别再手动收集指标了!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.url 和 tagexclude 实现基于标签的路由:
[[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 配置。
学习路径建议
-
入门阶段:先在本地环境安装 Telegraf,配置基础的 CPU、内存、磁盘监控,理解配置文件的基本结构。
-
进阶阶段:尝试多种输入插件(MySQL、Nginx、应用日志),学习处理器和聚合器的使用,掌握数据转换和统计计算。
-
生产阶段:关注高可用部署、性能调优、安全配置,学习与其他系统(Kubernetes、Prometheus、Grafana)的集成。
-
专家阶段:根据业务需求开发自定义插件,深度优化数据管道,参与开源社区贡献。
总结
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
评论区