Unyablog.

のにれんのブログ

Filebeat の Nginx module でアクセス先パスを正規化する

今回の ISUCON では Filebeat を使って Nginx のログを Elasticsearch に放り込み、 Kibana ダッシュボードで表示していた。

nonylene.hatenablog.jp

なかなか役に立ってよかったものの、 /user/:userID/home のようなパスだと userID に様々な値が入ってしまい、総計では時間がかかっていても上位としてダッシュボードに出てこないという課題があった。

/user/4372904890324/home のようなパスに対しては /user/:userID/home といった正規化したフィールドを作ってから Elasticsearch に保存するようにしたい。

Ingest pipeline をいじる

Filebeat の nginx module ではパース処理は基本的に Elasticsearch の Ingest pipeline で行っており、 URL の情報は Ingest pipeline 側で初めてパースして見れるようになる。そのため、 URL に関した処理を行いたい場合は Ingest pipeline 内の URL パース処理の後に追加する必要がある(ずっと Filebeat 側に Processor を追加しようとして本番中も感想戦でもハマっていた…)。

Filebeat 関係の Ingest Pipeline は Filebeat が直接 Elasticsearch に登録するようになっており(filebeat setup --pipelines コマンドで可能)、その設定は /usr/share/filebeat/module/nginx/access/ingest/pipeline.yml にある。

このファイルには適用する Ingest pipeline の Processor (Filebeat の Processor とはまた別!)の設定が並んでおり、その末尾に正規化関係の処理を追加すれば良い。

...
processors:
...
- set:
    copy_from: url.path
    field: url_path_normalized
- gsub:
    field: url_path_normalized
    pattern: "^/user/[a-zA-Z0-9-_]+/gacha/index$"
    replacement: "/user/:userID/gacha/index"
... (以降正規化したいパスを記載していく)

編集したら filebeat setup --pipelines コマンドで Elasticsearch に Ingest pipeline を再登録する。登録された様子は Kibana の Management でも確認できる。

これで正規化後のパスが url_path_normalized フィールドに追加され、 /user/ 配下の API に時間がかかっていることが一目で分かるようになった。

めでたし。