17 Prometheus チェック
概要
Zabbixは、Prometheusのラインフォーマットで公開されたメトリクスを取得できます。
Prometheusデータの収集を開始するには、2つのステップが必要です。
- 適切なデータエンドポイント(例:
https://<prometheus host>/metrics)を指すHTTPマスターアイテム - マスターアイテムで収集したメトリクスから必要なデータを取得するためのPrometheus前処理オプションを使用する従属アイテム
Prometheusデータの前処理オプションは2つあります。
- Prometheusパターン - 通常のアイテムでPrometheusデータを取得するために使用
- Prometheus to JSON - 通常のアイテムおよびローレベルディスカバリで使用。この場合、取得したPrometheusデータはJSON形式で返されます。
バルクプロセッシング
依存 item はバルクプロセッシングに対応しています。
キャッシュとインデックスを有効にするには、Prometheus pattern のプリプロセスを 最初の プリプロセスステップにする必要があります。
Prometheus pattern が最初のプリプロセスステップである場合、パースされた Prometheus データは、
Prometheus pattern プリプロセスステップの最初の <label>==<value> 条件によってキャッシュされ、インデックスが作成されます。
このキャッシュは、このバッチ内の他の依存 item を処理する際に再利用されます。
最適なパフォーマンスを得るために、最初のラベルは最も異なる値を持つものにすべきです。
最初のステップの前に他のプリプロセスがある場合は、マスター item か、従属 item のマスター item として使用される
新しい従属 item のどちらかに移動させる必要があります。
設定
HTTPマスターアイテムが設定されている場合は、Prometheusの前処理ステップを使用する従属アイテムを作成する必要があります。
- 設定フォームで一般的な従属アイテムのパラメータを入力します
- [前処理]タブに移動します
- Prometheusの前処理オプション(PrometheusパターンまたはPrometheus to JSON)を選択します

Prometheusパターン前処理オプションに固有のパラメータは以下の通りです。
| パラメータ | 説明 | 例 |
|---|---|---|
| パターン | 必要なデータパターンを定義するために、Prometheusクエリ言語に似たクエリ言語を使用できます(比較表を参照)、例: <metric name> - メトリック名で選択 {__name__="<metric name>"} - メトリック名で選択 {__name__=\~"<regex>"} - 正規表現に一致するメトリック名で選択 {<label name>="<label value>",...} - ラベル名で選択 {<label name>=\~"<regex>",...} - 正規表現に一致するラベル名で選択 {__name__=\~".*"}==<value> - メトリック値で選択 または上記の組み合わせ: <metric name>{<label1 name>="<label1 value>",<label2 name>=\~"<regex>",...}==<value> ラベル値は任意のUTF-8文字列ですが、バックスラッシュ、ダブルクォート、改行文字はそれぞれ \\、\"、\nとしてエスケープする必要があります。他の文字はエスケープしないでください。 |
wmi_os_physical_memory_free_bytes cpu_usage_system{cpu="cpu-total"} cpu_usage_system{cpu=\~".*"} cpu_usage_system{cpu="cpu-total",host=\~".*"} wmi_service_state{name="dhcp"}==1 wmi_os_timezone{timezone=\~".*"}==1 |
| 結果処理 | 値を返すか、ラベルを返すか、または適切な関数を適用するか(パターンが複数行に一致し、結果を集約する必要がある場合): value - メトリック値を返す(複数行に一致した場合はエラー) label - ラベルフィールドで指定したラベルの値を返す(複数のメトリックに一致した場合はエラー) sum - 値の合計を返す min - 最小値を返す max - 最大値を返す avg - 平均値を返す count - 値の数を返す このフィールドはPrometheusパターンオプションでのみ利用可能です。 |
下記のパラメータ使用例も参照してください。 |
| 出力 | ラベル名を定義します(オプション)。この場合、ラベル名に対応する値が返されます。 このフィールドは、結果処理フィールドで「ラベル」が選択されている場合にのみ、Prometheusパターンオプションで利用可能です。 |
パラメータ使用例
- 最も一般的なユースケースは値を返すことです。以下から
/var/dbの値を返すには:
node_disk_usage_bytes{path="/var/cache"} 2.1766144e+09
node_disk_usage_bytes{path="/var/db"} 20480
node_disk_usage_bytes{path="/var/dpkg"} 8192
node_disk_usage_bytes{path="/var/empty"} 4096
次のパラメータを使用します:
- パターン -
node_disk_usage_bytes{path="/var/db"} - 結果処理 - 「値」を選択
- すべての
node_disk_usage_bytesパラメータの平均値に興味がある場合:
- パターン -
node_disk_usage_bytes - 結果処理 - 「平均」を選択
- Prometheusは数値データのみをサポートしていますが、関連するテキストの説明も返すための回避策が一般的に使用されています。これはフィルタとラベルの指定で実現できます。したがって、以下から「color」ラベルの値を返すには
elasticsearch_cluster_health_status{cluster="elasticsearch",color="green"} 1
elasticsearch_cluster_health_status{cluster="elasticsearch",color="red"} 0
elasticsearch_cluster_health_status{cluster="elasticsearch",color="yellow"} 0
次のパラメータを使用します:
- パターン -
elasticsearch_cluster_health_status {cluster="elasticsearch"} == 1 - 結果処理 - 「ラベル」を選択
- ラベル - 「color」と指定
フィルタ(数値「1」に基づく)は適切な行に一致し、ラベルはヘルスステータスの説明(現在は「green」、ただし将来的には「red」や「yellow」もあり得る)を返します。
PrometheusからJSONへ
Prometheusからのデータローレベルディスカバリーに使用することができます。この場合、JSON形式のデータが必要で、
Prometheus to JSON プリプロセッシングオプションはまさにそのデータを返します。
詳しくは、Discovery using Prometheus dataを参照してください。
クエリ言語の比較
次の表は、PromQLとZabbix Prometheus前処理クエリ言語の違いと類似点を示しています。
| PromQLインスタントベクターセレクター | Zabbix Prometheus前処理 | |
|---|---|---|
| 違い | ||
| クエリターゲット | Prometheusサーバー | Prometheusエクスポート形式のプレーンテキスト |
| 戻り値 | インスタントベクター | メトリックまたはラベル値(Prometheusパターン) JSONでの単一値のメトリック配列(Prometheus to JSON) |
| ラベルマッチング演算子 | =, !=, =\~, !\~ | =, !=, =\~, !\~ |
| ラベルまたはメトリック名のマッチングに使用される正規表現 | RE2 | PCRE |
| 比較演算子 | リストを参照 | 値フィルタリングには==(等しい)のみサポート |
| 類似点 | ||
| 文字列と等しいメトリック名での選択 | <metric name> または {__name__="<metric name>"} | <metric name> または {__name__="<metric name>"} |
| 正規表現に一致するメトリック名での選択 | {__name__=\~"<regex>"} | {__name__=\~"<regex>"} |
| 文字列と等しい<label name>値での選択 | {<label name>="<label value>",...} | {<label name>="<label value>",...} |
| 正規表現に一致する<label name>値での選択 | {<label name>=\~"<regex>",...} | {<label name>=\~"<regex>",...} |
| 値が文字列と等しい場合の選択 | {__name__=\~".*"} == <value> | {__name__=\~".*"} == <value> |