テスト失敗メトリックの有無に基づいて、稼働時間またはSLA 'パーセンテージ')を表示するGrafana'singlestat 'パネルを作成したいと思います。
私はすでに適切なメトリックを持っています、e2e_tests_failure_count
、さまざまなテストフレームワーク用。これは、次のクエリが観測されたテストの失敗の合計を返すことを意味します。
sum(e2e_tests_failure_count{kubernetes_name=~"test-framework-1|test-framework-2|test-framework-3",kubernetes_namespace="platform-Edge"})
私はすでに、すべてが正常である場合は「1」、テストが失敗した場合は「0」のグラフを作成することができました。
1 - clamp_max(sum(e2e_tests_failure_count{kubernetes_name=~"test-framework-1|test-framework-1|test-framework-1",kubernetes_namespace="platform-Edge"}), 1)
ここで、一定期間の「稼働時間」(=環境が「不安定」だった時間)を示す単一のパーセンテージ値が必要です。過去5日間。 「99.5%」、またはスクリーンショットに適した「65%」のようなもの。
私はこのようなことを試みました:
(1 - clamp_max(sum(e2e_tests_failure_count{kubernetes_name=~"service-cvi-e2e-tests|service-svhb-e2e-tests|service-svh-roundtrip-e2e-tests",kubernetes_namespace="platform-Edge"}), 1))[5d]
ただし、これはパーサーエラーのみを引き起こします。グーグルはそれ以上私を助けてくれなかったので、ここで助けが見つかることを願っています:)
これを理解したところ、正しい結果が得られていると思います。すでに発見しているように、単一のクエリで関数のインスタンスベクトルの結果から範囲ベクトルを作成できないため、記録ルールを使用する必要があります(解析エラーが発生します)。そのため、関数の結果(インスタンスベクトルになります)を新しい時系列として記録し、それを別のクエリのメトリック名として使用します。次に、[5d]
を追加して範囲を選択できます。
すべてのサービスに対して1分間に複数回テストを実行し、各サービス(「サービス」は各サービスの名前がラベル値であるラベル)には異なる数のテストが関連付けられていますが、サービスが失敗した場合、それは「ダウンモーメント」と見なされます。 (特定のサービスのテスト失敗の数は、status="failure"
ラベル値を使用してメトリックにキャプチャされます。)失敗の数を1にクランプして、値に0と1のみを設定し、「」を変換できるようにします。代わりに、不等式演算子とbool
修飾子を使用して、「失敗値の時系列」を「成功値の時系列」に変換します。 (bool
の使用に関する説明については、 この投稿 を参照してください。)したがって、最初に記録されたメトリックの結果は、そのスクレイプ間隔中にすべてのテストが成功したすべてのサービスに対して1になります。 0そのサービスに対して少なくとも1つのテスト失敗があった場合。
特定の分に返されるすべての値でサービスの失敗数が0より大きい場合、そのサービスはその分「ダウン」していると見なされます。 (したがって、特定の1分間に失敗と成功の両方が発生した場合、それはダウンタイムとしてカウントされません。)そのため、実際の「この1分間のアップ」ブール値を生成する2番目に記録されたメトリックがあります。 2番目に記録されたメトリックは最初のメトリックに基づいています。これは、Prometheusのドキュメントに、記録されたメトリックが各グループ内で連続して実行されると記載されているため、問題ありません。
したがって、任意の期間の「稼働時間」は、「この分までの稼働時間」の値の合計(つまり、1分間の稼働時間ごとに1)を、その期間が何であれ、その期間の合計分数で割ったものです。
「minute_up_bool」という名前の記録されたメトリックを定義したので、必要な範囲で稼働時間グラフを作成できます。 (ところで、記録されたメトリックは、最初に定義した後の時間に対してのみ生成されるため、今日定義した記録されたメトリックに昨日の時系列データは含まれません。)これは、Grafanaに入力して、稼働時間%を表示するためのクエリです。過去5日間の移動ウィンドウ:
sum_over_time(minute_up_bool[5d]) * 100 / (5 * 24 * 60)
これが記録ルールの構成です。
groups:
- name: uptime
interval: 1m
# Each rule here builds on the previous one.
rules:
# Get test results as pass/fail => 1/0
# (label_replace() removes confusing status="failure" label value)
- record: test_success_bool
expr: label_replace(clamp_max(test_statuses_total{status="failure"}, 1), "status", "", "", "") != bool 1
# Get the uptime as 1 minute range where the sum of successes is not zero
- record: minute_up_bool
expr: clamp_max(sum_over_time(test_success_bool[1m]), 1)