LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-25

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ログを確認しましょう
200325-0001-2.png

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

200325-0002-2.png

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

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

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

グラフを作成

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

200325-0003.png

まとめ

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

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

謝辞

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0