web-dev-qa-db-ja.com

Prometheusでゼロ除算を適切に回避する方法

あるメトリックを別のメトリックで除算する必要がある場合があります。

たとえば、次のような平均レイテンシを計算したいと思います。

_rate({__name__="hystrix_command_latency_total_seconds_sum"}[60s])
/
rate({__name__="hystrix_command_latency_total_seconds_count"}[60s])
_

指定された期間中にアクティビティがない場合、除算器のrate()は_0_になり、除算の結果はNaNになります。結果(avg()またはsum()など)に対して何らかの集計を行うと、集計結果全体がNaNになります。

だから私は仕切りにゼロのチェックを追加します:

_rate({__name__="hystrix_command_latency_total_seconds_sum"}[60s])
/
(rate({__name__="hystrix_command_latency_total_seconds_count"}[60s]) > 0)
_

これにより、結果ベクトルからNaNsが削除されます。また、グラフ上の線を細かく裂きます。

非アクティブな期間を_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
_

これにより、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)
_

短編小説:分周器のゼロを処理する簡単な方法はありますか?または一般的な方法はありますか?

7
Yoory N.

指定された期間中にアクティビティがない場合、除算器のrate()は0になり、除算の結果はNaNになります。

これは正しい動作です。NaNはあなたが望む結果です。

集計は正常に機能します。

比率を集計することはできません。分子と分母を別々に集計してから除算する必要があります。

そう:

   sum by (command_group, command_name)(rate(hystrix_command_latency_total_seconds_sum[5m]))
  /
   sum by (command_group, command_name)(rate(hystrix_command_latency_total_seconds_count[5m]))
3
brian-brazil