HTTP agent

概述

此监控项类型允许使用 HTTP/HTTPS 协议进行数据轮询。 也可以使用 Zabbix sender 工具或 Zabbix sender 协议 进行捕获(用于向 Zabbix 服务器或 proxy 发送数据),或者使用 history.push API 方法(用于向 Zabbix 服务器发送数据)。

HTTP 监控项检查由 Zabbix 服务器执行。 但是,当主机由 Zabbix proxy 监控时,HTTP 监控项检查由 proxy 执行。

HTTP 监控项检查不需要被监控主机上运行任何 agent。

HTTP agent 同时支持 HTTP 和 HTTPS。 Zabbix 会按需跟随重定向(请参见下方的 跟随重定向 选项)。 重定向的最大数量硬编码为 10(使用 cURL 选项 CURLOPT_MAXREDIRS)。

Zabbix 服务器/proxy 必须先配置好 cURL(libcurl)支持。

HTTP 检查以异步方式执行 - 在启动其他检查之前,不需要先接收某个请求的响应。 DNS 解析同样是异步的。

异步检查的最大并发数为 1000(由 MaxConcurrentChecksPerPoller 定义)。

异步 HTTP agent poller 的数量由 StartHTTPAgentPollers 参数定义。

自 Zabbix 7.0 起,HTTP agent 检查已加入 cURL 的持久连接功能。

配置

要配置 HTTP 监控项:

  1. 转到 数据采集 > 主机。
  2. 单击主机所在行中的 监控项。
  3. 单击 创建监控项。
  4. 在表单中输入监控项参数。

所有必填字段均以红色星号标记。

HTTP 监控项需要特定信息的字段如下:

