今回の ISUCON では Filebeat を使って Nginx のログを Elasticsearch に放り込み、 Kibana ダッシュボードで表示していた。
なかなか役に立ってよかったものの、 /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 に時間がかかっていることが一目で分かるようになった。
めでたし。