“`

“`
别再手动收集指标了!Telegraf 让服务器监控自动化,附企业级实战案例

为什么 Telegraf 值得关注

在现代运维和监控体系中,指标采集是基础设施的核心组成部分。无论是服务器性能监控、容器资源追踪,还是业务埋点数据收集,都需要一个可靠、高效的数据采集工具。Telegraf 正是为解决这一痛点而生的。

Telegraf 是 InfluxData 公司开源的插件驱动型服务器代理,专门用于收集、转换和发送指标与事件数据。它的设计理念是“插件化、配置化、高性能”,让用户无需编写大量代码,就能快速搭建起完整的监控数据采集管道。

Telegraf 的核心竞争力体现在以下几个方面:

插件生态极其丰富。Telegraf 内置了超过 200 个输入插件、100 个输出插件,覆盖了主流的数据库、消息队列、Web 服务、云平台、物联网设备等场景。你想要的指标采集方案,几乎都能在插件生态中找到对应的实现。

配置简单直观。Telegraf 使用 TOML 格式的配置文件,语法清晰易懂。即便是初次接触的用户,也能在几分钟内完成基本的采集配置。

性能表现优异。Telegraf 使用 Go 语言开发,天生具备优秀的并发处理能力和内存管理效率。它可以在资源受限的环境中稳定运行,同时处理大量指标数据。

与 InfluxDB 无缝集成。作为 TICK 技术栈的核心组件,Telegraf 与 InfluxDB 的配合堪称完美。当然,它也支持将数据发送到 Prometheus、Elasticsearch、Kafka 等多种数据存储和分析系统。

对于需要搭建监控平台、处理物联网数据、构建可观测性系统的工程师来说,Telegraf 是一个值得深入学习和长期使用的工具。


环境搭建

系统要求

Telegraf 对运行环境的要求相对宽松。它支持 Linux、Windows、macOS 等主流操作系统,也能在 Docker 容器中运行。在硬件方面,建议至少 512MB 内存,CPU 需求则取决于采集规模和插件复杂度。

安装方式

Telegraf 提供了多种安装方式,你可以根据实际场景选择最合适的方法。

使用包管理器安装(推荐用于 Linux 系统)

对于 Debian/Ubuntu 系统,可以添加 InfluxData 的官方仓库后安装:

# 添加 InfluxData GPG 密钥
curl --silent --location -O https://repos.influxdata.com/influxdata-archive.key
echo "943666881a1b8d9b849b74caebf02d3465d6beb716510d86a39f6c8e8dac7515  influxdata-archive.key" | sha256sum --check -
cat influxdata-archive.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive.gpg > /dev/null

# 添加仓库配置
echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive.gpg] https://repos.influxdata.com/debian stable main" | sudo tee /etc/apt/sources.list.d/influxdata.list

# 更新包列表并安装
sudo apt-get update
sudo apt-get install telegraf

对于 RHEL/CentOS 系统,使用 yum 或 dnf:

cat << EOF | sudo tee /etc/yum.repos.d/influxdata.repo
[influxdata]
name = InfluxData Repository - Stable
baseurl = https://repos.influxdata.com/stable/\$basearch/main
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdata-archive.key
EOF

sudo yum install telegraf

使用二进制文件安装(适用于所有系统)

直接从 GitHub Releases 页面下载对应平台的压缩包,解压后即可使用:

# 下载最新版本的 Telegraf(Linux AMD64)
wget https://dl.influxdata.com/telegraf/releases/telegraf_latest_linux_amd64.tar.gz
tar xf telegraf_latest_linux_amd64.tar.gz

# 进入目录
cd telegraf_*/

# 验证安装
./telegraf version

使用 Docker 运行

对于容器化部署场景,Docker 是最便捷的选择:

# 拉取官方镜像
docker pull telegraf

# 运行 Telegraf(需要挂载配置文件)
docker run -d \
  --name telegraf \
  --network host \
  -v /path/to/telegraf.conf:/etc/telegraf/telegraf.conf:ro \
  influxdata/telegraf

使用 Homebrew 安装(macOS)

在 macOS 环境中,如果已安装 Homebrew,安装过程非常简单:

brew install telegraf

# 验证安装
telegraf version

目录结构

安装完成后,Telegraf 会创建以下目录结构:

/etc/telegraf/          # 配置文件目录
/var/log/telegraf/      # 日志文件目录
/usr/lib/telegraf/      # 插件和库文件目录
/etc/opt/telegraf/      # 其他配置目录

核心功能详解

插件体系架构

Telegraf 采用插件化架构,所有功能都通过插件实现。插件分为四大类型:

输入插件(Inputs)负责从各种数据源采集指标。这是 Telegraf 的数据入口,支持 CPU、内存、磁盘、网络等系统指标,也支持 MySQL、Redis、Kafka 等应用指标,还支持 HTTP、MQTT、Modbus 等协议的数据采集。

处理器插件(Processors)负责对采集到的数据进行转换和处理。常见的处理操作包括数据格式转换、字段重命名、数值计算、数据过滤等。处理器插件在数据发送给输出之前执行,可以清洗和丰富原始数据。

聚合器插件(Aggregators)负责对时序数据进行聚合计算。比如计算某个时间窗口内的平均值、最大值、最小值、统计值等。聚合器插件会在一批数据收集完成后执行,常用于生成统计指标。

输出插件(Outputs)负责将处理后的数据发送到目标存储。支持的输出目标包括 InfluxDB、Prometheus、Elasticsearch、Kafka、MQTT、云服务等。数据可以同时发送到多个输出目的地。

这种插件化的设计带来了极大的灵活性。用户可以根据实际需求自由组合输入、处理、输出插件,构建定制化的数据采集管道,而无需修改 Telegraf 核心代码。

数据模型

Telegraf 使用 InfluxDB 的数据线协议(Line Protocol)来描述时序数据。每条数据记录包含以下字段:

Measurement(测量名称):数据的类别标识,类似于关系型数据库中的表名。例如 “cpu”、”memory”、”http_request”。

Tags(标签):键值对形式的元数据,用于数据的分类和查询过滤。标签会被索引,查询效率高。常见标签包括 host(主机名)、region(地域)、service(服务名)等。

Fields(字段):键值对形式的实际指标数据。字段不会被索引,但可以存储任意类型的数据。常见字段包括 usage(使用率)、value(数值)、count(计数)等。

Timestamp(时间戳):数据点的时间标识,精确到纳秒。

一个典型的 Line Protocol 示例:

cpu_usage,host=server01,region=us-west usage_idle=95.5,usage_user=3.2 1704067200000000000

这条数据表示:在 server01 主机、us-west 地域,CPU 的空闲使用率为 95.5%,用户态使用率为 3.2%,时间戳为 1704067200000000000。

配置文件的结构

Telegraf 的配置文件采用 TOML 格式,基本结构如下:

# 全局配置项
[agent]
  interval = "10s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000

# 输入插件配置
[[inputs.cpu]]
  percpu = true
  totalcpu = true

[[inputs.mem]]

# 处理器插件配置
[[processors.regex]]
  [[processors.regex.tags]]
    key = "host"
    pattern = "(.*)"
    replacement = "${1}"

# 聚合器插件配置
[[aggregators.basicstats]]
  period = "30s"
  stats = ["mean", "max", "min"]

# 输出插件配置
[[outputs.influxdb]]
  urls = ["http://localhost:8086"]
  database = "telegraf"
  precision = "s"

配置文件中,双括号 [[inputs.xxx]] 表示启动一个插件实例,单括号 [agent] 表示这是一个配置节。多个相同类型的插件可以分别配置,使用数组语法。


实战教程

第一个案例:采集服务器系统指标

让我们从最简单的场景开始:采集服务器的 CPU、内存、磁盘、网络等基础指标,并发送到 InfluxDB。

第一步:准备 InfluxDB 环境

如果还没有 InfluxDB 环境,可以使用 Docker 快速启动一个:

docker run -d \
  --name influxdb \
  -p 8086:8086 \
  -p 8082:8082 \
  -v influxdb-data:/var/lib/influxdb2 \
  influxdb:latest

启动后,访问 http://localhost:8086 完成初始配置,创建一个 API Token 用于 Telegraf 连接。

第二步:编写 Telegraf 配置

创建配置文件 /etc/telegraf/telegraf.conf

# 全局代理配置
[agent]
  interval = "10s"           # 采集间隔
  round_interval = true       # 是否四舍五入到 interval 的整数倍
  metric_batch_size = 1000    # 每批发送的指标数量
  metric_buffer_limit = 10000 # 缓冲区大小
  collection_jitter = "0s"     # 采集抖动时间
  flush_interval = "10s"       # 刷新间隔
  flush_jitter = "0s"          # 刷新抖动时间
  precision = ""              # 时间精度,空表示使用纳秒
  debug = false               # 调试模式
  quiet = false               # 静默模式
  logtarget = "file"          # 日志目标
  logfile = "/var/log/telegraf/telegraf.log"  # 日志文件路径
  logfile_rotation_interval = "1d"  # 日志轮转间隔
  logfile_rotation_max_size = "10MB"  # 日志文件大小上限
  logfile_rotation_max_archives = 5   # 保留的日志文件数量

# CPU 指标采集
[[inputs.cpu]]
  percpu = true        # 采集每个 CPU 核心的指标
  totalcpu = true       # 采集总 CPU 指标
  collect_cpu_time = false  # 是否采集 CPU 时间
  report_active = false     # 是否报告活跃状态

# 内存指标采集
[[inputs.mem]]
  # 无需额外配置,使用默认设置

