ux00ff

ビールとプログラミングと

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なわけなんですが、算術演算子がサポートされていない中で、エポック秒とエポックミリ秒を用意するのはスマートではないしなぁ。