有时您需要将一个指标除以另一个指标.
例如,我想像这样计算平均延迟:
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)
长话短说:有没有更简单的方法来处理分频器中的零?或者任何常见做法?
这个问题的答案让我感到困惑."他们都错了!" 是我的想法,因为我之前在与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 …