1 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 の前処理ステップを使用する依存アイテムを作成する必要があります。

  • 設定フォームで依存アイテムの一般パラメータを入力する
  • 前処理タブに移動する
  • 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 Metric またはラベル値 (Prometheus pattern)
単一値の 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>