DevOps環境のモニタリングセットアップ完全ガイド

Prometheus、Grafana、ELKで実現する包括的な監視体制

DevOps環境において、適切なモニタリング体制の構築は、システムの安定性と信頼性を確保する上で不可欠です。 本記事では、Prometheus、Grafana、ELKスタックを中心に、包括的なモニタリングシステムのセットアップ方法を詳しく解説します。

モニタリングの重要性

現代のDevOps環境では、システムの複雑性が増し、マイクロサービスアーキテクチャやコンテナ化により、 監視すべき対象が飛躍的に増加しています。適切なモニタリング体制がなければ、 問題の早期発見や根本原因の特定が困難になります。

モニタリングが解決する課題

  • ダウンタイムの削減: 問題を早期発見し、迅速に対処
  • パフォーマンス最適化: ボトルネックの特定と改善
  • 容量計画: リソース使用状況の把握と予測
  • インシデント対応: 問題発生時の迅速な原因究明
  • ビジネス価値の向上: システムの信頼性向上によるユーザー満足度向上

可観測性の3つの柱

効果的なモニタリングシステムは、以下の3つの要素(Three Pillars of Observability)で構成されます。

メトリクス

CPU使用率、メモリ使用量、リクエスト数など、数値で表現できる時系列データ。 システムの健全性を定量的に把握できます。

主要ツール: Prometheus, Datadog, New Relic

ログ

アプリケーションやシステムが出力するイベント記録。 問題発生時の詳細な調査に不可欠です。

主要ツール: ELK Stack, Splunk, Loki

トレース

リクエストの流れを追跡し、分散システムにおける処理の全体像を把握。 マイクロサービスの監視に重要です。

主要ツール: Jaeger, Zipkin, OpenTelemetry

Prometheus + Grafana のセットアップ

Prometheusとは

Prometheusは、Cloud Native Computing Foundation (CNCF)のプロジェクトで、 時系列データベースを中心としたメトリクス監視システムです。 Pull型のアーキテクチャで、高い拡張性と柔軟性を持っています。

基本的なセットアップ手順

1. Docker Composeでの構築

# docker-compose.yml
version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.enable-lifecycle'
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_INSTALL_PLUGINS=grafana-clock-panel
    restart: unless-stopped
    depends_on:
      - prometheus

  node_exporter:
    image: prom/node-exporter:latest
    container_name: node_exporter
    ports:
      - "9100:9100"
    restart: unless-stopped

volumes:
  prometheus_data:
  grafana_data:

2. Prometheus設定ファイル

# prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

# アラートマネージャーの設定
alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - 'alertmanager:9093'

# メトリクス収集の設定
scrape_configs:
  # Prometheus自身の監視
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # Node Exporter (サーバーメトリクス)
  - job_name: 'node'
    static_configs:
      - targets: ['node_exporter:9100']

  # アプリケーションメトリクス
  - job_name: 'app'
    static_configs:
      - targets: ['app:8080']

  # Kubernetesクラスター (オプション)
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod

3. Grafanaダッシュボード設定

Grafanaにログイン後(http://localhost:3000、デフォルト admin/admin)、 以下の手順でダッシュボードを設定します:

  1. データソースの追加
    • Configuration → Data Sources → Add data source
    • Prometheusを選択
    • URL: http://prometheus:9090
    • Save & Test をクリック
  2. ダッシュボードのインポート
    • + → Import
    • 人気のダッシュボードID(例: 1860 - Node Exporter Full)を入力
    • Load → Import

推奨Grafanaダッシュボード

  • Node Exporter Full (ID: 1860): サーバーメトリクス全般
  • Kubernetes Cluster Monitoring (ID: 7249): K8sクラスター監視
  • Docker Container & Host Metrics (ID: 179): Docker環境監視
  • JVM (Micrometer) (ID: 4701): Javaアプリケーション監視

ELKスタックの構築

ELKスタック(Elasticsearch、Logstash、Kibana)は、ログの収集・保存・分析・可視化を実現する 強力なログ管理プラットフォームです。

ELKスタックの構成

Elasticsearch

分散型検索・分析エンジン。大量のログデータを高速に検索・集計できます。

Logstash

ログの収集・変換・送信を行うデータ処理パイプライン。様々な入力ソースに対応。

Kibana

Elasticsearchのデータを可視化するダッシュボード。直感的なUIで分析が可能。

Docker Composeでの構築

# docker-compose.yml (ELKスタック)
version: '3.8'

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - xpack.security.enabled=false
    ports:
      - "9200:9200"
    volumes:
      - elasticsearch_data:/usr/share/elasticsearch/data
    restart: unless-stopped

  logstash:
    image: docker.elastic.co/logstash/logstash:8.11.0
    container_name: logstash
    ports:
      - "5044:5044"
      - "9600:9600"
    volumes:
      - ./logstash/pipeline:/usr/share/logstash/pipeline
      - ./logstash/config:/usr/share/logstash/config
    environment:
      - LS_JAVA_OPTS=-Xms256m -Xmx256m
    depends_on:
      - elasticsearch
    restart: unless-stopped

  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    container_name: kibana
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    depends_on:
      - elasticsearch
    restart: unless-stopped

volumes:
  elasticsearch_data:

Logstash設定例

# logstash/pipeline/logstash.conf
input {
  # Filebeat からのログ受信
  beats {
    port => 5044
  }

  # Syslog受信
  syslog {
    port => 5514
  }
}

filter {
  # JSON形式のログをパース
  if [message] =~ /^\{/ {
    json {
      source => "message"
    }
  }

  # タイムスタンプの処理
  date {
    match => [ "timestamp", "ISO8601" ]
    target => "@timestamp"
  }

  # アプリケーションログのパース
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "logs-%{+YYYY.MM.dd}"
  }

  # デバッグ用
  stdout {
    codec => rubydebug
  }
}

効果的なアラート設定

モニタリングシステムの真価は、問題を早期に検知し、適切なアラートを発行できるかにかかっています。

Prometheus Alertmanagerの設定

# prometheus/alert.rules.yml
groups:
  - name: instance_alerts
    interval: 30s
    rules:
      # インスタンスダウン検知
      - alert: InstanceDown
        expr: up == 0
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Instance {{ $labels.instance }} down"
          description: "{{ $labels.instance }} is down for more than 5 minutes."

      # CPU使用率高騰
      - alert: HighCPUUsage
        expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage on {{ $labels.instance }}"
          description: "CPU usage is above 80% for 10 minutes."

      # メモリ使用率高騰
      - alert: HighMemoryUsage
        expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 90
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "High memory usage on {{ $labels.instance }}"
          description: "Memory usage is above 90%."

      # ディスク使用率
      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 10
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Disk space low on {{ $labels.instance }}"
          description: "Available disk space is less than 10%."

アラート通知の設定

# alertmanager.yml
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'cluster']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: 'default'
  routes:
    - match:
        severity: critical
      receiver: 'critical'
    - match:
        severity: warning
      receiver: 'warning'

