0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker内のアプリケーションログを監視したくなった。

0
Last updated at Posted at 2026-02-01

はじめに

自宅の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

image.png

データソース追加

[Connections] > [Data sources] > [Add data source] を選択。
Loki を選択し、URLに以下を入力して [Save & test]。

http://loki:3100

image.png

image.png

image.png

image.png

ログの確認

左メニューの [Explore] を開き、Label filters で container_name を選択。

image.png

アラートを飛ばすまで

通知先(Contact Point)を登録

[Alerting] > [Contact points] を開く。

[+ Create contact point] をクリック。

image.png

自作チャットに通知したいので、「Webhook」を選択。

image.png

で、自作チャットなので、標準のJSONだと送信ができないので独自JSONを送りたく。

{"content": "test", "channelId": "1"}

「Optional Webhook settings」をクリックして、「Custom Payload」を追加する!

image.png

「Edit Payload Template」をクリック。

image.png

だいぶハマったのですが、どうやら、「Edit Payload Template」は、

「テンプレートの選択」、「送信するPayloadを指定」で構成されている。

テンプレートを利用せず、「送信するPayloadを指定」だけも可能。

接続できる?の確認とかに利用したい場合、テンプレートを利用せず、「送信するPayloadを指定」に以下を記載するだけ。

{"content": "test", "channelId": "1"}

一旦こちらで保存。してテストをする。

image.png

「Test」ボタンを押下

image.png

「Send test notification」を押下。

image.png

おお!正常に送信完了!

image.png

一旦、「Save contact point」を押下。

image.png

追加完了
image.png

このままだと、アラートが起きても、メッセージ固定になっちゃうので、content部分を動的にするため、テンプレートを登録!したいけど、まずは監視設定がうまくいってから。

{"content": "test", "channelId": "1"}

監視ルールを追加

左メニュー [Alerting] > [Alert rules] を開き、[+ New alert rule] をクリック。

image.png

過去1分間にERRORという文字が何回出たか

count_over_time({container_name="hms-hms-ap-1"} |= "ERROR" [1m])

image.png

わざとエラーを出して、プレビューを見ると、ヒットする。

image.png

フォルダ指定が必須のようなので、任意のフォルダを作成

image.png

アラートチェックの間隔を「10秒」にする。
image.png

アラートが出たら即通知してほしいので、Pending periodを「0s」にする。

image.png

通知は、さっき作ったWebhook
image.png

Saveボタンを押下

image.png

こんな感じで作成される。

image.png

エラーを発生させる

image.png

放置すると?戻る。

image.png

メッセージ内容をカスタマイズ

現在は、以下固定になっているので、せめてコンテナ名を出したい。
今はこんなJSONを送信しているだけなので。

{"content": "test", "channelId": "1"}

やり方は、テンプレートを登録して、JSONにテンプレート名を指定するって感じ。

テンプレートを登録

{"content": "{{ template "my_payload_content" . }}", "channelId": "1"}

なので、「Add notification template group」をクリックする。

image.png

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」コンテナ名

で、保存

image.png

テンプレートを使用

「Contact points」の「Edit Payload Template」で、「my_payload_content」を選択。

image.png

Enter custom payload template に以下を指定。

{"content": "{{ template "my_payload_content" . }}", "channelId": "1"}

image.png

正常時は通知しないように変更

今のままだと、ステータスが正常になったら、空白状態で通知されてしまうので。

image.png

振り返って

とりあえず、通知までイケた!
改めて考えると、感覚的にはDataDogと似ている雰囲気を感じたかな。

ダッシュボードとかも作れるので、徐々にいじる予定。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?