16 HTTP agent

概述

该监控项类型支持通过HTTP/HTTPS协议进行数据轮询。 同时也可使用Zabbix sender或Zabbix sender协议实现陷阱捕获。

HTTP 监控项检查由Zabbix server执行。但当通过Zabbix proxy监控主机时, HTTP 监控项检查将由proxy执行。

HTTP 监控项检查无需在被监控的一个主机上运行任何agent。

HTTP agent同时支持HTTP和HTTPS协议。Zabbix可选择性地跟随重定向(参见下文Follow redirects选项)。 最大重定向次数硬编码为10次(使用cURL选项CURLOPT_MAXREDIRS)。

Zabbix server/proxy必须在初始配置时 启用cURL(libcurl)支持。

配置

配置HTTP 监控项的步骤:

  • 前往: 配置主机
  • 在主机行中点击监控项
  • 点击创建监控项
  • 在表单中输入监控项的参数

所有必填字段都标有红色星号。

HTTP 监控项需要特定信息的字段包括:

参数 描述
Type 在此选择HTTP agent
Key 输入唯一的监控项键。
URL 连接并获取数据的URL。例如:
https://www.example.com
http://www.example.com/download
域名可以用Unicode字符指定。执行HTTP检查时会自动转换为ASCII的punycode格式。
解析按钮可用于将可选的query字段(如?name=Admin&password=mypassword)从URL中分离出来,将属性和值移动到query字段进行自动URL编码。
限制为2048个字符。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。
这设置了CURLOPT_URL cURL选项。
Query fields URL的变量(见上文)。
指定为属性和值对。
值会自动进行URL编码。宏的值会被解析后自动进行URL编码。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。
这设置了CURLOPT_URL cURL选项。
Request type 选择请求方法类型: GET, POST, PUTHEAD
Timeout Zabbix处理URL的时间不会超过设置的时间(1-60秒)。实际上,此参数定义了连接到URL的最大时间和执行HTTP请求的最大时间。因此,Zabbix在一个检查上花费的时间不会超过2 x 超时秒数。
支持时间后缀,例如30s, 1m。
支持的宏: 用户宏, 低级发现宏。
这设置了CURLOPT_TIMEOUT cURL选项。
Request body type 选择请求体类型:
原始数据 - 自定义HTTP请求体,宏会被替换但不进行编码
JSON数据 - JSON格式的HTTP请求体。宏可以用作string, 数字, true和false; 用作字符串的宏必须用双引号括起来。宏的值会被解析后自动转义。如果未在头中指定"Content-Type",则默认为"Content-Type: application/json"
XML数据 - XML格式的HTTP请求体。宏可以用作文本节点、属性或CDATA部分。宏的值会被解析后自动在文本节点和属性中转义。如果未在头中指定"Content-Type",则默认为"Content-Type: application/xml"
注意 选择XML数据需要libxml2。
Request body 输入请求体。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。
Headers 执行请求时发送的自定义HTTP头。
指定为属性和值对。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。
这设置了CURLOPT_HTTPHEADER cURL选项。
Required status codes 预期的HTTP状态码列表。如果Zabbix收到的代码不在列表中,监控项将变为不支持。如果为空,则不进行检查。
例如: 200,201,210-299
列表中支持的宏: 用户宏, 低级发现宏。
这使用了CURLINFO_RESPONSE_CODE cURL选项。
Follow redirects 勾选复选框以跟随HTTP重定向。
这设置了CURLOPT_FOLLOWLOCATION cURL选项。
Retrieve mode 选择必须检索的响应部分:
正文 - 仅正文
- 仅头
正文和头 - 正文和头
Convert to JSON 头保存为"header"键下的属性和值对。
如果遇到'Content-Type: application/json',则正文保存为object,否则存储为string,例如:
HTTP proxy 可以指定使用的HTTP proxy,格式为[protocol://][username[:password]@]proxy.example.com[:port]
可选的前缀protocol://可用于指定替代的proxy协议(例如https, socks4, socks5; 参见documentation; 协议前缀支持在cURL 7.21.7中添加)。如果未指定协议,proxy将被视为HTTP proxy。如果指定了错误的协议,连接将失败,监控项将变为不支持。
默认使用1080端口。
如果指定,proxy将覆盖proxy相关的环境变量,如http_proxy, HTTPS_PROXY。如果未指定,proxy不会覆盖proxy相关的环境变量。输入的值按原样传递,不进行健全性检查。
注意 仅支持HTTP proxy的简单认证。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。
这设置了CURLOPT_PROXY cURL选项。
HTTP authentication 认证类型:
- 不使用认证。
基本 - 使用基本认证。
NTLM - 使用NTLM(Windows NT LAN Manager)认证。
Kerberos - 使用Kerberos认证。另见: Configuring Kerberos with Zabbix.
摘要 - 使用摘要认证。
选择认证方法将提供两个额外的字段用于输入用户名和密码,支持用户宏和低级发现宏。
这设置了CURLOPT_HTTPAUTH cURL选项。
SSL verify peer 勾选复选框以验证Web服务器的SSL证书。服务器证书将自动从系统范围的证书颁发机构(CA)位置获取。可以使用Zabbix server或proxy配置参数SSLCALocation覆盖CA文件的位置。
这设置了CURLOPT_SSL_VERIFYPEER cURL选项。
SSL verify host 勾选复选框以验证Web服务器证书的Common Name字段或Subject Alternate Name字段是否匹配。
这设置了CURLOPT_SSL_VERIFYHOST cURL选项。
SSL certificate file 用于客户端认证的SSL证书file的名称。证书file必须是PEM1格式。如果证书file也包含私钥,请将SSL密钥file字段留空。如果密钥已加密,请在SSL密钥密码字段中指定密码。包含此file的目录由Zabbix server或proxy配置参数SSLCertLocation指定。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。
这设置了CURLOPT_SSLCERT cURL选项。
SSL key file 用于客户端认证的SSL私钥file的名称。私钥file必须是PEM1格式。包含此file的目录由Zabbix server或proxy配置参数SSLKeyLocation指定。
支持的宏: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, 用户宏, 低级发现宏。
这设置了CURLOPT_SSLKEY cURL选项。
SSL key password SSL私钥file的密码。
支持的宏: 用户宏, 低级发现宏。
这设置了CURLOPT_KEYPASSWD cURL选项。
Enable trapping 勾选此复选框后,监控项还将作为trapper item运行,并接受Zabbix发送器或使用Zabbix发送器协议发送到此监控项的数据。
Allowed hosts 仅在启用捕获复选框勾选时可见。
逗号分隔的IP地址列表,可选CIDR表示法或DNS名称。
如果指定,则仅接受来自此处列出的主机的传入连接。
如果启用了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}
此字段中允许空格和user macros
主机宏: {HOST.HOST}, {HOST.NAME}, {HOST.IP}, {HOST.DNS}, {HOST.CONN}在此字段中允许。

如果HTTP proxy字段留空,另一种使用HTTP proxy的方法是设置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格式file(通常扩展名为*.p12或*.pfx)的证书和私钥数据,可以使用以下命令generate PEM file:

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" : "您知道的,专为搜索而生" }

  • 现在通过JSONPath预处理步骤提取version数值: $.version.number
示例2

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

  • 创建一个POST 监控项请求,URL为: http://localhost:9200/str/values/_search?scroll=10s

  • 配置以下POST请求体以获取处理器负载(1

    min average per core)

{ "query": { "bool": { "must": [{ "match": { "itemid": 28275 } }], "filter": [{ "range": { "clock": { "gt": 1517565836, "lte": 1517566137 } } }] } } }

  • 已接收:

{ "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAAkFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAJRZZUTJWQVktVFNacU5nRHhlcEI0QUxRAAAAAAAAACYWWVEyVkFZLVRTWnFOZ0R4ZXBCNEFMUQAAAAAAAAAnFllRMlZBWS1UU1pxTmdEeGVwQjRBTFEAAAAAAAAAKBZZUTJWQVktVFNacU5nRHhlcEI0QUxR" "耗时": 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预处理步骤来get监控项值: $.hits.hits[0]._source.value
示例3

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

  • 监控项配置:

注意使用POST方法携带JSON数据,设置请求头 并仅要求返回头部信息:

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

  • 最新数据中检查结果:

示例4

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

  • 配置主监控项以单次JSON批量收集数据:

注意query字段中宏的使用。参考Openweathermap API了解如何填充它们。

HTTPagent返回的示例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提取数据的依赖监控项。

  • 配置湿度指标的示例依赖监控项:

其他天气指标如'温度'以相同方式添加。

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

  • 最新数据中检查天气数据结果:

示例5

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

  • 按照[official

    guide](https://nginx.ru/en/docs/http/ngx_http_stub_status_module.html).

  • Configure a master item for bulk data collection:

配置nginx

示例 nginx 存根状态输出:

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]+):

server accepts handled requests\s+([0-9]+) ([0-9]+) ([0-9]+):

  • 最新数据中检查存根模块的完整结果: