Posted at

CloudWatch Logsに収集したアクセスログから応答時間をメトリクス化する

CloudWatch Logsの メトリクスフィルタ 機能を使用すると、CloudWatch Logsに収集したアクセスログから応答時間などをメトリクス化できます。

CloudWatch エージェントで収集したログをそのまま活用できるため、 カスタムメトリクス を発行する方法と比べて簡単です。


制約


  • ディメンションや単位は設定できない

  • アクセスログの出力フォーマットに手を入れる必要がある


手順


  1. メトリクス化したい数値項目はスペース区切りで出力するよう変更する

  2. メトリクスフィルタを作成する


    1. (例) 特定エンドポイントの応答時間をメトリクス化する

    2. (例) ステータスコード200以外の件数をメトリクス化する



※CloudWatch Logsへのアクセスログの収集は既に設定されている前提です。


1. メトリクス化したい数値項目はスペース区切りで出力するよう変更する

応答時間やバイト数などの数値を抽出したい場合は、抽出したい部分がスペース区切りで出力されている必要があります。


メトリクスフィルターには、スペースで区切られたログイベントから数値を抽出する機能もあります。たとえば、ウェブリクエストのレイテンシーです。

フィルターとパターンの構文 - Amazon CloudWatch Logs


LTSV形式でログを出力している場合は、スペース区切りで出力する部分を無理矢理足すか、LTSV形式をやめるかしなければなりません。


nginxでの設定例

log_format almostltsv "time:$time_local"

"\thost:$remote_addr"
"\tforwardedfor:$http_x_forwarded_for"
"\treq:$request"
"\tstatus:$status"
"\tsize:$body_bytes_sent"
"\treferer:$http_referer"
"\tua:$http_user_agent"
"\treqtime:$request_time"
"\tapptime:$upstream_response_time"
"\tvhost:$host"
" $request_time"; # ここ


2. メトリクスフィルタを作成する

公式のドキュメント フィルターとパターンの構文 - Amazon CloudWatch Logs に目を通しておきます。以下がポイントです(強調は引用者による)。


スペース区切りイベントを解析するメトリクスフィルターパターンを指定するには、メトリクスフィルターパターンが、フィールドの名前をカンマで区切り、すべてのパターンを角括弧で囲んで指定する必要があります。たとえば、[ip, user, username, timestamp, request, status_code, bytes] のようになります。

フィールド数が不明な場合は、省略符号 (…) を使用した省略通知を使用できます。

(略)

また、フィールドに条件を追加して、すべての条件に一致するログイベントのみがフィルターに一致するようにできます。

フィルターとパターンの構文 - Amazon CloudWatch Logs


例えば、先述のnginxの設定例では、アクセスログが次のように出力されます。

time:23/Sep/2019:11:37:10 +0900 host:127.0.0.1 forwardedfor:- req:GET /app/web/ HTTP/1.1 status:200 size:18650 referer:- ua:Xymon xymonnet/4.3.28 reqtime:0.409 apptime:0.409 vhost:www.p2pquake.net 0.409

よって、フィルターパターンは次のように記述できます(ua部分はスペースの数が不明なため省略符号を用いています)。

[time, timezone, host, forwardedfor, method, url, protocol, status, size, referer, ..., ltsvreqtime, apptime, vhost, reqtime]

フィールド名

time
time:23/Sep/2019:11:37:10

timezone
+0900

host
host:127.0.0.1

forwardedfor
forwardedfor:-

method
req:GET

url
/app/web/

protocol
HTTP/1.1

status
status:200

size
size:18650

referer
referer:-

...
ua:Xymon xymonnet/4.3.28

ltsvreqtime
reqtime:0.409

apptime
apptime:0.409

vhost
vhost:www.p2pquake.net

reqtime
0.409


2-1. (例) 特定エンドポイントの応答時間をメトリクス化する

/app/web/ への GET リクエストの応答時間を抽出します。


  1. CloudWatch Logsのロググループを選択し、「メトリクスフィルターの作成」を選択します。

  2. フィルタパターンを次のようにします:


    [time, timezone, host, forwardedfor, method="*GET", url="/app/web/", protocol, status, size, ..., reqtime]


  3. メトリクス値に、応答時間のフィールドである $reqtime を指定して設定完了です。




2-2. (例) ステータスコード200以外の件数をメトリクス化する

/v1/* への GET リクエストのうち、ステータスコード200以外の件数をカウントします。


  1. CloudWatch Logsのロググループを選択し、「メトリクスフィルターの作成」を選択します。

  2. フィルタパターンを次のようにします:


    [time, timezone, host, forwardedfor, method="*GET", url="/v1/*", protocol, status!="status:200", ...]


  3. 件数を数えるため、メトリクス値は 1 のままで設定完了です。


設定結果



上記のようにメトリクス化できました。通常のメトリクスと同様に、CloudWatch Alarmも設定可能です。

「既にCloudWatch Logsにアクセスログを収集してある」「外部の監視サービスを追加で導入するほどでもない」という場面ではお手軽で良いです。


参考