Gatus:Status PageとTelegram通知で実現するエンドポイント・ウェブサイト・API自動監視

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

従来のモニタリングの問題点

Prometheus + GrafanaはサーバーのMetrics監視に非常に強力ですが、単純に「ウェブサイトは稼働しているか?」「APIは200を返しているか?」を確認したいだけなのに、そのためにスタック全体を構築するのは手間がかかりすぎます。Gatus導入前は、各サーバーにSSHして手動で確認していました。今はダッシュボードを開けば一目でわかります——各エンドポイントの状態、稼働履歴、レスポンスタイムがすべて確認できます。

Gatusはまさに一つの問題を解決します:シンプルなエンドポイントのヘルスチェック、美しいStatus Page、そして障害発生時のTelegram通知。データベース不要、サーバーへのエージェントインストール不要、すべての設定は1つのYAMLファイルで完結します。

Gatusとは何か、なぜ選ぶのか

技術的には、Gatusは単一のGoバイナリです——デプロイ後すぐに動作し、ランタイムや追加の依存関係は一切不要です。フットプリントは非常に軽量:RAM使用量は通常20MB以下、起動は1秒未満です。ツールは4種類のチェックをサポートしています:

  • HTTP/HTTPS — ステータスコード、ボディ、レスポンスタイムの確認
  • TCP — ポートが開いているか確認(データベース、Redisなど)
  • DNS — ドメインが正しく解決されるか確認
  • ICMP (ping) — ホストに到達できるか確認

ZabbixやNetdataと比較すると、GatusはCPU/RAM/ディスクの監視は行いません——それは他のツールの役割です。Gatusは「このサービスは正常に動作しているか?」という点に完全に集中しています——既存の監視システムを置き換えるものではなく、補完する視点を提供します。

Gatusで最も気に入っているのは:Status Pageが内蔵されていること——追加のプラグインやサービスをインストールする必要がありません。顧客から「ウェブサイトに何かあったの?」と聞かれたら——Status PageのリンクをシェアするだけでOK、チャットで長々と説明する必要がありません。

Docker ComposeでGatusをインストールする

Dockerが最も手軽に始める方法です。作業ディレクトリを作成します:

mkdir -p ~/gatus && cd ~/gatus
touch config.yaml docker-compose.yml

docker-compose.ymlの内容:

version: "3.8"
services:
  gatus:
    image: twinproduction/gatus:stable
    container_name: gatus
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./config.yaml:/config/config.yaml
    environment:
      - GATUS_CONFIG_PATH=/config/config.yaml

コンテナを起動する:

docker compose up -d
docker compose logs -f gatus

Dockerを使わない場合は、ソースからビルドすることもできます:

git clone https://github.com/TwiN/gatus.git
cd gatus
go build -o gatus .
./gatus --config config.yaml

詳細な設定

config.yamlの基本構造

web:
  port: 8080
  # オプション:リバースプロキシのサブディレクトリで使用する場合はbase-pathを設定
  # base-path: /status

storage:
  type: sqlite          # 稼働履歴をSQLiteに保存(/dataディレクトリ)
  path: /data/gatus.db

alerting:
  telegram:
    token: "1234567890:ABCdef..."  # @BotFatherから取得したBotトークン
    id: "-100123456789"            # Chat ID(グループは負の数)
    default-alert:
      enabled: true
      failure-threshold: 3         # 3回連続チェック失敗後に通知
      success-threshold: 2         # 2回連続チェック成功後に復旧通知
      send-on-resolved: true       # サービス復旧時に通知を送信

endpoints:
  - name: "Website itfromzero.com"
    url: "https://itfromzero.com"
    interval: 5m
    conditions:
      - "[STATUS] == 200"
      - "[RESPONSE_TIME] < 3000"   # レスポンスタイム < 3秒
    alerts:
      - type: telegram

複数種類のエンドポイントを監視する

