もた日記

くだらないことを真面目にやる

Linuxメモ : Rust製のangle-grinderを使ってコマンドラインでログ分析

angle-grinder

github.com

Rust製のangle-grinder(コマンド名はagrind)はコマンドラインでログを分析できるツール。


インストール

README.mdのインストール方法によると、バイナリのダウンロードやcargoでインストールできる(この時の名前はagrindではなくag)。

$ cargo install ag

ヘルプメッセージ。

$ agrind --help
ag 0.13.0
Russell Cohen <russell.r.cohen@gmail.com>
CLI App to slice and dice logfiles

USAGE:
    agrind [FLAGS] [OPTIONS] <query|--self-update>

FLAGS:
    -h, --help
            Prints help information

        --self-update
            Update agrind to the latest published version Github (https://github.com/rcoh/angle-grinder)

    -V, --version
            Prints version information

    -v, --verbosity
            Pass many times for more log output

            By default, it'll only report errors. Passing `-v` one time also prints warnings, `-vv` enables info
            logging, `-vvv` debug, and `-vvvv` trace.

OPTIONS:
    -f, --file <file>
            Optionally reads from a file instead of Stdin

    -m, --format <format>
            DEPRECATED. Use -o format=... instead. Provide a Rust std::fmt string to format output

    -o, --output <output>
            Set output format. Options:
            - `json`,
            - `logfmt`
            - `format=<rust format string>` (eg. -o format='{src} => {dst}'
            - `legacy` The original output format, auto aligning [k=v]

ARGS:
    <query>
            The query


For more details + docs, see https://github.com/rcoh/angle-grinder


使い方

ログを分析するツールなのでテスト用のログが必要だが、angle-grindのリポジトリtests_flies/gen_logs.pyというテスト用のログを生成するスクリプトがあるのでこれを使う。
以下のようにスクリプトを実行するとjson形式のログを生成できる。

$ python -u test_files/gen_logs.py

f:id:wonder-wall:20200408230916g:plain

argindは以下のようにfilteroperatorを組み合わせて分析を行う。

$ agrind '<filter1> [... <filterN>] | operator1 | operator2 | operator3 | ...'

例えば下記コマンドを実行することで、*すべてのログを対象に、json形式をパースして、status_code, urlごとに、count, average(response_ms)をリアルタイムに集計できる。

$ python -u test_files/gen_logs.py | agrind '* | json | count, average(response_ms) by status_code, url'

f:id:wonder-wall:20200408230942g:plain

Aggregate Operators

集計オペレータとしては下記が使えるとのこと。

  • count
  • sum
  • min
  • average
  • max
  • pXX(percentile)
  • sort
  • total
  • count_distinct

使用例

* | count
* | json | count by status_code
* | json | count, p50(response_ms), p90(response_ms) by status_code
* | json | count as num_requests, p50(response_ms), p90(response_ms) by status_code
* | json | count, p50(response_ms), p90(response_ms), count by status_code >= 400, url

f:id:wonder-wall:20200409222718g:plain