小编Yoo*_* N.的帖子

如何在普罗米修斯中优雅地避免被零除

有时您需要将一个指标除以另一个指标.

例如,我想像这样计算平均延迟:

rate({__name__="hystrix_command_latency_total_seconds_sum"}[60s])
/
rate({__name__="hystrix_command_latency_total_seconds_count"}[60s])
Run Code Online (Sandbox Code Playgroud)

如果在指定的时间段内没有活动rate(),则分隔符中的内容将变为0分割结果NaN.如果我做了,结果(一些聚集avg()sum()或其他),整个聚合结果变成NaN.

所以我在divider中添加了一个零检查:

rate({__name__="hystrix_command_latency_total_seconds_sum"}[60s])
/
(rate({__name__="hystrix_command_latency_total_seconds_count"}[60s]) > 0)
Run Code Online (Sandbox Code Playgroud)

NaN将从结果向量中删除s.并且撕掉图表上的线条以撕碎.

让我们用0值标记不活动时段,使图表再次连续:

rate({__name__="hystrix_command_latency_total_seconds_sum"}[60s])
/
(rate({__name__="hystrix_command_latency_total_seconds_count"}[60s]) > 0)
or
rate({__name__="hystrix_command_latency_total_seconds_count"}[60s]) > bool 0
Run Code Online (Sandbox Code Playgroud)

这有效地替换了NaNs 0,图形是连续的,聚合工作正常.

但结果查询有点麻烦,尤其是当您需要进行更多标签过滤并对结果进行一些聚合时.像这样的东西:

avg(
    1000 * increase({__name__=~".*_hystrix_command_latency_total_seconds_sum", command_group=~"$commandGroup", command_name=~"$commandName", job=~"$service", instance=~"$instance"}[60s])
    /
    (increase({__name__=~".*_hystrix_command_latency_total_seconds_count", command_group=~"$commandGroup", command_name=~"$commandName", job=~"$service", instance=~"$instance"}[60s]) > 0)
    or
    increase({__name__=~".*_hystrix_command_latency_total_seconds_count", command_group=~"$commandGroup", command_name=~"$commandName", job=~"$service", instance=~"$instance"}[60s]) > bool 0
) by (command_group, command_name)
Run Code Online (Sandbox Code Playgroud)

长话短说:有没有更简单的方法来处理分频器中的零?或者任何常见做法?

prometheus

6
推荐指数
2
解决办法
4416
查看次数

为什么在这些情况下不需要分号?

这个问题的答案让我感到困惑."他们都错了!" 是我的想法,因为我之前在与OP相同或类似的情况下省略了分号,并且一切正常.

有关复合命令的文档似乎证明这些答案是正确的:

{ list; }

以下列表中的分号(或换行符)是必需的.

...它说的是关于分组命令,以及类似的循环:

注意,无论哪里';' 出现在命令语法的描述中,它可以替换为一个或多个换行符.

...并且所有示例都使用分号.

但是,在实践中,你可以在嵌套循环时自由省略分号,如果,花括号等,以任何顺序.例如:

{ if true; then echo; fi }
# no ";" here           ^
for i in {1..3}; do if true; then echo "$i"; fi done
# no ";" here                                  ^
{ while true; do if true; then for i in {1..3}; do { echo "$i"; } done fi done }
# no ";" in these 4 places                                       ^    ^  ^    ^
Run Code Online (Sandbox Code Playgroud)

我已经在bash 4.1,4.2,4.4和破折号0.5.7上进行了测试,它们都是一致的.

我的问题是:它只是一个实现的特点,我不应该依赖它,或者一个可以安全依赖的标准化行为?(Bash …

bash shell

4
推荐指数
1
解决办法
78
查看次数

标签 统计

bash ×1

prometheus ×1

shell ×1