Prometheusチェック

概要

Zabbixは、Prometheusのライン形式で公開されるメトリクスを取得できます。

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

  • 適切なデータエンドポイントを指すHTTPマスターアイテム。例: https://<prometheus host>/metrics
  • マスターアイテムで収集したメトリクスから必要なデータを取得するために、Prometheusの前処理オプションを使用する依存アイテム

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

  • Prometheus pattern - 通常のアイテムでPrometheusデータを取得するために使用します
  • Prometheus to JSON - 通常のアイテムおよびローレベルディスカバリで使用します。この場合、取得したPrometheusデータはJSON形式で返されます。
一括処理

一括処理は、依存アイテムでサポートされています。キャッシュとインデックス作成を有効にするには、Prometheus pattern の前処理を 最初の 前処理ステップにする必要があります。Prometheus pattern が最初の前処理ステップである場合、解析された Prometheus データは、Prometheus pattern 前処理ステップ内の最初の <label>==<value> 条件によってキャッシュされ、インデックスが作成されます。このキャッシュは、このバッチ内の他の依存アイテムを処理する際に再利用されます。最適なパフォーマンスを得るには、最初のラベルは値の種類が最も多いものにする必要があります。

最初のステップの前に他の前処理を行う必要がある場合は、それをマスターアイテムに移動するか、依存アイテムのマスターアイテムとして使用される新しい依存アイテムに移動してください。

設定

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

  1. 設定フォームで、依存アイテムの一般パラメータを入力します。
  2. 前処理 タブに移動します。
  3. Prometheusの前処理オプション(Prometheus pattern または Prometheus to JSON)を選択します。

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

Parameter Description Examples
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 前処理オプションを使用すると、まさにその形式が返されます。

詳細については、Prometheusデータを使用したディスカバリを参照してください。

クエリ言語の比較

次の表は、PromQL と Zabbix Prometheus 前処理クエリ言語の違いと共通点を示しています。

PromQL instant vector selector Zabbix Prometheus preprocessing
相違点
クエリ対象 Prometheus server 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>