16 HTTP agent

概述

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

HTTP 监控项 检查由 Zabbix server 执行。然而,当由 Zabbix proxy 监控 主机 时,HTTP 监控项 检查则由 proxy 执行。

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

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

Zabbix server/proxy 必须首先配置 cURL(libcurl)支持。

HTTP 检查是异步执行的 —— 不需要等待一个请求的响应完成后再启动其他检查。DNS 解析也是异步的。

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

异步 HTTP agent 轮询器的数量由 starthttpagentpollers 参数定义。

自 Zabbix 7 起,HTTP agent 检查中引入了持久连接的 cURL 特性。0

配置

配置一个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 选择请求方法类型:GETPOSTPUTHEAD
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 选择必须检索的响应部分:
Body - 仅正文
Headers - 仅头部
Body and headers - 正文和头部
Convert to JSON 如果检索模式未设置为Body,则头部将作为属性和值对保存在"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 选择认证选项:
None - 不使用认证;
Basic - 使用基本认证;
NTLM - 使用NTLM(Windows NT LAN Manager)认证;
Kerberos - 使用Kerberos认证(另请参见:Configuring Kerberos with Zabbix);
Digest - 使用Digest认证。
此设置对应CURLOPT_HTTPAUTH cURL选项。
User name 输入用户名(最多255个字符)。
如果HTTP认证设置为Basic、NTLM、Kerberos或Digest,则此字段可用。支持用户宏和低级别自动发现宏。
Password 输入用户密码(最多255个字符)。
如果HTTP认证设置为Basic、NTLM、Kerberos或Digest,则此字段可用。支持用户宏和低级别自动发现宏。
SSL verify peer 勾选此复选框以验证Web服务器的SSL证书。服务器证书将自动从系统范围的证书颁发机构(CA)位置获取。您可以使用Zabbix server或proxy配置参数SSLCALocation覆盖CA文件的位置。
此设置对应CURLOPT_SSL_VERIFYPEER cURL选项。
SSL verify host 勾选此复选框以验证Web服务器证书的通用名称字段或主题备用名称字段是否匹配。
此设置对应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选项。
Timeout Zabbix处理URL的时间不会超过设定值(1-600秒)。实际上,此参数定义了连接到URL的最大时间和执行HTTP请求的最大时间。因此,Zabbix在一个检查上不会花费超过2 x Timeout秒的时间。
此设置对应CURLOPT_TIMEOUT cURL选项。
有关Timeout参数的更多信息,请参见配置
Enable trapping 勾选此复选框后,该监控项还将作为trapper 监控项,并接受通过Zabbix sender工具或Zabbix sender protocol发送到Zabbix server或proxy的数据,或接受通过history.push API方法发送到Zabbix server的数据。有关发送数据的更多信息,请参见:发送数据
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" : "You know, for search"
           }
  • 现在使用 JSONPath 预处理步骤提取 version 数值: $.version.number
示例2

向类似 Elasticsearch 的服务发送简单的 POST 请求以检索数据:

  • 创建一个带有如下 URL 的 POST 监控项: 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 预处理步骤来 get 监控项 值: $.hits.hits[0]._source.value
示例3

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

  • 监控项 配置:

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

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

  • 最新数据 中检查结果:

示例4

通过连接到Openweathermap公共服务检索天气信息。

  • 配置一个主监控项以在单个JSON中进行批量数据收集:

请注意query字段中宏的使用。有关如何填写它们,请参阅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中提取数据的依赖项监控项。

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

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

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

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

示例5

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

  • 按照 official guide 中的说明配置 nginx。
  • 配置一个主 监控项 用于批量数据收集:

示例 nginx stub 状态输出:

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]+) 对依赖 监控项 的值进行示例预处理:

  • Latest data 中检查 stub 模块的完整结果: