📊

CloudWatchLogs Insigthsのstats by bin(1d)で嵌ったこと

2021/03/18に公開

ログを日次で集計する時、UTCで集計される ので、日本時間で調査するときに嵌った。
ローカルタイムゾーンにしてクエリ実行すれば勝手に集計基準も判定してくれると期待していたがだめだった。


ローカルタイムゾーン 2021/03/18 00:00:00 ~ 2021/03/18 23:59:59 に対して、statsのbin(1d)を使用して集計すると、

クエリ
fields @timestamp, @message
| stats count(*) by bin(1d)
結果
date, count
2021/03/17 09:00:00, 50
2021/03/18 09:00:00, 100

のようにUTCでカウントされた結果が返ってくる。


自分が出力したいデータはローカルタイムゾーンに合わせた結果なので、日本時間に変換して出力している。

クエリ
fields @timestamp, toMillis(@timestamp)+32400000 as millis, datefloor(millis,1d) as jst_date, @message
| stats count(*) by jst_date
結果
date, count
2021/03/18 09:00:00, 150
  • 32400000: 9時間(=9h * 60m * 60s * 1000ms), JST = UTC + 9h
  • toMillis: 指定されたフィールドで見つかったタイムスタンプを、Unix エポックからのミリ秒を表す数値に変換
  • datefloor(toMillis(@timestamp)+32400000) と直接書くとエラーになったので一度 millis と定義したものを datefloor で指定している

スッキリしていないので、他にいい方法あったら教えてください…

Discussion