Telegraf OpenNTPD Input 插件:用 ntpctl 采集 OpenNTPD 对等节点、传感器与时钟同步状态
2026/9/14 3:53:59 网站建设 项目流程

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),到openntpdopenntpd_sensorsopenntpd_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()函数设定):

配置项类型默认值说明
binarystring/usr/sbin/ntpctlntpctl二进制路径,OpenBSD 上通常位于此处,可按发行版调整
use_sudoboolfalse是否以sudo包装执行命令
timeoutduration5s允许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_Aliasntpctl路径归组,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/pollstratum标签为-
  • DNS 解析失败:第一行形如not resolved from pool pool.nl.ntp.org时,插件取该行最后一个字段作为remote标签(保留原始 DNS 名),而非not(解析逻辑,由 TestParseSimpleOutputServersDNSError 验证);
  • 单位剥离next/polls后缀、offset/delay/jitterms后缀都会被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 1

parseStatusLine 以,切分后逐项识别,每次 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的状态指标,可作为端到端解析行为的可执行规格。

使用方式小结

  1. 确认目标机器运行 OpenNTPD 且ntpctl可执行(which ntpctl,通常为/usr/sbin/ntpctl);
  2. 按上文任选其一解决权限:将telegraf用户加入ntpd组(推荐)或配置use_sudo = true+ sudoers 规则;
  3. 在 Telegraf 配置文件中加入[[inputs.openntpd]]段(必要时显式设置binarytimeout);
  4. 重启 Telegraf 后,即可在输出端看到openntpdopenntpd_sensorsopenntpd_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),仅供参考

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

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

立即咨询