文档文档

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=1

Zabbix 生成的指标

{"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_typeresponse_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
    }
  ]
}

此页面是否有帮助?

感谢您的反馈!


InfluxDB 3.8 新特性

InfluxDB 3.8 和 InfluxDB 3 Explorer 1.6 的主要增强功能。

查看博客文章

InfluxDB 3.8 现已适用于 Core 和 Enterprise 版本,同时发布了 InfluxDB 3 Explorer UI 的 1.6 版本。本次发布着重于操作成熟度,以及如何更轻松地部署、管理和可靠地运行 InfluxDB。

更多信息,请查看

InfluxDB Docker 的 latest 标签将指向 InfluxDB 3 Core

在 **2026 年 2 月 3 日**,InfluxDB Docker 镜像的 latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。

如果使用 Docker 来安装和运行 InfluxDB,latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。例如,如果使用 Docker 运行 InfluxDB v2,请将 latest 版本标签替换为 Docker pull 命令中的特定版本标签 — 例如

docker pull influxdb:2