跳到主要内容

Telegraf集成

直接将 Telegraf 的监控指标写入 IotEdgeDB,无需改造现有采集链路,就能把服务器、数据库、容器、云服务和 IoT 设备的指标统一汇聚到 IotEdgeDB 中。

概述

Telegraf 是一个非常成熟的指标采集代理,拥有 300+ 个输入插件,可以从几乎任何系统、服务或设备中采集数据。

这意味着你可以继续沿用 Telegraf 现有的采集能力,把系统监控、数据库指标、云服务遥测、工业 IoT 数据等,直接写入 IotEdgeDB 的高性能时序存储中。

主要特点:

  • 300+ 输入插件——覆盖系统、数据库、云服务、容器、消息队列、IoT 等常见场景
  • 官方HTTP输出插件——Telegraf 直接将指标发送到 IotEdgeDB
  • MessagePack 传输——更高效的写入格式
  • gzip 压缩——降低网络带宽开销
  • Parquet 存储——数据以开放格式保存,便于后续分析
  • SQL 查询——写入后即可直接使用 SQL 分析
  • 避免供应商锁定——数据始终保持可迁移、可访问

为什么 Telegraf 很重要

在监控生态里,Telegraf 的地位非常特殊。它不是某个单一场景的采集器,而是一个高度插件化的指标接入层。正因为如此,它能在不改动采集架构的前提下,接入各种来源的数据。

插件驱动的架构

Telegraf 的能力主要来自它的插件体系,整体分为四类:

  • 输入插件(Input)——从系统、服务和 API 采集指标
  • 处理插件(Processor)——在传输过程中对指标进行转换和过滤
  • 聚合插件(Aggregator)——按时间窗口计算统计值
  • 输出插件(Output)——把指标发送到后端存储,例如 IotEdgeDB

有了 300+ 个输入插件,Telegraf 几乎可以采集任何东西:

类别示例插件数量
系统CPU、内存、磁盘、网络、进程15+
数据库MySQL、PostgreSQL、MongoDB、Redis、Elasticsearch50+
云服务AWS CloudWatch、Azure Monitor、Alibaba Cloud30+
容器Docker、Kubernetes、containerd10+
消息队列Kafka、RabbitMQ、NATS、MQTT15+
Web 服务器NGINX、Apache、HAProxy、Traefik10+
IoT / 工业Modbus、OPC-UA、S7、SNMP20+

轻量、稳定、经过实战验证

Telegraf 是一个单文件 Go 程序,没有复杂的外部依赖,支持 Linux、Windows、macOS 以及 ARM 设备。它已经在大量生产环境中运行,从初创团队到大型企业都在使用。

InfluxData 最初是为了配合 InfluxDB 打造它的,但 Telegraf 本身支持很多输出目标。

IotEdgeDB 的插件使用

IotEdgeDB 输出插件的配置非常简单:

[[outputs.http]]
url = "http://127.0.0.1:8000/api/v1/write/line-protocol"
data_format = "influx"
[outputs.http.headers]
x-iedb-database = "default"
x-api-key = "your-api-key-here"

就这几行,就能把 Telegraf 接到 IotEdgeDB 上。

配置项说明

选项说明默认值
urlIotEdgeDB 的 写入端点必填
api_keyIotEdgeDB API Token,支持环境变量必填
databaseIotEdgeDB 中的目标数据库default
content_encoding压缩方式(gzip 或空)
timeout请求超时时间5s

这个插件使用 IotEdgeDB 的 行协议格式进行数据传输。配合 gzip 压缩后,尤其在高基数指标场景下,可以显著减少网络带宽消耗。

完整示例:采集系统指标

下面用一个完整的例子来演示如何把服务器的 CPU、内存、磁盘、网络和系统指标写入 IotEdgeDB。

先创建 telegraf.conf

# Telegraf Agent 全局配置
[agent]
interval = "10s" # 数据采集频率
round_interval = true # 将采集间隔对齐到整时间点
flush_interval = "10s" # 数据发送频率
flush_jitter = "0s" # 避免所有 Agent 同时发送造成拥塞
metric_batch_size = 1000 # 每个批次的最大指标数量
metric_buffer_limit = 10000 # 单个输出插件缓冲区的最大指标数量
collection_jitter = "0s" # 采集抖动的最大值,用于分散采集
precision = "" # 时间戳精度
debug = false # 是否开启调试模式
quiet = false # 是否仅显示错误日志
logfile = "" # 日志文件路径,留空则输出到 stderr
hostname = "" # 指标中使用的 host tag,留空则使用系统主机名
omit_hostname = false # 是否不在指标中设置 host tag

# 采集系统整体进程状态
[[inputs.processes]]

# CPU 采集配置
[[inputs.cpu]]
## 是否报告每个 CPU 核心的统计信息
percpu = true
## 是否报告 CPU 整体统计信息
totalcpu = true
## 是否采集原始 CPU 时间指标(如 time_user)
collect_cpu_time = false
## 是否计算并上报所有非空闲 CPU 状态的累计时间(time_active)
report_active = false
## 是否采集 CPU 核心 ID 和物理 ID 标签(仅部分平台支持)
core_tags = false

# =========================================
# Memory (内存) 采集配置
# =========================================
[[inputs.mem]]
# 采集系统内存指标(可用内存、已用内存、缓存、Buffers等)
# 此插件无需特殊参数,保持空配即可默认采集所有核心指标

# =========================================
# Disk (磁盘使用率) 采集配置
# =========================================
[[inputs.disk]]
## 如果你只想采集指定的挂载点,取消下行的注释并修改
# mount_points = ["/", "/data"]

## 忽略一些临时的虚拟文件系统,只采集物理磁盘
ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]

# =========================================
# Disk IO (磁盘读写速率) 采集配置
# =========================================
[[inputs.diskio]]
## 默认采集所有物理磁盘的 IO(读写字节数、读写次数、耗时等)
## 如果只想采集特定的磁盘,可以这样配:
# devices = ["sda", "sdb", "nvme0n1"]

# =========================================
# Network (网络流量) 采集配置
# =========================================
[[inputs.net]]
## 采集网卡的收发字节数(bytes_recv / bytes_sent)、错包、丢包等
## 默认采集所有网卡。如果只想采集主要的网卡,可以指定:
# interfaces = ["eth0", "en0", "wlan0"]

# =========================================
# System (系统整体负载)
# =========================================
[[inputs.system]]
# 采集系统的基础指标,如:load1, load5, load15(系统负载)和 uptime(运行时间)
# 监控面板的头部通常都需要这些宏观指标
fielddrop = ["uptime_format"]

# 输出到 GreptimeDB 的 HTTP API 配置
[[outputs.http]]
url = "http://localhost:8000/api/v1/write/line-protocol"
data_format = "influx"
[outputs.http.headers]
x-iedb-database = "default"
x-api-key = "$token"

# =========================================
# 聚合器:合并同类项 (非常适合列式时序数据库)
# =========================================
[[aggregators.merge]]
## 告诉 Telegraf:如果发现表名(Measurement)、标签(Tags)和时间戳(Timestamp)完全一致的数据
## 请不要分开传,直接把它们的 Fields 合并成一个超级大字典,然后再发给输出端。
drop_original = true

这份配置会:

  • 每 10 秒采集一次指标
  • 每次最多打包 1,000 条指标再刷新
  • 使用 gzip 压缩传输数据
  • 忽略虚拟文件系统
  • 采集每个 CPU 核心以及总 CPU 使用率

如何运行 Telegraf

方式一:使用 Docker


# 启动 Telegraf
sudo docker run -d \
--name telegraf \
-e TOKEN=$TOKEN \
-v $(pwd)/telegraf.conf:/etc/telegraf/telegraf.conf:ro \
-v /:/hostfs:ro \
-e HOST_ETC=/hostfs/etc \
-e HOST_PROC=/hostfs/proc \
-e HOST_SYS=/hostfs/sys \
-e HOST_VAR=/hostfs/var \
-e HOST_RUN=/hostfs/run \
-e HOST_MOUNT_PREFIX=/hostfs \
telegraf:1.37

挂载宿主机文件系统后,Telegraf 就能在容器里读取主机的系统指标。

方式二:使用 Systemd 原生安装

如果你是在物理机或虚拟机上直接安装 Telegraf,可以参考下面的方式:

# 安装 Telegraf 1.37+(Debian / Ubuntu)
wget https://dl.influxdata.com/telegraf/releases/telegraf_1.37.0-1_amd64.deb
sudo dpkg -i telegraf_1.37.0-1_amd64.deb

# 复制配置文件
sudo cp telegraf.conf /etc/telegraf/telegraf.conf

# 把 API Token 放到环境变量里
sudo systemctl edit telegraf
# 添加:Environment="TOKEN=your-token-here"

# 启动服务
sudo systemctl enable telegraf
sudo systemctl start telegraf

# 查看状态
sudo systemctl status telegraf

验证数据是否已经写入 IotEdgeDB

