2 流式传输到外部系统
概述
可以通过 HTTP 将监控项值和事件从 Zabbix 流式传输到外部系统(请参见协议详情)。
标签过滤器可用于流式传输部分监控项值或事件。
有两个 Zabbix 服务器进程负责数据流传输:connector manager 和 connector worker。
Zabbix 内部监控项 zabbix[connector_queue] 可用于监控 connector 队列中已排队的值的数量。
配置
要将数据流式传输到外部系统,需要执行以下步骤:
1. 准备一个远程系统,用于接收来自 Zabbix 的数据。
为此,可使用以下工具:
- 一个简单的接收器示例,它会将接收到的信息记录到
events.ndjson和history.ndjson文件中。 - 适用于 Zabbix 服务器的 Kafka connector - 一个使用 Go 编写的轻量级服务器,用于将来自 Zabbix 服务器的监控项值和事件转发到 Kafka broker。
2. 通过调整 zabbix_server.conf 中的 StartConnectors 参数,在 Zabbix 中设置所需数量的 connector worker。
connector worker 的数量应与 Zabbix 前端中配置的 connector 数量一致(如果并发会话数大于 1,则应超过该数量)。
然后,重启 Zabbix 服务器。
3. 在 Zabbix 前端中配置一个新的 connector(Administration > General > Connectors),并使用 zabbix_server -R config_cache_reload 命令重新加载服务器缓存。

