nginx + StackdriverでAPIの平均レスポンスタイム(ms)をグラフ化したい


nginxのログのrequest_timeやupstream_response_timeは
43msの場合は0.043のような形式でログに吐き出されてしまい、Stackdriverlogで
カスタムログベースの指標を作成する際にうまく表示できていませんでした。

致し方なくヒートマップ表示に甘んじていたのですが、これが解決できたので備忘録で記載しておきます。

nginxのログフォーマットを変更

default.conf
log_format stackdriver escape=json '{"severity":"INFO",'
        '"timestamp":"$time_iso8601",'
        '"httpRequest":{'
          '"requestMethod":"$request_method",'
          '"requestUrl":"$request_uri",'
          '"requestSize":$request_length,'
          '"status":$status,'
          '"responseSize":$bytes_sent,'
          '"userAgent":"$http_user_agent",'
          '"remoteIp":"$remote_addr",'
          '"serverIp":"$server_addr",'
          '"referer":"$http_referer",'
          '"latency":"${request_time}s",'
          '"request_body": "$request_body",'
          '"protocol":"$server_protocol"'
        '},'
        '"uri": "$request_uri",'
        '"status":$status,'
        '"queryString":"$query_string",'
        '"userId":"$sent_http_x_user_id",'
        '"upstreamResponseTime":"${upstream_response_time}s",'
        '"pod":"$hostname",'
        '"host":"$http_host"}';

~skip
        access_log /var/log/nginx/access.log stackdriver;

ここでキモになるのが

"${upstream_response_time}s"

この記載方法でログ指標の分布をうまく使えるようになります(sは秒の単位として扱われます)他の情報は自分の欲しい情報をうまく取りましょう

これでNginxのログがこんな形で返却されます

{"severity":"INFO","timestamp":"2020-03-25T06:25:58+00:00","httpRequest":{"requestMethod":"GET","requestUrl":"/","requestSize":87,"status":200,"responseSize":208,"userAgent":"GoogleHC/1.0","remoteIp":"**.**.**","serverIp":"**.**,**","referer":"","latency":"0.014s","request_body": "","protocol":"HTTP/1.1"},"path": "/","status":200,"userId":"***","upstreamResponseTime":"0.013s","pod":"****","host":"**.**.**.**"}

"latency":"0.014s"のようにうまく取れていればおkです

ログベースの指標の作成

まずは対象のNginxログを確認しましょう

ちゃんとStackdriverLogがmsだと認識できていますね、完璧です。
それではこのログでログベースの指標の作成をします

分布を作成したいので単位を「s」として、Distributionタイプに変更、分布の対象フィールド名を「httpRequest.latency」とします。

自分は各API単位の平均レスポンスをグラフ表示させたかったのでpathという名前でラベルを作成しています。対象フィールドはhttpRequest.requestUrlです。

ラベルを作成しておくと、Stackdriverでグラフ表示する際にフィルタリングやグループ化を行えます。必要に応じて作成しましょう

グラフを作成

あとはMetrix Exporterで作成した指標をグラフ化するだけです。
完成するとこんな感じで見れるようになります
下のグラフはAPIをグループ化して各API単位で平均レスポンスタイムを表示しているグラフです

まとめ

このグラフが欲しくて欲しくてたまらなかったのですが前述のログフォーマットのせいで作れずに苦心していました、やっと欲しい情報を手に入れることができました!同じ問題を抱えてる方の一助になれば幸いです。

ご意見マサカリ等ありましたらお気軽にどうぞ

謝辞

参考にさせていただきました!ありがとうございます
https://839.hateblo.jp/entry/2019/12/20/090000