Grain

ログの一行は、点。千万行で、絵になる。

Grain は、ターミナルで動くログ解析のコマンドです。圧縮したままのログを 1 コアで毎秒 450 万行読み、ふだんと違う山だけを、その場でグラフにします。

版
2 色(蛍光ピンク・青)
網
8×8 Bayer
字
形合わせ ASCII
原稿
下の画面(本物の HTML)

Grain の画面の見本刷り

画面にカーソルを載せると、網点がほどけて元の画面が見えます。文字はそのまま選べます。画面をタップした所だけ、網点がほどけます。

設定ファイルは要らない。
ログを渡すだけ。

どこが遅いかを、表で

パスごとの件数と応答時間を並べ、遅い順に。重いのは 1 行ずつ読むより、まとめて数える所だけ。

$ grain top api-*.log.gz --by path --sort p99
path              件数         p50      p99
/v2/checkout     82,114      41ms  3,004ms  ██████████
/v2/search      611,902      18ms    912ms  ███
/v2/orders    1,204,377      12ms    140ms  █
/v2/users       904,551       9ms     88ms  ▏

ふだんと違う山だけ、色を変える

曜日と時刻ごとの「いつもの幅」を覚えておき、外れた所にだけ印を付けます。

$ grain spike --window 5m
▁▂▁▁▂▁▂▁▁▂▁▂▁▅█▇▃▁▂▁
09:23 から 7 分間、平常の 3.5 倍

パイプの途中に挟める

標準入力も読めるので、いつものコマンドの間に置くだけ。

$ zcat old/*.gz | grain count --by level -
INFO  9,812,004
WARN     41,210
ERROR     3,117

この画面は、2 色で刷っています

網点(Bayer ディザ)

インクは「塗る・塗らない」の 2 つしか選べません。そこで、8×8 のマス目に 0〜63 の順番を振っておき、濃い所ほど多くのマスにインクを置きます。右の図は濃さ 37.5%(順番が 24 より前のマスだけ)。

形まで合わせる文字(ASCII)

グラフは文字で刷っています。明るさだけで文字を選ぶと線は「:」や「#」の帯になりますが、1 マスを 9 か所に分けて濃さを比べると、右上がりの線には「/」、水平な線には「_」が選ばれ、線の向きが残ります。

2 版の掛け合わせ

ピンクと青を重ねた所が、いちばん濃くなります。このページの本文の色も、その重なりの色です。版は少しずらして刷っているので、文字の縁にピンクと青がのぞきます。

Grain がしていることも同じです。1 行ずつは意味のない点でも、集めて並べると、どこに山があるかが見えてきます。

しくみ: 画面の HTML を測って canvas に描き写し、WebGL 2 のシェーダー 1 枚(ライブラリなし)で刷っています。描くのは、刷り方を変えた時とカーソルが動いている間だけです。

入れて、すぐ使う

$ curl -fsSL https://grain.example/install.sh | sh
$ grain watch ./logs

実行ファイル 1 つだけ。依存するものはありません。macOS・Linux・Windows(WSL)で動きます。

無料で、ソースは公開しています(架空の製品です)。

インストール手順を読む
LP Lab