Zabbix 输出插件
此插件通过陷阱将指标写入Zabbix。它已在 v3.0、v4.0 和 v6.0 版本上进行了测试,但只要协议不改变,它应该也能与更新版本的 Zabbix 一起工作。
引入于: Telegraf v1.30.0 标签: datastore 操作系统支持: all
全局配置选项
插件支持其他全局和插件配置设置,用于修改指标、标签和字段,创建别名以及配置插件顺序等任务。更多详情请参阅 CONFIGURATION.md。
配置
# Send metrics to Zabbix
[[outputs.zabbix]]
## Address and (optional) port of the Zabbix server
address = "zabbix.example.com:10051"
## Send metrics as type "Zabbix agent (active)"
# agent_active = false
## Add prefix to all keys sent to Zabbix.
# key_prefix = "telegraf."
## Name of the tag that contains the host name. Used to set the host in Zabbix.
## If the tag is not found, use the hostname of the system running Telegraf.
# host_tag = "host"
## Skip measurement prefix to all keys sent to Zabbix.
# skip_measurement_prefix = false
## This field will be sent as HostMetadata to Zabbix Server to autoregister the host.
## To enable this feature, this option must be set to a value other than "".
# autoregister = ""
## Interval to resend auto-registration data to Zabbix.
## Only applies if autoregister feature is enabled.
## This value is a lower limit, the actual resend should be triggered by the next flush interval.
# autoregister_resend_interval = "30m"
## Interval to send LLD data to Zabbix.
## This value is a lower limit, the actual resend should be triggered by the next flush interval.
# lld_send_interval = "10m"
## Interval to delete stored LLD known data and start capturing it again.
## This value is a lower limit, the actual resend should be triggered by the next flush interval.
# lld_clear_interval = "1h"agent_active
发送到 Zabbix 的数据包中的 request 值应该不同,具体取决于 Zabbix 中配置的项目是 Zabbix trapper 还是 Zabbix agent (active)。
agent_active = false 会以发送者数据的形式发送数据,期望 trapper 项目。
agent_active = true 会以代理者数据的形式发送数据,期望 active Zabbix agent 项目。
key_prefix
我们可以设置一个前缀,该前缀将被添加到所有 Zabbix 键中。
这是通过 key_prefix 选项可配置的,默认设置为 telegraf.。
给定 Telegraf 指标时,key_prefix = "telegraf." 配置将生成 Zabbix 键的示例
- measurement,host=hostname valueA=0,valueB=1
+ telegraf.measurement.valueA
+ telegraf.measurement.valueB
skip_measurement_prefix
我们可以跳过添加到所有 Zabbix 键的测量前缀。
使用 skip_measurement_prefix = true" 和 prefix = "telegraf." 的示例
- measurement,host=hostname valueA=0,valueB=1
+ telegraf.valueA
+ telegraf.valueB
使用 skip_measurement_prefix = true" 和 prefix = "" 的示例
- measurement,host=hostname valueA=0,valueB=1
+ valueA
+ valueB
autoregister
如果此字段处于激活状态,Telegraf 将向 Zabbix 发送一个 自动注册请求,并使用此字段的内容作为 HostMetadata。
为 Telegraf 看到的 host 标签的每个不同值发送一个请求。
autoregister_resend_interval
如果定义了 autoregister,此字段设置向 Zabbix 重发自动注册请求的间隔。
应使用 telegraf 间隔格式。
实际发送自动注册请求将在超过此间隔后的下一次输出刷新时发生。
lld_send_interval
为了减少发送到 Zabbix 的 LLD 请求数量(LLD 处理很昂贵),此插件每 lld_send_interval 只发送一个。
当 Telegraf 启动时,此插件将开始收集生成 LLD 数据包所需的信息(测量、标签键和值)。
一旦超过此间隔,此插件的下一次刷新将添加包含 LLD 数据的包。
在下一个间隔中,只发送新的或已修改的 LLD。
lld_clear_interval
当此间隔超过时,下一次刷新将清除收集到的所有 LLD 数据。
这使得此插件能够忘记旧数据并重新发送 LLDs 到 Zabbix,以防主机有新的发现规则或数据包丢失。
如果我们有 flush_interval = "1m"、lld_send_interval = "10m" 和 lld_clear_interval = "1h",并且 Telegraf 在 00:00 启动,第一个 LLD 将在 00:10 发送。在 01:00 LLD 数据将被删除,在 01:10 LLD 数据将被重新发送。
Trap 格式
对于 Telegraf 生成的每个新指标,此输出插件将为每个字段发送一个 trap。
给定此 Telegraf 指标
measurement,host=hostname valueA=0,valueB=1它将生成此 Zabbix 指标
{"host": "hostname", "key": "telegraf.measurement.valueA", "value": "0"}
{"host": "hostname", "key": "telegraf.measurement.valueB", "value": "1"}如果指标有标签(除了 host),它们将被添加,按字母顺序使用 LLD 指标的格式
measurement,host=hostname,tagA=keyA,tagB=keyB valueA=0,valueB=1Zabbix 生成的指标
{"host": "hostname", "key": "telegraf.measurement.valueA[keyA,keyB]", "value": "0"}
{"host": "hostname", "key": "telegraf.measurement.valueB[keyA,keyB]", "value": "1"}此顺序基于标签键,而不是标签值,因此,例如,此 Telegraf 指标
measurement,host=hostname,aaaTag=999,zzzTag=111 value=0将生成此 Zabbix 指标
{"host": "hostname", "key": "telegraf.measurement.value[999,111]", "value": "0"}Zabbix 低级发现
Zabbix 在接收任何指标之前需要一个已创建的 item。在某些情况下,我们无法提前知道要发送的内容,例如,要发送其 CPU 和内存消耗的容器名称。
为此,Zabbix 提供了 低级发现,它允许根据 trap 发送的参数动态创建新项目。
如前所述,此输出插件将使用 Telegraf 指标中看到的标签按照 LLD 格式格式化 Zabbix 键。
为了创建这些发现的项目,此插件使用与 Zabbix agent 相同的机制,收集关于每个测量看到的标签的信息,并定期向发现规则发送包含收集数据的请求。
请记住,对于此类指标,Zabbix 会在发送低级发现 (LLD) 数据之前将其丢弃。发送 LLD 到 Zabbix 是一个重量级的过程,并且仅在 lld_send_interval 设置指定的间隔进行。
设计
为了解释一切如何相互连接,我们将使用 net_response 输入的示例
[[inputs.net_response]]
protocol = "tcp"
address = "example.com:80"此输入将生成此指标
$ telegraf -config example.conf -test
* Plugin: inputs.net_response, Collection 1
> net_response,server=example.com,port=80,protocol=tcp,host=myhost result_type="success",response_time=0.091026869 1522741063000000000这里我们有四个标签:server、port、protocol 和 host(后者将假定始终存在并被区别对待)。
Zabbix 无法知道这三个参数可能取的值,因此我们无法在 Zabbix 中创建 trapper 项目来接收这些值(至少不将该指标与具有不同标签的另一个 net_response 指标混合)。
为了解决这个问题,我们在 Zabbix 中使用了一个发现规则,它将接收不同的标签值组并创建 trap 来收集指标。
此插件知道 net_response 输入的三个标签(不包括 host),因此它将生成这个新的 Telegraf 指标
lld.host=myhost net_response.port.protocol.server="{\"data\":[{\"{#PORT}\":\"80\",\"{#PROTOCOL}\":\"tcp\",\"{#SERVER}\":\"example.com\"}]}"一旦发送,最终的数据包将是
{
"request":"sender data",
"data":[
{
"host":"myhost",
"key":"telegraf.lld.net_response.port.protocol.server",
"value":"{\"data\":[{\"{#PORT}\":\"80\",\"{#PROTOCOL}\":\"tcp\",\"{#SERVER}\":\"example.com\"}]}",
"clock":1519043805
}
],
"clock":1519043805
}Zabbix 键是通过连接 lld、输入名称和按字母顺序排序的标签(键)生成的。某些输入可能对不同的字段使用不同的标签组,这就是为什么标签被添加到键中,以允许对同一输入具有不同的发现规则。
用于 value 的标签已更改为大写,以匹配 Zabbix 的格式。
在 Zabbix 服务器中,应该有一个与该键(telegraf.lld.net_response.port.protocol.server)关联的发现规则,以及每个字段的一个项目原型,在这种情况下是 result_type 和 response_time。
项目原型将是 Zabbix trappers,键为(数据类型也应匹配,某些值最好存储为增量)
telegraf.net_response.response_time[{#PORT},{#PROTOCOL},{#SERVER}]
telegraf.net_response.result_type[{#PORT},{#PROTOCOL},{#SERVER}]项目原型键中的宏应按字母顺序排序,以便它们可以匹配此插件生成的键。
使用这些键和示例 trap,主机 myhost 将有两个新项目
telegraf.net_response.response_time[80,tcp,example.com]
telegraf.net_response.result_type[80,tcp,example.com]此插件将为每个指标向 Zabbix 服务器发送与相同结构(INPUT.FIELD[标签排序]…)相同的 trap,填充发现规则创建的项目。
总结
- 我们需要一个具有正确键的发现规则和一个用于每个字段的项目原型
- 此插件将生成 trap 来根据 Telegraf 中看到的指标创建项目
- 它还将发送 trap 来填充新创建的项目
减少 LLDs 的数量
此插件会记住已发送到 Zabbix 的 LLDs,并避免再次生成相同的指标,以避免 Zabbix 中 LLD 处理的成本。
它仅在 lld_send_interval 时发送 LLD 数据。
但是,可能会发生数据包丢失或某些主机获得新的发现规则的情况,因此每隔 lld_clear_interval,插件将忘记已知数据并重新开始收集。
关于输入配置的说明
每个输入应暴露哪些标签应该被控制,因为意外的标签可能会修改 trap 键,并且不会匹配 Zabbix 中定义的 trapper。
例如,在 docker 输入中,每个容器标签都是一个新标签。
为了控制这一点,我们可以向输入添加一个配置,例如
taginclude = ["host", "container_name"]只允许使用“host”和“container_name”标签生成键(并丢失其他标签中提供的信息)。
指标转换为 trap 的示例
无标签
mem,host=myHost available_percent=14.684620843239944,used=14246531072i 152276442800000000{
"request":"sender data",
"data":[
{
"host":"myHost",
"key":"telegraf.mem.available_percent",
"value":"14.382719",
"clock":1522764428
},
{
"host":"myHost",
"key":"telegraf.mem.used",
"value":"14246531072",
"clock":1522764428
}
]
}带标签
docker_container_net,host=myHost,container_name=laughing_babbage rx_errors=0i,tx_errors=0i 1522764038000000000{
"request":"sender data",
"data": [
{
"host":"myHost",
"key":"telegraf.docker_container_net.rx_errors[laughing_babbage]",
"value":"0",
"clock":15227640380
},
{
"host":"myHost",
"key":"telegraf.docker_container_net.tx_errors[laughing_babbage]",
"value":"0",
"clock":15227640380
}
]
}此页面是否有帮助?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一员!我们欢迎并鼓励您对 Telegraf 和本文档提出反馈和 bug 报告。要获取支持,请使用以下资源
具有年度合同或支持合同的客户可以 联系 InfluxData 支持。