Telegraf:InfluxDB 开源时序数据采集 Agent,300+插件生态实战指南
posts posts 2026-05-16T15:10:00+08:00Telegraf 是 InfluxDB 官方开源的指标采集Agent,支持300+输入/输出插件,覆盖系统监控、云服务、消息队列等场景。本文从核心架构、插件生态、快速配置到生产部署进行完整解读,助你搭建现代化可观测性基础设施。技术笔记监控, InfluxDB, 时序数据, DevOps, 可观测性, Golang, 插件系统Telegraf:InfluxDB 开源时序数据采集 Agent,300+ 插件生态实战指南
Telegraf 是 InfluxDB 官方维护的开源数据采集 Agent,主打「收集-处理-聚合-写入」全流程,无需任何外部依赖即可编译为独立静态二进制。截至 2026 年 5 月,项目拥有 17,200+ Stars 和 1,200+ 贡献者,插件生态覆盖 300+ 输入输出模块,是时序监控领域的事实标准工具之一。
本文目标:从架构设计、插件生态、快速配置到生产部署,提供从入门到精通的完整实践指南。
你将学到什么
- Telegraf 的核心架构与设计哲学
- 300+ 插件生态全景图与选型思路
- TOML 配置文件的规范写法与调试技巧
- Input/Processor/Aggregator/Output 四阶段处理流程
- 生产环境部署最佳实践与性能调优
核心架构:四阶段数据处理流水线
Telegraf 的数据处理分为四个阶段:
Inputs → Processors → Aggregators → Outputs| 阶段 | 作用 | 示例插件 |
|---|---|---|
| Input | 数据源采集 | cpu, mem, kafka, mqtt |
| Processor | 数据转换/过滤 | regex, converter, pivot |
| Aggregator | 数据聚合/统计 | basicstats, minmax, valuecounter |
| Output | 数据输出目标 | influxdb, prometheus, file |
每个阶段均支持多实例并发,数据通过「收集间隔(interval)」和「刷新间隔(flush_interval)」解耦。
收集间隔 vs 刷新间隔
[agent]
interval = "10s" # 每10秒从 inputs 收集一次数据
flush_interval = "10s" # 每10秒将数据刷新到 outputs
metric_buffering = 10000 # 内存缓冲区上限(条)关键原则:flush_interval 必须 >= interval,否则会导致数据积压甚至丢数据。
双进程架构:主进程 + 聚合器
Telegraf 在内存中维护两份数据状态:
- 主进程:按
interval从各 Input 插件拉取原始数据 - 聚合器:按
flush_interval对窗口期内数据做聚合后推送至 Output
两个进程通过**环形缓冲区(metric buffer)**通信,缓冲区满时会丢弃最老的数据并记录 metrics.dropped 指标。
插件生态详解
Input 插件(数据采集源)
Telegraf 的 Input 插件按场景分为以下大类:
系统监控
[[inputs.cpu]]
percpu = true
totalcpu = true
[[inputs.mem]]
[[inputs.disk]]
paths = ["/", "/data"]
[[inputs.net]]
interfaces = ["eth0", "en0"]
[[inputs.diskio]]
[[inputs.processes]]云服务与中间件
# Docker 容器指标
[[inputs.docker]]
endpoint = "unix:///var/run/docker.sock"
# Kubernetes
[[inputs.kubernetes]]
url = "http://127.0.0.1:10255"
# MySQL
[[inputs.mysql]]
servers = ["root:password@tcp(127.0.0.1:3306)/"]
# Kafka
[[inputs.kafka_consumer]]
brokers = ["localhost:9092"]
topics = ["metrics"]消息队列与协议
[[inputs.mqtt_consumer]]
servers = ["tcp://localhost:1883"]
topics = ["device/+/data"]
[[inputs.amqp_consumer]]
servers = ["amqp://localhost:5672"]
queue = "telegraf"
[[inputs.snmp]]
agents = ["udp://localhost:161"]
version = "2c"
community = "public"IoT 与工业协议
# OPC UA 工业物联网
[[inputs.opcua]]
endpoint = "opc.tcp://localhost:4840"
certificate = "/etc/telegraf/cert.pem"
key = "/etc/telegraf/key.pem"
# Modbus TCP
[[inputs.modbus]]
name = "PLC1"
type = "tcp"
timeout = "5s"
controllers = [{name = "modbus",baudrate = 9600, parity="E"}]Output 插件(数据导出目标)
# InfluxDB(时序数据库)
[[outputs.influxdb]]
urls = ["http://localhost:8086"]
database = "telegraf"
username = "telegraf"
password = "password"
# Prometheus(指标抓取)
[[outputs.prometheus_client]]
listen = ":9273"
metric_version = 2
# Kafka
[[outputs.kafka]]
brokers = ["localhost:9092"]
topic = "telegraf"
# MQTT
[[outputs.mqtt]]
brokers = ["tcp://localhost:1883"]
topic = "telegraf/all"Processor 插件(数据转换)
# 正则提取字段
[[processors.regex]]
[[processors.regex.tags]]
key = "uri"
pattern = "^/api/v([0-9]+)"
replacement = "v${1}"
# 类型转换
[[processors.converter]]
[processors.converter.fields]
integer = ["value", "count"]
float = ["rate"]
string = ["status"]
# 顶点数过滤
[[processors.topk]]
[processors.topk.config]
topk = 5
period = "30s"
metric_version = 2
fields = ["cpu"]Aggregator 插件(数据聚合)
# 基础统计聚合
[[aggregators.basicstats]]
period = "30s"
stats = ["count", "min", "max", "mean", "s2", "sum"]
# 分位数聚合(用于告警异常检测)
[[aggregators.quantile]]
period = "60s"
quantile = 0.99
metric_version = 2快速上手:5 分钟跑通第一个配置
1. 安装(macOS)
# Homebrew
brew install telegraf
# 或下载二进制
curl -LO https://dl.influxdata.com/telegraf/releases/telegraf_latest_darwin_amd64.tar.gz
tar xzf telegraf_latest_darwin_amd64.tar.gz
sudo cp telegraf /usr/local/bin/2. 最小配置示例
# telegraf.conf
[agent]
interval = "10s"
flush_interval = "10s"
round_interval = true
# 输入:CPU + 内存 + 磁盘
[[inputs.cpu]]
percpu = true
[[inputs.mem]]
[[inputs.disk]]
# 输出:标准输出(调试用)
[[outputs.file]]
files = ["stdout"]
data_format = "influx"3. 启动与验证
# 前台运行(调试)
telegraf --config telegraf.conf --test
# 后台运行
telegraf --config telegraf.conf
# 查看输出
telegraf --config telegraf.conf --test | head -20正确输出类似:
> cpu,cpu=cpu0 usage_idle=98.5,usage_system=1.2,usage_user=0.3 1700000000000000000
> mem,host=localhost free=16384,used=8192 17000000000000000004. 配置 InfluxDB 输出
生产环境中通常将数据写入 InfluxDB:
[[outputs.influxdb]]
urls = ["http://192.168.1.100:8086"]
database = "telegraf"
retention_policy = "autogen"
username = "admin"
password = "password"
timeout = "5s"
# 高可用集群配置
[[outputs.influxdb.urls]]
urls = ["http://node1:8086", "http://node2:8086", "http://node3:8086"]配置文件规范与最佳实践
TOML 语法要点
Telegraf 使用 TOML 格式,以下是常见坑点:
正确写法
[[inputs.cpu]]
percpu = true # 布尔值
totalcpu = true
[[inputs.mysql]]
servers = ["root:password@tcp(127.0.0.1:3306)/"] # 字符串数组错误写法(整数数组)
# ❌ 错误
interval = 10 # 应该是 "10s"
# ✅ 正确
interval = "10s"插件顺序与全局设置
# 全局 [agent] 设置必须在 [[inputs]] 之前
[agent]
interval = "10s"
flush_interval = "10s"
metric_buffering = 10000
collection_jitter = "0s"
# 顺序:agent → inputs → processors → aggregators → outputs
[[inputs.cpu]]
percpu = true环境变量注入
[[outputs.influxdb]]
urls = ["${INFLUX_URL}"]
token = "${INFLUX_TOKEN}"
org = "${INFLUX_ORG}"
bucket = "${INFLUX_BUCKET}"启动时传入环境变量:
INFLUX_URL=http://localhost:8086 \
INFLUX_TOKEN=my-token \
telegraf --config telegraf.conf多配置文件拆分
/etc/telegraf/
├── telegraf.conf # 主配置
├── conf.d/
│ ├── inputs.conf # 输入插件
│ ├── processors.conf # 处理器
│ └── outputs.conf # 输出目标在主配置中启用自动加载:
# telegraf.conf
[agent]
config_dir = "/etc/telegraf/conf.d"生产环境部署
Systemd 守护进程(Linux)
# /etc/systemd/system/telegraf.service
[Unit]
Description=Telegraf Agent
After=network-online.target
[Service]
ExecStart=/usr/bin/telegraf -config /etc/telegraf/telegraf.conf
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target启用服务:
sudo systemctl enable telegraf
sudo systemctl start telegraf
sudo journalctl -u telegraf -fDocker 部署
# docker-compose.yml
version: '3'
services:
telegraf:
image: telegraf:1.29
container_name: telegraf
restart: unless-stopped
volumes:
- ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- HOST_PROC=/host/proc
- HOST_SYS=/host/sys
- HOST_ETC=/host/etc
network_mode: host
pid_mode: host注意:Docker 部署时需要挂载
HOST_PROC、HOST_SYS等路径以访问宿主机指标。
高可用集群架构
┌─────────────────────────┐
│ Load Balancer (VIP) │
└─────────┬───────────────┘
│
┌──────────────┼──────────────┐
│ │ │
Telegraf Telegraf Telegraf
Agent 1 Agent 2 Agent N
│ │ │
└──────────────┼──────────────┘
│
┌─────────┴───────────────┐
│ InfluxDB Cluster │
│ (3-node InfluxDB OSS) │
└─────────────────────────┘每个 Telegraf 实例写入所有 InfluxDB 节点:
[[outputs.influxdb]]
urls = [
"http://influx1:8086",
"http://influx2:8086",
"http://influx3:8086"
]
content_encoding = "gzip" # 节省带宽
timeout = "5s"性能调优参数
[agent]
# 内存缓冲(根据指标量调大)
metric_buffering = 100000
# 收集抖动(避免多实例同时写入)
collection_jitter = "3s"
# 刷新间隔(配合 buffer)
flush_interval = "10s"
flush_jitter = "1s"
# 监控自身性能
debug = false
logtarget = "file"
logfile = "/var/log/telegraf/telegraf.log"关键调优指标:
metric_buffering:默认 10000,建议在高速采集场景(Kafka、物联网)调至 50000-100000collection_jitter:多 Agent 部署时,错开 0-5s 的抖动避免 InfluxDB 写入峰值flush_jitter:与 collection_jitter 类似,防止刷新瞬间并发
监控自身健康状况
# 开启 Telegraf 自监控
[[inputs.internal]]
collect_memstats = true
# 输出到 Prometheus(可被 Prometheus 抓取)
[[outputs.prometheus_client]]
listen = ":9273"Prometheus 抓取规则:
- job_name: telegraf
static_configs:
- targets: ['telegraf:9273']常见问题排查
问题1:指标数据丢失
症状:InfluxDB 中数据不连续,存在丢点数情况。
排查步骤:
# 1. 检查 Telegraf 日志
journalctl -u telegraf | grep -i "dropped\|buffer\|error"
# 2. 查看 dropped 指标
curl -s localhost:9273/metrics | grep telegraf_metrics_dropped
# 3. 调大缓冲区
[agent]
metric_buffering = 200000问题2:插件启动失败
症状:Error: plugin inputs.xxx: not found
排查:确认插件是否被编译进二进制。
# 查看已启用的插件列表
telegraf --test --config /dev/null 2>&1 | grep "inputs\."
# 特定插件测试
telegraf --test --config <(cat telegraf.conf) 2>&1问题3:Kafka Consumer 重复消费
排查:确认 consumer group 配置唯一。
[[inputs.kafka_consumer]]
brokers = ["localhost:9092"]
topics = ["metrics"]
consumer_group = "telegraf-cluster-1" # 集群内唯一
offset = "oldest"问题4:时间戳偏差
症状:指标时间与实际时间偏差几分钟。
原因:precision 配置缺失导致。
# 在 agent 或 output 中指定时间精度
[agent]
precision = "ms"插件开发:自定义 Input 实战
Telegraf 支持编写自定义插件。以下是一个最小 Input 插件示例:
// plugins/inputs/example/example.go
package example
import (
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/inputs"
)
type Example struct {
URL string `toml:"url"`
}
func (e *Example) Description() string {
return "Example input plugin"
}
func (e *Example) SampleConfig() string {
return `url = "http://localhost:8080"`
}
func (e *Example) Gather(acc telegraf.Accumulator) error {
acc.AddFields("example", map[string]interface{}{
"value": 42,
}, map[string]string{
"url": e.URL,
})
return nil
}
func init() {
inputs.Add("example", func() telegraf.Input {
return &Example{URL: "http://localhost:8080"}
})
}编译进 Telegraf:
# 在 plugins/inputs/example/ 目录开发后
go build -o telegraf ./cmd/telegraf总结:何时该用 Telegraf
推荐使用场景:
- 搭建 InfluxDB + Telegraf + Grafana 可观测性栈
- 多源异构数据(系统、云服务、IoT、工业协议)需要统一采集
- 需要插件式扩展的数据采集管道
- 时序数据需要做本地聚合后再上报
不推荐场景:
- 纯日志采集(用 Vector、Fluentd 替代)
- 实时流处理(用 Kafka Flink 替代)
- 单机轻量监控(用 Prometheus node_exporter 替代)
Telegraf 的核心竞争力在于 300+ 插件生态 + 零依赖静态二进制 + InfluxDB 原生集成。对于已经采用 InfluxDB 的团队,Telegraf 是数据采集的首选方案;对于多源数据采集场景,Telegraf 的插件体系也能大幅降低集成成本。
参考链接:
- 官方文档:https://docs.influxdata.com/telegraf/
- GitHub:https://github.com/influxdata/telegraf
- 插件列表:https://telegraf.dev/plugins/