跳转至

Logstash


视图预览

Logstash 收集的指标包括节点统计信息,例如 JVM 统计信息、进程统计信息、事件相关统计信息和 Pipeline 运行时统计信息等。

image

版本支持

操作系统支持:Windows/AMD 64, Windows/386, Linux/ARM, Linux/ARM 64, Linux/386, Linux/AMD 64, Darwin/AMD 64

安装部署

说明:示例 Logstash 版本为 logstash 7.11.x (CentOS),各个不同版本指标可能存在差异。

前置条件

您可以使用根资源来检索有关 Logstash 实例的一般信息,包括主机和版本来检验您的 Logstash 的运行状态。

curl - XGET 'localhost:9600/?pretty'

示例响应:

{
  "host" : "df-solution-ecs-018",
  "version" : "7.11.2",
  "http_address" : "127.0.0.1:9600",
  "id" : "aeb96782-9127-4e95-a57b-e90125f4a7a4",
  "name" : "df-solution-ecs-018",
  "ephemeral_id" : "75408543-fcc3-424b-8c32-1ef86fe14c22",
  "status" : "green",
  "snapshot" : false,
  "pipeline" : {
    "workers" : 4,
    "batch_size" : 125,
    "batch_delay" : 50
  },
  "build_date" : "2021-03-06T04:40:05Z",
  "build_sha" : "5ea72dd819364370a8170ea90774578382e2fe42",
  "build_snapshot" : false

在 Logstash 配置文件中开启如下配置

# ------------ HTTP API Settings -------------
http.enabled: true
http.host: 0.0.0.0
http.port: 9600

默认情况下,监控 API 会尝试绑定到 tcp:9600. 如果此端口已被另一个 Logstash 实例使用,则需要使用 --api.http.port 指定的标志启动 Logstash 以绑定到不同的端口。

配置实施

指标采集 (必选)

1、 登录 Func,地址 http://ip:8088(默认 admin/admin)

image

2、 配置 DataKit 数据源进行数据上报

image

3、 输入标题/描述信息

image

4、 编辑脚本

import requests
import socket

@DFF.API('get_logstash_metrics')
def get_logstash_metrics():
    # 链接本地 DataKit
    datakit = DFF.SRC('datakit')
    # 查看 Logstash 健康状态
    health_response = requests.get("http://172.17.0.1:9600/?pretty")
    # 查看 Logstash process 状态
    process_response = requests.get("http://172.17.0.1:9600/_node/stats/process?pretty")
    # 查看 Logstash JVM 状态
    jvm_response = requests.get("http://172.17.0.1:9600/_node/stats/jvm?pretty")
    # 查看 Logstash reloads 状态
    reloads_response = requests.get("http://172.17.0.1:9600/_node/stats/reloads?pretty")
    # 查看 Logstash pipeline 状态
    pipeline_response = requests.get("http://172.17.0.1:9600/_node/stats/pipelines?pretty")
    health = health_response.json()
    process = process_response.json()
    jvm = jvm_response.json()
    reloads = reloads_response.json()
    pipeline = pipeline_response.json()
    pipeline_plugin = pipeline["pipelines"]["main"]["plugins"]
    # print(type(process))
    # print(jvm)
    print(jvm["jvm"]["threads"]["count"],process["process"]["cpu"]["total_in_millis"],process["process"]["cpu"]["percent"],process["process"]["cpu"]["load_average"]["1m"])
    host = health["host"]
    version = health["version"]
    # 输出指标
    measurement = "logstash"
    tags = {
        "host":host,
        "version":version,
    }

    fields = {
        "health_runtime_status":health["status"],
        "process_open_file_descriptors":process["process"]["open_file_descriptors"],
        "process_peak_open_file_descriptors":process["process"]["peak_open_file_descriptors"],
        "process_max_file_descriptors":process["process"]["max_file_descriptors"],
        "process_mem_total_virtual_in_bytes":process["process"]["mem"]["total_virtual_in_bytes"],
        "process_cpu_total_in_millis":process["process"]["cpu"]["total_in_millis"],
        "process_cpu_percent":process["process"]["cpu"]["percent"],
        "process_cpu_load_average_1m":process["process"]["cpu"]["load_average"]["1m"],
        "process_cpu_load_average_5m":process["process"]["cpu"]["load_average"]["5m"],
        "process_cpu_load_average_15m":process["process"]["cpu"]["load_average"]["15m"],
        "jvm_threads_count":jvm["jvm"]["threads"]["count"],
        "jvm_threads_peak_count":jvm["jvm"]["threads"]["peak_count"],
        "jvm_mem_heap_used_percent":jvm["jvm"]["mem"]["heap_used_percent"],
        "jvm_mem_heap_committed_in_bytes":jvm["jvm"]["mem"]["heap_committed_in_bytes"],
        "jvm_mem_heap_max_in_bytes":jvm["jvm"]["mem"]["heap_max_in_bytes"],
        "jvm_mem_heap_used_in_bytes":jvm["jvm"]["mem"]["heap_used_in_bytes"],
        "jvm_mem_non_heap_used_in_bytes":jvm["jvm"]["mem"]["non_heap_used_in_bytes"],
        "jvm_mem_non_heap_committed_in_bytes":jvm["jvm"]["mem"]["non_heap_committed_in_bytes"],
        "jvm_mem_pools_survivor_peak_used_in_bytes":jvm["jvm"]["mem"]["pools"]["survivor"]["peak_used_in_bytes"],
        "jvm_mem_pools_survivor_used_in_bytes":jvm["jvm"]["mem"]["pools"]["survivor"]["used_in_bytes"],
        "jvm_mem_pools_survivor_peak_max_in_bytes":jvm["jvm"]["mem"]["pools"]["survivor"]["peak_max_in_bytes"],
        "jvm_mem_pools_survivor_max_in_bytes":jvm["jvm"]["mem"]["pools"]["survivor"]["max_in_bytes"],
        "jvm_mem_pools_survivor_committed_in_bytes":jvm["jvm"]["mem"]["pools"]["survivor"]["committed_in_bytes"],
        "jvm_mem_pools_old_peak_used_in_bytes":jvm["jvm"]["mem"]["pools"]["old"]["peak_used_in_bytes"],
        "jvm_mem_pools_old_used_in_bytes":jvm["jvm"]["mem"]["pools"]["old"]["used_in_bytes"],
        "jvm_mem_pools_old_peak_max_in_bytes":jvm["jvm"]["mem"]["pools"]["old"]["peak_max_in_bytes"],
        "jvm_mem_pools_old_max_in_bytes":jvm["jvm"]["mem"]["pools"]["old"]["max_in_bytes"],
        "jvm_mem_pools_old_committed_in_bytes":jvm["jvm"]["mem"]["pools"]["old"]["committed_in_bytes"],
        "jvm_mem_pools_young_peak_used_in_bytes":jvm["jvm"]["mem"]["pools"]["young"]["peak_used_in_bytes"],
        "jvm_mem_pools_young_used_in_bytes":jvm["jvm"]["mem"]["pools"]["young"]["used_in_bytes"],
        "jvm_mem_pools_young_peak_max_in_bytes":jvm["jvm"]["mem"]["pools"]["young"]["peak_max_in_bytes"],
        "jvm_mem_pools_young_max_in_bytes":jvm["jvm"]["mem"]["pools"]["young"]["max_in_bytes"],
        "jvm_mem_pools_young_committed_in_bytes":jvm["jvm"]["mem"]["pools"]["young"]["committed_in_bytes"],
        "jvm_gc_collectors_old_collection_time_in_millis":jvm["jvm"]["gc"]["collectors"]["old"]["collection_time_in_millis"],
        "jvm_gc_collectors_old_collection_count":jvm["jvm"]["gc"]["collectors"]["old"]["collection_count"],
        "jvm_gc_collectors_young_collection_time_in_millis":jvm["jvm"]["gc"]["collectors"]["young"]["collection_time_in_millis"],
        "jvm_gc_collectors_young_collection_count":jvm["jvm"]["gc"]["collectors"]["young"]["collection_count"],
        "reloads_successes":reloads["reloads"]["successes"],
        "reloads_failures":reloads["reloads"]["failures"],
        "pipeline_workers":health["pipeline"]["workers"],
        "pipeline_workers":health["pipeline"]["batch_size"],
        "pipeline_workers":health["pipeline"]["batch_delay"],
        "pipeline_events_duration_in_millis":pipeline["pipelines"]["main"]["events"]["duration_in_millis"],
        "pipeline_events_in":pipeline["pipelines"]["main"]["events"]["in"],
        "pipeline_events_out":pipeline["pipelines"]["main"]["events"]["out"],
        "pipeline_events_filtered":pipeline["pipelines"]["main"]["events"]["filtered"],
        "pipeline_reloads_successes":pipeline["pipelines"]["main"]["reloads"]["successes"],
        "pipeline_reloads_failures":pipeline["pipelines"]["main"]["reloads"]["failures"],
        "pipeline_queue_page_max_queue_size_in_bytes":pipeline["pipelines"]["main"]["queue"]["max_queue_size_in_bytes"],
        "pipeline_queue_queue_size_in_bytes":pipeline["pipelines"]["main"]["queue"]["queue_size_in_bytes"],
        "pipeline_queue_events_count":pipeline["pipelines"]["main"]["queue"]["events_count"],
    }


    for i in range(0,len(pipeline_plugin["inputs"])):
        tags["plugin_inputs_id"] = pipeline_plugin["inputs"][i]["id"]
        fields["pipeline_plugins_inputs_events_out"] = pipeline_plugin["inputs"][i]["events"]["out"]
        fields["pipeline_plugins_inputs_events_queue_push_duration_in_millis"] = pipeline_plugin["inputs"][i]["events"]["queue_push_duration_in_millis"]
        try:
            status_code, result = datakit.write_metric(measurement=measurement, tags=tags, fields=fields)
            print(measurement, tags, fields, status_code)
        except:
            print("插入失败!")

    for i in range(0,len(pipeline_plugin["outputs"])):
        tags["plugin_outputs_id"] = pipeline_plugin["outputs"][i]["id"]
        fields["pipeline_plugins_outputs_events_in"] = pipeline_plugin["outputs"][i]["events"]["in"]
        fields["pipeline_plugins_outputs_events_out"] = pipeline_plugin["outputs"][i]["events"]["out"]
        fields["pipeline_plugins_outputs_events_duration_in_millis"] = pipeline_plugin["outputs"][i]["events"]["duration_in_millis"]
        try:
            status_code, result = datakit.write_metric(measurement=measurement, tags=tags, fields=fields)
            print(measurement, tags, fields, status_code)
        except:
            print("插入失败!")

    for i in range(0,len(pipeline_plugin["filters"])):
        tags["plugin_filters_id"] = pipeline_plugin["filters"][i]["id"]
        fields["pipeline_plugins_filters_events_in"] = pipeline_plugin["filters"][i]["events"]["in"]
        fields["pipeline_plugins_filters_events_out"] = pipeline_plugin["filters"][i]["events"]["out"]
        fields["pipeline_plugins_filters_events_duration_in_millis"] = pipeline_plugin["filters"][i]["events"]["duration_in_millis"]
        try:
            status_code, result = datakit.write_metric(measurement=measurement, tags=tags, fields=fields)
            print(measurement, tags, fields, status_code)
        except:
            print("插入失败!")

5、 在管理中新建自动触发执行进行函数调度

image

选择刚刚编写好的执行函数设置定时任务,添加有效期有点击保存即可。
定时任务最短1分钟触发一次,如果有特殊需求可以使用 while + sleep 的方式来提高数据采集频率。

6、 通过自动触发配置查看函数运行状态

image

image

image

如果显示已成功,那么恭喜您可以去studio中查看您上报的指标了

7、 DQL 验证

[root@df-solution-ecs-018 config]# datakit -Q
dql > M::logstash LIMIT 1
-----------------[ r1.logstash.s1 ]-----------------
                                       health_runtime_status 'green'
                                                        host 'df-solution-ecs-018'
                      jvm_gc_collectors_old_collection_count 2
             jvm_gc_collectors_old_collection_time_in_millis 437
                    jvm_gc_collectors_young_collection_count 11
           jvm_gc_collectors_young_collection_time_in_millis 558
                             jvm_mem_heap_committed_in_bytes 1038876672
                                   jvm_mem_heap_max_in_bytes 1038876672
                                  jvm_mem_heap_used_in_bytes 249935464
                                   jvm_mem_heap_used_percent 24
                         jvm_mem_non_heap_committed_in_bytes 196231168
                              jvm_mem_non_heap_used_in_bytes 165088744
                        jvm_mem_pools_old_committed_in_bytes 724828160
                              jvm_mem_pools_old_max_in_bytes 724828160
                         jvm_mem_pools_old_peak_max_in_bytes 724828160
                        jvm_mem_pools_old_peak_used_in_bytes 139130016
                             jvm_mem_pools_old_used_in_bytes 139130016
                   jvm_mem_pools_survivor_committed_in_bytes 34865152
                         jvm_mem_pools_survivor_max_in_bytes 34865152
                    jvm_mem_pools_survivor_peak_max_in_bytes 34865152
                   jvm_mem_pools_survivor_peak_used_in_bytes 34865152
                        jvm_mem_pools_survivor_used_in_bytes 17296768
                      jvm_mem_pools_young_committed_in_bytes 279183360
                            jvm_mem_pools_young_max_in_bytes 279183360
                       jvm_mem_pools_young_peak_max_in_bytes 279183360
                      jvm_mem_pools_young_peak_used_in_bytes 279183360
                           jvm_mem_pools_young_used_in_bytes 93508680
                                           jvm_threads_count 31
                                      jvm_threads_peak_count 34
                          pipeline_events_duration_in_millis 0
                                    pipeline_events_filtered 0
                                          pipeline_events_in 0
                                         pipeline_events_out 0
          pipeline_plugins_filters_events_duration_in_millis <nil>
                          pipeline_plugins_filters_events_in <nil>
                         pipeline_plugins_filters_events_out <nil>
                          pipeline_plugins_inputs_events_out 0
pipeline_plugins_inputs_events_queue_push_duration_in_millis 0
          pipeline_plugins_outputs_events_duration_in_millis <nil>
                          pipeline_plugins_outputs_events_in <nil>
                         pipeline_plugins_outputs_events_out <nil>
                                 pipeline_queue_events_count 0
                 pipeline_queue_page_max_queue_size_in_bytes 0
                          pipeline_queue_queue_size_in_bytes 0
                                   pipeline_reloads_failures 0
                                  pipeline_reloads_successes 0
                                            pipeline_workers 50
                                           plugin_filters_id <nil>
                                                   plugin_id 'f31d565aaf78a146929f3c85bdd0a5d75bba8fbde270aafe4f6cfeb18787b483'
                                            plugin_inputs_id <nil>
                                           plugin_outputs_id <nil>
                                process_cpu_load_average_15m 0
                                 process_cpu_load_average_1m 0
                                 process_cpu_load_average_5m 0.020000
                                         process_cpu_percent 0
                                 process_cpu_total_in_millis 106850
                                process_max_file_descriptors 65535
                          process_mem_total_virtual_in_bytes 4923002880
                               process_open_file_descriptors 97
                          process_peak_open_file_descriptors 98
                                            reloads_failures 0
                                           reloads_successes 0
                                                        time 2022-01-28 17:49:42 +0800 CST
                                                     version '7.11.2'
---------
1 rows, 1 series, cost 20.487064ms

8、 指标预览

image

场景视图

<场景 - 新建仪表板 - 模板库 - 系统视图 - Logstash 监控视图>

监控规则

<监控 - 监控器 - 从模板新建 - Logstash 检测库>

序号 规则名称 触发条件 级别 检测频率
1 Logstash 配置重新加载失败 Logstash 配置重新加载失败次数 > 0 紧急 1m
2 Logstash Pipeline配置重新加载失败 Logstash Pipeline配置重新加载失败次数 > 0 紧急 1m
3 Logstash Java 堆内存使用率过高 Logstash Java 堆内存使用率 > 90% 紧急 1m

指标详解

指标 描述
logstash_health_runtime_status logstash运行状态
logstash_process_open_file_descriptors 此进程使用的打开文件描述符的数量
logstash_process_peak_open_file_descriptors 此进程使用的打开文件描述符的峰值数
logstash_process_max_file_descriptors 此进程使用的最大文件描述符数
logstash_process_mem_total_virtual_in_bytes 分配给此进程的总虚拟内存(单位:byte)
logstash_process_cpu_total_in_millis CPU 时间(单位:ms)
logstash_process_cpu_percent CPU 利用率百分比(单位:%)
logstash_process_cpu_load_average_1m 一分钟内的平均 CPU 负载
logstash_process_cpu_load_average_5m 五分钟内的平均 CPU 负载
logstash_process_cpu_load_average_15m 十五分钟内的平均 CPU 负载
logstash_jvm_threads_count VM 使用的线程数(单位:个)
logstash_jvm_threads_peak_count VM 使用的峰值线程数
logstash_jvm_mem_heap_used_percent 使用的总 Java 堆内存(单位:%)
logstash_jvm_mem_heap_committed_in_bytes 已提交的 Java 堆内存总量(单位:byte)
logstash_jvm_mem_heap_max_in_bytes 最大 Java 堆内存大小(单位:byte)
logstash_jvm_mem_heap_used_in_bytes 使用的总 Java 堆内存(单位:byte)
logstash_jvm_mem_non_heap_used_in_bytes 使用的 Java 非堆内存总量(单位:byte)
logstash_jvm_mem_non_heap_committed_in_bytes 已提交的 Java 非堆内存总量(单位:byte)
logstash_jvm_mem_pools_survivor_peak_used_in_bytes Survivor 空间中使用的 Java 内存(单位:byte)
logstash_jvm_mem_pools_survivor_used_in_bytes Survivor 空间中使用的峰值 Java 内存(单位:byte)
logstash_jvm_mem_pools_survivor_peak_max_in_bytes Survivor 空间中使用的最大 Java 内存峰值(单位:byte)
logstash_jvm_mem_pools_survivor_max_in_bytes Survivor 空间中使用的最大 Java 内存(单位:byte)
logstash_jvm_mem_pools_survivor_committed_in_bytes Survivor 空间中使用的已提交 Java 内存(单位:byte)
logstash_jvm_mem_pools_old_peak_used_in_bytes 老年代中使用的峰值 Java 内存(单位:byte)
logstash_jvm_mem_pools_old_used_in_bytes 老年代中使用的 Java 内存(单位:byte)
logstash_jvm_mem_pools_old_peak_max_in_bytes 老年代使用的最大 Java 内存峰值(单位:byte)
logstash_jvm_mem_pools_old_max_in_bytes 老年代使用的最大 Java 内存(单位:byte)
logstash_jvm_mem_pools_old_committed_in_bytes 老年代中使用的已提交 Java 内存(单位:byte)
logstash_jvm_mem_pools_young_peak_used_in_bytes 年轻代空间中使用的峰值 Java 内存(单位:byte)
logstash_jvm_mem_pools_young_used_in_bytes 年轻代使用的 Java 内存(单位:byte)
logstash_jvm_mem_pools_young_peak_max_in_bytes 年轻代使用的最大 Java 内存峰值(单位:byte)
logstash_jvm_mem_pools_young_max_in_bytes 年轻代使用的最大 Java 内存(单位:byte)
logstash_jvm_mem_pools_young_committed_in_bytes 年轻代使用的已提交 Java 内存(单位:byte)
logstash_jvm_gc_collectors_old_collection_time_in_millis 老年代花费的垃圾收集时间(单位: ms)
logstash_jvm_gc_collectors_old_collection_count 老年代的垃圾收集计数
logstash_jvm_gc_collectors_young_collection_time_in_millis 年轻代花费的垃圾收集时间(单位:ms)
logstash_jvm_gc_collectors_young_collection_count 年轻代花费的垃圾收集时间
logstash_reloads_successes 成功的配置重新加载次数
logstash_reloads_failures 失败的配置重新加载次数
pipeline_workers 实际output 时的线程数
pipeline_batch_size 每次发送的事件数
pipeline_batch_delay 每次发送的事件发送延时
logstash_pipeline_dead_letter_queue_queue_size_in_bytes 死信pipeline的总大小(单位:byte)
logstash_pipeline_events_duration_in_millis pipeline中的事件持续时间(单位:ms)
logstash_pipeline_events_in 进入pipeline的事件数
logstash_pipeline_events_out pipeline中的事件数
logstash_pipeline_events_filtered 过滤的事件数
logstash_pipeline_reloads_successes 成功的pipeline重新加载次数
logstash_pipeline_reloads_failures 失败的pipeline重新加载次数
logstash_pipeline_plugins_inputs_events_out 从输入插件输出的事件数
logstash_pipeline_plugins_inputs_events_queue_push_duration_in_millis 输入插件中pipeline推送的持续时间。(单位:ms)
logstash_pipeline_plugins_outputs_events_in 输出插件中的事件数
logstash_pipeline_plugins_outputs_events_out 从输出插件输出的事件数
logstash_pipeline_plugins_outputs_events_duration_in_millis 输出插件中事件的持续时间(单位:ms)
logstash_pipeline_plugins_filters_events_in 过滤器插件中的事件数
logstash_pipeline_plugins_filters_events_out 过滤器插件中的事件数
logstash_pipeline_plugins_filters_events_duration_in_millis 过滤器插件中事件的持续时间(单位:ms)
logstash_pipeline_queue_capacity_max_queue_size_in_bytes 持久队列的最大队列容量(单位:byte)
logstash_pipeline_queue_capacity_max_unread_events 持久队列中允许的最大未读事件
logstash_pipeline_queue_capacity_page_capacity_in_bytes 持久队列的队列页面容量(单位:byte)
logstash_pipeline_queue_capacity_queue_size_in_bytes 以持久队列的字节数使用的磁盘(单位:byte)
logstash_pipeline_queue_events 持久队列中的事件数

最佳实践

<暂无>

故障排查

<无数据上报排查>