Telegraf 启动后,先看日志确认它正在发送数据:

docker logs telegraf

然后查询 IotEdgeDB,确认表已经创建:

curl -X POST http://localhost:8000/api/v1/query \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"sql": "SHOW TABLES FROM telegraf"}'

如果写入成功,你应该能看到这些指标表:cpumemdiskdiskionetsystemprocessesswap

示例查询

下面是一些常见的查询示例。

CPU 使用情况

SELECT time, host, cpu, usage_user, usage_system, usage_idle
FROM telegraf.cpu
WHERE time > NOW() - INTERVAL '1 hour'
AND cpu = 'cpu-total'
ORDER BY time DESC
LIMIT 100;

内存使用情况

SELECT time, host, used_percent, available, used, total
FROM telegraf.mem
WHERE time > NOW() - INTERVAL '1 hour'
ORDER BY time DESC
LIMIT 50;

按挂载点查看磁盘空间

SELECT time, host, path, used_percent, free, total
FROM telegraf.disk
WHERE time > NOW() - INTERVAL '1 hour'
ORDER BY time DESC;

网络吞吐

SELECT time, host, interface, bytes_sent, bytes_recv, packets_sent, packets_recv
FROM telegraf.net
WHERE time > NOW() - INTERVAL '1 hour'
ORDER BY time DESC;

系统负载

SELECT time, host, load1, load5, load15, uptime
FROM telegraf.system
WHERE time > NOW() - INTERVAL '1 hour'
ORDER BY time DESC;

你还能采集什么

系统指标只是开始。Telegraf 还能采集很多其他类型的数据。

数据库

无需自己写埋点,就能监控数据库性能:

# PostgreSQL
[[inputs.postgresql]]
address = "postgres://user:password@localhost/dbname"

# MySQL
[[inputs.mysql]]
servers = ["user:password@tcp(localhost:3306)/"]

# MongoDB
[[inputs.mongodb]]
servers = ["mongodb://localhost:27017"]

# Redis
[[inputs.redis]]
servers = ["tcp://localhost:6379"]

容器与编排

# Docker 容器
[[inputs.docker]]
endpoint = "unix:///var/run/docker.sock"

# Kubernetes
[[inputs.kubernetes]]
url = "http://localhost:10255"

云服务

# AWS CloudWatch
[[inputs.cloudwatch]]
region = "us-east-1"
namespace = "AWS/EC2"

# Azure Monitor
[[inputs.azure_monitor]]
subscription_id = "your-subscription-id"

消息队列

# Kafka
[[inputs.kafka_consumer]]
brokers = ["localhost:9092"]
topics = ["telegraf"]

# RabbitMQ
[[inputs.rabbitmq]]
url = "http://localhost:15672"

IoT 与工业场景

# MQTT 传感器
[[inputs.mqtt_consumer]]
servers = ["tcp://localhost:1883"]
topics = ["sensors/#"]

# Modbus 工业设备
[[inputs.modbus]]
name = "device"
slave_id = 1
timeout = "1s"

这些插件以及更多扩展,现在都可以直接和 IotEdgeDB 配合使用。

为什么“可移植存储”很重要

Telegraf 负责采集,IotEdgeDB 负责存储,而且将数据保存在标准的 Parquet 文件中。这样一来,数据就不再被锁死在某个私有格式里。

Parquet 是开放格式,几乎所有数据工具都能读取:DuckDB、Spark、pandas、Snowflake 都可以直接使用。

这意味着:

  • 你可以把 5 年前的 CPU 指标直接拿到 Jupyter Notebook 里分析
  • 你可以把监控数据和业务数据放到同一个数仓里联查
  • 你也可以随时迁移到其他分析工具,而不用重做数据导出

Telegraf 提供采集灵活性,IotEdgeDB 提供存储可移植性。组合起来,就是一个没有供应商锁定的监控方案。

总结

IotEdgeDB 的 Telegraf 输出插件,让监控数据接入变得更简单,也更开放:

  • 300+ 输入插件,覆盖几乎所有常见数据源
  • 使用 MessagePack 和 gzip,高效传输指标
  • 数据以标准 Parquet 格式保存,便于后续分析
  • 可以直接用 SQL 查询时序指标
  • 数据始终可迁移、可访问,没有厂商锁定

如果你已经在用 Telegraf,那么切到 IotEdgeDB 只需要改一下输出配置。如果你正在搭建新的监控系统,Telegraf + IotEdgeDB 能同时给你采集广度和存储灵活性。

现在就可以试试这个插件了。