閑話休題。実のところ、rate()関数というよりは、サーバー側のmetric初期化問題です。
さて、何らかのサーバーAがあったとして、それが更に他のサーバーBにRPCを送っているとします。サーバーBの方でホワイトボックスモニタリングをするのは当然として、サーバーA側でもサーバーBからのレスポンスを記録すると思います。というわけで、サーバーAでは以下のようなmetricsを吐くとします。
rpc_response{status=OK, service=B} 100
T0でこの状態だったとします。そしてT1(T0 + 1分)で
となってた場合、rpc_response{status=OK, service=B} 160
irate(rpc_response[5m])
=> {status=OK, service=B} 1
rpc_response{status=OK, service=B} 190
rpc_response{status=ERR, service=B} 60
irate(rpc_response[5m])
=> {status=OK, service=B} 0.5
rpc_response{status=OK, service=B} 250
rpc_response{status=ERR, service=B} 60
irate(rpc_response[5m])
=> {status=OK, service=B} 0.5
{status=ERR, service=B} 0
- もし取りうるstatusが最初から分かっているのなら、事前にrpc_responseカウンターを全てのstatusに対して0で初期化しておく。
- あきらめるw
- rate()の結果が存在しないけど、その元となるmetricが存在する場合には、その元となるmetricを直接使うようにPromQLをゴリゴリ書く