あるメトリックを別のメトリックで除算する必要がある場合があります。
たとえば、次のような平均レイテンシを計算したいと思います。
_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)
_
これにより、結果ベクトルから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
_
これにより、NaN
sが_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)
_
短編小説:分周器のゼロを処理する簡単な方法はありますか?または一般的な方法はありますか?
指定された期間中にアクティビティがない場合、除算器の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]))