receivers:
  - name: 'default'
    email_configs:
      - to: 'team@example.com'
        from: 'alertmanager@example.com'
        smarthost: 'smtp.example.com:587'

  - name: 'critical'
    email_configs:
      - to: 'oncall@example.com'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/XXX/YYY/ZZZ'
        channel: '#alerts-critical'
        title: 'Critical Alert'

  - name: 'warning'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/XXX/YYY/ZZZ'
        channel: '#alerts-warning'

運用のベストプラクティス

1. SLI/SLOの設定

Service Level Indicators (SLI) とService Level Objectives (SLO) を定義し、 ビジネス価値と連携したモニタリングを実現します。

  • 可用性: 99.9%以上
  • レイテンシ: P95で500ms以下
  • エラー率: 0.1%以下

2. アラート疲れの回避

過度なアラートはチームの疲弊を招きます。以下のルールを適用しましょう。

  • アクション可能なアラートのみ設定
  • 適切なしきい値の設定
  • 重複アラートの削減
  • 定期的なアラートルールの見直し

3. 階層化されたダッシュボード

役割に応じたダッシュボードを用意します。

  • 経営層向け: ビジネスKPI、可用性サマリー
  • 運用チーム向け: システムメトリクス、アラート状況
  • 開発チーム向け: アプリケーションメトリクス、エラー詳細

4. セキュリティとアクセス制御

モニタリングシステム自体のセキュリティも重要です。

  • 認証・認可の設定(OAuth, LDAP)
  • データの暗号化(転送時・保管時)
  • 定期的なバックアップ
  • アクセスログの監査

監視対象の選定

カテゴリ 主要メトリクス 推奨しきい値
CPU 使用率、ロードアベレージ 警告: 70%, 重大: 85%
メモリ 使用率、スワップ使用量 警告: 80%, 重大: 90%
ディスク 使用率、I/O待ち時間 警告: 80%, 重大: 90%
ネットワーク 帯域使用率、エラー率 エラー率: > 0.1%
アプリケーション 応答時間、エラー率、スループット 応答時間: P95 > 500ms

まとめ

DevOps環境における効果的なモニタリングシステムの構築には、以下のポイントが重要です:

重要なポイント

  1. 可観測性の3つの柱を網羅: メトリクス、ログ、トレースすべてを監視
  2. 適切なツール選定: 環境と要件に応じたツールの組み合わせ
  3. 段階的な導入: 小規模から始め、徐々に拡張
  4. 自動化の推進: プロビジョニングと設定の自動化
  5. 継続的改善: モニタリング体制の定期的な見直し

Prometheus + GrafanaとELKスタックの組み合わせにより、 包括的なモニタリング体制を構築できます。これらのツールはオープンソースで、 幅広いコミュニティのサポートを受けられるため、長期的な運用にも適しています。

注意点

  • 過度なモニタリングは、システムリソースを消費するため注意が必要
  • アラートのノイズを減らし、本当に重要な通知のみに絞る
  • データ保持期間を適切に設定し、ストレージコストを管理
  • モニタリングシステム自体の監視も忘れずに実施

モニタリング環境の構築をサポートします

Deployでは、お客様の環境に最適化されたモニタリングシステムの設計・構築を支援しています。 Prometheus、Grafana、ELKスタックの導入から運用まで、包括的にサポートいたします。

無料相談を申し込む