必填字段以星号标记。
| Parameter | Description |
|---|---|
| Name | 输入 connector 名称。 |
| Data type | 选择要流式传输的数据类型: Item values - 将监控项值从 Zabbix 流式传输到外部系统; Events - 将事件从 Zabbix 流式传输到外部系统。 |
| URL | 输入接收器 URL。支持用户宏。 |
| Tag filter | 仅导出与标签过滤器匹配的监控项值或事件。如果未设置,则导出全部内容。 可以包含或排除特定标签及标签值。可设置多个条件。标签名称匹配始终区分大小写。 每个条件可使用以下运算符: Exists - 包含指定的标签名称; Equals - 包含指定的标签名称和值(区分大小写); Contains - 包含指定的标签名称,且标签值包含输入的字符串(子串匹配,不区分大小写); Does not exist - 排除指定的标签名称; Does not equal - 排除指定的标签名称和值(区分大小写); Does not contain - 排除指定的标签名称,且标签值包含输入的字符串(子串匹配,不区分大小写)。 条件有两种计算类型: And/Or - 必须满足所有条件,具有相同标签名称的条件将按 Or 条件分组; Or - 满足任一条件即可。 |
| Type of information | 选择信息类型(numeric (unsigned)、numeric (float)、character 等),用于过滤 connector 应流式传输的监控项值。 当 Data type 设置为 "Item values" 时,此字段可用。 |
| HTTP authentication | 选择认证方式: None - 不使用认证; Basic - 使用基本认证; NTLM - 使用 NTLM(Windows NT LAN Manager)认证; Kerberos - 使用 Kerberos 认证(另请参见:使用 Zabbix 配置 Kerberos); Digest - 使用 Digest 认证; Bearer - 使用 Bearer 认证。 |
| Username | 输入用户名(最多 255 个字符)。支持用户宏。 当 HTTP authentication 设置为 "Basic"、"NTLM"、"Kerberos" 或 "Digest" 时,此字段可用。 |
| Password | 输入用户密码(最多 255 个字符)。支持用户宏。 当 HTTP authentication 设置为 "Basic"、"NTLM"、"Kerberos" 或 "Digest" 时,此字段可用。 |
| Bearer token | 输入 Bearer token。支持用户宏。 当 HTTP authentication 设置为 "Bearer" 时,此字段可用且必填。 |
| Advanced configuration | 点击 Advanced configuration 标签以显示高级配置选项(见下文)。 |
| Max records per message | 指定单条消息中可流式传输的最大值或事件数量。 |
| Concurrent sessions | 选择为此 connector 运行的发送进程数量。最多可指定 100 个会话;默认值为 "1"。 |
| Attempts | 流式传输数据的尝试次数。最多可指定 5 次;默认值为 "1"。 |
| Attempt interval | 指定 connector 在一次流式传输数据失败后应等待多长时间再重试。最长可指定 10s;默认值为 "5s"。 当 Attempts 设置为 "2" 或更大时,此字段可用。 失败的尝试包括:建立连接失败,或 HTTP 响应代码不是 200、201、202、203、204。发生通信错误,或 HTTP 响应代码不是 200、201、202、203、204、400、401、403、404、405、415、422 时,将触发器重试。重定向会被跟随,因此 302 -> 200 视为成功响应;而 302 -> 503 将触发重试。 |
| Timeout | 指定消息超时时间(1-60 秒,默认值为 5 秒)。 支持时间后缀,例如 30s、1m。支持用户宏。 |
| HTTP proxy | 你可以按以下格式指定要使用的 HTTP proxy:[protocol://][username[:password]@]proxy.example.com[:port]支持用户宏。 可选的 protocol:// 前缀可用于指定其他 proxy 协议(协议前缀支持是在 cURL 7.21.7 中添加的)。如果未指定协议,则该 proxy 将被视为 HTTP proxy。默认使用 1080 端口。如果指定了 HTTP proxy,则该 proxy 将覆盖诸如 http_proxy、HTTPS_PROXY 之类与 proxy 相关的环境变量。如果未指定,则不会覆盖与 proxy 相关的环境变量。输入的值将按原样传递,不进行合理性检查。你也可以输入 SOCKS proxy 地址。如果指定了错误的协议,连接将失败,监控项将变为不支持。 请注意,HTTP proxy 仅支持简单认证。 |
| SSL verify peer | 勾选此复选框以验证 web 服务器的 SSL 证书。 服务器证书将自动从系统范围的证书颁发机构(CA)位置获取。你可以使用 Zabbix 服务器或 proxy 配置参数 SSLCALocation 覆盖 CA 文件位置。 |
| SSL verify host | 勾选此复选框以验证 web 服务器证书中的 Common Name 字段或 Subject Alternate Name 字段是否匹配。 这将设置 cURL 选项 CURLOPT_SSL_VERIFYHOST。 |
| SSL certificate file | 用于客户端认证的 SSL 证书文件名称。证书文件必须为 PEM1 格式。支持用户宏。 如果证书文件中还包含私钥,请将 SSL key file 字段留空。如果密钥已加密,请在 SSL key password 字段中指定密码。包含此文件的目录由 Zabbix 服务器或 proxy 配置参数 SSLCertLocation 指定。 |
| SSL key file | 用于客户端认证的 SSL 私钥文件名称。私钥文件必须为 PEM1 格式。支持用户宏。 包含此文件的目录由 Zabbix 服务器或 proxy 配置参数 SSLKeyLocation 指定。 |
| SSL key password | SSL 私钥文件密码。支持用户宏。 |
| Description | 输入 connector 描述。 |
| Enabled | 勾选此复选框以启用 connector。 |
当 Kafka connector 配置为以逗号分隔的 bootstrap broker 地址列表时(例如 Kafka.URL=kafka1.example.com:9093,kafka2.example.com:9093),Kafka 客户端会连接到最先响应的 broker,并使用其集群元数据。
如果该列表包含来自不同 Kafka 集群的地址,则只会使用响应最快的集群,其他地址将被记录为不可用;因此,即使 connector 已连接,也可能出现如下启动警告:
kafka cluster connected, but broker(s) "kafka1.example.com:9093, kafka2.example.com:9093" unavailable; will retry on message send if active brokers fail
在某些环境中(私有网络、容器网络或非标准 DNS/hosts 设置),主机名或 IP 可能会解析为回环地址(例如 127.0.0.1/localhost),或者被客户端规范化,这可能导致此类警告具有误导性。
为减少混淆,请确保所有 Kafka.URL 地址都属于同一个 Kafka 集群,验证从 connector 主机到 broker 的 DNS 解析以及 broker 的 advertised.listeners,并优先使用可解析为 broker 广播地址的地址。
协议
服务器与接收器之间的通信通过使用 REST API 和 NDJSON(Newline-delimited JSON)格式的 HTTP 完成,内容类型为 "Content-Type: application/x-ndjson"。
有关更多详细信息,请参阅 Newline-delimited JSON 导出协议。
服务器请求
流式传输监控项值的示例:
POST /v1/history HTTP/1.1
Host: localhost:8080
Accept: */*
Accept-Encoding: deflate, gzip, br, zstd
Content-Length: 628
Content-Type: application/x-ndjson
{"host":{"host":"Zabbix server","name":"Zabbix server"},"groups":["Zabbix servers"],"item_tags":[{"tag":"foo","value":"test"}],"itemid":44457,"name":"foo","clock":1673454303,"ns":800155804,"value":0,"type":3}
{"host":{"host":"Zabbix server","name":"Zabbix server"},"groups":["Zabbix servers"],"item_tags":[{"tag":"foo","value":"test"}],"itemid":44457,"name":"foo","clock":1673454303,"ns":832290669,"value":1,"type":3}
{"host":{"host":"Zabbix server","name":"Zabbix server"},"groups":["Zabbix servers"],"item_tags":[{"tag":"bar","value":"test"}],"itemid":44458,"name":"bar","clock":1673454303,"ns":867770366,"value":123,"type":3}
流式传输事件的示例:
POST /v1/events HTTP/1.1
Host: localhost:8080
Accept: */*
Accept-Encoding: deflate, gzip, br, zstd
Content-Length: 333
Content-Type: application/x-ndjson
{"clock":1673454303,"ns":800155804,"value":1,"eventid":5,"name":"trigger for foo being 0","severity":0,"hosts":[{"host":"Zabbix server","name":"Zabbix server"}],"groups":["Zabbix servers"],"tags":[{"tag":"foo_trig","value":"test"},{"tag":"foo","value":"test"}]}
{"clock":1673454303,"ns":832290669,"value":0,"eventid":6,"p_eventid":5}
接收端响应
响应由 HTTP 响应状态码和 JSON 负载组成。 对于已成功处理的请求,HTTP 响应状态码必须为“200”、“201”、“202”、“203”或“204”;其他状态码表示请求失败。
成功示例:
localhost:8080/v1/history": HTTP/1.1 200 OK
Date: Wed, 11 Jan 2023 16:40:30 GMT
Content-Length: 0
错误示例:
localhost:8080/v1/history": HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
Date: Wed, 11 Jan 2023 17:07:36 GMT
Content-Length: 55
{"error":"invalid character '{' after top-level value"}