目录

Telegraf:InfluxDB 开源时序数据采集 Agent,300+插件生态实战指南

Telegraf:InfluxDB 开源时序数据采集 Agent,300+ 插件生态实战指南

Telegraf 是 InfluxDB 官方维护的开源数据采集 Agent,主打「收集-处理-聚合-写入」全流程,无需任何外部依赖即可编译为独立静态二进制。截至 2026 年 5 月,项目拥有 17,200+ Stars1,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 在内存中维护两份数据状态:

  1. 主进程:按 interval 从各 Input 插件拉取原始数据
  2. 聚合器:按 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 1700000000000000000

4. 配置 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 -f

Docker 部署

# 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_PROCHOST_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-100000
  • collection_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/