はじめに
ログは「集めるだけ」では意味がありません。
使える状態にして、初めて価値になります。
前回までで、Minecraft Bedrock サーバに対して
- メトリクス監視
- 外形監視
を進めてきました。
ここまでで「動いているか」「使えるか」は見えるようになりましたが、
“なぜそうなっているのか”はまだ分かりません。
そこで今回はログ監視を追加し、
- 何が起きているのか
- なぜその状態なのか
ログがあることで、「なぜ?」に答えられるようにします。
Loki + Promtail + Grafana を使い、
すべてを拾うのではなく、必要なログだけを拾う構成を目指します。
Prometheusと同じ思想で扱える点で、Lokiを選定しました。
ゴールは以下です。
- Docker 環境でログ収集基盤を構築する
- 必要なログのみを可視化する
- “使えるログ監視”を実現する
Observabilityへの道シリーズ
このシリーズでは、監視スタックを段階的に構築しながら「見える化」から「使える監視」へと進めていきます。
これまでに以下の内容を扱ってきました。
1.Prometheusでメトリクス監視を構築
https://qiita.com/KanshiKun/items/1176246d27e52be652eb
2.AlertmanagerでSlack通知
https://qiita.com/KanshiKun/items/c56754fa6baaffec5de0
3.Grafanaでメトリクス可視化
https://qiita.com/KanshiKun/items/5979d2aaed5221ce0a1e
4.Minecraftサーバ監視
https://qiita.com/KanshiKun/items/65446702d765ec580d7a
5.Mincraftサーバの障害を定義(アラートルール作成)
https://qiita.com/KanshiKun/items/8f8239b65639e9d3c749
6.AWSを監視拠点にした外形監視の実装
https://qiita.com/drafts/5002eb89d4019ed96ccc/edit
7.Loki × Promtail × Grafanaでログを可視化する
https://qiita.com/KanshiKun/items/4b768d00433d1b5f700b
8.ログから監視を設計する 〜「何が起きているか」を捉える〜
https://qiita.com/drafts/6642323ec0b45368e932/edit
構成
今回使うのは以下の3つです。
- Loki: ログの保存
- Promtail: ログの収集
- Grafana: 可視化
前提
今回は以下の前提で進めます。
- Docker / Docker Compose が利用できる
- Minecraft Bedrock サーバが Docker で動いている
- Grafana が利用できる
ディレクトリ構成
~/monitoring/prometheus/
├── docker-compose.yml
├── loki-config.yaml
└── promtail-config.yml
docker-compose.yml
まずは docker-compose.yml を作成します。
services:
loki:
image: grafana/loki:latest
container_name: loki
command:
- "-config.file=/etc/loki/config.yaml"
volumes:
- ./loki-config.yaml:/etc/loki/config.yaml:ro
- loki-data:/loki
ports:
- "3100:3100"
restart: unless-stopped
promtail:
image: grafana/promtail:latest
container_name: promtail
command:
- "-config.file=/etc/promtail/config.yml"
volumes:
- ./promtail-config.yml:/etc/promtail/config.yml:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- promtail-positions:/tmp
depends_on:
- loki
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
restart: unless-stopped
depends_on:
- loki
volumes:
grafana-data:
loki-data:
promtail-positions:
Loki設定
次に loki-config.yaml を作成します。
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2024-01-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
storage_config:
filesystem:
directory: /loki/chunks
Lokiの役割(ログの保存)
Loki はログを受け取り、保存する役割を持ちます。
設定ファイルでは主に以下を定義しています。
-
server
→ Loki が待ち受けるポート -
storage_config
→ ログの保存先(今回はローカル) -
schema_config
→ ログのインデックス構造
今回の構成では、
「受け取ったログをローカルに保存する」
最小構成としています。
Promtail設定
次に promtail-config.yml を作成します。
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: container
- source_labels: ['__meta_docker_container_id']
target_label: container_id
- source_labels: ['__meta_docker_container_image']
target_label: image
pipeline_stages:
- docker: {}
Promtailの役割(ログの収集)
Promtail はログを収集し、Loki に送信する役割を持ちます。
設定ファイルでは以下を定義しています。
-
clients
→ 送信先(LokiのURL) -
positions
→ どこまでログを読んだかの記録 -
scrape_configs
→ どのログを収集するか
最初は static_configs でログファイルを直接読む方法も試しましたが、
コンテナ単位で扱えるように docker_sd_configs を採用しました。
これにより、Grafana 側で
container="mc-bedrock"
のようにコンテナ単位でログを絞り込めるようになります。
起動
ファイルを配置したら起動します。
docker compose up -d
コンテナ確認
docker ps
以下のコンテナが起動していればOKです。
- loki
- promtail
- grafana
Promtailログ確認
起動直後は Promtail のログも確認しておきます。
docker logs promtail --tail 50
ハマりポイント: timestamp too old
初回起動時、以下のようなエラーが出ることがありました。
has timestamp too old
これは Minecraft サーバの異常ではなく、
Promtail が古い Docker ログを Loki に送信しようとして拒否されたものです。
つまり、
- 監視対象のエラーではない
- ログ収集基盤の初回取り込み時のエラー
です。
この切り分けは重要で、
監視対象と監視基盤の問題は分けて考える必要があります。
GrafanaでLokiを追加
Grafana にアクセスします。
http://<サーバIP>:3000
ログイン後、
- Connections
- Data sources
- Add new data source
URL は以下です。
http://loki:3100
Exploreでログ確認
Grafana の Explore 画面で、データソースに Loki を選択し、
以下のクエリを実行します。
{job="docker"}
補足
Promtail は現在非推奨となっており、
今後は Grafana Alloy への移行が推奨されています。
ただし、ログ収集の流れを理解するという観点では
Promtail はシンプルで扱いやすく、学習用途としては有効でした。
まとめ
今回は、
- Docker で Loki / Promtail / Grafana を構築
- mc-bedrock のログを収集
- Grafana で可視化
までを実施しました。
これにより、
- メトリクス
- 外形
- ログ
の3つが揃い、
観測の土台が整ってきました。
次回
次は、
ログ監視設計(何を検知するか / どこまで通知するか)
を整理していきます。
ログ監視を追加して変わったこと
ログ監視を追加したことで、以下が分かるようになりました。
- 外形監視がNGになったときに、原因をログから追える
- サーバは生きているが「使えない」状態を把握できる
- 事象の裏付けが取れるため、切り分けが早くなる
メトリクスは「兆候」、外形監視は「結果」、
ログは「事実」です。
この3つを組み合わせることで、
初めて“判断できる監視”になります。
ログ監視は「全部集めること」ではなく、
“判断に必要な情報だけを拾うこと”が重要だと感じました。


