16 HTTPエージェント

概要

このアイテムタイプでは、HTTP/HTTPSプロトコルを使用したデータのポーリングが可能です。 トラッピングも、Zabbix senderユーティリティやZabbix senderプロトコル(Zabbixサーバーまたはプロキシへのデータ送信)、またはhistory.pushAPIメソッド(Zabbixサーバーへのデータ送信)を使用して可能です。

HTTPアイテムチェックはZabbixサーバーによって実行されます。ただし、ホストがZabbixプロキシによって監視されている場合、HTTPアイテムチェックはプロキシによって実行されます。

HTTPアイテムチェックは、監視対象ホストでエージェントを実行する必要はありません。

HTTPエージェントは、HTTPとHTTPSの両方をサポートします。Zabbixは、リダイレクトをオプションで追跡します(下記のリダイレクトを追跡オプションを参照)。リダイレクトの最大数は10にハードコードされています(cURLオプションCURLOPT_MAXREDIRSを使用)。

Zabbixサーバー/プロキシは、最初にcURL(libcurl)サポートで構成する必要があります。

HTTPチェックは非同期で実行されます。1つのリクエストの応答を受信する前に他のチェックを開始する必要はありません。DNS解決も非同期です。

非同期チェックの最大同時実行数は1000です(MaxConcurrentChecksPerPollerで定義)。

非同期HTTPエージェントポーラーの数は、StartHTTPAgentPollersパラメータで定義されます。

cURLの永続的な接続機能は、Zabbix 7.0以降のHTTPエージェントチェックに追加されました。

設定

HTTPアイテムを設定するには:

  • データ収集ホスト に移動します
  • ホストの行にある アイテム をクリックします
  • アイテムの作成 をクリックします
  • フォームにアイテムのパラメータを入力します

必須の入力フィールドには、すべて赤いアスタリスクが付いています。

HTTPアイテムで固有の情報が必要なフィールドは次のとおりです:

Parameter Description
Type ここでは HTTPエージェント を選択します。
Key 一意のアイテムキーを入力します。
URL 接続してデータを取得するURLです。例:
https://www.example.com
http://www.example.com/download
ドメイン名はUnicode文字で指定できます。HTTPチェックの実行時に自動的にpunycodeでASCIIへ変換されます。
Parse ボタンを使用すると、オプションのクエリフィールド(例:?name=Admin&password=mypassword)をURLから分離し、属性と値を Query fields に移動して自動的にURLエンコードできます。
2048文字まで。
サポートされるマクロ: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {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}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, ユーザーマクロ、ローレベルディスカバリマクロ。
これは CURLOPT_URL cURLオプションを設定します。
Request type リクエストメソッドの種類を選択します: GETPOSTPUTHEAD
Request body type リクエストボディの種類を選択します:
Raw data - カスタムHTTPリクエストボディ。マクロは置換されますが、エンコードは行われません
JSON data - JSON形式のHTTPリクエストボディ。マクロは文字列、数値、true、false として使用できます。文字列として使用するマクロはダブルクォートで囲む必要があります。マクロからの値は展開された後、自動的にエスケープされます。"Content-Type" がヘッダーで指定されていない場合、デフォルトで "Content-Type: application/json" になります
XML data - XML形式のHTTPリクエストボディ。マクロはテキストノード、属性、またはCDATAセクションとして使用できます。マクロからの値は展開された後、テキストノードおよび属性内で自動的にエスケープされます。"Content-Type" がヘッダーで指定されていない場合、デフォルトで "Content-Type: application/xml" になります
Request body リクエストボディを入力します。
サポートされるマクロ: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, ユーザーマクロ、ローレベルディスカバリマクロ。
Headers リクエスト実行時に送信されるカスタムHTTPヘッダーです。
属性と値のペアとして指定します。
サポートされるマクロ: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {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 Retrieve modeBody に設定されていない場合、ヘッダーは "header" キーの下に属性と値のペアとして保存されます。
'Content-Type: application/json' が検出された場合、ボディはオブジェクトとして保存され、それ以外の場合は文字列として保存されます。例:
HTTP proxy 使用するHTTPプロキシを [protocol://][username[:password]@]proxy.example.com[:port] の形式で指定できます。
オプションの protocol:// プレフィックスを使用して、代替のプロキシプロトコル(例: https、socks4、socks5。詳細は documentation を参照。プロトコルプレフィックスのサポートは cURL 7.21.7 で追加)を指定できます。プロトコルを指定しない場合、プロキシはHTTPプロキシとして扱われます。誤ったプロトコルを指定すると接続は失敗し、アイテムは未サポートになります。
デフォルトではポート1080が使用されます。
指定した場合、プロキシは http_proxy、HTTPS_PROXY などのプロキシ関連環境変数を上書きします。指定しない場合、プロキシはプロキシ関連環境変数を上書きしません。入力した値はそのまま渡され、妥当性チェックは行われません。
:HTTPプロキシでは単純認証のみサポートされます。
サポートされるマクロ: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, ユーザーマクロ、ローレベルディスカバリマクロ。
これは CURLOPT_PROXY cURLオプションを設定します。
HTTP authentication 認証オプションを選択します:
None - 認証は使用しません。
Basic - Basic認証を使用します。
NTLM - NTLM (Windows NT LAN Manager) 認証を使用します。
Kerberos - Kerberos認証を使用します(あわせて参照: Configuring Kerberos with Zabbix)。
Digest - Digest認証を使用します。
これは CURLOPT_HTTPAUTH cURLオプションを設定します。
User name ユーザー名を入力します(255文字まで)。
このフィールドは HTTP authentication が Basic、NTLM、Kerberos、または Digest に設定されている場合に使用できます。ユーザーマクロおよびローレベルディスカバリマクロをサポートします。
Password ユーザーパスワードを入力します(255文字まで)。
このフィールドは HTTP authentication が Basic、NTLM、Kerberos、または Digest に設定されている場合に使用できます。ユーザーマクロおよびローレベルディスカバリマクロをサポートします。
SSL verify peer WebサーバーのSSL証明書を検証するには、このチェックボックスをオンにします。サーバー証明書はシステム全体の認証局(CA)の場所から自動的に取得されます。CAファイルの場所は、Zabbix server または プロキシ の設定パラメータ SSLCALocation を使用して上書きできます。
これは CURLOPT_SSL_VERIFYPEER cURLオプションを設定します。
SSL verify host Webサーバー証明書の Common Name フィールドまたは Subject Alternate Name フィールドが一致することを検証するには、このチェックボックスをオンにします。
これは CURLOPT_SSL_VERIFYHOST cURLオプションを設定します。
SSL certificate file クライアント認証に使用するSSL証明書ファイルの名前です。証明書ファイルは PEM1 形式である必要があります。証明書ファイルに秘密鍵も含まれている場合は、SSL key file フィールドは空のままにしてください。鍵が暗号化されている場合は、SSL key password フィールドにパスワードを指定します。このファイルを含むディレクトリは、Zabbix server または プロキシ の設定パラメータ SSLCertLocation で指定します。
サポートされるマクロ: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, ユーザーマクロ、ローレベルディスカバリマクロ。
これは CURLOPT_SSLCERT cURLオプションを設定します。
SSL key file クライアント認証に使用するSSL秘密鍵ファイルの名前です。秘密鍵ファイルは PEM1 形式である必要があります。このファイルを含むディレクトリは、Zabbix server または プロキシ の設定パラメータ SSLKeyLocation で指定します。
サポートされるマクロ: {HOST.IP}, {HOST.CONN}, {HOST.DNS}, {HOST.HOST}, {HOST.NAME}, {HOST.PORT}, {ITEM.ID}, {ITEM.KEY}, {ITEM.KEY.ORIG}, ユーザーマクロ、ローレベルディスカバリマクロ。
これは CURLOPT_SSLKEY cURLオプションを設定します。
SSL key password SSL秘密鍵ファイルのパスワードです。
サポートされるマクロ: ユーザーマクロ、ローレベルディスカバリマクロ。
これは CURLOPT_KEYPASSWD cURLオプションを設定します。
Timeout Zabbixは、URLの処理に設定された時間(1~600秒)を超えて費やしません。実際には、このパラメータはURLへの接続を確立する最大時間と、HTTPリクエストを実行する最大時間を定義します。したがって、Zabbixは1回のチェックに対して 2 x Timeout 秒を超えて費やしません。
これは CURLOPT_TIMEOUT cURLオプションを設定します。
Timeout パラメータの詳細については、一般的なアイテム属性 を参照してください。
Enable trapping このチェックボックスをオンにすると、このアイテムはトラッパーアイテムとしても機能し、Zabbix sender ユーティリティまたは Zabbix sender protocol を使用して Zabbix server または プロキシ に送信されたデータ、または history.push APIメソッドを使用して Zabbix server に送信されたデータを受け付けます。データ送信の詳細については、トラッパーアイテム を参照してください。
Allowed hosts Enable trapping チェックボックスがオンの場合にのみ表示されます。
カンマ区切りの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プロキシを使用する別の方法として、 プロキシ関連の環境変数を設定できます。

HTTP の場合 - Zabbix server ユーザーに対して http_proxy 環境変数を設定します。例:
http_proxy=http://proxy_ip:proxy_port

HTTPS の場合 - HTTPS_PROXY 環境変数を設定します。例:
HTTPS_PROXY=http://proxy_ip:proxy_port。詳細は、シェルコマンド # 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

Elasticsearchのようなサービスからデータを取得するために、単純なGETリクエストを送信します。

  • URLがlocalhost:9200/?prettyのGETアイテムを作成します
  • レスポンスを確認します:
    {
      "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

Elasticsearchなどのサービスからデータを取得するために、シンプルなPOSTリクエストを送信します:

  • URLに対してPOSTアイテムを作成します: http://localhost:9200/str/values/_search?scroll=10s
  • プロセッサの負荷(1分平均/コア)を取得するために、以下のPOSTボディを設定します
    {
        "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

Zabbix APIが生きているかどうかを確認するには、 apiinfo.versionを使用します。

  • アイテムの設定:

POSTメソッドでJSONデータを使用し、リクエストヘッダーを設定し、ヘッダーのみを返すように指定している点に注意してください。

  • HTTPコードを取得するための正規表現によるアイテム値の事前処理:

  • 最新データでの結果の確認:

例4

Openweathermapのパブリックサービスに接続して天気情報を取得します。

  • 1つのJSONで一括データ収集のためのマスターアイテムを設定します。

クエリフィールドでのマクロの使用に注意してください。これらの入力方法についてはOpenweathermap APIを参照してください。

HTTPエージェントの応答で返されるサンプル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のステータスページに接続し、そのメトリクスを一括で取得します。

  • 公式ガイドに従って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モジュールからの完全な結果を確認します: