17 Prometheus チェック

概要

Zabbixは、Prometheusの行形式で公開されたメトリクスを問い合わせることができます。

Prometheusデータの収集を開始するには、次の2つの手順が必要です。

  • 適切なデータエンドポイントを指すHTTPマスターアイテム。例: https://<prometheus host>/metrics
  • Prometheusの前処理オプションを使用する依存アイテム。マスターアイテムによって収集されたメトリクスから必要なデータを問い合わせます

Prometheusデータの前処理オプションは2種類あります。

  • Prometheusパターン - 通常のアイテムでPrometheusデータを問い合わせるために使用します
  • PrometheusからJSON - 通常のアイテムおよびローレベルディスカバリで使用します。この場合、問い合わせたPrometheusデータはJSON形式で返されます。
バルクプロセッシング

依存 item はバルクプロセッシングに対応しています。
キャッシュとインデックスを有効にするには、Prometheus pattern のプリプロセスを 最初の プリプロセスステップにする必要があります。
Prometheus pattern が最初のプリプロセスステップである場合、パースされた Prometheus データは、
Prometheus pattern プリプロセスステップの最初の <label>==<value> 条件によってキャッシュされ、インデックスが作成されます。
このキャッシュは、このバッチ内の他の依存 item を処理する際に再利用されます。
最適なパフォーマンスを得るために、最初のラベルは最も異なる値を持つものにすべきです。

最初のステップの前に他のプリプロセスがある場合は、マスター item か、従属 item のマスター item として使用される
新しい従属 item のどちらかに移動させる必要があります。

設定

HTTPマスターアイテムが設定されている場合は、Prometheusの前処理ステップを使用する依存アイテムを作成する必要があります。

  • 設定フォームで依存アイテムの一般的なパラメータを入力します
  • [前処理]タブを開きます
  • Prometheus前処理オプション(Prometheus pattern または Prometheus to JSON)を選択します

以下のパラメータは、Prometheus pattern 前処理オプション固有のものです。

パラメータ 説明
Pattern 必要なデータパターンを定義するには、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
Result processing 値を返すか、ラベルを返すか、または適切な関数を適用するかを指定します(パターンが複数行に一致し、結果を集計する必要がある場合):
value - メトリクス値を返します(複数行に一致した場合はエラー)
label - Label フィールドで指定したラベルの値を返します(複数のメトリクスに一致した場合はエラー)
sum - 値の合計を返します
min - 最小値を返します
max - 最大値を返します
avg - 平均値を返します
count - 値の件数を返します
このフィールドは Prometheus pattern オプションでのみ使用できます。
以下のパラメータ使用例も参照してください。
Output ラベル名を定義します(任意)。この場合、そのラベル名に対応する値が返されます。
このフィールドは、Result processing フィールドで「Label」が選択されている場合に限り、Prometheus pattern オプションでのみ使用できます。

パラメータの使用例

  1. 最も一般的な使用例は、value を返すことです。次のデータから /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

次のパラメータを使用します。

  • Pattern - node_disk_usage_bytes{path="/var/db"}
  • Result processing - 「value」を選択
  1. すべての node_disk_usage_bytes パラメータの平均値が必要な場合もあります。
  • Pattern - node_disk_usage_bytes
  • Result processing - 「avg」を選択
  1. 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

次のパラメータを使用します。

  • Pattern - elasticsearch_cluster_health_status {cluster="elasticsearch"} == 1
  • Result processing - 「label」を選択
  • Label - 「color」を指定

フィルター(数値 '1' に基づく)は適切な行に一致し、ラベルはヘルスステータスの説明を返します(現在は 'green' ですが、'red' または 'yellow' になる可能性もあります)。

PrometheusからJSONへ

Prometheusからのデータローレベルディスカバリーに使用することができます。この場合、JSON形式のデータが必要で、
Prometheus to JSON プリプロセッシングオプションはまさにそのデータを返します。

詳しくは、Discovery using Prometheus dataを参照してください。

クエリ言語の比較

以下の表は、PromQL と Zabbix の Prometheus 前処理クエリ言語の相違点と類似点を示しています。

PromQL instant vector selector Zabbix Prometheus 前処理
相違点
クエリ対象 Prometheus サーバー Prometheus exposition format のプレーンテキスト
返される値 Instant vector メトリクスまたはラベル値(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>