jqのtodateでタイムスタンプ値を読みやすく
できるんじゃないか!
背景: jq コマンドで todate が使えるのをさっき知って。たぶん、何度目かに知って、感動しています。いいんだ、嬉しいことは何度あったっていいんだ。
つまりCloudWatch Logsのエポックタイム形式の表記を「2017-05-07T07:20:58Z」のような人間に優しい感じに拾えるということであって、これはとてもありがたい。filter-log-events
がたいへん便利なんだけど時刻がエポックミリ秒なのがどうにも辛かったので。なお jq は 1.5 を使っています。
で、これができると、以下のようにCloudWatchのログが探せて結果がとても読みやすいわけです。
aws --profile=production logs filter-log-events \ --log-group-name "/aws/lambda/my-awesome-log-group!" \ --max-item 10 \ --start-time `date -v-5M +"%s"` \ --query "events" \ --filter-pattern='REPORT' \ --query "events[].{timestamp:timestamp,message:message}" | \ jq '.[] | {: .timestamp | tonumber | (. / 1000) | todate , message: .message}'
しかし “–query” 内の関数に todate 追加されないものかなー、と思って見てみる。aws-cliのrequirements.txtでは boto/jmespath.git
が参照されてます。実際に環境に利用されているのは jmespath-0.9.1
のようですね(最新は0.9.2)。そしてpython版実装に対して todate
関数は実装されていません。残念。夢潰える。
さらっと見て jmespath の関数の実装は難しくないので送り付けちゃうのもいいのかもしれません。例えばエポックミリ秒を date に変換する millixec_to_date
をこんな風に作ることで動くには動く。
@signature({'types': ['number']}) def _func_millisec_to_date(self, arg): from datetime import datetime return datetime.fromtimestamp(arg/1000)
じゃあどこに突っ込むかといえば、jmespath/functions.pyなわけなんですが、算術演算子がサポートされていない中で、エポック秒とエポックミリ秒を用意するのはスマートではないしなぁ。