☰
Zabbix 社区模板实战:基于 protobix 与 Trapper 机制的 Logstash 节点监控(App Logstash 6.0 深度解析)
2026/10/16 2:54:07 网站建设 项目流程

【免费下载链接】community-templates

Zabbix Community Templates repository

项目地址:https://gitcode.com/gh_mirrors/co/community-templates
点击查看免费下载

导读

本文围绕 Zabbix Community Templates 仓库中的App Logstash模板(6.0 版本文档)展开,剖析一种不依赖 JMX、不依赖 SNMP 的 Logstash 监控方案:由 Python protobix 库编写的配套脚本读取 Logstash 节点统计 JSON,再通过 Zabbix trapper(Sender)协议将 40 余项 JVM、GC、Pipeline、进程级指标推送到 Zabbix Server。读完本文,你将掌握该模板的完整监控项清单、发现规则、触发器逻辑、宏的作用,以及它背后的"脚本采集 + Trapper 上报 + Agent 哨兵"三层数据流设计,可直接在 Zabbix 6.0 环境中部署落地。


一、模板定位与整体方案

App Logstash是 Zabbix 社区为Logstash(ELK 中的 L)提供的应用级监控模板,作者为 fredprod。模板的核心思路写在 6.0 版 README 的 Overview 中:

This method uses python protobix library, and check metrics from logstash JSON file.

即:使用 Python protobix 库,从 Logstash 的 JSON 统计数据中提取指标。也就是说,监控数据的生产方不是 Zabbix 本身,而是一个独立配套脚本——脚本在 Logstash 节点上读取其节点统计接口输出的 JSON,解析出 JVM 内存、GC、线程、Pipeline 事件、进程 CPU、文件描述符等指标,然后借助 protobix 库按 Zabbix trapper 协议推送给 Server。

这种方案的典型优势在于:Logstash 本身是 JVM 应用,若用 JMX 监控需要额外开启 JMX 端点并维护 keytool 信任链;而本模板只需脚本能访问 Logstash 的统计 JSON,监控链路轻量、无侵入。模板本体(template_logstash.yaml)只负责在 Zabbix 侧定义"接收指标的桶"(items)、"节点发现的入口"(discovery rule)和"告警规则"(triggers)。

仓库中的版本分布

当前仓库中该模板按 Zabbix 主版本维护了三个版本目录:

目录面向 Zabbix 版本模板文件格式
Applications/template_logstash/5.05.0XML(template_logstash.xml)
Applications/template_logstash/5.45.4YAML(template_logstash.yaml)
Applications/template_logstash/6.06.0YAML(template_logstash.yaml)

三个版本的 README 内容一致,模板结构(宏、发现规则、监控项、触发器)也基本保持同步;6.0 的 YAML 导出时间为 2021-11-21,zabbix_export.version: '6.0',可直接导入 Zabbix 6.0 及以上版本。5.0 的 XML 版本额外保留了applications分组(Logstash、Logstash Memory、Logstash Node JVM、Logstash Pipeline Events、Logstash Process CPU、Logstash Process File Descriptors),而 6.0 YAML 采用tags替代了 applications 分组,这是 Zabbix 5.4+ 对旧分组机制的演进。


二、模板宏:{$ZBX_TPL_VERSION}

README 中明确列出的宏只有一个:

宏名称描述默认值类型
{$ZBX_TPL_VERSION}模板/脚本版本标识0.0.1Text macro(文本宏)

在 6.0 YAML 的macros段中对应定义:

macros: - macro: '{$ZBX_TPL_VERSION}' value: 0.0.1

这个宏不是用来计算数值的,而是模板版本与脚本版本的"握手令牌"。配套脚本会把自身版本通过logstash.zbx_version这个 trapper 项上报给 Server,模板中的触发器Logstash Template and Script version mismatched会用find()函数在logstash.zbx_version的取值中正则匹配0.0.1:如果脚本版本与宏不一致,说明脚本或模板有一方已更新而另一方未同步,触发 INFO 级提示。这保证了"模板升级后脚本也得跟着升级"的运维一致性。


