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)、 以下の手順でダッシュボードを設定します:
- データソースの追加
- Configuration → Data Sources → Add data source
- Prometheusを選択
- URL: http://prometheus:9090
- Save & Test をクリック
- ダッシュボードのインポート
- + → 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環境における効果的なモニタリングシステムの構築には、以下のポイントが重要です:
重要なポイント
- 可観測性の3つの柱を網羅: メトリクス、ログ、トレースすべてを監視
- 適切なツール選定: 環境と要件に応じたツールの組み合わせ
- 段階的な導入: 小規模から始め、徐々に拡張
- 自動化の推進: プロビジョニングと設定の自動化
- 継続的改善: モニタリング体制の定期的な見直し
Prometheus + GrafanaとELKスタックの組み合わせにより、 包括的なモニタリング体制を構築できます。これらのツールはオープンソースで、 幅広いコミュニティのサポートを受けられるため、長期的な運用にも適しています。
注意点
- 過度なモニタリングは、システムリソースを消費するため注意が必要
- アラートのノイズを減らし、本当に重要な通知のみに絞る
- データ保持期間を適切に設定し、ストレージコストを管理
- モニタリングシステム自体の監視も忘れずに実施
モニタリング環境の構築をサポートします
Deployでは、お客様の環境に最適化されたモニタリングシステムの設計・構築を支援しています。 Prometheus、Grafana、ELKスタックの導入から運用まで、包括的にサポートいたします。
無料相談を申し込む