参数 描述
类型 在此选择 HTTP agent。
键值 输入唯一的监控项键值。
URL 要连接并从中检索数据的 URL。例如:
https://www.example.com
http://www.example.com/download
域名可以使用 Unicode 字符指定。在执行 HTTP 检查时,它们会自动转换为 ASCII 格式的 punycode。
可以使用 解析 按钮将可选查询字段(例如 ?key=value&limit=10)与 URL 分离,并将属性和值移至 查询字段,以便自动进行 URL 编码。
出于安全原因,请勿在 URL 中包含实际的用户名或密码。请改用用户宏,以避免凭据泄露。
限制为 2048 个字符。
支持的宏:{HOST.IP}、{HOST.CONN}、{HOST.DNS}、{HOST.HOST}、{HOST.NAME}、{HOST.PORT}、{ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏、低级别发现宏。
此项设置 CURLOPT_URL cURL 选项。
查询字段 URL 的变量(见上文)。
指定为属性和值对。
值会自动进行 URL 编码。宏的值会先解析,然后自动进行 URL 编码。
支持的宏:{HOST.IP}、{HOST.CONN}、{HOST.DNS}、{HOST.HOST}、{HOST.NAME}、{HOST.PORT}、{ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏、低级别发现宏。
此项设置 CURLOPT_URL cURL 选项。
请求类型 选择请求方法类型:GET、POST、PUT 或 HEAD。
请求正文类型 选择请求正文类型:
原始数据 - 自定义 HTTP 请求正文,会替换宏,但不会执行编码。
JSON 数据 - JSON 格式的 HTTP 请求正文。宏可以用作字符串、数字、true 和 false;用作字符串的宏必须用双引号括起来。宏的值会先解析,然后自动进行转义。如果标头中未指定 "Content-Type",则默认为 "Content-Type: application/json"。
XML 数据 - XML 格式的 HTTP 请求正文。宏可以用作文本节点、属性或 CDATA 节。文本节点和属性中的宏值会先解析,然后自动进行转义。如果标头中未指定 "Content-Type",则默认为 "Content-Type: application/xml"。
请求正文 输入请求正文。
支持的宏:{HOST.IP}、{HOST.CONN}、{HOST.DNS}、{HOST.HOST}、{HOST.NAME}、{HOST.PORT}、{ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏、低级别发现宏。
标头 执行请求时将发送的自定义 HTTP 标头。
指定为属性和值对。
支持的宏:{HOST.IP}、{HOST.CONN}、{HOST.DNS}、{HOST.HOST}、{HOST.NAME}、{HOST.PORT}、{ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏、低级别发现宏。
此项设置 CURLOPT_HTTPHEADER cURL 选项。
所需状态码 预期 HTTP 状态码列表。如果 Zabbix 获取的状态码不在列表中,监控项将变为不支持。如果为空,则不执行检查。
例如:200、201、210-299。
列表中支持的宏:用户宏、低级别发现宏。
此项使用 CURLINFO_RESPONSE_CODE cURL 选项。
跟随重定向 选中复选框以跟随 HTTP 重定向。
此项设置 CURLOPT_FOLLOWLOCATION cURL 选项。
检索模式 选择必须检索的响应部分:
正文 - 仅正文
标头 - 仅标头
正文和标头 - 正文和标头
转换为 JSON 如果 检索模式 未设置为 正文,则标头会作为属性和值对保存在 "header" 键下。
如果遇到 'Content-Type: application/json',则正文会保存为对象;否则会保存为字符串,例如:
HTTP proxy 可以使用格式 [protocol://][username[:password]@]proxy.example.com[:port] 指定要使用的 HTTP proxy。
可选的 protocol:// 前缀可用于指定其他 proxy 协议(例如 https、socks4、socks5;请参阅文档;cURL 7.21.7 添加了对协议前缀的支持)。如果未指定协议,proxy 将被视为 HTTP proxy。如果指定了错误的协议,连接将失败,监控项将变为不支持。
默认使用端口 1080。
如果指定了 proxy,它将覆盖 http_proxy、HTTPS_PROXY 等与 proxy 相关的环境变量。如果未指定 proxy,则不会覆盖与 proxy 相关的环境变量。输入的值将按“原样”传递,不会执行有效性检查。
请注意,HTTP proxy 仅支持简单身份验证。
支持的宏:{HOST.IP}、{HOST.CONN}、{HOST.DNS}、{HOST.HOST}、{HOST.NAME}、{HOST.PORT}、{ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏、低级别发现宏。
此项设置 CURLOPT_PROXY cURL 选项。
HTTP 身份验证 选择身份验证选项:
无 - 不使用身份验证;
Basic - 使用基本身份验证;
NTLM - 使用 NTLM(Windows NT LAN Manager)身份验证;
Kerberos - 使用 Kerberos 身份验证(另请参阅:在 Zabbix 中配置 Kerberos);
Digest - 使用 Digest 身份验证。
此项设置 CURLOPT_HTTPAUTH cURL 选项。
用户名 输入用户名(最多 255 个字符)。
当 HTTP 身份验证 设置为 Basic、NTLM、Kerberos 或 Digest 时,此字段可用。支持用户宏和低级别发现宏。
密码 输入用户密码(最多 255 个字符)。
当 HTTP 身份验证 设置为 Basic、NTLM、Kerberos 或 Digest 时,此字段可用。支持用户宏和低级别发现宏。
SSL 验证对等方 选中复选框以验证 web 服务器的 SSL 证书。服务器证书会根据系统范围 CA 位置中的受信任证书颁发机构(CA)证书进行验证。可以使用 Zabbix 服务器或 proxy 配置参数 SSLCALocation 覆盖 CA 文件的位置。
此项设置 CURLOPT_SSL_VERIFYPEER cURL 选项。
SSL 验证主机 选中复选框以验证 web 服务器证书的 Common Name 字段或 Subject Alternate Name 字段是否匹配。
此项设置 CURLOPT_SSL_VERIFYHOST cURL 选项。
SSL 证书文件 用于客户端身份验证的 SSL 证书文件名称。证书文件必须为 PEM1 格式。如果证书文件还包含私钥,请将 SSL 密钥文件 字段留空。如果密钥已加密,请在 SSL 密钥密码 字段中指定密码。包含此文件的目录由 Zabbix 服务器或 proxy 配置参数 SSLCertLocation 指定。
支持的宏:{HOST.IP}、{HOST.CONN}、{HOST.DNS}、{HOST.HOST}、{HOST.NAME}、{HOST.PORT}、{ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏、低级别发现宏。
此项设置 CURLOPT_SSLCERT cURL 选项。
SSL 密钥文件 用于客户端身份验证的 SSL 私钥文件名称。私钥文件必须为 PEM1 格式。包含此文件的目录由 Zabbix 服务器或 proxy 配置参数 SSLKeyLocation 指定。
支持的宏:{HOST.IP}、{HOST.CONN}、{HOST.DNS}、{HOST.HOST}、{HOST.NAME}、{HOST.PORT}、{ITEM.ID}、{ITEM.KEY}、{ITEM.KEY.ORIG}、用户宏、低级别发现宏。
此项设置 CURLOPT_SSLKEY cURL 选项。
SSL 密钥密码 SSL 私钥文件密码。
支持的宏:用户宏、低级别发现宏。
此项设置 CURLOPT_KEYPASSWD cURL 选项。
超时 Zabbix 处理 URL 所用的时间不会超过设定值(1-600 秒)。实际上,此参数定义了与 URL 建立连接以及执行 HTTP 请求的最长时间。因此,Zabbix 对一次检查所用的时间不会超过 2 x 超时 秒。
此项设置 CURLOPT_TIMEOUT cURL 选项。
有关 超时 参数的更多信息,请参阅监控项常规属性。
启用捕获 选中此复选框后,监控项还将作为 trapper 监控项运行,并接受通过 Zabbix sender 工具或 Zabbix sender 协议 发送到 Zabbix 服务器或 proxy 的数据,或者接受通过 history.push API 方法发送到 Zabbix 服务器的数据。有关发送数据的更多信息,请参阅:Trapper 监控项。
允许的主机 仅当选中 启用捕获 复选框时可见。
以逗号分隔的 IP 地址列表(可选用 CIDR 表示法)或 DNS 名称。

默认值为用户宏 {$TRAPPER.ALLOWED_HOSTS}。默认情况下,{$TRAPPER.ALLOWED_HOSTS} 为 127.0.0.1,::1。可以直接在字段中输入地址,也可以更改宏值。如果留空,将拒绝来自所有主机的传入连接。如果指定了值,则仅接受来自此处列出的主机的传入连接。
如果启用了 IPv6 支持,则 127.0.0.1、::127.0.0.1、::ffff:127.0.0.1 将被视为相同,并且 ::/0 将允许任何 IPv4 或 IPv6 地址。
可以使用 0.0.0.0/0 允许任何 IPv4 地址。
请注意,“IPv4 兼容的 IPv6 地址”(0000::/96 前缀)受支持,但已被 RFC4291 弃用。
示例:127.0.0.1、192.168.1.0/24、192.168.3.1-255、192.168.1-10.1-255、::1、2001:db8::/32、mysqlserver1、zabbix.example.com、{HOST.HOST}
此字段允许使用空格和用户宏。
此字段允许使用主机宏:{HOST.HOST}、{HOST.NAME}、{HOST.IP}、{HOST.DNS}、{HOST.CONN}。

如果 HTTP proxy 字段留空,还可以通过设置与 proxy 相关的环境变量来使用 HTTP proxy。

对于 HTTP - 为 Zabbix 服务器用户设置 http_proxy 环境变量。 例如:
http_proxy=http://proxy_ip:proxy_port。

对于 HTTPS - 设置 HTTPS_PROXY 环境变量。 例如:
HTTPS_PROXY=http://proxy_ip:proxy_port。 运行 shell 命令可获取更多详细信息:\# man curl。

[1] Zabbix 仅支持 PEM 格式的证书和私钥文件。 如果证书和私钥数据位于 PKCS #12 格式的文件中(通常扩展名为 *.p12 或 *.pfx),可以使用以下命令从中生成 PEM 文件:

openssl pkcs12 -in ssl-cert.p12 -clcerts -nokeys -out ssl-cert.pem
openssl pkcs12 -in ssl-cert.p12 -nocerts -nodes  -out ssl-cert.key

示例

示例 1

发送简单的 GET 请求以从 Elasticsearch 等服务检索数据:

  • 创建一个 GET 监控项,URL 为:localhost:9200/?pretty
  • 注意响应:
    {
      "name" : "YQ2VAY-",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "kH4CYqh5QfqgeTsjh2F9zg",
      "version" : {
        "number" : "6.1.3",
        "build_hash" : "af51318",
        "build_date" : "2018-01-26T18:22:55.523Z",
        "build_snapshot" : false,
        "lucene_version" : "7.1.0",
        "minimum_wire_compatibility_version" : "5.6.0",
        "minimum_index_compatibility_version" : "5.0.0"
      },
      "tagline" : "You know, for search"
    }
  • 现在使用 JSONPath 预处理步骤提取版本号:$.version.number
示例 2

发送简单的 POST 请求,从 Elasticsearch 等服务中检索数据:

  • 创建一个 POST 监控项,URL 为:http://localhost:9200/str/values/_search?scroll=10s
  • 配置以下 POST 请求体以获取处理器负载(每个核心 1 分钟平均值)
    {
        "query": {
            "bool": {
                "must": [{
                    "match": {
                        "itemid": 28275
                    }
                }],
                "filter": [{
                    "range": {
                        "clock": {
                            "gt": 1517565836,
                            "lte": 1517566137
                        }
                    }
                }]
            }
        }
    }
  • 返回结果:
    {
        "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAAkFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAJRZZUTJWQVktVFNacU5nRHhlcEI0QUxRAAAAAAAAACYWWVEyVkFZLVRTWnFOZ0R4ZXBCNEFMUQAAAAAAAAAnFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAKBZZUTJWQVktVFNacU5nRHhlcEI0QUxR",
        "took": 18,
        "timed_out": false,
        "_shards": {
            "total": 5,
            "successful": 5,
            "skipped": 0,
            "failed": 0
        },
        "hits": {
            "total": 1,
            "max_score": 1.0,
            "hits": [{
                "_index": "dbl",
                "_type": "values",
                "_id": "dqX9VWEBV6sEKSMyk6sw",
                "_score": 1.0,
                "_source": {
                    "itemid": 28275,
                    "value": "0.138750",
                    "clock": 1517566136,
                    "ns": 25388713,
                    "ttl": 604800
                }
            }]
        }
    }
  • 现在使用 JSONPath 预处理步骤获取监控项值:$.hits.hits[0]._source.value
示例 3

使用 apiinfo.version 检查 Zabbix API 是否存活。

  • 监控项配置:

注意这里使用了带有 JSON 数据的 POST 方法,设置请求头,并要求仅返回响应头:

  • 使用正则表达式对监控项值进行预处理,以获取 HTTP 状态码:

  • 在 Latest data 中检查结果:

示例 4

通过连接 Openweathermap 公共服务获取天气信息。

  • 配置一个主监控项,用于在单个 JSON 中批量收集数据:

请注意在查询字段中使用宏。 有关如何填写,请参阅 Openweathermap API。

HTTP agent 返回的示例 JSON:

{
    "body": {
        "coord": {
            "lon": 40.01,
            "lat": 56.11
        },
        "weather": [{
            "id": 801,
            "main": "Clouds",
            "description": "few clouds",
            "icon": "02n"
        }],
        "base": "stations",
        "main": {
            "temp": 15.14,
            "pressure": 1012.6,
            "humidity": 66,
            "temp_min": 15.14,
            "temp_max": 15.14,
            "sea_level": 1030.91,
            "grnd_level": 1012.6
        },
        "wind": {
            "speed": 1.86,
            "deg": 246.001
        },
        "clouds": {
            "all": 20
        },
        "dt": 1526509427,
        "sys": {
            "message": 0.0035,
            "country": "RU",
            "sunrise": 1526432608,
            "sunset": 1526491828
        },
        "id": 487837,
        "name": "Stavrovo",
        "cod": 200
    }
}

下一步是配置依赖监控项,从 JSON 中提取数据。

  • 配置一个用于湿度的示例依赖监控项:

其他天气指标,例如“Temperature”,也以相同方式添加。

  • 使用 JSONPath 的示例依赖监控项值预处理:

  • 在 Latest data 中查看天气数据结果:

示例 5

连接到 NGINX 状态页面并批量获取其指标。

  • 按照官方指南配置 NGINX。
  • 配置用于批量数据采集的主监控项:

NGINX stub status 输出示例:

Active connections: 1 Active connections:
server accepts handled requests
 52 52 52 
Reading: 0 Writing: 1 Waiting: 0

下一步是配置用于提取数据的依赖监控项。

  • 配置用于获取每秒请求数的依赖监控项示例:

  • 使用正则表达式 server accepts handled requests\s+([0-9]+) ([0-9]+) ([0-9]+) 对依赖监控项值进行预处理的示例:

  • 在最新数据中检查 stub 模块返回的完整结果: