TDengine 接入 icinga2 监控指标:通过 taosAdapter OpenTSDB Telnet 接口实现监控数据入库
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
本文讲解如何把开源监控软件 icinga2 采集到的主机与服务监控指标(检查结果、性能数据)无缝写入 TDengine。核心方案是:在 taosAdapter 中启用 OpenTSDB Telnet 协议监听,并让 icinga2 的opentsdb-writer特性将数据发往 taosAdapter 对应的端口(默认为 6048)。读完全文,你将掌握完整的 taosAdapter 与 icinga2 两侧配置步骤、opentsdb_telnet各参数的取值与端口/数据库映射关系,以及入库结果的验证方法。
方案背景:icinga2 为什么可以直接对接 TDengine
icinga2 是一款开源主机、网络监控软件,最初由 Nagios 网络监控应用发展而来,目前遵从 GNU GPL v2 许可协议发行。它内置了opentsdb-writer特性,可以在监控检查结果产生后,将指标和性能数据以 OpenTSDB 的 telnet 协议(put语义)推送到远端接收端。
taosAdapter 是 TDengine 集群和应用程序之间的桥梁,除 WebSocket、InfluxDB v1、Prometheus 等接口外,还提供兼容 OpenTSDB JSON 和 telnet 格式的数据写入能力,并明确支持 icinga2 OpenTSDB writer 数据写入(见 taosAdapter 参考手册 的功能列表)。因此只需把 icinga2 的 OpenTSDB writer 指向 taosAdapter 的服务器和相应端口,即可利用 TDengine 对时序数据的高效存储查询性能和集群处理能力来长期保存 icinga2 的监控数据,整体数据链路为:
icinga2 (opentsdb-writer, telnet 协议) │ put icinga.xxx <timestamp> <value> tag=... ▼ taosAdapter [opentsdb_telnet] 监听 6046~6049 │ 按端口区分来源,schemaless 无模式写入 ▼ TDengine 数据库 icinga2(自动创建,超级表 + 规则生成的子表)前置条件
要将 icinga2 数据写入 TDengine,需要完成以下几方面准备工作:
- TDengine 集群已经部署并正常运行;
- taosAdapter 已经安装并正常运行(taosAdapter 随 TDengine server 一同安装,安装完成后可用
systemctl start taosadapter启动),具体细节请参考 taosAdapter 参考手册; - icinga2 已经安装(安装方式请参考 icinga2 官方安装文档)。
配置步骤一:配置 taosAdapter 接收 icinga2 数据
在 taosAdapter 配置文件(默认位置/etc/taos/taosadapter.toml)中使能opentsdb_telnet相关配置:
# 写入 Schemaless 数据时自动创建数据库 smlAutoCreateDB = true [opentsdb_telnet] enable = true maxTCPConnections = 250 tcpKeepAlive = false dbs = ["opentsdb_telnet", "collectd", "icinga2", "tcollector"] ports = [6046, 6047, 6048, 6049] user = "root" password = "taosdata"各配置项说明如下(默认值与 taosAdapter 参考手册 中 OpenTSDB 配置参数一节一致):
enable:启用 OpenTSDB Telnet 协议支持,默认值为false,此处必须显式打开。注意该接口本身没有认证机制,生产环境建议通过网络层控制访问来源;ports:OpenTSDB Telnet 监听端口,默认值为[6046, 6047, 6048, 6049]。四个端口分别对应不同的数据来源:6046 对应 OpenTSDB 客户端、6047 对应 collectd、6048 对应 icinga2、6049 对应 tcollector;dbs:指定各端口写入的目标数据库,与ports按位置一一对应:6046 → opentsdb_telnet、6047 → collectd、6048 → icinga2、6049 → tcollector。也就是说,icinga2 数据默认写入名为icinga2的数据库;如果希望改用其他库名(例如手册中另一套默认命名icinga2_tsdb),只需修改dbs中第 3 个元素即可。user 和 password 需填写实际 TDengine 配置的用户名密码;maxTCPConnections:最大 TCP 连接数,默认值250;tcpKeepAlive:是否启用 TCP KeepAlive,默认值false;smlAutoCreateDB:这是全局配置项,用于控制在 schemaless(无模式)协议写入时是否自动创建数据库。设置为true时,taosAdapter 会在接收到数据时自动创建对应的数据库(如果不存在);如果保持默认false,则必须手动创建icinga2数据库,否则写入会失败。
配置完成后需要重启 taosAdapter 使配置生效:
sudo systemctl restart taosadapter配置步骤二:配置 icinga2 的 OpenTSDB writer
- 使能 icinga2 的
opentsdb-writer特性(例如执行icinga2 feature enable opentsdb,特性启用后会在features-enabled目录下生成对应配置文件); - 修改配置文件
/etc/icinga2/features-enabled/opentsdb.conf,填写 taosAdapter 所在服务器的域名或 IP 地址,以及 taosAdapter 接收 icinga2 数据的端口(默认为 6048):
object OpenTsdbWriter "opentsdb" { host = "<taosAdapter's host>" port = <port for icinga2> }本机部署 taosAdapter 与 icinga2 时的完整示例:
object OpenTsdbWriter "opentsdb" { host = "127.0.0.1" port = 6048 }修改后重启 icinga2 使配置生效:
sudo systemctl restart icinga2验证方法
等待 10 秒左右后,使用taos客户端 shell 查询 TDengine,验证是否创建了相应数据库并写入数据:
taos> show databases; name | ================================= information_schema | performance_schema | icinga2 | Query OK, 3 row(s) in set (0.001867s) taos> use icinga2; Database changed. taos> show stables; name | ================================= icinga.service.users.state_... | icinga.service.users.acknow... | icinga.service.procs.downti... | icinga.service.users.users | icinga.service.procs.procs_min | icinga.service.users.users_min | icinga.check.max_check_atte... | icinga.service.procs.state_... | icinga.service.procs.procs_... | icinga.service.users.users_... | icinga.check.latency | icinga.service.procs.procs_... | icinga.service.users.downti... | icinga.service.users.users_... | icinga.service.users.reachable | icinga.service.procs.procs | icinga.service.procs.acknow... | icinga.service.procs.state | icinga.service.procs.reachable | icinga.check.current_attempt | icinga.check.execution_time | icinga.service.users.state | Query OK, 22 row(s) in set (0.002317s)从查询结果可以看到,taosAdapter 按照 icinga2 指标的命名把不同指标自动组织成了超级表(stables),例如:
icinga.check.latency、icinga.check.current_attempt、icinga.check.execution_time、icinga.check.max_check_attempt:检查(check)流程相关的性能指标;icinga.service.users.*、icinga.service.procs.*:icinga2 服务自身的运行状态指标(users、procs 状态,以及_min、downtime、acknowledgement、reachable等派生序列)。
注意:TDengine 中默认生成的子表名是根据规则生成的唯一 ID 值,而不是人为可读的名称,这是 schemaless 写入的默认行为。
仓库中的实现佐证:自动化测试如何复刻这条链路
本仓库的稳定性测试框架内置了一个专门用于验证该链路的 icinga2 容器环境,与上文的手动配置一一对应,可以当作一份可参考的部署样板:
容器构建脚本 icinga2/Dockerfile:基于 Ubuntu 20.04 安装
icinga2、monitoring-plugins与systemctl,执行icinga2 feature enable opentsdb启用 opentsdb 特性,然后通过环境变量TaosadapterIp(默认127.0.0.1)、TaosadapterPort(默认6048)声明 taosAdapter 的地址与端口,并用Icinga2Interval(默认10s)控制检查模板的间隔;特性配置文件模板 opentsdb.conf:
object OpenTsdbWriter "opentsdb" { host = "TaosadapterIp" port = TaosadapterPort }与官方文档中的配置结构完全一致,仅把地址与端口留作占位符;
容器入口脚本 entrypoint.sh:在容器启动时用
sed将占位符替换为实际注入的TaosadapterIp/TaosadapterPort值,随后执行systemctl restart icinga2——这与本文"修改配置后重启 icinga2"的步骤一致;测试框架的工具脚本 taosadapter.py 中维护了 taosAdapter 的默认 TOML 配置字典,其中包含
"opentsdb_telnet": {"enable": True},即测试环境同样通过开启opentsdb_telnet监听来接收 telnet 协议的 OpenTSDB 数据,印证了 taosAdapter 侧的使能方式是opentsdb_telnet.enable = true。
常见问题与注意事项
- 端口与库名的映射:
dbs与ports是按顺序对应的,icinga2 固定使用第 3 个端口(默认 6048),对应的库名是dbs数组第 3 个元素。若要调整库名,只改dbs不改ports即可,无需改动 icinga2 侧配置; - 自动建库:保持
smlAutoCreateDB = true可以让 taosAdapter 在首条数据到达时自动创建icinga2数据库,省去手工CREATE DATABASE;若关闭该选项,写入前必须先建库; - 接口无认证:OpenTSDB Telnet 接口没有认证机制,
user/password是 taosAdapter 与 TDengine 之间的连接凭据,而不是 icinga2 侧的登录信息。生产环境建议在防火墙或安全组层面限制 6046~6049 端口的访问来源; - 生效方式:taosAdapter 与 icinga2 两侧配置修改后都需要重启对应服务(
systemctl restart taosadapter/systemctl restart icinga2); - 命名说明:入库后的子表名为 TDengine 按规则生成的唯一 ID,查询时建议以超级表(
show stables中列出的指标名)为入口聚合查询。
完整步骤与验证结果参见 icinga2 写入,taosAdapter 侧参数详解参见 taosAdapter 参考手册。
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考