我想创建一个Grafana'singlestat'面板,根据是否存在测试失败指标,显示正常运行时间或SLA'百分比'。
对于不同的测试框架,我已经有了适当的指标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)
我现在想要一个单一的百分比值,显示一段时间内的“正常运行时间”(=环境'helathy'的时间量),例如过去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]
但这只会导致解析器错误。谷歌搜索并没有让我更进一步,所以我希望我能在这里找到帮助:)
答案 0 :(得分:3)
刚想出来,我相信它正在产生正确的结果。您必须使用录制规则,因为您无法从单个查询中的函数的实例向量结果创建范围向量,正如您已经发现的那样(您得到一个解析错误)。因此,我们将函数结果(将是实例向量)记录为新的时间序列,并将其用作不同查询中的度量标准名称,然后您可以在其中添加[5d]
以选择范围。
我们对所有服务每分钟多次运行测试,每个服务(“服务”是一个标签,其中每个服务的名称是标签值)具有与之关联的不同数量的测试,但是如果有的话对给定服务的测试失败,我们认为是“下降时刻”。 (给定服务的测试失败次数在具有status="failure"
标签值的度量标准中捕获。)我们将失败次数限制为1,因此我们的值只有零和1,因此可以转换为“失败值时间序列“成为”成功值时间序列“而不是使用不等式运算符和bool
修饰符。 (有关使用bool
的讨论,请参阅this post。)因此,对于在该刮擦间隔期间所有测试都成功的每个服务,第一个记录度量的结果为1,其中0为该服务至少有一次测试失败。
如果服务的失败次数是>对于任何给定分钟返回的所有值,我们认为该服务在该分钟内“关闭”。 (因此,如果我们在给定的分钟内同时出现故障和成功,则不会将其视为停机时间。)这就是为什么我们有第二个记录的度量标准来生成实际的“up this this”布尔值。第二个记录的度量标准建立在第一个,这是正常的,因为Prometheus文档说记录的度量标准在每个组内串行运行。
因此,任何给定持续时间的“正常运行时间”是“此分钟上升”值(即每分钟增加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)