endpoints:
  # ボディチェック付きHTTPエンドポイント
  - name: "API Health Check"
    url: "https://api.example.com/health"
    interval: 2m
    conditions:
      - "[STATUS] == 200"
      - "[BODY] == {\"status\":\"ok\"}"   # ボディはこのJSONを含む必要がある
      - "[RESPONSE_TIME] < 1000"
    alerts:
      - type: telegram
        failure-threshold: 2          # Override: 2回の失敗後に通知

  # TCP — データベースのポート確認
  - name: "PostgreSQL Port"
    url: "tcp://db.internal:5432"
    interval: 1m
    conditions:
      - "[CONNECTED] == true"
    alerts:
      - type: telegram

  # TCP — Redis
  - name: "Redis Cache"
    url: "tcp://redis.internal:6379"
    interval: 1m
    conditions:
      - "[CONNECTED] == true"
    alerts:
      - type: telegram

  # DNSチェック — ドメインが正しいIPに解決されるか
  - name: "DNS itfromzero.com"
    url: "dns://1.1.1.1"
    dns:
      query-name: "itfromzero.com"
      query-type: "A"
    interval: 10m
    conditions:
      - "[DNS_RCODE] == NOERROR"

  # ICMPピング — サーバーに到達できるか
  - name: "VPS Singapore"
    url: "icmp://103.x.x.x"
    interval: 5m
    conditions:
      - "[CONNECTED] == true"

TelegramのBot TokenとChat IDを取得する

Telegramで@BotFatherにメッセージを送り——/newbotと入力してボット名を設定し、BotFatherが返してくる1234567890:ABCdef...の形式のトークンを保存してください。

グループやチャンネルのChat IDを取得するには:

# ボットをグループに追加してからAPIを呼び出す:
curl "https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates"
# responseの中から "chat":{"id":-100xxxxxxxxx} を探す

機密情報に環境変数を使用する

configにトークンをハードコードしないようにしましょう。Gatusは${VAR_NAME}という構文で環境変数をサポートしています:

alerting:
  telegram:
    token: "${TELEGRAM_BOT_TOKEN}"
    id: "${TELEGRAM_CHAT_ID}"

変数を渡すためにdocker-compose.ymlを更新する:

services:
  gatus:
    image: twinproduction/gatus:stable
    container_name: gatus
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./config.yaml:/config/config.yaml
      - gatus_data:/data
    env_file:
      - .env

volumes:
  gatus_data:

.envファイル:

TELEGRAM_BOT_TOKEN=1234567890:ABCdef...
TELEGRAM_CHAT_ID=-100123456789

Monitoring Dashboardの確認と使用方法

Status Pageにアクセスする

Gatusが起動したら、http://your-server-ip:8080を開くとすぐにダッシュボードが表示されます。各エンドポイントは現在の状態(緑/赤)、平均レスポンスタイム、直近7日間と24時間の稼働率をブロックタイムライン形式で表示——一目で問題があるかどうかわかります。

Nginxを使用してインターネットに公開する場合:

server {
    listen 80;
    server_name status.yourdomain.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Telegram通知の動作確認

必ず失敗する条件でテスト用エンドポイントを追加し、確認後に削除します:

endpoints:
  - name: "Test Alert"
    url: "https://httpstat.us/503"   # 常に503を返す
    interval: 30s
    conditions:
      - "[STATUS] == 200"            # 失敗する
    alerts:
      - type: telegram
        failure-threshold: 1          # 最初の失敗ですぐに通知

Gatusを再起動して30秒待ちます——設定が正しければ、エンドポイント情報と失敗理由を含む通知メッセージがTelegramに届きます。

ログの確認とデバッグ

# リアルタイムでログを確認
docker compose logs -f gatus

# configが正しくパースされるか確認
docker compose exec gatus cat /config/config.yaml

# config変更後に再起動
docker compose restart gatus

運用時の実践的な注意点

  • failure-thresholdは一時的なネットワークの揺らぎによる誤通知を避けるため、>=2に設定することを推奨
  • 重要な本番エンドポイントはinterval: 1m、重要度が低いエンドポイントは5mで十分——不要なリクエストを大量に発生させないよう注意
  • /dataボリュームを外部にマウントして、コンテナ再起動時に稼働履歴が失われないようにすること
  • 監視対象のサービスと同じサーバーでGatusを実行する場合、サーバー全体がダウンしたときのfalse positiveを避けるため、別サーバーからの外部チェックも追加すること

このセットアップにより、ウェブサイトがダウンしていても気づかないという心配がなくなりました。エンドポイント監視全体で必要なのはYAMLファイル1つとコンテナ1つだけ——各サービスにPrometheus exporterを構築するよりはるかにシンプルです。

Share: