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

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をデータソースとして追加
- Grafanaを開き、設定 → データソースに移動
- 「データソースを追加」をクリック
- 「Prometheus」を選択
- URLを
http://localhost:9090(またはPrometheusサーバー)に設定 - 「保存&テスト」をクリック
人気のあるダッシュボード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は、単一サーバーのデプロイメントからマルチデータセンターのモニタリングアーキテクチャまで、インフラストラクチャに合わせてスケールします。
関連リソース
- Ubuntu 24.04のインストールと役に立つツール
- Ubuntuパッケージ管理: APTとdpkgチートシート
- UbuntuでのGrafanaのインストールと使用: 完全ガイド
- Kubernetesチートシート
- Kubernetesディストリビューション: kubeadm、k3s、MicroK8s、Minikube、Talos Linux、RKE2の概要
- Dockerチートシート