Prometheus配置
1 配置文件结构
global: # 全局配置(抓取间隔、超时等)
scrape_configs: # 定义抓取目标(监控对象)
alerting: # 告警管理器(Alertmanager)配置
rule_files: # 告警规则文件路径
remote_write: # 远程存储写入配置(如 Thanos、InfluxDB)
remote_read: # 远程存储读取配置
2 全局配置
global:
scrape_interval: 15s # 默认抓取间隔(可被单个任务覆盖)
evaluation_interval: 15s # 规则评估间隔(告警规则和记录规则)
scrape_timeout: 10s # 单次抓取超时时间
# 外部标签(附加到所有时间序列和告警)
external_labels:
region: "us-west"
env: "prod"
3 数据抓取配置
定义需要监控的目标(如服务器、数据库、应用),支持静态配置或动态服务发现。
3.1 静态配置
# 静态配置
scrape_configs:
- job_name: "node_exporter" # 任务名称(唯一标识)
static_configs:
- targets: ["192.168.1.10:9100", "192.168.1.11:9100"] # 监控目标地址
# 重命名标签(可选)
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- source_labels: []
target_label: job
replacement: "node_exporter_custom"
3.2 动态服务发现
scrape_configs:
- job_name: "kubernetes-pods"
kubernetes_sd_configs: # 使用 Kubernetes 服务发现
- role: pod # 发现所有 Pod
relabel_configs:
# 仅抓取包含注解 prometheus.io/scrape: "true" 的 Pod
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
# 从 Pod 注解中提取抓取路径和端口
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
3.3 基于文件的服务发现
动态更新:通过外部工具(如Ansible)生成目标列表文件,Prometheus监听文件变化。
scrape_configs:
- job_name: 'file-sd'
file_sd_configs:
- files: ['/etc/prometheus/targets/*.json']
# 文件格式
[
{
"targets": ["10.0.0.3:8080"],
"labels": { "service": "api", "region": "us-west" }
}
]
3.4 DNS服务发现
动态DNS记录:通过SRV或A记录解析目标地址。
scrape_configs:
- job_name: 'dns-sd'
dns_sd_configs:
- names: ['_prometheus._tcp.example.com']
type: SRV
port: 9100
3.5 抓取参数
metrics_path
: 指标路径(默认/metrics
)scheme
: 协议(http
或https
)basic_auth
: 基础认证tls_config
: TLS 证书配置
4 告警配置
4.1 告警规则文件
rule_files:
- "rules/node_alerts.yml" # 告警规则文件路径
- "rules/custom_*.yml" # 支持通配符
4.2 Alertmanager配置
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"] # Alertmanager 地址
# 配置请求超时和 TLS
timeout: 10s
scheme: http
5 存储与远程读写
5.1 远程写入
remote_write:
- url: "http://thanos-receive:19291/api/v1/receive"
queue_config:
max_samples_per_send: 1000 # 每批发送最大样本数
capacity: 10000 # 队列容量
write_relabel_configs: # 过滤需写入的指标
- source_labels: [job]
regex: "node|kubelet"
action: keep
5.2 远程读取
remote_read:
- url: "http://thanos-query:10902/api/v1/read"
read_recent: true # 同时查询本地和远程数据
6 完整示例
global:
scrape_interval: 15s
evaluation_interval: 30s
external_labels:
cluster: "my-cluster"
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: "node_exporter"
static_configs:
- targets: ["node1:9100", "node2:9100"]
relabel_configs:
- source_labels: [__address__]
target_label: instance
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
rule_files:
- "/etc/prometheus/rules/*_alerts.yml"
remote_write:
- url: "http://thanos:10901/api/v1/receive"
7 alertmanager配置
Alertmanager 的配置是其告警处理的核心,定义了告警的路由、分组、抑制、通知方式等规则。
global: # 全局配置(所有接收器的默认设置)
route: # 告警路由的根节点
receivers: # 告警接收者定义(如邮件、Slack、Webhook)
inhibit_rules: # 告警抑制规则
templates: # 自定义通知模板文件路径
7.1 全局配置
global:
resolve_timeout: 5m # 告警恢复后持续通知的时间(防抖动)
smtp_smarthost: 'smtp.example.com:25' # SMTP服务器地址
smtp_from: 'alertmanager@example.com' # 发件人邮箱
smtp_auth_username: 'user'
smtp_auth_password: 'pass'
smtp_require_tls: true # 强制使用TLS
slack_api_url: 'https://hooks.slack.com/services/...' # Slack Webhook URL
http_config: # HTTP客户端配置(代理、TLS)
proxy_url: 'http://proxy:8080'
tls_config:
ca_file: '/path/to/ca.pem'
7.2 路由配置
该配置定义告警如何被分组、过滤和路由到接收器。路由树支持嵌套。
字段
说明
receiver
默认接收器名称(必须存在)。
group_by
分组依据的标签(如 [cluster, alertname]
)。
group_wait
初次发送告警前的等待时间(默认 30s
,收集同组告警)。
group_interval
相同组告警的间隔时间(默认 5m
)。
repeat_interval
重复发送未修复告警的间隔(默认 4h
)。
routes
子路由列表(支持嵌套匹配)。
match
/ match_re
标签精确匹配或正则匹配。
route:
receiver: 'default-email' # 默认接收器
group_by: [alertname, cluster]
group_wait: 30s
group_interval: 5m
repeat_interval: 12h
routes: # 子路由规则
- match:
severity: 'critical'
receiver: 'pagerduty-team'
continue: false # 匹配后停止后续路由
- match_re:
team: '^(frontend|backend)$'
receiver: 'slack-notify'
routes: # 嵌套子路由
- match:
environment: 'prod'
receiver: 'prod-slack'
7.3 接收器
定义告警通知的发送目标,每个接收器可配置多种通知方式(如同时发邮件和Slack)。
7.4 抑制规则
防止特定条件下重复发送告警(如网络故障时抑制服务不可达告警)。
# 抑制规则(减少冗余告警)
inhibit_rules:
# 规则1:当网络不可达时,抑制相关服务告警
- source_match:
alertname: NetworkDown # 源告警名称
severity: critical # 源告警级别
target_match:
severity: warning # 被抑制的目标告警级别
equal: ['cluster'] # 要求cluster标签值相同才抑制
# 规则2:主机宕机时抑制其上的所有服务告警
- source_match:
alertname: HostDown
target_match_re:
instance: '^.*$' # 匹配所有实例
equal: ['instance'] # 抑制相同实例的其他告警
7.5 自定义模板
通过 Go 模板引擎定制通知内容格式,需指定模板文件路径。
定义模板文件
{{ define "email.custom.html" }}
<h2>告警列表({{ len .Alerts }}条)</h2>
{{ range .Alerts }}
<p><strong>告警名称</strong>: {{ .Labels.alertname }}</p>
<p><strong>主机</strong>: {{ .Labels.instance }}</p>
<p><strong>时间</strong>: {{ .StartsAt.Format "2006-01-02 15:04:05" }}</p>
<hr>
{{ end }}
{{ end }}
配置文件引用模板
templates:
- '/etc/alertmanager/templates/*.tmpl'
7.6 完整示例
# alertmanager.yml
# 全局配置(所有接收器的默认设置)
global:
# 告警恢复后持续发送通知的时间(防止短暂恢复后再次触发)
resolve_timeout: 5m
# SMTP服务器配置(会被接收器中的email_configs覆盖)
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alertmanager@example.com'
smtp_auth_username: 'admin@example.com'
smtp_auth_password: 'password123'
smtp_require_tls: true # 强制使用TLS加密
# Slack Webhook URL(会被接收器中的slack_configs覆盖)
slack_api_url: 'https://hooks.slack.com/services/TXXXXXX/BXXXXXX/XXXXXX'
# 告警路由树的根节点配置
route:
# 默认接收器(必须与receivers中的某个name对应)
receiver: 'default-email'
# 分组依据的标签,相同标签值的告警会被合并
group_by: ['alertname', 'cluster', 'service']
# 初次发送告警前的等待时间(等待30秒以收集同组告警)
group_wait: 30s
# 同一组告警下次发送的时间间隔(若未修复,每5分钟发送一次)
group_interval: 5m
# 重复发送未修复告警的间隔(每3小时重复提醒)
repeat_interval: 3h
# 子路由规则(按顺序匹配)
routes:
# 路由1:严重级别为critical的告警发送到pagerduty
- match:
severity: critical
receiver: 'pagerduty-team'
# 是否继续匹配后续路由(false表示匹配到此终止)
continue: false
# 路由2:服务名为web或db的告警发送到Slack
- match_re:
service: ^(web|db)$
receiver: 'slack-notify'
# 子路由:生产环境的告警单独路由到另一个Slack频道
routes:
- match:
environment: prod
receiver: 'prod-slack'
# 接收器列表(定义告警通知发送到哪里)
receivers:
# 接收器1:默认邮件通知
- name: 'default-email'
email_configs:
- to: 'admin@example.com' # 收件人
send_resolved: true # 发送恢复通知
# 自定义邮件主题
headers:
Subject: '[ALERT] {{ .CommonLabels.severity }}: {{ .CommonLabels.alertname }}'
# 接收器2:PagerDuty通知
- name: 'pagerduty-team'
pagerduty_configs:
- service_key: 'pd_api_key_123' # PagerDuty集成的API密钥
severity: 'critical' # 设置事件严重级别
# 自定义事件详情
details:
firing: '{{ .Alerts | len }}个告警触发'
summary: '{{ .CommonAnnotations.summary }}'
# 接收器3:Slack通知(非生产环境)
- name: 'slack-notify'
slack_configs:
- channel: '#alerts' # Slack频道
title: '{{ .CommonLabels.alertname }}' # 消息标题
# 消息正文(使用模板语法)
text: |-
*描述*: {{ .CommonAnnotations.description }}
*环境*: {{ .CommonLabels.environment }}
*详情链接*: <{{ .GeneratorURL }}|查看>
send_resolved: true # 发送恢复通知
# 自定义颜色(warning: 黄色, critical: 红色)
color: '{{ if eq .CommonLabels.severity "critical" }}danger{{ else }}warning{{ end }}'
# 接收器4:生产环境专用Slack频道
- name: 'prod-slack'
slack_configs:
- channel: '#prod-alerts'
title: '生产告警: {{ .CommonLabels.alertname }}'
# 抑制规则(减少冗余告警)
inhibit_rules:
# 规则1:当网络不可达时,抑制相关服务告警
- source_match:
alertname: NetworkDown # 源告警名称
severity: critical # 源告警级别
target_match:
severity: warning # 被抑制的目标告警级别
equal: ['cluster'] # 要求cluster标签值相同才抑制
# 规则2:主机宕机时抑制其上的所有服务告警
- source_match:
alertname: HostDown
target_match_re:
instance: '^.*$' # 匹配所有实例
equal: ['instance'] # 抑制相同实例的其他告警
# 自定义模板文件路径(可选)
templates:
- '/etc/alertmanager/templates/*.tmpl'
最后更新于