プロメテウスモニタリング: 完全なセットアップとベストプラクティス

プロメテウスで堅牢なインフラストラクチャのモニタリングを構築しましょう

目次

Prometheus は、クラウドネイティブなアプリケーションとインフラストラクチャのモニタリングにおいて事実上の標準となり、メトリクスの収集、クエリ、可視化ツールとの統合を提供しています。

technical-diagram

Prometheusとは?

Prometheusは、2012年にSoundCloudで開発され、現在はCloud Native Computing Foundation (CNCF)の卒業プロジェクトとなっているオープンソースのモニタリングおよびアラートツールキットです。動的なクラウド環境における信頼性とスケーラビリティを特に設計しており、マイクロサービス、コンテナ、Kubernetesクラスターのモニタリングに最適なソリューションです。

主な特徴

時系列データベース: Prometheusは、メトリクス名とキーバリューペア(ラベル)によって識別されるすべてのデータを時系列として保存し、柔軟で強力なクエリ機能を可能にします。

プルベースモデル: 伝統的なプッシュベースのシステムとは異なり、Prometheusは指定された間隔で設定されたターゲットからメトリクスをアクティブにスクレイプし、より信頼性が高く、設定も簡単になります。

PromQLクエリ言語: 実時間でメトリクスデータをスライス&ダイスするための強力な関数型クエリ言語が提供され、集計、変換、複雑な計算が可能です。

サービス発見: Kubernetes、Consul、EC2、静的設定を含むさまざまなメカニズムを通じて、モニタリングターゲットの自動発見が可能です。

外部依存なし: Prometheusは、外部依存が不要な単一のバイナリで動作し、デプロイを簡素化し、運用の複雑さを減らします。

組み込みのアラート: AlertManagerはPrometheusからのアラートを処理し、重複除去、グループ化、電子メール、PagerDuty、Slackなどの通知チャネルへのルーティングを提供します。

アーキテクチャ概要

Prometheusのアーキテクチャを理解することは、効果的なデプロイに不可欠です。主なコンポーネントは以下の通りです:

  • Prometheusサーバー: メトリクスをスクレイプし、保存し、ルールを評価し、クエリを提供します
  • クライアントライブラリ: アプリケーションコードをインストゥルメントし、メトリクスを公開します
  • エクスポータ: 第三者システムをPrometheus形式に橋渡しします
  • AlertManager: アラートおよび通知を処理します
  • Pushgateway: スクレイプができない一時的なジョブからメトリクスを受け取ります

典型的なデータフロー: アプリケーションがメトリクスエンドポイントを公開 → Prometheusがこれらのエンドポイントをスクレイプ → データが時系列データベースに保存 → PromQLクエリがデータを取得および分析 → ルールに基づいてアラートが生成 → AlertManagerが通知を処理およびルーティングします。

インフラストラクチャを Ubuntu 24.04 にデプロイする場合、Prometheusは包括的なモニタリングのための優れた基盤を提供します。

UbuntuでのPrometheusのインストール

LinuxシステムにPrometheusをインストールする手順を確認しましょう。ここではUbuntuを使用していますが、他のディストリビューションでもプロセスは似ています。

ダウンロードとインストール

まず、Prometheus専用のユーザーを作成します:

sudo useradd --no-create-home --shell /bin/false prometheus

最新版のPrometheusをダウンロードします:

cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar xvf prometheus-2.48.0.linux-amd64.tar.gz
cd prometheus-2.48.0.linux-amd64

バイナリをコピーし、ディレクトリを作成します:

sudo cp prometheus /usr/local/bin/
sudo cp promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool

sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
sudo chown prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus

sudo cp -r consoles /etc/prometheus
sudo cp -r console_libraries /etc/prometheus
sudo cp prometheus.yml /etc/prometheus/prometheus.yml
sudo chown -R prometheus:prometheus /etc/prometheus

Ubuntuでのパッケージ管理については、当社の包括的な Ubuntu パッケージ管理ガイド を参照してください。

Prometheusの設定

/etc/prometheus/prometheus.ymlを編集します:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

rule_files:
  - 'alert_rules.yml'

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']

Systemdサービスの作成

/etc/systemd/system/prometheus.serviceを作成します:

[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus/ \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries \
  --storage.tsdb.retention.time=30d

[Install]
WantedBy=multi-user.target

Prometheusを起動および有効化します:

sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
sudo systemctl status prometheus

Prometheusのウェブインターフェースにアクセスするには、http://localhost:9090を使用してください。

Node Exporterのセットアップ

Node ExporterはLinuxシステムのハードウェアおよびOSメトリクスを公開します。サーバーを監視するためにインストールしてください:

cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xvf node_exporter-1.7.0.linux-amd64.tar.gz
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/node_exporter

/etc/systemd/system/node_exporter.serviceを作成します:

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

Node Exporterを起動します:

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

Node Exporterは現在、ポート9100でメトリクスを公開しています。

PromQLの理解

PromQL(Prometheusクエリ言語)は、Prometheusデータをクエリするための中心的な要素です。以下のクエリパターンは必須です:

基本クエリ

メトリクスのすべてのタイムシリーズを選択:

node_cpu_seconds_total

ラベルでフィルタ:

node_cpu_seconds_total{mode="idle"}

複数のラベルフィルタ:

node_cpu_seconds_total{mode="idle",cpu="0"}

レンジベクトルと集計

時間経過に伴うレートの計算:

rate(node_cpu_seconds_total{mode="idle"}[5m])

すべてのCPUにわたる合計:

sum(rate(node_cpu_seconds_total{mode="idle"}[5m]))

ラベルごとにグループ化:

sum by (mode) (rate(node_cpu_seconds_total[5m]))

実用的な例

CPU使用率のパーセンテージ:

100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

メモリ使用率:

(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100

ディスク使用率:

(node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100

ネットワークトラフィックレート:

rate(node_network_receive_bytes_total[5m])

Dockerでのデプロイ

Docker コンテナでPrometheusを実行することで、柔軟性と管理が容易になります:

docker-compose.ymlを作成します:

version: '3.8'

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

  node_exporter:
    image: prom/node-exporter:latest
    container_name: node_exporter
    command:
      - '--path.rootfs=/host'
    volumes:
      - '/:/host:ro,rslave'
    ports:
      - "9100:9100"
    restart: unless-stopped

  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - alertmanager_data:/alertmanager
    ports:
      - "9093:9093"
    restart: unless-stopped

volumes:
  prometheus_data:
  alertmanager_data:

スタックを起動します:

docker-compose up -d

Kubernetesのモニタリング

PrometheusはKubernetesクラスターのモニタリングに優れています。kube-prometheus-stack Helmチャートは、完全なモニタリングソリューションを提供します。

Helmを使用してインストールします:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack

これによりインストールされます:

  • Prometheus Operator
  • Prometheusインスタンス
  • AlertManager
  • Grafana
  • Node Exporter
  • kube-state-metrics
  • 事前に設定されたダッシュボードおよびアラート

Grafanaにアクセスします:

kubectl port-forward svc/prometheus-grafana 3000:80

デフォルトの資格情報: admin/prom-operator

Kubernetesディストリビューション に関しては、プラットフォーム固有の機能に応じたわずかな調整を除き、デプロイプロセスは類似しています。

アラートの設定

AlertManagerはPrometheusから送信されるアラートを処理します。アラートルールと通知チャネルを設定します。

アラートルール

/etc/prometheus/alert_rules.ymlを作成します:

groups:
  - name: system_alerts
    interval: 30s
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "インスタンス {{ $labels.instance }}のCPU使用率が高い"
          description: "CPU使用率は80%を超えています(現在の値: {{ $value }}%)"

      - alert: HighMemoryUsage
        expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "インスタンス {{ $labels.instance }}のメモリ使用率が高い"
          description: "メモリ使用率は85%を超えています(現在の値: {{ $value }}%)"

      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 < 15
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "インスタンス {{ $labels.instance }}のディスク空き容量が低い"
          description: "{{ $labels.mountpoint }}のディスク空き容量が15%未満です"

      - alert: InstanceDown
        expr: up == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "インスタンス {{ $labels.instance }}がダウンしています"
          description: "{{ $labels.job }}インスタンス {{ $labels.instance }}が2分以上ダウンしています"

AlertManager設定

/etc/prometheus/alertmanager.ymlを作成します:

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.gmail.com:587'
  smtp_from: 'alerts@example.com'
  smtp_auth_username: 'alerts@example.com'
  smtp_auth_password: 'your-password'

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: 'team-email'
  routes:
    - match:
        severity: critical
      receiver: 'team-pagerduty'
    - match:
        severity: warning
      receiver: 'team-slack'

receivers:
  - name: 'team-email'
    email_configs:
      - to: 'team@example.com'
        headers:
          Subject: '{{ .GroupLabels.alertname }}: {{ .Status | toUpper }}'

  - name: 'team-slack'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
        channel: '#alerts'
        title: 'アラート: {{ .GroupLabels.alertname }}'
        text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'

  - name: 'team-pagerduty'
    pagerduty_configs:
      - service_key: 'your-pagerduty-key'

Grafanaとの統合

Prometheusには基本的なウェブインターフェースがありますが、Grafanaはより優れた可視化を提供します。

Prometheusをデータソースとして追加

  1. Grafanaを開き、設定 → データソースに移動
  2. 「データソースを追加」をクリック
  3. 「Prometheus」を選択
  4. URLを http://localhost:9090(またはPrometheusサーバー)に設定
  5. 「保存&テスト」をクリック

人気のあるダッシュボードID

grafana.comから事前に構築されたダッシュボードをインポートします:

  • Node Exporter Full (ID: 1860): 継続的なLinuxメトリクス
  • Kubernetes Cluster Monitoring (ID: 7249): K8s概観
  • Docker Container Monitoring (ID: 193): コンテナメトリクス
  • Prometheus Stats (ID: 2): Prometheus内部メトリクス

カスタムダッシュボードの作成

PromQLクエリを使用してパネルを作成します:

{
  "title": "CPU使用率",
  "targets": [{
    "expr": "100 - (avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)"
  }]
}

人気のあるエクスポータ

Prometheusのモニタリングを専用のエクスポータで拡張します:

Blackboxエクスポータ

HTTP、HTTPS、DNS、TCP、ICMP経由でエンドポイントをプローブします:

scrape_configs:
  - job_name: 'blackbox'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
          - https://example.com
          - https://api.example.com
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: localhost:9115

データベースエクスポータ

  • mysqld_exporter: MySQL/MariaDBメトリクス
  • postgres_exporter: PostgreSQLメトリクス
  • mongodb_exporter: MongoDBメトリクス
  • redis_exporter: Redisメトリクス

アプリケーションエクスポータ

  • nginx_exporter: NGINXウェブサーバーのメトリクス
  • apache_exporter: Apache HTTPサーバーのメトリクス
  • haproxy_exporter: HAProxyロードバランサーのメトリクス

クラウドエクスポータ

  • cloudwatch_exporter: AWS CloudWatchメトリクス
  • stackdriver_exporter: Google Cloudメトリクス
  • azure_exporter: Azure Monitorメトリクス

最佳な実践

データ保持

必要に応じて適切な保持を設定します:

--storage.tsdb.retention.time=30d
--storage.tsdb.retention.size=50GB

記録ルール

頻繁にクエリされる式を事前に計算します:

groups:
  - name: example_rules
    interval: 30s
    rules:
      - record: job:node_cpu_utilization:avg
        expr: 100 - (avg by (job) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

ラベル管理

  • ラベルのカーディナリティを低く保つ
  • 一貫した命名規則を使用
  • 高カーディナリティのラベル(ユーザーID、タイムスタンプ)を避ける

セキュリティ

  • 認証とHTTPSを有効にする
  • Prometheus APIへのアクセスを制限
  • Kubernetesでネットワークポリシーを実装
  • 敏感なメトリクスにRBACを実装

高可用性

  • 複数のPrometheusインスタンスを実行
  • 長期保存にThanosやCortexを使用
  • ヘイエラル構成にフェデレーションを実装

一般的な問題のトラブルシューティング

高メモリ使用率

  • スクレイプ頻度を減らす
  • 保持期間を短くする
  • PromQLクエリを最適化
  • 記録ルールを実装

メトリクスの欠如

  • /targetsでターゲットの状態を確認
  • ネットワーク接続を確認
  • スクレイプ構成を検証
  • エクスポータのログを確認

クエリの遅さ

  • 複雑な集計に記録ルールを使用
  • ラベルフィルタを最適化
  • 時間範囲を減らす
  • リモートストレージを使用する場合にインデックスを追加

パフォーマンス最適化

クエリ最適化

# Bad: 高カーディナリティ
sum(rate(http_requests_total[5m]))

# Good: 関連するラベルでグループ化
sum by (status, method) (rate(http_requests_total[5m]))

リソース制限

Kubernetesデプロイメントの場合:

resources:
  requests:
    memory: "2Gi"
    cpu: "1000m"
  limits:
    memory: "4Gi"
    cpu: "2000m"

結論

Prometheusは、現代のインフラストラクチャに強力でスケーラブルなモニタリングソリューションを提供します。プルベースのアーキテクチャ、強力なクエリ言語、広範なエクスポータのエコシステムにより、裸金属サーバーから複雑なKubernetesクラスターまで、あらゆるものをモニタリングするのに最適です。

PrometheusをGrafanaで可視化し、AlertManagerで通知を処理することで、企業規模のモニタリング要件に対応できる包括的な観測性プラットフォームを構築できます。活発なコミュニティとCNCFの支援により、継続的な開発とサポートが保証されています。

基本的なメトリクスの収集から始め、特定のサービスに応じてエクスポータを段階的に追加し、実世界の経験に基づいてアラートルールを調整してください。Prometheusは、単一サーバーのデプロイメントからマルチデータセンターのモニタリングアーキテクチャまで、インフラストラクチャに合わせてスケールします。

関連リソース

外部参考資料