はじめに
自宅のDokcerで複数アプリケーションを運用していて、毎日自動ビルド・デプロイしているのですが、たまにビルドが成功しているけど、動かない。で、見るとエラーがログに出ている。
ビルド・デプロイは、自作チャットに通知しているのですが、エラーログも通知したいな。と。
ログ監視はFluentしか知らなかったので、Geminiに聞いてみたら、Loki+promtail+Grafanaをお勧めされたので、起動してみました。
管理画面でDockerログを確認まで
起動
docker-compose.yml + promtail-config.yamlをGeminiに作ってもらう。
docker-compose.yml
services:
# ログの保管庫
loki:
image: grafana/loki:latest
container_name: loki
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
networks:
- home_network
# ログの運び屋(WindowsのDockerログを拾う設定)
promtail:
image: grafana/promtail:latest
container_name: promtail
volumes:
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock
- ./promtail-config.yaml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
depends_on:
- loki
networks:
- home_network
# 可視化・通知設定用
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin # 初期パスワード
depends_on:
- loki
networks:
- home_network
## ここは自宅ネットワーク(home_network)に変更
# networks:
# logging:
# driver: bridge
networks:
home_network:
external: true
promtail-config.yaml
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_logs
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: 'container_name'
起動する。
docker compose -up -d
Grafanaにアクセスする。
http://localhost:3000
データソース追加
[Connections] > [Data sources] > [Add data source] を選択。
Loki を選択し、URLに以下を入力して [Save & test]。
http://loki:3100
ログの確認
左メニューの [Explore] を開き、Label filters で container_name を選択。
アラートを飛ばすまで
通知先(Contact Point)を登録
[Alerting] > [Contact points] を開く。
[+ Create contact point] をクリック。
自作チャットに通知したいので、「Webhook」を選択。
で、自作チャットなので、標準のJSONだと送信ができないので独自JSONを送りたく。
{"content": "test", "channelId": "1"}
「Optional Webhook settings」をクリックして、「Custom Payload」を追加する!
「Edit Payload Template」をクリック。
だいぶハマったのですが、どうやら、「Edit Payload Template」は、
「テンプレートの選択」、「送信するPayloadを指定」で構成されている。
テンプレートを利用せず、「送信するPayloadを指定」だけも可能。
接続できる?の確認とかに利用したい場合、テンプレートを利用せず、「送信するPayloadを指定」に以下を記載するだけ。
{"content": "test", "channelId": "1"}
一旦こちらで保存。してテストをする。
「Test」ボタンを押下
「Send test notification」を押下。
おお!正常に送信完了!
一旦、「Save contact point」を押下。
このままだと、アラートが起きても、メッセージ固定になっちゃうので、content部分を動的にするため、テンプレートを登録!したいけど、まずは監視設定がうまくいってから。
{"content": "test", "channelId": "1"}
監視ルールを追加
左メニュー [Alerting] > [Alert rules] を開き、[+ New alert rule] をクリック。
過去1分間にERRORという文字が何回出たか
count_over_time({container_name="hms-hms-ap-1"} |= "ERROR" [1m])
わざとエラーを出して、プレビューを見ると、ヒットする。
フォルダ指定が必須のようなので、任意のフォルダを作成
アラートが出たら即通知してほしいので、Pending periodを「0s」にする。
Saveボタンを押下
こんな感じで作成される。
エラーを発生させる
放置すると?戻る。
メッセージ内容をカスタマイズ
現在は、以下固定になっているので、せめてコンテナ名を出したい。
今はこんなJSONを送信しているだけなので。
{"content": "test", "channelId": "1"}
やり方は、テンプレートを登録して、JSONにテンプレート名を指定するって感じ。
テンプレートを登録
{"content": "{{ template "my_payload_content" . }}", "channelId": "1"}
なので、「Add notification template group」をクリックする。
Template group name に「my_payload」を指定。
「Template group」に以下を指定。
{{ define "my_payload_content" }}{{ range .Alerts.Firing }}🚨【異常検知】\n■コンテナ:{{ .Labels.container_name }}\n■状態:ERROR発生{{ end }}{{ end }}
具体的には、
1)「define」で名称を定義
2)「range .Alerts.Firing」エラー発生時のメッセージ
3)「.Labels.container_name」コンテナ名
で、保存
テンプレートを使用
「Contact points」の「Edit Payload Template」で、「my_payload_content」を選択。
Enter custom payload template に以下を指定。
{"content": "{{ template "my_payload_content" . }}", "channelId": "1"}
正常時は通知しないように変更
今のままだと、ステータスが正常になったら、空白状態で通知されてしまうので。
振り返って
とりあえず、通知までイケた!
改めて考えると、感覚的にはDataDogと似ている雰囲気を感じたかな。
ダッシュボードとかも作れるので、徐々にいじる予定。































