概要
mtail指定したログの行数を Promethues 用のメトリックスとして返してくれる exporter です
今回は nginx と連携して nginx のログを監視する compose を紹介します
環境
- Ubuntu 24.04
- docker 27.3.1
- mtail 3.0.8
compose.yaml
nginx を起動しアクセスログをホスト側でマウントします
mtail 側ではホスト側のマウントした nginx のログを更にコンテナ側にマウントします
mtail の公式イメージは dockerhub で公開されていないので Dockerfile.mtail を作成し自分でビルドしてイメージを作成します
あとは mtail の設定を作成します
services:
nginx:
image: nginx:latest
container_name: nginx_server
ports:
- "8080:80"
volumes:
- ./nginx/log:/var/log/nginx
networks:
- monitoring_net
mtail:
container_name: mtail_monitor
build:
context: .
dockerfile: Dockerfile.mtail
ports:
- "3903:3903"
volumes:
- ./nginx/log:/var/log/nginx:ro
- ./mtail/progs:/mtail/progs:ro
networks:
- monitoring_net
command: >
-logtostderr
-logs /var/log/nginx/access.log
-progs /mtail/progs
networks:
monitoring_net:
driver: bridge
Dockerfile.mtail
golang は執筆時の最新を使っています
mtail 自体のインストールはバイナリまたは自分でソースビルドするしかないので今回はバイナリファイルを使います
また mtail でメトリックスを取得するためのポートを expose します
FROM golang:1.23.2
RUN wget https://github.com/google/mtail/releases/download/v3.0.8/mtail_3.0.8_linux_amd64.tar.gz
RUN tar zvxf mtail_3.0.8_linux_amd64.tar.gz
RUN mv mtail /go/bin
EXPOSE 3903
ENTRYPOINT ["/go/bin/mtail"]
mtail/progs/log.mtail
mtail 用の設定ファイルを作成します
アクセスがきたときにカウントする変数を用意します
今回は nginx のどのパスにアクセスが来てもカウントをプラス1するようにします
counter nginx_requests_total
/^.*$/ {
nginx_requests_total++
}
動作確認
- docker compose up -d
で各種コンテナを作成しましょう
- curl localhost:3903/metrics
にアクセスするとメトリックスが確認できます
更に
- curl localhost:8080
にアクセスし再度メトリックスを確認するとカウンタが1進んでいるのが確認できると思います
おまけ: 特定のパスのみカウントする方法
- vim nginx/nginx.conf
events {}
http {
server {
listen 80;
location /status {
default_type application/json;
return 200 '{"status":"ok"}';
}
# 他のリクエストをデフォルトの404にする場合
location / {
return 404;
}
}
}
- vim compose.yaml
services:
nginx:
image: nginx:latest
container_name: nginx_server
ports:
- "8080:80"
volumes:
- ./nginx/log:/var/log/nginx
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
networks:
- monitoring_net
mtail:
container_name: mtail_monitor
build:
context: .
dockerfile: Dockerfile.mtail
ports:
- "3903:3903"
volumes:
- ./nginx/log:/var/log/nginx:ro
- ./mtail/progs:/mtail/progs:ro
networks:
- monitoring_net
command: >
-logtostderr
-logs /var/log/nginx/access.log
-progs /mtail/progs
networks:
monitoring_net:
driver: bridge
- vim mtail/progs/log.mtail
counter nginx_requests_total
/status/ {
nginx_requests_total++
}
最後に
mtail を使ってログの行数を Promethues のメトリックス形式で取得する方法を紹介しました
mtail 側からログファイルにアクセスできればどんなファイルでも監視することができます
ファイルは単純なテキストファイルなどでも良いです