Prometheus
サポート対象バージョン: Prometheus 2.x / 3.x 最終更新: February 20, 2026
目次
- 概要
- アーキテクチャ
- コアコンポーネント
- PromQL クエリ言語
- Service Discovery
- Prometheus Operator
- kube-prometheus-stack のインストール
- Alertmanager との統合
- Remote Write と AMP の統合
- パフォーマンスチューニング
- ベストプラクティス
- トラブルシューティング
概要
Prometheus は、SoundCloud で最初に開発され、CNCF (Cloud Native Computing Foundation) に寄贈されたオープンソースのシステム監視およびアラートツールキットです。Kubernetes 環境におけるデファクトスタンダードの監視ソリューションとなっています。
主な機能
- 多次元データモデル: メトリクス名とキー・バリューペア(ラベル)で識別される時系列データ
- PromQL: 多次元データを活用する柔軟なクエリ言語
- Pull ベースの収集: HTTP を介してターゲットから定期的にメトリクスをスクレイプ
- Service Discovery: Kubernetes のような動的環境で監視ターゲットを自動検出
- アラート管理: Alertmanager を介したルールベースのアラート定義とルーティング
- スタンドアロンサーバー: 分散ストレージへの依存なしに単一サーバーとして動作
Prometheus が適している場合
- 純粋な数値の時系列データを記録する場合
- マシン中心の監視および非常に動的なサービス指向アーキテクチャ
- 多次元データの収集とクエリ
- 100% の正確性よりシステム全体の概要が重要な場合
Prometheus が適していない場合
- イベントログやトレーシング
- リクエスト単位の課金のように 100% の正確性が必要なケース
- 長期データ保持(別途長期ストレージが必要)
アーキテクチャ
データフロー
- Service Discovery: Kubernetes API、DNS、ファイルなどからスクレイプターゲットを検出
- メトリクス収集: HTTP を介してターゲットの
/metricsエンドポイントからメトリクスをスクレイプ - データストレージ: 収集したメトリクスをローカル TSDB に保存
- ルール評価: 保存済みデータに対してアラートルールと記録ルールを評価
- アラート配信: 発火したアラートを Alertmanager に送信
- クエリサービス: HTTP API を介して PromQL クエリを処理
コアコンポーネント
TSDB(時系列データベース)
Prometheus に組み込まれた時系列データベースは、時系列データを効率的に保存するよう設計されています。
yaml
# TSDB-related configuration
storage:
tsdb:
path: /prometheus # Data storage path
retention.time: 15d # Data retention period
retention.size: 50GB # Maximum storage size
wal-compression: true # Enable WAL compression
min-block-duration: 2h # Minimum block size
max-block-duration: 36h # Maximum block size (10% of retention recommended)TSDB ブロック構造:
data/
├── 01BKGV7JBM69T2G1BGBGM6KB12/ # 2-hour block
│ ├── chunks/ # Time series data
│ │ └── 000001
│ ├── tombstones # Deleted data
│ ├── index # Label index
│ └── meta.json # Block metadata
├── 01BKGV7JC0RY8A6MACW02A2PJD/ # Another block
├── chunks_head/ # Currently writing data
│ └── 000001
├── wal/ # Write-Ahead Log
│ ├── 00000000
│ └── 00000001
└── lock # Process lockkube-state-metrics
Kubernetes API オブジェクトに関するメトリクスを生成するサービスです。
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kube-state-metrics
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: kube-state-metrics
template:
metadata:
labels:
app: kube-state-metrics
spec:
serviceAccountName: kube-state-metrics
containers:
- name: kube-state-metrics
image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.10.1
ports:
- name: http-metrics
containerPort: 8080
- name: telemetry
containerPort: 8081
resources:
requests:
cpu: 10m
memory: 128Mi
limits:
cpu: 100m
memory: 256Mi主なメトリクス:
promql
# Pod status metrics
kube_pod_status_phase{phase="Running"}
kube_pod_container_status_restarts_total
kube_pod_container_resource_requests{resource="cpu"}
kube_pod_container_resource_limits{resource="memory"}
# Deployment metrics
kube_deployment_spec_replicas
kube_deployment_status_replicas_available
kube_deployment_status_replicas_unavailable
# Node metrics
kube_node_status_condition{condition="Ready"}
kube_node_status_allocatable{resource="cpu"}node-exporter
ホストレベルのハードウェアおよび OS メトリクスを公開する exporter です。
yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
hostNetwork: true
hostPID: true
containers:
- name: node-exporter
image: prom/node-exporter:v1.7.0
args:
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --path.rootfs=/host/root
- --collector.filesystem.mount-points-exclude=^/(dev|proc|sys|var/lib/docker/.+)($|/)
- --collector.netclass.ignored-devices=^(veth.*|docker.*|br-.*)$
ports:
- name: metrics
containerPort: 9100
volumeMounts:
- name: proc
mountPath: /host/proc
readOnly: true
- name: sys
mountPath: /host/sys
readOnly: true
- name: root
mountPath: /host/root
readOnly: true
mountPropagation: HostToContainer
resources:
requests:
cpu: 10m
memory: 32Mi
limits:
cpu: 100m
memory: 64Mi
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
- name: root
hostPath:
path: /
tolerations:
- operator: Exists主なメトリクス:
promql
# CPU metrics
node_cpu_seconds_total{mode="idle"}
rate(node_cpu_seconds_total{mode!="idle"}[5m])
# Memory metrics
node_memory_MemTotal_bytes
node_memory_MemAvailable_bytes
node_memory_Buffers_bytes
node_memory_Cached_bytes
# Disk metrics
node_filesystem_size_bytes
node_filesystem_avail_bytes
node_disk_io_time_seconds_total
# Network metrics
node_network_receive_bytes_total
node_network_transmit_bytes_totalPromQL クエリ言語
PromQL (Prometheus Query Language) は Prometheus の関数型クエリ言語です。
基本クエリ
promql
# Instant vector: value at current time
http_requests_total
# Label filtering
http_requests_total{method="GET"}
http_requests_total{status=~"2.."} # Regex match
http_requests_total{status!~"5.."} # Negative regex
# Range vector: values over time range
http_requests_total[5m] # All samples in last 5 minutes
http_requests_total[1h:5m] # Samples at 5 minute intervals over 1 hour
# Offset modifier
http_requests_total offset 1h # Value from 1 hour ago
rate(http_requests_total[5m] offset 1h) # 5 minute rate from 1 hour ago集約演算子
promql
# sum: Total
sum(http_requests_total)
sum by (method)(http_requests_total) # Sum by method
sum without (instance)(http_requests_total) # Sum excluding instance
# avg: Average
avg(node_cpu_seconds_total)
# count: Count
count(kube_pod_status_phase{phase="Running"})
# min/max: Minimum/Maximum
max(node_memory_MemAvailable_bytes)
# topk/bottomk: Top/bottom k
topk(5, sum by (pod)(rate(container_cpu_usage_seconds_total[5m])))
# quantile: Quantile
quantile(0.95, http_request_duration_seconds)
# stddev/stdvar: Standard deviation/variance
stddev(rate(http_requests_total[5m]))Rate と Increase 関数
promql
# rate: Average per-second rate of increase (for Counters)
rate(http_requests_total[5m])
# irate: Instant rate between last two samples
irate(http_requests_total[5m])
# increase: Total increase over time range
increase(http_requests_total[1h])
# delta: Difference between first and last values (for Gauges)
delta(temperature_celsius[1h])
# deriv: Per-second rate of change (for Gauges, linear regression)
deriv(temperature_celsius[1h])予測関数
promql
# predict_linear: Linear regression based future value prediction
predict_linear(node_filesystem_avail_bytes[6h], 24*60*60) # Predict 24 hours ahead
# Disk space exhaustion prediction alert
predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 24*60*60) < 0実践的なクエリ例
promql
# CPU usage (%)
100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Memory usage (%)
100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)
# Pod restart count increase
increase(kube_pod_container_status_restarts_total[1h]) > 3
# HTTP error rate (%)
100 * sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
# p95 latency
histogram_quantile(0.95,
sum by (le)(rate(http_request_duration_seconds_bucket[5m]))
)
# Disk usage
100 - (node_filesystem_avail_bytes{mountpoint="/"}
/ node_filesystem_size_bytes{mountpoint="/"} * 100)Service Discovery
Kubernetes Service Discovery
Prometheus は Kubernetes API を通じて監視ターゲットを自動検出します。
yaml
scrape_configs:
# Pod auto-discovery
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
# Only scrape pods with prometheus.io/scrape annotation
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
# Custom metrics path
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
# Custom port
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
# Add labels
- source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- source_labels: [__meta_kubernetes_pod_name]
target_label: podPod Annotation ベースのスクレイピング
yaml
apiVersion: v1
kind: Pod
metadata:
name: my-app
annotations:
prometheus.io/scrape: "true" # Enable scraping
prometheus.io/port: "8080" # Metrics port
prometheus.io/path: "/metrics" # Metrics path
prometheus.io/scheme: "http" # http or https
spec:
containers:
- name: app
image: my-app:latest
ports:
- containerPort: 8080Prometheus Operator
Prometheus Operator は Kubernetes で Prometheus を宣言的に管理するためのコントローラーです。
Custom Resource Definitions (CRD)
ServiceMonitor
yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: example-app
namespace: monitoring
labels:
team: frontend
spec:
# Target service selection
selector:
matchLabels:
app: example-app
# Target namespaces
namespaceSelector:
matchNames:
- production
- staging
# Endpoint configuration
endpoints:
- port: web
interval: 30s
scrapeTimeout: 10s
path: /metrics
scheme: http
# Label rewriting
relabelings:
- sourceLabels: [__meta_kubernetes_pod_name]
targetLabel: pod
- sourceLabels: [__meta_kubernetes_namespace]
targetLabel: namespace
# Metric filtering
metricRelabelings:
- sourceLabels: [__name__]
regex: 'go_.*'
action: dropPrometheusRule
yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: kubernetes-alerts
namespace: monitoring
labels:
role: alert-rules
spec:
groups:
- name: kubernetes-system
interval: 30s
rules:
# Node memory high alert
- alert: NodeMemoryHigh
expr: |
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes)
/ node_memory_MemTotal_bytes * 100 > 90
for: 5m
labels:
severity: warning
team: infrastructure
annotations:
summary: "Node {{ $labels.instance }} memory usage is high"
description: "Memory usage is {{ printf \"%.2f\" $value }}%"
runbook_url: "https://wiki.example.com/runbooks/node-memory-high"
# Pod restart alert
- alert: PodRestartingFrequently
expr: increase(kube_pod_container_status_restarts_total[1h]) > 5
for: 10m
labels:
severity: warning
annotations:
summary: "Pod {{ $labels.namespace }}/{{ $labels.pod }} is restarting frequently"
description: "Pod has restarted {{ $value }} times in the last hour"kube-prometheus-stack のインストール
kube-prometheus-stack は、Prometheus、Alertmanager、Grafana、および関連コンポーネントを含む包括的な Helm chart です。
Helm を使用したインストール
bash
# Add Helm repository
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# Basic installation
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace
# Installation with custom values
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace \
-f values.yamlvalues.yaml の例
yaml
# Prometheus configuration
prometheus:
prometheusSpec:
# Replicas
replicas: 2
# Retention period
retention: 15d
retentionSize: 50GB
# Storage
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: gp3
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 100Gi
# Resources
resources:
requests:
cpu: 500m
memory: 2Gi
limits:
cpu: 2000m
memory: 8Gi
# Remote Write
remoteWrite:
- url: http://victoriametrics:8428/api/v1/write
queueConfig:
maxSamplesPerSend: 10000
batchSendDeadline: 5s
# External labels
externalLabels:
cluster: production
# Collect ServiceMonitors from all namespaces
serviceMonitorSelectorNilUsesHelmValues: false
podMonitorSelectorNilUsesHelmValues: false
ruleSelectorNilUsesHelmValues: false
# Alertmanager configuration
alertmanager:
alertmanagerSpec:
replicas: 3
storage:
volumeClaimTemplate:
spec:
storageClassName: gp3
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
# Grafana configuration
grafana:
enabled: true
replicas: 1
persistence:
enabled: true
storageClassName: gp3
size: 10Gi
# Additional data sources
additionalDataSources:
- name: VictoriaMetrics
type: prometheus
url: http://victoriametrics:8428
access: proxy
isDefault: falseAlertmanager との統合
AlertmanagerConfig
yaml
apiVersion: monitoring.coreos.com/v1alpha1
kind: AlertmanagerConfig
metadata:
name: main-config
namespace: monitoring
labels:
alertmanagerConfig: main
spec:
# Routing configuration
route:
receiver: 'default'
groupBy: ['alertname', 'namespace', 'severity']
groupWait: 30s
groupInterval: 5m
repeatInterval: 4h
routes:
# Critical alerts -> PagerDuty
- receiver: 'pagerduty-critical'
matchers:
- name: severity
matchType: =
value: critical
groupWait: 10s
repeatInterval: 1h
# Warning alerts -> Slack
- receiver: 'slack-warnings'
matchers:
- name: severity
matchType: =
value: warning
groupWait: 1m
repeatInterval: 4h
# Receivers
receivers:
- name: 'default'
emailConfigs:
- to: 'alerts@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:587'
authUsername: 'alertmanager'
authPassword:
name: alertmanager-smtp
key: password
requireTLS: true
- name: 'slack-warnings'
slackConfigs:
- apiURL:
name: alertmanager-slack
key: webhook-url
channel: '#alerts'
sendResolved: true
- name: 'pagerduty-critical'
pagerdutyConfigs:
- routingKey:
name: alertmanager-pagerduty
key: routing-key
sendResolved: trueRemote Write と AMP の統合
Amazon Managed Prometheus (AMP) との統合
yaml
# Prometheus configuration
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
namespace: monitoring
spec:
# IRSA service account
serviceAccountName: prometheus-amp
# Remote Write to AMP
remoteWrite:
- url: https://aps-workspaces.ap-northeast-2.amazonaws.com/workspaces/ws-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/api/v1/remote_write
sigv4:
region: ap-northeast-2
queueConfig:
maxSamplesPerSend: 1000
maxShards: 200
capacity: 2500
writeRelabelConfigs:
# Exclude unnecessary metrics
- sourceLabels: [__name__]
regex: 'go_.*'
action: dropIRSA の設定
bash
# Create IAM policy
cat <<EOF > amp-policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"aps:RemoteWrite",
"aps:QueryMetrics",
"aps:GetSeries",
"aps:GetLabels",
"aps:GetMetricMetadata"
],
"Resource": "*"
}
]
}
EOF
aws iam create-policy \
--policy-name AmazonManagedPrometheusPolicy \
--policy-document file://amp-policy.json
# Create service account (using eksctl)
eksctl create iamserviceaccount \
--name prometheus-amp \
--namespace monitoring \
--cluster my-cluster \
--attach-policy-arn arn:aws:iam::123456789012:policy/AmazonManagedPrometheusPolicy \
--approveパフォーマンスチューニング
メモリの最適化
yaml
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
spec:
# Memory limits
resources:
requests:
memory: 2Gi
limits:
memory: 8Gi
# Query limits
query:
maxConcurrency: 20 # Max concurrent queries
maxSamples: 50000000 # Max samples per query
timeout: 2m # Query timeout
# WAL compression
walCompression: trueスクレイプの最適化
yaml
scrape_configs:
- job_name: 'high-cardinality-app'
scrape_interval: 60s # Increase interval
scrape_timeout: 30s
sample_limit: 10000 # Limit sample count
metric_relabel_configs:
# Remove unnecessary metrics
- source_labels: [__name__]
regex: 'go_.*|process_.*'
action: drop
# Remove high cardinality labels
- regex: 'pod_template_hash|controller_revision_hash'
action: labeldropベストプラクティス
高可用性の設定
yaml
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
spec:
# Run 2 replicas
replicas: 2
# Pod anti-affinity
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app.kubernetes.io/name: prometheus
topologyKey: kubernetes.io/hostname
# Sharding (for large environments)
shards: 2
# External labels (for deduplication)
externalLabels:
cluster: production
replica: $(POD_NAME)アラートルールのガイドライン
yaml
# Good alert rule example
- alert: HighErrorRate
# Meaningful threshold
expr: |
sum(rate(http_requests_total{status=~"5.."}[5m])) by (service)
/ sum(rate(http_requests_total[5m])) by (service) > 0.01
# Appropriate wait time (noise prevention)
for: 5m
labels:
# Severity level
severity: warning
# Owning team
team: backend
annotations:
# Clear summary
summary: "High error rate on {{ $labels.service }}"
# Detailed description
description: |
Service {{ $labels.service }} has error rate of {{ printf "%.2f" $value }}%.
This is above the 1% threshold.
# Runbook link
runbook_url: "https://wiki.example.com/runbooks/high-error-rate"トラブルシューティング
一般的な問題
1. メモリ不足(OOMKilled)
bash
# Check current memory usage
kubectl top pod -n monitoring prometheus-prometheus-0
# Check TSDB status
curl -s http://prometheus:9090/api/v1/status/tsdb | jq .
# Solution: Increase memory limit or reduce retention period2. 高カーディナリティ
promql
# Find high cardinality metrics
topk(10, count by (__name__)({__name__=~".+"}))
# Check label combinations for specific metric
count(http_requests_total)
# Solution: Use metric_relabel_configs to remove unnecessary labels/metrics3. スクレイプの失敗
bash
# Check target status
curl -s http://prometheus:9090/api/v1/targets | jq '.data.activeTargets[] | select(.health != "up")'
# Directly check target metrics
kubectl exec -it prometheus-prometheus-0 -n monitoring -- \
wget -qO- http://target-service:8080/metrics | head -20
# Solution: Check network policies, RBAC, service endpointsデバッグコマンド
bash
# Check Prometheus logs
kubectl logs -f prometheus-prometheus-0 -n monitoring
# Prometheus API status
curl http://prometheus:9090/api/v1/status/config
curl http://prometheus:9090/api/v1/status/flags
curl http://prometheus:9090/api/v1/status/runtimeinfo
# TSDB status
curl http://prometheus:9090/api/v1/status/tsdb
# Target metadata
curl http://prometheus:9090/api/v1/targets/metadata
# Rule status
curl http://prometheus:9090/api/v1/rules
# Alert status
curl http://prometheus:9090/api/v1/alerts参考資料
- Prometheus 公式ドキュメント
- Prometheus Operator ドキュメント
- PromQL チートシート
- kube-prometheus-stack Chart
- Prometheus ベストプラクティス
クイズ
この章の理解度を確認するには、Prometheus クイズに挑戦してください。