三、发现规则:Logstash discovery

模板只定义了一条发现规则,负责把 Logstash 节点纳入监控:

名称类型Key更新周期
Logstash discoveryZabbix trapperlogstash.node.discovery0(不轮询,由脚本推送)

YAML 中的完整定义:

discovery_rules: - uuid: 02bcf2252dc6437ba7e10e0a213bb6a7 name: 'Logstash discovery' type: TRAP key: logstash.node.discovery delay: '0' filter: conditions: - macro: '{#NODENAME}' value: '.*' formulaid: A lifetime: 3d

解读其工作机制:

  • 类型为 Trapper:Zabbix Server 不会主动轮询该 key,而是等待脚本通过 trapper 协议推送发现数据(JSON),数据中应包含宏{#NODENAME}(节点名),由此生成"被监控节点"的 LLD 条目。
  • 过滤条件{#NODENAME}匹配.*:接受所有上报的节点名,不做白名单过滤。
  • lifetime 为 3d:若某个节点超过 3 天没有向logstash.node.discovery推送数据,Server 会将其自动清理出监控列表——这天然覆盖了"节点下线/脚本停止"的场景。

另外还有一条名为Logstash discovery的Zabbix agent (active)监控项(key 同样是logstash.discovery,更新周期 1h),注意与上面的发现规则区分:这条 item 由 agent 主动采集,用于周期性报告脚本的发现执行状态。


四、监控项全解析(44 项)

模板定义了 44 个监控项(README 的 Items collected 表),绝大部分(42 项)是Zabbix trapper类型,由脚本推送;另有 2 项由Zabbix agent (active)采集。按功能可分为以下类别。

4.1 健康检查与版本哨兵(agent active / 文本)

名称Key类型更新备注
Logstash checklogstash.checkZabbix agent (active)1m脚本运行状态,0 为正常
Logstash discoverylogstash.discoveryZabbix agent (active)1h发现任务执行状态
Logstash zabbix script versionlogstash.zbx_versionZabbix trapper—TEXT 类型,history 15d,trends 关闭

logstash.zbx_version在 YAML 中的定义比较特殊:value_type: TEXT、trends: '0'(不做趋势存储),因为它只是版本字符串,用于与{$ZBX_TPL_VERSION}宏比对,无需保留历史趋势。

4.2 JVM 内存(Heap / Non-Heap)

所有内存指标单位均为B(字节),value_type 为 FLOAT,history 30d:

名称Key
Logstash JVM Mem heap committedlogstash.jvm.mem.heap_committed_in_bytes
Logstash JVM Mem heap maxlogstash.jvm.mem.heap_max_in_bytes
Logstash JVM Mem heap usedlogstash.jvm.mem.heap_used_in_bytes
Logstash JVM Percent Mem heap usedlogstash.jvm.mem.heap_used_percent(单位%)
Logstash JVM Mem non heap committedlogstash.jvm.mem.non_heap_committed_in_bytes
Logstash JVM Mem non heap usedlogstash.jvm.mem.non_heap_used_in_bytes

heap_used_percent是模板中唯一带双级告警的指标(详见触发器章节),也是日常看板最常用的"JVM 健康度"指标。

4.3 JVM 内存池(Pools:young / survivor / old)

三类内存池各自有 5 个维度(committed、max、used、peak_max、peak_used),共 15 项,单位均为B:

Young 代:

  • logstash.jvm.mem.pools.young.committed_in_bytes
  • logstash.jvm.mem.pools.young.max_in_bytes
  • logstash.jvm.mem.pools.young.used_in_bytes
  • logstash.jvm.mem.pools.young.peak_max_in_bytes
  • logstash.jvm.mem.pools.young.peak_used_in_bytes

Survivor 区:

  • logstash.jvm.mem.pools.survivor.committed_in_bytes
  • logstash.jvm.mem.pools.survivor.max_in_bytes
  • logstash.jvm.mem.pools.survivor.used_in_bytes
  • logstash.jvm.mem.pools.survivor.peak_max_in_bytes
  • logstash.jvm.mem.pools.survivor.peak_used_in_bytes

Old 代:

  • logstash.jvm.mem.pools.old.committed_in_bytes
  • logstash.jvm.mem.pools.old.max_in_bytes
  • logstash.jvm.mem.pools.old.used_in_bytes
  • logstash.jvm.mem.pools.old.peak_max_in_bytes
  • logstash.jvm.mem.pools.old.peak_used_in_bytes

peak_*系列反映的是历史峰值(自 JVM 启动以来的最高水位),对判断内存池是否曾接近上限、是否需要调大堆很有价值。

4.4 JVM GC 收集器

名称Key单位
Logstash JVM gc collectors old collection countlogstash.jvm.gc.collectors.old.collection_count—
Logstash JVM gc collectors old collection timelogstash.jvm.gc.collectors.old.collection_time_in_millisms
Logstash JVM gc collectors young collection countlogstash.jvm.gc.collectors.young.collection_count—
Logstash JVM gc collectors young collection timelogstash.jvm.gc.collectors.young.collection_time_in_millisms

young 与 old 两个收集器的次数/耗时分开统计,配合前面的内存池指标,可以完整评估 GC 频率与停顿对 Logstash 吞吐的影响。

4.5 JVM 线程与运行时间

名称Key单位
Logstash JVM Threads countlogstash.jvm.threads.count—
Logstash JVM Threads peak countlogstash.jvm.threads.peak_count—
Logstash JVM uptimelogstash.jvm.uptime_in_millisms

uptime_in_millis可辅助判断节点是否发生过重启——重启后该值会归零重新累计,配合 heartbeat 触发器可还原故障时间线。

4.6 Pipeline 事件统计

名称Key单位
Logstash Pipeline Events durationlogstash.pipeline.events.duration_in_millisms
Logstash Pipeline Events filteredlogstash.pipeline.events.filtered—
Logstash Pipeline Events inlogstash.pipeline.events.in—
Logstash Pipeline Events outlogstash.pipeline.events.out—

in / filtered / out是 Logstash 管道最核心的三组计数:进入管道的事件数、经 filter 处理后的事件数、成功输出的事件数。duration_in_millis则是事件在管道中停留的总耗时(毫秒),可用于评估 filter 链的处理效率。

4.7 进程 CPU 与负载

名称Key单位
Logstash Process CPU load 1logstash.process.cpu.load_average.1m—
Logstash Process CPU load 5logstash.process.cpu.load_average.5m—
Logstash Process CPU load 15logstash.process.cpu.load_average.15m—
Logstash Process CPUlogstash.process.cpu.percent%
Logstash Process CPU Total in mslogstash.process.cpu.total_in_millisms

三个 load average 分别对应 1/5/15 分钟的系统负载,percent是 CPU 使用百分比,total_in_millis是进程累计 CPU 时间。

4.8 文件描述符与虚拟内存

名称Key单位
Logstash Process Max File descriptorslogstash.process.max_file_descriptors—
Logstash Process Open File descriptorslogstash.process.open_file_descriptors—
Logstash Process Peak File descriptorslogstash.process.peak_open_file_descriptors—
Logstash Mem Total Virtuallogstash.process.mem.total_virtual_in_bytesB

文件描述符三项(上限/当前打开/历史峰值)对排查 "Too many open files" 类故障至关重要;total_virtual_in_bytes表示进程占用的虚拟内存总量。

4.9 监控项的通用属性

从 6.0 YAML 可以看到,所有 trapper 项都遵循同样的定义模式:

- uuid: f0ee1d0ded7f46f5bd4f17a40138d2f1 name: 'Logstash JVM Mem heap committed' type: TRAP key: logstash.jvm.mem.heap_committed_in_bytes delay: '0' history: 30d value_type: FLOAT units: B tags: - tag: Application value: 'Logstash Node JVM'

几个关键点:

  • type: TRAP+delay: '0':trapper 项不轮询,delay 恒为 0,数据到达时间完全由脚本推送频率决定。
  • history: 30d:JVM/Pipeline 类指标保留 30 天历史;而logstash.check、logstash.discovery、logstash.zbx_version以及三个 load average 项为15d,在 YAML 中可逐一核对。
  • tags取代 applications:6.0 版本用Application: Logstash Node JVM、Application: Logstash Pipeline Events、Application: Logstash Process CPU、Application: Logstash Process File Descriptors、Application: Logstash Memory、Application: Logstash等标签对监控项分类,这也是 5.0 XML 中applications分组的等价物。
  • value_type 与 units:绝大多数为 FLOAT,内存类B、时间类ms、百分比%,版本项为 TEXT。

五、触发器详解(README 与模板文件的差异说明)

这里有一个值得注意的细节:README 的 Triggers 章节写的是 "There are no triggers in this template."(模板中没有触发器),但实际模板文件里定义了 6 条触发器。以 6.0 YAML 和 5.0 XML 为准,实际触发器如下:

触发器名称表达式优先级含义
Logstash check failedmin(/App Logstash/logstash.check,3m)>0AVERAGE3 分钟内 check 值最小值 >0,即脚本检查失败
Logstash discovery failedlast(/App Logstash/logstash.discovery)>0WARNING最近一次发现结果 >0,即发现任务异常
Logstash JVM Heap used percent is highavg(/App Logstash/logstash.jvm.mem.heap_used_percent,30m)>75AVERAGE30 分钟堆使用率均值 >75%
Logstash JVM Heap used percent is TOO HIGHavg(/App Logstash/logstash.jvm.mem.heap_used_percent,30m)>85HIGH30 分钟堆使用率均值 >85%
Logstash heartbeatnodata(/App Logstash/logstash.zbx_version,10m)=1WARNING版本数据 10 分钟无更新,判定脚本/节点失联
Logstash Template and Script version mismatchedfind(/App Logstash/logstash.zbx_version,,"regexp","0.0.1")=0INFO脚本版本与模板宏版本不一致

值得展开的两个设计:

  1. 双级堆告警(依赖关系):is high(>75%)与is TOO HIGH(>85%)都基于heap_used_percent的 30 分钟均值。YAML 中is high通过dependencies声明依赖is TOO HIGH,从而形成"先 AVERAGE 后 HIGH"的分级告警阶梯:堆水位 >75% 持续 30 分钟先报 AVERAGE,若继续恶化到 >85% 再升级 HIGH,避免抖动导致告警风暴。YAML 中触发器描述还指出,is high的描述为 "JVM heap used percent average is above 75% for 30m.",is TOO HIGH为 "JVM heap used percent average is above 90% during 30m."(注意描述中的 90% 与表达式 85 存在轻微出入,以表达式为准)。

  2. 心跳与版本一致性:Logstash heartbeat依赖logstash.zbx_version的 10 分钟无数据(nodata),并带恢复表达式nodata(...,1m)<>1(数据恢复后 1 分钟内解除);Logstash Template and Script version mismatched用find()正则检查上报版本是否含0.0.1,与{$ZBX_TPL_VERSION}宏呼应。这两条触发器共同保证"脚本活着、且版本与模板匹配"。


六、数据流与工作机制:三层配合

综合 README 与模板定义,整套方案的数据流可以归纳为三层:

  1. 采集层(脚本 + protobix):配套 Python 脚本在 Logstash 节点上运行,读取 Logstash 节点统计的 JSON 数据(对应 Logstash 节点统计接口输出的字段结构,如jvm.mem.heap_used_in_bytes、jvm.gc.collectors.young.collection_count、pipeline.events.in、process.cpu.percent等)。README 明确指出该方法依赖python protobix 库,该库封装了 Zabbix trapper/sender 协议,脚本只需把解析出的指标以key → value形式交给 protobix,即可批量推送给 Zabbix Server。
  2. 接收层(Zabbix trapper items):Server 侧由模板预置的 42 个 trapper 项按 key 接收数据,logstash.node.discovery则接收含{#NODENAME}的发现 JSON,驱动 LLD 生成节点监控条目(lifetime 3d 自动清理失联节点)。
  3. 哨兵层(Zabbix agent active):logstash.check(1 分钟)与logstash.discovery(1 小时)由 agent 主动模式采集,反馈脚本自身的健康状态——任何一层(脚本崩溃、JSON 解析失败、推送中断)都会体现为 check/discovery 非零或zbx_version无数据,从而触发上面的告警。

这种"trapper 收数据、agent 做哨兵、宏做版本握手"的组合,让监控项完全不受轮询间隔限制(数据按脚本自身的节奏推送),又保留了独立于推送链路的故障检测能力。


七、部署与使用要点

仓库根目录 README.md 说明了社区模板的标准使用流程,应用到本模板即:

  1. 获取模板文件:从 Applications/template_logstash/6.0 下载template_logstash.yaml(Zabbix 6.0 环境;5.x 环境请使用 5.4 版 YAML 或 5.0 版 XML)。
  2. 导入模板:在 Zabbix 前端进入Data collection → Templates → Import,选择下载的 YAML/XML 文件导入,模板名为App Logstash,所属组为 Templates。
  3. 准备配套脚本:模板本身不包含采集脚本,需要按原文档说明(README Overview 中注明脚本的获取方式)部署 fredprod 提供的 logstash-zabbix 脚本及 Python protobix 库到 Logstash 节点,并确保脚本能读取 Logstash 的节点统计 JSON。
  4. 配置 Host 并关联模板:为主机(对应 Logstash 节点)关联App Logstash模板,配置 Zabbix agent(active)以支撑logstash.check/logstash.discovery两个哨兵项。
  5. 验证:导入后检查logstash.zbx_version是否收到脚本上报的0.0.1;若触发Logstash Template and Script version mismatched,说明脚本版本与{$ZBX_TPL_VERSION}宏不一致,需对齐两者。

八、常见问题与排障思路

  • Logstash heartbeat告警:logstash.zbx_version超过 10 分钟无数据,通常是脚本未运行、protobix 推送失败或 Logstash 统计 JSON 不可读。先确认脚本进程与日志,再检查 Server 端 trapper 端口连通性。
  • Logstash check failed/Logstash discovery failed:检查脚本是否写入了非零状态值(如 JSON 解析失败、节点名获取失败),以及 agent active 模式是否正常回传。
  • Logstash JVM Heap used percent is high / TOO HIGH:对应堆使用率持续高位,需结合heap_max_in_bytes、pools.old.*与 GC 指标判断是否需要调整-Xmx或优化 filter 链内存占用。
  • 发现列表为空或节点消失:确认logstash.node.discovery是否收到含{#NODENAME}的推送;节点超过 3 天(lifetime)未上报会被自动清理,属预期行为。

总结

App Logstash模板是一套结构清晰、职责分明的 Logstash 应用监控方案:42 个 trapper 指标覆盖 JVM 堆/非堆/内存池/GC/线程、Pipeline 事件计数与耗时、进程 CPU/负载/文件描述符/虚拟内存,配合logstash.node.discovery的 LLD 节点发现、{$ZBX_TPL_VERSION}宏的版本握手、以及 check/discovery/heartbeat 三层故障哨兵,让 Logstash 节点在无 JMX、无 SNMP 的前提下获得完整可观测性。部署时请以本仓库 6.0 YAML 中的实际触发器与监控项定义为准(README 中 "no triggers" 的表述与模板文件存在出入),并注意脚本与模板的版本一致性。

【免费下载链接】community-templates

Zabbix Community Templates repository

项目地址:https://gitcode.com/gh_mirrors/co/community-templates
点击查看免费下载
上一篇:easy-vibe 后端架构演进实战指南:从单体到微服务的拆分时机、策略与数据治理
下一篇:Effect 数据库迁移(Migrator)Windows 文件路径兼容修复:`Migrator.fromFileSystem` 如何通过 File URL 让 ESM 加载器接受绝对路径

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询