剖析核心配置文件 prometheus.yml 详解
prometheus.yml 是 Prometheus 的主配置文件,决定了 Prometheus Server 如何发现目标、抓取指标、评估规则、以及与外部系统(如 Alertmanager)交互。理解并正确配置该文件,是部署和运维 Prometheus 的核心技能。
本文将逐段详解 prometheus.yml 的所有关键配置项,结合生产环境最佳实践,帮助你构建一个稳定、高效、可维护的监控系统。
一、配置文件结构概览
# 全局配置
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_timeout: 10s
# 告警配置(连接 Alertmanager)
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
# 规则配置(记录规则 + 告警规则)
rule_files:
- "rules/*.yml"
# 抓取配置(核心:定义监控目标)
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
二、1. global:全局配置
定义 Prometheus 的默认行为。
配置项详解
| 配置项 | 默认值 | 说明 |
|---|---|---|
scrape_interval | 1m | 默认抓取间隔(可被 job 覆盖) |
scrape_timeout | 10s | 单次抓取超时时间 |
evaluation_interval | 1m | 告警和记录规则的评估频率 |
external_labels | {} | 添加到所有指标的外部标签(如 datacenter: "us-east-1") |
推荐配置(生产环境)
global:
scrape_interval: 15s # 统一抓取频率
scrape_timeout: 10s # 超时应小于 scrape_interval
evaluation_interval: 15s # 与 scrape_interval 保持一致
external_labels:
datacenter: "shanghai"
environment: "production"
cluster: "k8s-prod"
✅ 建议:
scrape_interval和evaluation_interval保持一致,避免规则评估时数据不完整。
三、2. alerting:告警配置
配置 Prometheus 如何将告警发送到 Alertmanager。
配置结构
alerting:
alertmanagers:
- scheme: http
static_configs:
- targets: ['alertmanager1:9093', 'alertmanager2:9093']
timeout: 10s
api_version: v1
关键配置项
| 配置项 | 说明 |
|---|---|
targets | Alertmanager 实例地址列表(支持高可用) |
scheme | http 或 https |
timeout | 发送告警的超时时间 |
api_version | v1(当前唯一版本) |
高可用配置示例
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager-primary:9093', 'alertmanager-standby:9093']
✅ Prometheus 会轮询所有 Alertmanager,实现高可用。
四、3. rule_files:规则文件
指定 Prometheus 加载的记录规则(Recording Rules) 和 告警规则(Alerting Rules) 文件路径。
配置示例
rule_files:
- "rules/alerts.yml"
- "rules/recording.yml"
- "rules/k8s/*.yml"
✅ 支持通配符
*,便于模块化管理。
规则文件示例(rules/alerts.yml)
groups:
- name: example-alerts
rules:
- alert: HighRequestLatency
expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 1
for: 10m
labels:
severity: warning
annotations:
summary: "High latency on {{ $labels.instance }}"
⚠️ 规则文件修改后需 重载 Prometheus(
POST /-/reload或kill -SIGHUP)。
五、4. scrape_configs:抓取配置(核心)
定义 Prometheus 的监控任务(Jobs) 和 目标发现方式。
基本结构
scrape_configs:
- job_name: 'node-exporter'
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: '/metrics'
scheme: http
static_configs:
- targets: ['192.168.1.10:9100', '192.168.1.11:9100']
labels:
region: 'east'
关键配置项详解
| 配置项 | 说明 |
|---|---|
job_name | 任务名称,会作为 job 标签自动添加 |
scrape_interval | 该任务的抓取频率(覆盖全局) |
scrape_timeout | 该任务的抓取超时 |
metrics_path | 指标端点路径(默认 /metrics) |
scheme | http 或 https |
basic_auth / bearer_token | 认证配置 |
tls_config | TLS 证书配置 |
static_configs | 静态目标配置 |
file_sd_configs | 文件服务发现 |
kubernetes_sd_configs | Kubernetes 服务发现 |
relabel_configs | 抓取前重写标签 |
metric_relabel_configs | 抓取后重写指标 |
5.1 静态配置 static_configs
适用于固定 IP 的服务。
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
5.2 文件服务发现 file_sd_configs
从外部文件动态加载目标。
- job_name: 'node'
file_sd_configs:
- files:
- 'targets/nodes.json'
refresh_interval: 5m
targets/nodes.json 示例:
[
{
"targets": ["192.168.1.10:9100", "192.168.1.11:9100"],
"labels": { "region": "east" }
}
]
✅ 适合非 Kubernetes 环境的动态服务。
5.3 Kubernetes 服务发现 kubernetes_sd_configs
自动发现 Kubernetes 中的 Pod、Service、Endpoint 等。
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
✅ 这是 Kubernetes 环境的标准配置,可自动发现所有带注解的服务。
六、6. relabel_configs 与 metric_relabel_configs
区别
| 配置 | 时机 | 用途 |
|---|---|---|
relabel_configs | 抓取前 | 控制目标发现、修改 __* 元标签、过滤目标 |
metric_relabel_configs | 抓取后 | 修改指标名称、标签,过滤无用指标 |
常见 relabel_configs 用法
1. 过滤目标(只抓取特定 Pod)
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
2. 重写 metrics_path
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
3. 添加自定义标签
- action: replace
source_labels: [__meta_kubernetes_namespace]
target_label: namespace
4. 使用 labelmap 提取所有 Pod 标签
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
常见 metric_relabel_configs 用法
1. 删除无用指标(节省存储)
- source_labels: [__name__]
regex: 'go_.+'
action: drop
2. 重命名指标
- source_labels: [__name__]
regex: 'old_metric_name'
replacement: 'new_metric_name'
action: replace
target_label: __name__
3. 过滤高基数标签
- action: labeldrop
regex: 'user_id'
✅ 强烈推荐:使用
labeldrop删除user_id,request_id等高基数标签。
七、完整生产级配置示例
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_timeout: 10s
external_labels:
environment: "production"
cluster: "k8s-prod"
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager.monitoring.svc:9093']
rule_files:
- "rules/alerts.yml"
- "rules/recording.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
metric_relabel_configs:
- source_labels: [__name__]
regex: 'unwanted_metric_.+'
action: drop
- action: labeldrop
regex: 'user_id|trace_id'
八、配置管理最佳实践
| 实践 | 说明 |
|---|---|
✅ 使用 external_labels 标识集群/环境 | 便于多集群聚合 |
✅ 统一 scrape_interval | 避免数据不一致 |
✅ 模块化 rule_files | 按服务或团队拆分 |
✅ 使用 relabel_configs 控制标签爆炸 | 删除或重写高基数标签 |
| ✅ 定期 reload 配置 | curl -X POST http://prometheus:9090/-/reload |
| ✅ 配置文件版本化 | 使用 Git 管理 prometheus.yml |
九、总结
prometheus.yml 是 Prometheus 的“大脑”,其核心配置项包括:
| 配置块 | 作用 |
|---|---|
global | 全局默认值 |
alerting | 连接 Alertmanager |
rule_files | 加载告警和记录规则 |
scrape_configs | 定义监控任务和目标发现 |
relabel_configs | 抓取前标签重写 |
metric_relabel_configs | 抓取后指标处理 |
关键原则:
- 服务发现优先:Kubernetes 用
kubernetes_sd_configs - 标签治理:用
relabel和metric_relabel控制标签爆炸 - 规则分离:将告警和记录规则放入独立文件
- 高可用:配置多个 Alertmanager
通过深入理解 prometheus.yml,你可以构建一个自动化、可扩展、低维护成本的监控系统,为云原生应用提供坚实保障。
📌 官方文档:https://prometheus.io/docs/prometheus/latest/configuration/configuration/
438

被折叠的 条评论
为什么被折叠?



