Prometheusによるルールの単体テスト - Prometheusドキュメント

Unit testing rules with Prometheus

2.5.0以降、promtoolはレコーディングルールをテストできる機能がある。

PromQLは、強力な言語で、予想したことを全くしない式を書くということもあり得る。 単体テストによって、そのような問題を検出し、将来うっかり壊してしまう可能性を減らすことができる。 promtool単体テスト機能は、PromQLの内部的な実装の単体テストを元にしている。

簡単な例を見てみよう。

wget https://github.com/prometheus/prometheus/releases/download/v2.5.0/prometheus-2.5.0.linux-amd64.tar.gz
tar -xzf prometheus-*.tar.gz
cd prometheus-*
cat >rules.yml <<EOF
groups:
 - name: example
   rules:
    - record: job:up:sum
      expr: sum without(instance)(up)
EOF

このルールをテストするために、test.ymlを以下の内容で作成することができる。

rule_files:
  - rules.yml
evaluation_interval: 1m
tests:
 - interval: 1m
   input_series:
    - series: 'up{job="node",instance="foo"}'
      values: '1+0x10'
    - series: 'up{job="node",instance="bar"}'
      values: '1+0x5 0+0x5'
    - series: 'up{job="prometheus",instance="foo"}'
      values: '1+0x10'
   promql_expr_test:
    - expr: job:up:sum
      eval_time: 1m
      exp_samples:
       - labels: 'job:up:sum{job="node"}'
         value: 2
       - labels: 'job:up:sum{job="prometheus"}'
         value: 1
    - expr: job:up:sum
      eval_time: 6m
      exp_samples:
       - labels: 'job:up:sum{job="node"}'
         value: 1
       - labels: 'job:up:sum{job="prometheus"}'
         value: 1

以下のコマンドでこれらのテストを実行できる。

./promtool test rules test.yml

以下のような結果になるはずだ。

Unit Testing: test.yml
  SUCCESS

テストファイルを分解してみよう。

rule_files:
  - rules.yml
evaluation_interval: 1m

これは、ルールファイルrules.ymlを読み込んで、毎分そのルールを評価したいことを表している。

tests:
 - interval: 1m
   input_series:
    - series: 'up{job="node",instance="foo"}'
      values: '1+0x10'
    - series: 'up{job="node",instance="bar"}'
      values: '1+0x5 0+0x5'
    - series: 'up{job="prometheus",instance="foo"}'
      values: '1+0x10'

これは、1つ目のテストを定義し、入力データを提供している。 1つ目の時系列は1 1 1 1 1 1 1 1 1 1、 2つ目は1 1 1 1 1 0 0 0 0 0、 3つ目は1 1 1 1 1 1 1 1 1 1である。

   promql_expr_test:
    - expr: job:up:sum
      eval_time: 1m
      exp_samples:
       - labels: 'job:up:sum{job="node"}'
         value: 2
       - labels: 'job:up:sum{job="prometheus"}'
         value: 1
    - expr: job:up:sum
      eval_time: 6m
      exp_samples:
       - labels: 'job:up:sum{job="node"}'
         value: 1
       - labels: 'job:up:sum{job="prometheus"}'
         value: 1

最後に実際のテストがある。 1つ目は、1分にjob:up:sumを評価する。結果は、2と1になる。 2つ目は、6分にjob:up:sumを評価する。その時点では、up{job="node",instance="bar"}は0となり、結果は1と1である。

これは自明な例だが、これでどのようにすればもっと複雑なPromQLの式をテストできるかを示している。

参考リンク

Unit testing rules with Prometheus – Robust Perception | Prometheus Monitoring Experts

おすすめ書籍

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

入門 Prometheus ―インフラとアプリケーションのパフォーマンスモニタリング

 
入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

 
SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム

SRE サイトリライアビリティエンジニアリング ―Googleの信頼性を支えるエンジニアリングチーム