Telegraf OpenNTPD Input 插件:用 ntpctl 采集 OpenNTPD 对等节点、传感器与时钟同步状态
【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf
本篇指南基于 Telegraf 仓库中的 openntpd input 插件文档 及其源码实现,讲解如何通过ntpctl命令采集 OpenNTPD 的 NTP 同步质量指标:从插件配置、权限方案(组权限 / sudo),到openntpd、openntpd_sensors、openntpd_status三类指标的字段含义与解析原理。读完后你可以将该插件部署到使用 OpenBSD/NetBSD 系时间服务的服务器上,并结合源码理解ntpctl -s all输出是如何被逐行解析成 Telegraf 指标的。
插件工作原理
该插件通过执行 OpenNTPD 自带的ntpctl命令来采集指标。从源码看(openntpd.go),实际执行的命令固定为:
ntpctl -s all其中-s all表示同时输出状态摘要行、peer(对等节点)段与 sensor(硬件/GPS 传感器)段。插件随后用bufio.Scanner按行扫描输出,根据peer/sensor这两个段标题维护一个 section 状态机,把摘要行交给parseStatusLine,peer 双行条目交给parsePeer,sensor 双行条目交给parseSensor(Gather 实现)。
[!NOTE]
ntpctl二进制必须存在于系统上并可被 Telegraf 执行。插件支持通过sudo执行(见下文权限配置)。
插件标签:server, network;平台:all(自 Telegraf v1.12.0 引入)。
配置项说明
完整配置示例见插件随附的 sample.conf:
# Get standard NTP query metrics from OpenNTPD. [[inputs.openntpd]] ## Run ntpctl binary with sudo. # use_sudo = false ## Location of the ntpctl binary. # binary = "/usr/sbin/ntpctl" ## Maximum time the ntpctl binary is allowed to run. # timeout = "5s"各配置项与默认值(默认值由 插件注册代码 中的init()函数设定):
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
binary | string | /usr/sbin/ntpctl | ntpctl二进制路径,OpenBSD 上通常位于此处,可按发行版调整 |
use_sudo | bool | false | 是否以sudo包装执行命令 |
timeout | duration | 5s | 允许ntpctl运行的最长时间,超时后进程会被终止 |
关于timeout的底层实现:插件调用 internal.RunTimeout,超时后通过 WaitTimeout 先向进程(及其子进程)发送SIGTERM,再给予 5 秒KillGrace宽限期后SIGKILL,并返回ErrTimeout错误,避免采集被卡死的命令拖住整个 agent 轮次。
插件还支持 Telegraf 全局的插件级配置(指标/字段/标签过滤、别名、插件排序等),详见 CONFIGURATION.md。
权限配置
ntpctl通常需要访问 OpenNTPD 的 socket 才能执行成功,因此运行 Telegraf 的用户往往需要额外权限。文档推荐两种方式,可按环境任选其一。
方式一:组权限(推荐)
将telegraf用户加入ntpd组:
$ groups telegraf telegraf : telegraf $ usermod -a -G ntpd telegraf $ groups telegraf telegraf : telegraf ntpd修改组后需重启 Telegraf 服务使新组身份生效。
方式二:sudo 提权
在 Telegraf 配置中启用 sudo:
[[inputs.openntpd]] use_sudo = true从源码看(openntpdRunner),启用后实际执行的命令为sudo <binary> -s all。
同时更新 sudoers($ visudo),追加:
Cmnd_Alias NTPCTL = /usr/sbin/ntpctl telegraf ALL=(ALL) NOPASSWD: NTPCTL Defaults!NTPCTL !logfile, !syslog, !pam_session三条 sudoers 规则的作用:Cmnd_Alias把ntpctl路径归组,NOPASSWD允许免密执行,Defaults!NTPCTL !...关闭该命令的日志与 PAM session 开销。两种方式中请选用你认为最合适的方案。
指标详解
1. openntpd —— 每个对等节点一条指标
ntpctl -s all的 peer 段中每个节点占两行:第一行为地址/DNS 名(如212.129.9.36 from pool 0.debian.pool.ntp.org),第二行为统计行(wt tl st next poll offset delay jitter)。插件按列索引(peerTagI/peerFloatI/peerIntI 映射)提取字段:
- 标签(tags):
remote:远端对等节点地址或主机名stratum:远端节点的层(stratum)state_prefix:ntpctl 状态指示符,如活跃 peer 前的*;不存在时省略
- 字段(fields):
delay:到远端 peer 的往返延迟(毫秒;float)jitter:远端 peer 的平均偏差/jitter(毫秒;float)offset:对远端 peer 的平均相位偏移(毫秒;float)poll:轮询间隔(秒;int)next:距下次轮询的秒数(int)wt:peer 权重(int)tl:peer trust level(int)
几个值得注意的解析细节(均可在 parsePeer 中找到对应逻辑并有测试覆盖):
- 无效 peer:统计行呈
---- peer not valid ----时,offset/delay/jitter会被跳过,只保留wt/tl/next/poll,stratum标签为-; - DNS 解析失败:第一行形如
not resolved from pool pool.nl.ntp.org时,插件取该行最后一个字段作为remote标签(保留原始 DNS 名),而非not(解析逻辑,由 TestParseSimpleOutputServersDNSError 验证); - 单位剥离:
next/poll的s后缀、offset/delay/jitter的ms后缀都会被TrimSuffix去掉后按数值解析; - 活跃 peer:统计行首字段包含
*时记入state_prefix标签并整体后移一列,保证列索引不错位。
2. openntpd_sensors —— 每个硬件/GPS 传感器一条指标
传感器段(如nmea0 GPS的 GPS 时间源)每条同样为双行结构,解析逻辑见 parseSensor:
- 标签:
sensor:传感器设备名(如nmea0)refid:传感器参考 ID(如GPS)state_prefix:状态指示符,如活跃传感器前的*;不存在时省略
- 字段:
wt:传感器权重(int)gd:good 计数(int)st:stratum(int)next:距下次轮询秒数(int)poll:轮询间隔(秒;int)offset:传感器偏移(毫秒;float)correction:传感器修正量(毫秒;float)
3. openntpd_status —— 每次采集的系统级摘要
ntpctl -s all的第一行形如:
12/12 peers valid, 1/1 sensors valid, constraint offset -1s, clock synced, stratum 1parseStatusLine 以,切分后逐项识别,每次 gather 产出一条指标:
peers_valid/peers_total:当前有效 / 已配置的 peer 总数(由12/12分数解析)sensors_valid/sensors_total:当前有效 / 已配置的传感器数constraint_offset_s:约束偏移(秒;int,可负)clock_synced:本地时钟已同步为 1,否则为 0(源码保证该字段恒存在,见 clock_synced 兜底逻辑)stratum:本地时钟 stratum(int)
注意摘要行是可变句式:时钟未同步时不会出现clock synced片段,甚至缺少stratum段,例如0/4 peers valid, constraint offset 0s, clock unsynced(对应测试数据 outputNoSync),因此解析采用后缀/前缀匹配而非固定位置匹配。
示例输出
README 给出的典型 Line Protocol 输出:
openntpd,remote=194.57.169.1,stratum=2 tl=10i,poll=1007i,offset=2.295,jitter=3.896,delay=53.766,next=266i,wt=1i 1514454299000000000 openntpd_sensors,sensor=nmea0,refid=GPS,state_prefix=* wt=10i,gd=1i,st=0i,next=1i,poll=15i,offset=-0.673,correction=0.6 1514454299000000000 openntpd_status peers_valid=12i,peers_total=12i,sensors_valid=1i,sensors_total=1i,constraint_offset_s=-1i,clock_synced=1i,stratum=1i 1514454299000000000测试用例中ntpctl -s all完整输出对应的完整断言见 TestParseFullOutputAll:包含 12/12 有效 peer、一个nmea0GPS 传感器(state_prefix=*)以及peers_valid=12, peers_total=12, sensors_valid=1, sensors_total=1, constraint_offset_s=-1, clock_synced=1, stratum=1的状态指标,可作为端到端解析行为的可执行规格。
使用方式小结
- 确认目标机器运行 OpenNTPD 且
ntpctl可执行(which ntpctl,通常为/usr/sbin/ntpctl); - 按上文任选其一解决权限:将
telegraf用户加入ntpd组(推荐)或配置use_sudo = true+ sudoers 规则; - 在 Telegraf 配置文件中加入
[[inputs.openntpd]]段(必要时显式设置binary与timeout); - 重启 Telegraf 后,即可在输出端看到
openntpd、openntpd_sensors、openntpd_status三类指标。
延伸阅读
- 插件源码:plugins/inputs/openntpd/openntpd.go
- 解析测试用例(含各种边界输出:无效 peer、DNS 解析失败、未同步时钟):plugins/inputs/openntpd/openntpd_test.go
- 插件注册与构建标签(自定义构建时使用
inputs.openntpd):plugins/inputs/all/openntpd.go - 带超时的外部命令执行器:internal/exec.go、internal/exec_unix.go
- 全局插件配置说明:docs/CONFIGURATION.md
【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考