Telegraf Nagios 数据格式解析器(Nagios Parser)使用指南:采集监控插件输出与性能数据

发布时间:2026/9/15 4:36:43
Telegraf Nagios 数据格式解析器(Nagios Parser)使用指南:采集监控插件输出与性能数据
Telegraf Nagios 数据格式解析器Nagios Parser使用指南采集监控插件输出与性能数据【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegrafnagios是 Telegraf 内置的一种输入数据格式data format用于直接解析 Nagios 监控插件的标准输出包括服务状态文本service output与管道符|分隔的性能数据performance data。本文以 plugins/parsers/nagios/README.md 为骨架结合仓库内 parser.go 源码与 parser_test.go 测试用例完整讲解配置方式、输出格式规范、生成度量结构、阈值解析规则以及退出码状态映射帮助你在一套监控体系内直接复用海量现成的 Nagios 插件。一、Nagios 数据格式是什么Nagios 插件遵循一套统一的命令行输出约定即 Nagios Plugin API插件以人类可读文本汇报服务状态并通过管道符|之后追加机器可读的性能数据。Telegraf 的nagios解析器正是读取这段输出将其中的性能数据转换成时序度量metrics并把状态文本与退出码映射成一条名为nagios_state的状态度量。该解析器在仓库中注册名称为nagios注册逻辑位于 parser.gofunc init() { // Register parser parsers.Add(nagios, func(defaultMetricName string) telegraf.Parser { return Parser{metricName: defaultMetricName} }, ) }在标准构建中它通过 plugins/parsers/all/nagios.go 被默认注册使用自定义构建时可用parsers.nagios标签按需引入。二、配置方法结合 inputs.exec 使用Nagios 插件本质上是可执行程序因此 Telegraf 中最典型的接入方式是配合inputs.exec插件调用并把data_format设为nagios。原文档给出了完整的最小配置[[inputs.exec]] ## Commands array commands [/usr/lib/nagios/plugins/check_load -w 5,6,7 -c 7,8,9] ## Data format to consume. ## Each data format has its own unique set of configuration options, read ## more about them here: ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md data_format nagiosinputs.exec会周期性执行commands中列出的命令并把标准输出交给nagios解析器处理。结合 exec.go 的源码可以看到当 exec 插件检测到解析器是*nagios.Parser时会额外挂载一个退出码处理钩子func (e *Exec) SetParser(parser telegraf.Parser) { e.parser parser unwrapped, ok : parser.(*models.RunningParser) if ok { if _, ok : unwrapped.Parser.(*nagios.Parser); ok { e.exitCodeHandler func(metrics []telegraf.Metric, err error, msg []byte) []telegraf.Metric { return nagios.AddState(err, msg, metrics) } e.parseDespiteError true } } }这意味着两点即使插件以非零退出码结束exec 也会继续解析其输出parseDespiteError true而不是直接丢弃命令的退出码会被nagios.AddState转换成nagios_state度量中的state字段详见下文第六节。三、Nagios 插件输出格式规范要正确使用该解析器需要了解 Nagios 插件的标准输出结构。其单行输出格式为TEXT_OUTPUT|PERFDATA管道符左侧是服务状态文本如PING OK - Packet loss 0%, RTA 0.30 ms管道符右侧是零个或多个性能数据项各项之间用空格分隔每项形如labelvalue[UOM];[warn];[crit];[min];[max]以check_disk类插件的典型输出为例该样例同时出现在 parser_test.go 中DISK OK - free space: / 3326 MB (56%); | /2643MB;5948;5958;0;5968 / 15272 MB (77%); /boot 68 MB (69%); /home 69357 MB (27%); /var/log 819 MB (84%); | /boot68MB;88;93;0;98 /home69357MB;253404;253409;0;253414 /var/log818MB;970;975;0;980该样例展示了 Nagios 输出的另外两个特性多行长输出long output状态文本之后可跟多行详细说明解析器会将其合并到long_service_output字段额外的性能数据区长输出结束后可再次出现|其后的内容同样作为性能数据解析。解析器通过两个正则表达式完成切分与字段提取见 parser.goperfSplitRegExp regexp.MustCompile(([^]\S)) nagiosRegExp regexp.MustCompile( ^([^])([\d\.\-\eE])([\w\/%]*);?([\d\.\-\eE:~])?;?([\d\.\-\eE:~])?;?([\d\.\-\eE])?;?([\d\.\-\eE])?;?\s*, )perfSplitRegExp负责把整段性能数据按labelvalue...拆分成独立项nagiosRegExp负责从每个项中依次提取标签组1、数值组2、单位 UOM组3、警告阈值组4、严重阈值组5、最小值组6、最大值组7。四、解析生成的度量结构与字段对于每个性能数据项解析器会生成一条名为nagios的度量对于整段插件输出则额外生成一条名为nagios_state的状态度量。性能度量nagios由 parsePerfData 生成字段结构如下类别键说明标签perfdata性能数据标签如rta、pl、load1会去除两侧单引号标签unit单位如ms、%、MB无单位时该标签不存在字段value解析出的数值浮点数字段warning_lt/warning_gt普通警告阈值解析出的下界/上界字段warning_le/warning_ge语义区间内告警的警告阈值字段critical_lt/critical_gt普通严重阈值解析出的下界/上界字段critical_le/critical_ge语义的严重阈值字段min/max性能数据中的最小/最大值以测试用例 valid output 1 中的rta项为例rta0.298000ms;4000.000000;6000.000000;0.000000生成的度量等价于nagios,perfdatarta,unitms value0.298,warning_lt0,warning_gt4000,critical_lt0,critical_gt6000,min0几点细节值得注意若性能值本身为Uundetermined未确定解析会直接返回错误value undeterminedparser.go格式损坏的性能项会被静默跳过仅记录日志不会导致整条输出解析失败——测试用例malformed perf data验证了这一点parser_test.go标签中的单引号会被去除例如load10.00解析出的perfdata标签值为load1见 valid output 4。状态度量nagios_state由Parse主流程parser.go生成字段如下字段说明service_output管道符左侧的状态文本去除首尾空白long_service_output多行长输出的合并文本多行之间用换行符连接仅当存在长输出时才出现state插件退出码映射的状态值03由 exec 插件的退出码处理钩子补充例如PING OK样例生成的状态度量nagios_state service_outputPING OK - Packet loss 0%, RTA 0.30 ms,long_service_outputThis is a long output\nwith three lines五、阈值格式解析规则Nagios 插件的阈值支持多种格式对应 nagios-plugins.org 的 Threshold format 规范parseThreshold 完整实现了这些情况并返回(vmin, vmax)一对边界值阈值写法含义解析结果10只有上界下界隐含为 0(0, 10)10:下界为 10上界无限制(10, MaxFloat64)~:10下界无限制~代表负无穷上界为 10(MinFloat64, 10)10:20完整区间(10, 20)10:20:30非法格式含两个冒号返回ErrBadThresholdFormat其中MaxFloat64与MinFloat64在源码中以常量形式定义parser.go用于表示无限边界。对应的单测 TestParseThreshold 覆盖了上述全部情况。此外阈值中带前缀时表示反向区间语义落在区间内才告警解析器会据此将阈值写入*_le/*_ge字段普通阈值则写入*_lt/*_gt字段。valid output 4中的load10.00;~:4;0:6;0;即为典型示例parser_test.goload1: warning_ltMinFloat64, warning_gt4, critical_le0, critical_ge6, min0六、退出码与 state 状态字段Nagios 插件通过退出码表达服务状态标准定义如下来源Nagios Plugin API Plugin Return Codes退出码状态含义0OK正常1WARNING警告2CRITICAL严重3UNKNOWN未知Telegraf 将这一语义落到nagios_state度量的state字段上。实现位于 AddState 与 getExitCode命令正常结束无错误时state 0命令以非零码退出时从*exec.ExitError中取出真正的进程退出码通过syscall.WaitStatus的ExitStatus()任何异常情况错误类型不对、退出码越界、解析不出退出码都会回退为 UNKNOWN即state 3当状态为 UNKNOWN 时错误信息会被写入service_output字段若原输出为空确保度量本身包含了可排障的信息。源码注释特别说明这里不抛出错误是有意设计——错误信息会随service_output输出用户可在查询结果中直接看到失败原因。exec插件在 processCommand 中调用该钩子即使命令失败也解析输出随后用exitCodeHandler补齐state字段。相关行为在 TestTryAddState 中被验证例如非可解析错误 → state3 且 service_output 为错误文本、正常执行 → state0 追加到已有度量等场景。七、完整解析流程与多行处理从源码主流程Parse可以梳理出完整的解析步骤逐行扫描输出取第一行按|切分若存在性能数据部分调用parsePerfData生成nagios度量将管道符左侧内容存入service_output继续读取后续行作为长输出合并到long_service_output若长输出中再次出现|其右侧内容也按性能数据解析对应check_disk的多段 perfdata 场景最后生成nagios_state度量并追加到结果尾部所有度量的时间戳统一取解析时刻timeFunc().UTC()默认time.Now。若第一行同时包含多于一个|则视为非法输出返回错误illegal output format。八、验证与调试仓库自带完善的测试套件可直接运行验证解析行为go test ./plugins/parsers/nagios/...测试文件 parser_test.go 覆盖了多种真实插件输出PING、TCP、负载、磁盘空间的解析结果断言无性能数据、畸形性能数据、UNKNOWN 状态的容错处理阈值格式各分支基准测试BenchmarkParsing用于评估解析性能。如果你希望亲手验证也可以直接把 Nagios 插件的输出用 Telegraf 跑一遍例如[[inputs.exec]] commands [/usr/lib/nagios/plugins/check_ping -H 127.0.0.1 -w 100,20% -c 200,50%] data_format nagios配置完成后用telegraf --test --config 你的配置.conf查看实时解析结果。九、适用前提与注意事项适用于标准 Nagios 插件输出解析器针对 Nagios Plugin API 约定设计非标准格式如普通命令的任意文本输出应改用influx、json、value等其它数据格式退出码语义依赖 exec 插件state字段由inputs.exec与nagios解析器协同产生若通过其它输入插件如execd使用该解析器需自行确认退出码处理路径UNKNOWN 兜底任何解析异常都会以state3呈现并尽量保留错误信息到service_output监控告警时建议将该状态一并纳入判断完整的输入数据格式清单参见 docs/DATA_FORMATS_INPUT.md其中已收录 Nagios 条目。十、小结Telegraf 的nagios数据格式解析器让用户可以零改造地接入 Nagios 生态中成千上万的现成监控插件inputs.exec负责执行、nagios解析器负责把状态文本、性能数据、阈值和退出码完整映射为结构化时序度量。从配置一行data_format nagios到通过nagios/nagios_state两类度量在 InfluxDB、Prometheus 等时序库中建图与告警整个过程已在 parser.go 与 parser_test.go 中被实现和验证可作为直接落地的可靠参考。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考