# 磁盘指标采集
[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
  # 忽略这些文件系统类型

# 磁盘 IO 指标采集
[[inputs.diskio]]
  # 采集磁盘读写统计
  devices = ["sda", "sdb"]  # 指定要监控的设备
  # 如果留空,则监控所有设备

# 网络接口指标采集
[[inputs.net]]
  interfaces = ["eth0", "eth1"]  # 指定要监控的接口
  # 如果留空,则监控所有接口

# 系统进程指标采集
[[inputs.processes]]
  # 采集进程统计数据

# 系统内核指标采集
[[inputs.kernel]]
  # 采集内核统计信息

# InfluxDB 输出配置
[[outputs.influxdb]]
  urls = ["http://localhost:8086"]  # InfluxDB 地址
  token = "YOUR_API_TOKEN_HERE"     # API Token
  organization = "your-org"          # 组织名称
  bucket = "telegraf"               # Bucket 名称
  timeout = "5s"                    # 超时时间
  content_encoding = "gzip"         # 压缩方式

第三步:验证配置并启动

在生产环境启动之前,先用测试模式验证配置是否正确:

# 使用 --test 参数只运行一次采集并输出结果,不实际发送
telegraf --config /etc/telegraf/telegraf.conf --test

如果配置正确,你应该能看到类似这样的输出:

2024-01-15T10:30:00Z I! Starting Telegraf
2024-01-15T10:30:00Z I! Loaded inputs: cpu disk diskio mem net kernel processes
2024-01-15T10:30:00Z I! Loaded outputs: influxdb
2024-01-15T10:30:00Z I! Starting Telegraf agent
2024-01-15T10:30:00Z D! [outputs.influxdb] wrote batch of 156 metrics in 12.5ms
cpu,cpu=cpu0,host=your-host,region=us-west usage_guest=0,usage_idle=95.234,usage_iowait=0.123,usage_irq=0,usage_nice=0.456,usage_softirq=0,usage_steal=0,usage_system=2.345,usage_user=1.842 1705315800000000000
cpu,cpu=cpu-total,host=your-host,region=us-west usage_guest=0,usage_idle=94.567,usage_iowait=0.234,usage_irq=0,usage_nice=0.123,usage_softirq=0,usage_steal=0,usage_system=3.456,usage_user=1.620 1705315800000000000
mem,host=your-host,region=us-west available=8589934592i,available_percent=66.67,free=4294967296i,total=12884901888i,used=4294967296i,used_percent=33.33 1705315800000000000
...

确认数据格式正确后,正式启动 Telegraf:

# 启动服务
sudo systemctl start telegraf

# 查看服务状态
sudo systemctl status telegraf

# 设置开机自启
sudo systemctl enable telegraf

第二个案例:采集 MySQL 数据库指标

在生产环境中,数据库监控是必不可少的一环。下面我们为 MySQL 配置专门的指标采集。

第一步:安装 MySQL 输入插件依赖

MySQL 输入插件需要 MySQL 客户端库。安装方法因系统而异:

# Debian/Ubuntu
sudo apt-get install libmysqlclient-dev

# RHEL/CentOS
sudo yum install mysql-devel

# macOS(通过 Homebrew)
brew install mysql-client

第二步:创建 MySQL 监控账号

在 MySQL 服务器上创建专门用于监控的账号,并授予必要的权限:

-- 创建监控账号
CREATE USER 'telegraf'@'localhost' IDENTIFIED BY 'your_secure_password';

-- 授予 PROCESS、SHOW DATABASES、SUPER 权限
GRANT PROCESS, SHOW DATABASES, SUPER, REPLICATION CLIENT ON *.* TO 'telegraf'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

第三步:配置 MySQL 采集插件

在配置文件中添加 MySQL 相关配置:

# MySQL 数据库监控
[[inputs.mysql]]
  servers = [
    "telegraf:your_secure_password@tcp(localhost:3306)/",
    "telegraf:your_secure_password@tcp(192.168.1.100:3306)/"
  ]

  # 采集间隔(可以覆盖全局设置)
  interval_slow = "30s"

  # 是否采集持久化查询日志
  " Gather log_table data " = false

  # 是否采集 MyISAM 引擎指标
  " Gather MyISAM metrics " = false

  # 是否采集 InnoDB 指标
  " Gather InnoDB metrics " = true

  # 是否采集 Galera 集群指标
  " Gather Galera metrics " = false

  # 是否采集从库复制状态
  " Gather slave status " = true

  # 是否采集表结构信息
  " Gather table schema " = false

  # 采集表结构信息时的超时时间
  " Table Schema databases " = ["information_schema", "performance_schema"]

上述配置会采集以下 MySQL 指标:

  • 全局状态变量(connections、queries、transactions 等)
  • InnoDB 缓冲池状态
  • 主从复制状态
  • 查询性能指标
  • 表级统计信息

第四步:验证 MySQL 采集

telegraf --config /etc/telegraf/telegraf.conf --test --input-filter mysql

输出中应该包含 mysql 相关的指标:

mysql,host=db-server,server=localhost:3306 binlog_bytes_written=0i,connection_errors=0i,connections=1256i,innodb_buffer_pool_pages_data=4096i,innodb_buffer_pool_pages_free=2048i,innodb_buffer_pool_pages_total=6144i,innodb_row_lock_current_waits=0i,opened_files=0i,opened_tables=245i,queries=1548923i,questions=1245678i,threads_connected=45i,threads_running=3i 1705315800000000000

第三个案例:采集 HTTP 服务指标

对于 Web 服务和 API 服务,HTTP 输入插件可以采集请求延迟、状态码分布、吞吐量等关键指标。

第一步:部署测试 HTTP 服务

为了演示,我们先用 Python 快速创建一个简单的 HTTP 服务:

#!/usr/bin/env python3
"""
简单的 HTTP 服务,用于演示 Telegraf HTTP 采集
"""
from http.server import HTTPServer, BaseHTTPRequestHandler
import time

class MetricsHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        start_time = time.time()

        if self.path == "/health":
            self.send_response(200)
            self.send_header("Content-type", "text/plain")
            self.end_headers()
            self.wfile.write(b"OK")
        elif self.path == "/metrics":
            # 模拟一些业务指标
            response_time = (time.time() - start_time) * 1000
            metrics = f"http_request_duration_ms{{endpoint=\"/metrics\"}} {response_time}\n"
            metrics += "http_requests_total{status=\"200\"} 12345\n"
            metrics += "http_requests_total{status=\"500\"} 12\n"

            self.send_response(200)
            self.send_header("Content-type", "text/plain")
            self.end_headers()
            self.wfile.write(metrics.encode())
        else:
            self.send_response(404)
            self.send_header("Content-type", "text/plain")
            self.end_headers()
            self.wfile.write(b"Not Found")

    def log_message(self, format, *args):
        # 自定义日志格式
        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {args[0]}")

if __name__ == "__main__":
    server = HTTPServer(("0.0.0.0", 8080), MetricsHandler)
    print("HTTP 服务已启动,监听端口 8080")
    server.serve_forever()

保存为 app.py 并运行:

python3 app.py

第二步:配置 HTTP 输入插件

Telegraf 的 HTTP 输入插件支持多种数据格式,包括 InfluxDB Line Protocol、Prometheus、JSON 等:

# HTTP 服务指标采集
[[inputs.http]]
  urls = ["http://localhost:8080/metrics"]

  # HTTP 方法
  method = "GET"

  # 请求超时时间
  timeout = "5s"

  # 数据格式
  data_format = "prometheus"

  # 指标名称前缀
  metric_name = "http_service"

  # 标签配置
  [inputs.http.headers]
    Authorization = "Bearer your-token-here"

除了主动拉取,Telegraf 也支持作为 HTTP 服务器接收推送的数据:

# HTTP 服务端点(Telegraf 监听此端口接收数据)
[[inputs.http_listener]]
  service_address = ":8080"

  # 最大请求体大小
  max_body_size = 32 * 1024 * 1024  # 32MB

  # 认证配置
  # basic_username = "telegraf"
  # basic_password = "password"

  # 数据格式
  data_format = "influx"

配置完成后,其他服务可以通过 HTTP POST 请求向 Telegraf 推送指标数据:

curl -X POST http://localhost:8080/telegraf \
  -H "Content-Type: text/plain" \
  --data-binary "custom_metric,host=myhost value=42 1705315800000000000"

第四个案例:使用处理器插件转换数据

采集到的原始数据往往需要处理才能满足业务需求。Telegraf 提供了丰富的处理器插件,下面介绍几个常用场景。

数据格式转换

使用 converter 处理器将字符串类型的数值转换为整数或浮点数:

[[inputs.http]]
  urls = ["http://localhost:8080/api/metrics"]
  data_format = "json"
  tag_keys = ["host", "service"]
  json_string_fields = ["value"]  # 指定要转换的字段

[[processors.converter]]
  [processors.converter.fields]
    integer = ["value"]
    float = ["percentage"]
    string = ["status"]
    boolean = ["enabled"]

正则表达式处理

使用 regex 处理器从标签中提取信息或重命名标签:

[[inputs.diskio]]
  # 采集磁盘 IO 指标

[[processors.regex]]
  # 从 device 标签中提取设备名称
  [[processors.regex.tags]]
    key = "device"
    pattern = "^(sd[a-z])"
    replacement = "${1}"
    result_key = "disk_name"

  # 从序列号中提取有用信息
  [[processors.regex.fields]]
    key = "serial_number"
    pattern = "SN-([0-9]+)-([A-Z]+)"
    replacement = "${1}_${2}"
    # ---

数据过滤

使用 过滤插件 排除不需要的指标或标签:

[[inputs.cpu]]
  percpu = true
  totalcpu = true

[[processors.filtering]]
  # 排除指定名称的指标
  exclude = [
    { name = "cpu", tags = { cpu = "cpu-total" } },
    { name = "mem", tags = { host = "test-*" } }
  ]

  # 或者使用正则表达式
  [[processors.filtering.exclude]]
    name = "disk"
    tags = { device = "loop.*" }

数据转换和计算

使用 transform 处理器进行数值计算:

[[inputs.disk]]
  # 采集磁盘指标

[[processors.pivot]]
  # 将 field 转换为 tag
  tag_key = "name"
  value_key = "value"

[[processors.converter]]
  [processors.converter.fields]
    float = ["used_percent"]

第五个案例:使用聚合器插件统计计算

聚合器插件用于在一定时间窗口内对数据进行统计计算,非常适合生成汇总指标。

基本统计聚合

计算一段时间内的平均值、最大值、最小值等:

[[inputs.cpu]]
  percpu = false
  totalcpu = true

[[aggregators.basicstats]]
  period = "30s"              # 聚合周期
  drop_original = false       # 是否丢弃原始数据
  stats = ["count", "min", "max", "mean", "stdev", "s2", "sum"]
  # 计算以下统计量:
  # count - 样本数量
  # min   - 最小值
  # max   - 最大值
  # mean  - 平均值
  # stdev - 标准差
  # s2    - 方差
  # sum   - 总和

这样配置后,Telegraf 会每 30 秒输出一次 CPU 指标的统计结果,而不是每次采集的原始数据。

分位数聚合

对于性能分析,计算延迟的分位数(p50、p95、p99)非常有用:

[[inputs.http_response]]
  urls = ["http://api.example.com/health"]
  http_proxy = ""
  response_timeout = "5s"

[[aggregators.histogram]]
  period = "60s"
  drop_original = false

  [[aggregators.histogram.config]]
    measurement_name = "http_response"
    fields = ["response_time"]
    buckets = [0.5, 1.0, 2.5, 5.0, 10.0, 25.0, 50.0, 100.0, 250.0, 500.0, 1000.0, 2500.0, 5000.0, 10000.0]

第六个案例:多目标输出与数据路由

Telegraf 支持同时向多个目标发送数据,也支持根据条件将数据路由到不同的目的地。

多输出配置

将同一份数据同时发送到 InfluxDB 和 Prometheus:

# 输入配置(只配置一次)
[[inputs.cpu]]
  percpu = false
  totalcpu = true

[[inputs.mem]]

# 发送到 InfluxDB
[[outputs.influxdb]]
  urls = ["http://localhost:8086"]
  token = "your-influxdb-token"
  organization = "your-org"
  bucket = "telegraf"
  namepass = ["cpu", "mem"]

# 同时发送到 Prometheus(用于 Grafana 等工具拉取)
[[outputs.prometheus_client]]
  listen = ":9273"
  metric_version = 2
  namepass = ["cpu", "mem"]
  # Prometheus 抓取端点:http://your-host:9273/metrics

条件路由

使用 outputs.urltagexclude 实现基于标签的路由:

[[inputs.http]]
  urls = ["http://app1:8080/metrics", "http://app2:8080/metrics"]
  data_format = "prometheus"

  [inputs.http.headers]
    X-App-Name = "telegraf"

# 生产环境指标发送到生产 InfluxDB
[[outputs.influxdb]]
  urls = ["http://prod-influxdb:8086"]
  database = "production"

  # 只接收带有 env=prod 标签的指标
  tagexclude = ["env"]
  [outputs.influxdb.tagpass]
    env = ["prod"]

# 开发环境指标发送到开发 InfluxDB
[[outputs.influxdb]]
  urls = ["http://dev-influxdb:8086"]
  database = "development"

  tagexclude = ["env"]
  [outputs.influxdb.tagpass]
    env = ["dev"]

常见使用场景

容器环境监控

在 Kubernetes 或 Docker 环境中,Telegraf 可以作为 DaemonSet 运行在每个节点上,采集容器相关的指标:

# 容器指标采集
[[inputs.docker]]
  endpoint = "unix:///var/run/docker.sock"

  # 容器状态过滤
  container_names = []
  container_states = ["running"]

  # 采集间隔
  interval = "60s"

  # 是否采集容器标签
  gather_labels = true
  gather_perc_cpu_time = false

  # 过滤配置
  container_name_include = []
  container_name_exclude = []

# Kubernetes 指标采集
[[inputs.kube_inventory]]
  # 采集 K8s 资源状态
  url = "https://kubernetes.default:443"

  # 使用服务账号令牌
  bearer_token = "/var/run/secrets/kubernetes.io/serviceaccount/token"

  # 跳过 TLS 验证(仅适用于内部网络)
  insecure_skip_verify = true

  # 采集哪些资源类型
  resource_filters = [
    "pod:true",
    "deployment:false",
    "service:false",
    "node:true"
  ]

物联网数据采集

Telegraf 支持 MQTT 协议,非常适合物联网场景:

# MQTT 消息订阅
[[inputs.mqtt_consumer]]
  servers = ["tcp://mqtt-broker:1883"]

  # 订阅主题
  topics = [
    "sensors/+/temperature",
    "sensors/+/humidity",
    "sensors/+/pressure"
  ]

  # 客户端配置
  client_id = "telegraf-mqtt-consumer"

  # QoS 级别
  qos = 1

  # 数据格式
  data_format = "json"
  json_name_key = "device_id"

  # 标签配置
  tag_keys = ["device_id", "location"]
  json_time_key = "timestamp"
  json_time_format = "unix"
  json_timezone = "Asia/Shanghai"

  # 连接重试配置
  max_undelivered_messages = 1000

# 数据处理
[[processors.converter]]
  [processors.converter.fields]
    float = ["temperature", "humidity", "pressure"]

[[processors.rename]]
  [[processors.rename.replace]]
    measurement = "mqtt_consumer"
    dest = "sensor_data"

# 输出到 InfluxDB
[[outputs.influxdb]]
  urls = ["http://influxdb:8086"]
  database = "iot_sensors"
  precision = "s"

日志收集与处理

除了指标数据,Telegraf 也能处理日志文件:

# 日志文件采集
[[inputs.tail]]
  files = ["/var/log/application/*.log"]

  # 文件编码
  charset = "UTF-8"

  # 行首匹配模式(用于识别多行日志)
  from_beginning = false
  pipe = false
  watch_method = "inotify"

  # Grok 解析
  grok_pattern = "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:message}"
  grok_timezone = "Asia/Shanghai"
  grok_custom_patterns = """
    TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}T%{HOUR}:%{MINUTE}:%{SECOND}%{ISO8601_TIMEZONE}?
  """

  # 数据格式
  data_format = "grok"

# 日志级别过滤
[[processors.regex]]
  [[processors.regex.tags]]
    key = "level"
    pattern = "^(ERROR|WARN|INFO|DEBUG)$"
    replacement = "${1}"

# 发送到 Elasticsearch
[[outputs.elasticsearch]]
  urls = ["http://elasticsearch:9200"]
  index_name = "application-logs-%{YYYY.MM.DD}"

  # 认证配置
  # username = "elastic"
  # password = "changeme"

  # 模板管理
  manage_template = true
  template_name = "application-logs"

  # 字段映射
  [outputs.elasticsearch.tag_keys]
    level = "log.level"
    message = "log.message"

业务指标采集

将 Telegraf 与业务系统集成,采集自定义的业务指标:

# HTTP 接口轮询业务数据
[[inputs.http]]
  urls = ["http://api-backend:8080/api/v1/metrics"]
  method = "GET"

  # 认证
  [inputs.http.headers]
    Authorization = "Bearer ${API_TOKEN}"

  # JSON 数据解析
  data_format = "json"
  json_query = "data"
  json_name_key = ""
  json_time_key = "timestamp"
  json_time_format = "unix_ms"

  # 标签
  tag_keys = ["region", "environment"]
  json_string_fields = ["order_id"]

# 数据转换
[[processors.converter]]
  [processors.converter.fields]
    integer = ["order_count", "revenue", "user_count"]
    float = ["conversion_rate", "average_order_value"]

[[processors.rename]]
  [[processors.rename.replace]]
    measurement = "http"
    dest = "business_metrics"

# 输出到多个系统
[[outputs.influxdb]]
  urls = ["http://influxdb:8086"]
  database = "business_metrics"

[[outputs.kafka]]
  brokers = ["kafka-broker:9092"]
  topic = "business-metrics"
  data_format = "json"

最佳实践

配置优化

合理设置采集间隔

采集间隔的选择需要在数据精度和系统开销之间平衡。对于系统基础指标,10-30 秒的间隔通常足够;对于实时性要求高的场景,可以缩短到 5 秒甚至更短,但要确保 Telegraf 的性能跟得上。

# 全局设置
[agent]
  interval = "10s"
  flush_interval = "10s"

# 特定输入插件覆盖设置
[[inputs.mysql]]
  interval_slow = "60s"  # MySQL 采集间隔设置为 60 秒

调整缓冲区大小

如果采集数据量大或输出目标响应慢,需要增大缓冲区:

[agent]
  metric_buffer_limit = 100000  # 缓冲区大小,默认 10000
  metric_batch_size = 5000      # 每批发送数量

启用数据压缩

在网络带宽受限的场景下,开启 gzip 压缩可以显著减少传输数据量:

[[outputs.influxdb]]
  urls = ["http://influxdb:8086"]
  content_encoding = "gzip"  # 启用 gzip 压缩
  compression_level = 6       # 压缩级别 1-9,默认为 6

性能调优

减少不必要的标签

每个唯一的标签组合都会创建新的时间序列,过多的时间序列会增加存储和查询负担。只添加必要的查询标签:

# 不推荐:过多的标签
[[inputs.diskio]]
  device_tags = ["name", "serial_number", "wwn"]

# 推荐:只保留查询需要的标签
[[inputs.diskio]]
  device_tags = ["name"]

使用过滤器减少处理数据

在数据源头过滤,比在处理阶段过滤更高效:

# 采集时过滤
[[inputs.disk]]
  mount_points = ["/", "/data", "/var/log"]  # 只监控特定挂载点
  ignore_fs = ["tmpfs", "devtmpfs"]

[[inputs.cpu]]
  percpu = false  # 不需要按核心统计时,关闭此选项
  totalcpu = true

启用查询缓存

如果使用 InfluxDB 输出,启用查询缓存可以提高查询性能:

[[outputs.influxdb_v2]]
  urls = ["http://influxdb:8086"]

  # 启用查询缓存
  influxdb_max_retries = 3
  influxdb_retry_interval = "5s"

安全配置

保护配置文件

Telegraf 配置文件可能包含敏感信息,需要适当保护:

# 设置文件权限
chmod 600 /etc/telegraf/telegraf.conf

# 使用环境变量存储敏感信息
# 在配置文件中使用 ${VAR_NAME} 语法
[[outputs.influxdb]]
  token = "${INFLUXDB_TOKEN}"

在 systemd 服务文件中设置环境变量:

# /etc/default/telegraf
INFLUXDB_TOKEN="your-secure-token-here"

启用 TLS 加密

与敏感系统的通信应使用 TLS 加密:

[[outputs.influxdb]]
  urls = ["https://influxdb:8086"]

  # TLS 配置
  tls_ca = "/etc/telegraf/ca.pem"
  tls_cert = "/etc/telegraf/cert.pem"
  tls_key = "/etc/telegraf/key.pem"

  # 跳过证书验证(仅用于测试)
  # insecure_skip_verify = true

使用认证

为所有输入源和输出目标配置认证:

# HTTP 输入认证
[[inputs.http_listener]]
  service_address = ":8080"
  basic_username = "telegraf"
  basic_password = "${HTTP_LISTENER_PASSWORD}"

# HTTP 输出认证
[[outputs.influxdb]]
  urls = ["http://influxdb:8086"]
  token = "${INFLUXDB_TOKEN}"

监控与调试

启用调试日志

排查问题时,启用详细日志:

[agent]
  debug = true
  logtarget = "file"
  logfile = "/var/log/telegraf/telegraf.log"

使用测试模式

修改配置后,使用测试模式验证:

# 测试单个插件
telegraf --config /etc/telegraf/telegraf.conf --test --input-filter cpu

# 测试整个配置
telegraf --config /etc/telegraf/telegraf.conf --test

# 打印配置而不运行
telegraf --config /etc/telegraf/telegraf.conf --config-directory /etc/telegraf/conf.d --print

性能基准测试

使用内置的基准测试工具评估性能:

# 运行基准测试
telegraf --config /etc/telegraf/telegraf.conf --test --benchmark

高可用部署

多实例部署

对于大规模部署,可以在多个节点上运行 Telegraf,通过负载均衡分发采集任务:

# Kubernetes Deployment 示例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: telegraf
  labels:
    app: telegraf
spec:
  replicas: 3
  selector:
    matchLabels:
      app: telegraf
  template:
    metadata:
      labels:
        app: telegraf
    spec:
      containers:
      - name: telegraf
        image: telegraf:latest
        volumeMounts:
        - name: config
          mountPath: /etc/telegraf
        resources:
          requests:
            memory: "256Mi"
            cpu: "200m"
          limits:
            memory: "512Mi"
            cpu: "500m"
        env:
        - name: HOST_PROC
          value: "/host/proc"
        - name: HOST_SYS
          value: "/host/sys"
        - name: HOST_ETC
          value: "/host/etc"
        securityContext:
          privileged: true
      volumes:
      - name: config
        configMap:
          name: telegraf-config

配置热更新

Telegraf 支持通过信号重载配置,无需重启服务:

# 发送 SIGHUP 信号重载配置
kill -HUP $(pidof telegraf)

# 或者使用 systemd reload
sudo systemctl reload telegraf

进阶技巧

插件开发

如果现有插件无法满足需求,可以开发自定义插件。Telegraf 插件开发文档完善,下面是一个简单的输入插件示例:

package telegraf

import (
    "github.com/influxdata/telegraf"
    "github.com/influxdata/telegraf/plugins/common/shim"
)

// 自定义插件结构
type CustomInput struct {
    Url    string `toml:"url"`
    Method string `toml:"method"`
}

// 创建插件实例(实现 Input 接口)
func (c *CustomInput) Sample() telegraf.SampleConfig {
    return `
  # 自定义输入插件示例
  [[inputs.custom]]
    url = "http://localhost:8080/api"
    method = "GET"
`
}

func (c *CustomInput) Description() string {
    return "采集自定义业务数据"
}

func (c *CustomInput) Gather(acc telegraf.Accumulator) error {
    // 采集逻辑
    acc.AddFields("custom", map[string]interface{}{
        "value": 123,
    }, map[string]string{
        "host": "myhost",
    })
    return nil
}

// 初始化插件
func init() {
    plugins.Add("custom", func() telegraf.Input {
        return &CustomInput{
            Url:    "http://localhost:8080/api",
            Method: "GET",
        }
    })
}

// Shim 用于独立运行测试
func main() {
    shim := shim.New()
    plugin := &CustomInput{}
    shim.AddInput(plugin)
    shim.Run()
}

模板复用

使用配置目录组织多个配置文件,提高可维护性:

# /etc/telegraf/telegraf.conf(主配置)
[agent]
  interval = "10s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  flush_interval = "10s"
  precision = ""

# 主配置文件只包含全局设置和输出
[[outputs.influxdb]]
  urls = ["http://influxdb:8086"]
  database = "telegraf"

# /etc/telegraf/conf.d/inputs/
#    ├── system.toml      # 系统指标
#    ├── mysql.toml       # MySQL 指标
#    └── nginx.toml       # Nginx 指标
# /etc/telegraf/conf.d/inputs/system.toml
[[inputs.cpu]]
  percpu = true
  totalcpu = true

[[inputs.mem]]

[[inputs.disk]]

与 Prometheus 生态集成

Telegraf 可以作为 Prometheus 和其他系统之间的桥梁:

# 接收 Prometheus 格式的指标
[[inputs.prometheus]]
  urls = ["http://prometheus:9090/metrics"]
  monitor_kubernetes_pods = true
  kubernetes_namespace = "monitoring"

  [inputs.prometheus.tagpass]
    env = ["prod"]

# 转换为 InfluxDB 格式输出
[[outputs.influxdb]]
  urls = ["http://influxdb:8086"]
  database = "prometheus"
  retention_policy = "autogen"

故障排查指南

常见问题与解决方案

Telegraf 无法启动

检查配置文件语法:

# 验证配置语法
telegraf --config /etc/telegraf/telegraf.conf --test

# 检查配置文件权限
ls -la /etc/telegraf/telegraf.conf

# 查看系统日志
journalctl -u telegraf -n 50

数据丢失或延迟

检查缓冲区配置和网络连接:

[agent]
  metric_buffer_limit = 50000  # 增大缓冲区
  metric_batch_size = 5000    # 减小批次大小
  flush_interval = "10s"       # 缩短刷新间隔

插件加载失败

检查插件依赖和版本兼容性:

# 列出所有可用插件
telegraf --plugins

# 查看特定插件信息
telegraf --plugins-help inputs.cpu

# 检查插件依赖
ldd /usr/bin/telegraf

内存使用过高

优化配置减少资源占用:

[agent]
  metric_buffer_limit = 5000   # 减小缓冲区
  collection_jitter = "1s"    # 添加抖动分散负载

[[inputs.diskio]]
  devices = ["sda"]           # 只监控必要设备

日志分析

Telegraf 日志中常见的问题标识:

E! [outputs.influxdb] Error writing to output...  # 输出写入失败
W! [inputs.mysql] Connection failed...           # 输入连接失败
E! [agent] Metric buffer overflow                # 缓冲区溢出
W! [processors.regex] Pattern compilation failed # 处理器错误

通过日志可以快速定位问题所在,然后针对性地调整配置或排查网络、权限等问题。


相关资源与扩展

官方文档

  • Telegraf 官方文档:https://docs.influxdata.com/telegraf/
  • InfluxDB 文档:https://docs.influxdata.com/influxdb/
  • 插件库索引:https://portal.influxdata.com/plugins/

监控生态集成

Telegraf 与以下开源项目配合使用效果最佳:

Grafana:可视化展示 Telegraf 采集的数据,配合 InfluxDB 数据源或 Prometheus 数据源使用。

Prometheus:Telegraf 的输出插件可以将数据转换为 Prometheus 格式,也可以接收 Prometheus 格式的输入。

Kubernetes:作为 DaemonSet 部署,采集集群级别的指标和日志。

Ansible/Salt:使用配置管理工具批量部署和更新 Telegraf 配置。

学习路径建议

  1. 入门阶段:先在本地环境安装 Telegraf,配置基础的 CPU、内存、磁盘监控,理解配置文件的基本结构。

  2. 进阶阶段:尝试多种输入插件(MySQL、Nginx、应用日志),学习处理器和聚合器的使用,掌握数据转换和统计计算。

  3. 生产阶段:关注高可用部署、性能调优、安全配置,学习与其他系统(Kubernetes、Prometheus、Grafana)的集成。

  4. 专家阶段:根据业务需求开发自定义插件,深度优化数据管道,参与开源社区贡献。


总结

Telegraf 作为一个功能全面、性能优异、配置灵活的数据采集工具,已经成为现代监控体系中的重要组件。它用插件化的架构解决了数据源多样性的问题,用简洁的配置语法降低了使用门槛,用 Go 语言实现保证了运行效率。

通过本文的详细介绍,你应该已经掌握了 Telegraf 的核心概念、配置方法和实战技巧。从基础的服务器监控,到复杂的物联网数据采集,再到企业级的多系统集成,Telegraf 都能提供可靠的支持。

建议你在学习过程中多动手实践,从简单的配置开始,逐步尝试更复杂的场景。同时,也欢迎探索 Telegraf 的插件生态,发现更多可能性。

监控是保障系统稳定运行的重要手段,而 Telegraf 正是构建可靠监控体系的有力工具。掌握 Telegraf,让数据采集变得更简单、更高效。


相关项目链接:

  • Telegraf 官方仓库:https://github.com/influxdata/telegraf
  • InfluxDB:https://github.com/influxdata/influxdb
  • Grafana:https://github.com/grafana/grafana
  • Prometheus:https://github.com/prometheus/prometheus
  • Kapacitor:https://github.com/influxdata/kapacitor
  • Chronograf:https://github.com/influxdata/chronograf

如果内容对您有帮助,欢迎打赏

您的支持是我继续创作的动力

前往打赏页面

评论区

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注