Article

时间序列数据库PrometheusDB

更新于:2026-07-16

第一章:Prometheus 基础入门

1.1 什么是 Prometheus

概念名称说明注意事项
Prometheus开源的系统监控与告警工具包,专为时序数据设计,由 SoundCloud 开发,现为 CNCF 毕业项目不适用于日志存储或事件溯源,专注指标监控
时序数据库(TSDB)存储带时间戳的数值型指标数据,如 CPU 使用率、请求延迟等Prometheus 内置 TSDB,自 v2.0 起取代 LevelDB
拉模型(Pull-based)Prometheus 主动从目标服务拉取指标,而非接收推送需确保网络可达;不适合 NAT/防火墙后不可达的服务
多维数据模型指标由名称 + 键值对标签(labels)唯一标识,支持灵活查询标签过多会导致高基数问题,影响性能
PromQLPrometheus 自有的查询语言,支持聚合、函数、范围查询等语法与其他 SQL 类语言不同,需专门学习

1.2 Prometheus 架构组成

组件名称说明注意事项
Prometheus Server核心服务,负责抓取、存储、查询时序数据单机部署,无内置集群模式(需 Thanos/Cortex 扩展)
Exporter暴露第三方系统指标的中间代理,如 Node Exporter、MySQL Exporter每个被监控系统通常需对应一个 Exporter
Pushgateway允许短期作业(batch job)推送指标,供 Prometheus 拉取不用于长期运行服务,避免指标陈旧
Alertmanager处理 Prometheus 发送的告警,支持分组、抑制、多通道通知需独立部署,与 Prometheus 解耦
Client Libraries用于在应用代码中埋点暴露指标(如 Go、Java、Python 等)应用需开启 HTTP /metrics 端点
Service Discovery自动发现监控目标,支持 Kubernetes、Consul、文件等减少手动维护 targets 的成本

1.3 安装与启动 Prometheus

步骤名称操作细节注意事项
下载二进制包访问 https://prometheus.io/download/,选择对应 OS 架构版本(如 linux-amd64)生产环境建议使用稳定版(Stable)而非 nightly
解压安装包tar -xvzf prometheus-.tar.gz && cd prometheus-解压后包含 prometheus 可执行文件和默认配置
创建配置目录mkdir -p /etc/prometheus && cp prometheus.yml /etc/prometheus/配置文件路径可自定义,但需在启动时指定
启动 Prometheus./prometheus --config.file=/etc/prometheus/prometheus.yml --web.listen-address=":9090"默认监听 9090 端口;首次启动会创建 data 目录
验证服务浏览器访问 http://localhost:9090,查看 Status > Targets若无法访问,检查防火墙或绑定地址是否为 0.0.0.0
设置系统服务(可选)编写 systemd unit 文件(如 /etc/systemd/system/prometheus.service)并启用确保用户权限正确,data 目录可写

1.4 配置文件 prometheus.yml 初探

配置项语法示例用途注意事项
globalglobal: scrape_interval: 15s evaluation_interval: 15s设置全局抓取与规则评估间隔默认 scrape_interval 为 1m,可按需调小(增加负载)
scrape_configsscrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090']定义监控任务及目标job_name 必须唯一;targets 为 [host:port] 列表
metrics_pathmetrics_path: /metrics指定指标暴露的 HTTP 路径默认为 /metrics,部分 Exporter 可能不同
schemescheme: http指定协议(http/https)使用 https 时需配置 TLS 证书(高级配置)
static_configsstatic_configs: - targets: ['192.168.1.10:9100'] labels: env: prod静态指定监控目标及附加标签labels 可用于 PromQL 过滤,如 env=“prod”
external_labelsexternal_labels: cluster: 'us-east'为所有时间序列添加全局标签常用于多集群联邦场景

1.5 使用 Node Exporter 采集主机指标

步骤名称操作细节注意事项
下载 Node Exporterwget https://github.com/prometheus/node_exporter/releases/download/v1.8.0/node_exporter-1.8.0.linux-amd64.tar.gz版本需与 Prometheus 兼容(通常向后兼容)
解压并启动tar -xzf node_exporter-.tar.gz cd node_exporter- ./node_exporter &默认监听 9100 端口,暴露 /metrics
验证指标端点curl http://localhost:9100/metrics应返回大量以 node_ 开头的指标,如 node_cpu_seconds_total
配置 Prometheus 抓取在 prometheus.yml 的 scrape_configs 中添加:- job_name: 'node' static_configs: - targets: ['localhost:9100']确保 Prometheus 能访问该 IP:PORT
重启 Prometheuskill -HUPsystemctl restart prometheus无需停机,支持热重载配置(需启用 —web.enable-lifecycle)
查看指标在 Prometheus Web UI 查询 node_memory_MemAvailable_bytes指标命名遵循规范,单位通常为 bytes/seconds

1.6 Prometheus Web UI 与基本查询

功能名称操作细节注意事项
访问 Web UI浏览器打开 http://<IP>:9090首页为 Graph 查询界面
表达式浏览器在输入框输入指标名(如 up),点击 Executeup==1 表示目标健康,up==0 表示宕机
图形展示点击 Graph 标签页,自动绘制时间序列图时间范围可通过右上角调整
自动补全输入部分指标名,按 Tab 或等待下拉提示支持标签名和值的自动提示
查看目标状态Status > Targets显示所有 job 的抓取状态、错误信息
查看配置Status > Configuration实时显示当前生效的配置(含默认值)
基本查询示例node_cpu_seconds_total{mode="idle"}使用花括号 {} 进行标签过滤
时间范围查询node_cpu_seconds_total[5m]方括号表示过去 5 分钟的范围向量(仅用于函数)

第二章:PromQL 查询语言详解

2.1 时间序列数据模型

概念名称说明注意事项
时间序列(Time Series)由指标名称 + 唯一标签集 + 时间戳 + 浮点值组成的数据流标签组合必须唯一,否则视为不同时间序列
指标名称(Metric Name)描述被监控对象的语义,如 http_requests_total必须以字母或下划线开头,仅含 [a-zA-Z0-9_:]
标签(Labels)键值对,用于区分同一指标的不同维度,如 method=“POST”, status=“200”避免高基数标签(如 user_id),会导致内存爆炸
样本(Sample)单个时间点的数值记录,格式为 {timestamp => value}Prometheus 每次抓取生成一个样本
内置标签__name__ 表示指标名;jobinstance 由 scrape_configs 自动添加__name__ 可用于 PromQL 过滤,但通常不显式使用
高基数问题当标签组合过多(如百万级),导致 TSDB 索引膨胀、查询变慢应通过 relabeling 或应用层聚合控制基数

2.2 基本查询语法与标签过滤

方法/操作名称语法用途代码示例注意事项
即时向量查询metric_name返回当前所有匹配的时间序列最新值up若无结果,返回空
标签等值过滤metric{label="value"}筛选特定标签值的序列node_cpu_seconds_total{mode="idle"}字符串需用双引号
标签正则匹配metric{label=~"regex"}匹配符合正则的标签值http_requests_total{handler=~"/api/.*"}使用 =~(匹配)或 !~(不匹配)
多标签组合metric{l1="v1", l2!="v2"}同时满足多个条件up{job="node", instance!="10.0.0.1:9100"}逗号表示 AND 逻辑
返回所有序列{__name__=~"node_.*"}通过指标名正则匹配{__name__=~"node_disk.*"}适用于探索未知指标
数值比较过滤metric > 0.5过滤值大于阈值的序列node_load1 > 2仅保留满足条件的序列,不改变值

2.3 范围查询与时间偏移

方法/操作名称语法用途代码示例注意事项
范围向量查询metric[duration]获取过去一段时间内的所有样本http_requests_total[5m]仅能用于函数输入,不能直接绘图
时间偏移 offsetmetric offset duration查询历史时间点的数据node_memory_Free_bytes offset 1h可与范围向量结合:metric[5m] offset 1h
合法时间单位s(秒)、m(分)、h(小时)、d(天)、w(周)、y(年)表示时间长度30s, 5m, 2h不支持毫秒(ms)
范围查询限制最大查询窗口受 scrape_interval 和存储限制避免过大窗口导致 OOMhttp_requests_total[1d]默认最大查询时间通常为 5 分钟到数小时
offset 与函数结合rate(metric[5m] offset 1h)计算过去某时段的增长速率rate(node_network_receive_bytes_total[5m] offset 10m)常用于对比历史同期数据
子查询(Subquery)metric[1h:5m]每 5 分钟采样一次,持续 1 小时(高级用法)avg_over_time(http_requests_total[1h:5m])性能开销大,慎用

2.4 聚合操作(sum、avg、max 等)

聚合函数语法用途代码示例注意事项
sumsum(metric) by (label)对值求和,可按标签分组sum(node_memory_MemTotal_bytes) by (instance)默认丢弃非分组标签
avgavg(metric) by (label)计算平均值avg(rate(http_requests_total[5m])) by (handler)适用于 QPS、延迟等均值场景
max / minmax(metric) by (label)取最大/最小值max(node_filesystem_free_bytes) by (mountpoint)常用于资源水位监控
countcount(metric) by (label)统计序列数量count(up) by (job)可用于服务实例数统计
stdvar / stddevstddev(metric)计算标准差stddev(node_load1)衡量波动性
topk / bottomktopk(3, metric)取前/后 K 个最大/小值topk(5, rate(http_request_duration_seconds_sum[5m]))返回原始序列,含所有标签
withoutsum(metric) without (label)聚合时排除某些标签sum(http_requests_total) without (method)与 by 互斥,保留其余标签
group_left / group_right用于二元运算符的多对一匹配见 2.6 实战高级用法,需理解向量匹配规则

2.5 常用函数(rate、increase、delta 等)

函数名称语法用途代码示例注意事项
raterate(counter[window])计算每秒平均增长率(自动处理 counter 重置)rate(http_requests_total[5m])仅用于 Counter 类型;窗口应 ≥ 4×scrape_interval
irateirate(counter[window])计算最近两个点的瞬时增长率irate(node_cpu_seconds_total[5m])对短期波动敏感,不适合告警
increaseincrease(counter[window])计算窗口内总增量(= rate × window)increase(http_requests_total[1h])结果可能非整数(因插值)
deltadelta(gauge[window])计算 Gauge 类型在窗口内的变化量delta(node_memory_MemFree_bytes[10m])适用于温度、队列长度等
changeschanges(metric[window])统计窗口内值变化次数changes(up[1h])可检测服务重启次数
predict_linearpredict_linear(gauge[window], seconds)基于线性回归预测未来值predict_linear(node_memory_MemAvailable_bytes[1h], 3600)用于内存耗尽预警
histogram_quantilehistogram_quantile(φ, rate(bucket[window]))从直方图计算分位数(如 P99)histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))要求指标为 Histogram 类型,含 _bucket 后缀
clamp_min / clamp_maxclamp_max(metric, max_val)限制值上下界clamp_max(node_load1, 10)用于可视化平滑

2.6 PromQL 实战练习

场景名称查询表达式说明注意事项
服务可用性up == 0查找所有宕机目标可用于告警规则
CPU 使用率(非 idle)100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)计算各主机 CPU 使用百分比需排除 idle、iowait 等模式
内存使用率(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100计算内存使用百分比MemAvailable 比 MemFree 更准确
磁盘使用率100 - (node_filesystem_avail_bytes * 100 / node_filesystem_size_bytes)按挂载点计算磁盘使用率需过滤非磁盘文件系统(如 tmpfs)
HTTP 错误率sum(rate(http_requests_total{status=~"5.."}[5m])) by (handler) / sum(rate(http_requests_total[5m])) by (handler)计算各接口 5xx 错误率分母为零时返回 NaN
接口 P99 延迟histogram_quantile(0.99, sum by (le, handler) (rate(http_request_duration_seconds_bucket[5m])))计算各接口 99 分位延迟必须使用 sum 聚合 bucket
网络吞吐量rate(node_network_receive_bytes_total[5m]) * 8转换为 bps(比特每秒)乘以 8 得到比特;注意 interface 标签
告警触发测试vector(1)强制返回常量 1,用于测试告警在 Alertmanager 中可收到通知

第三章:监控目标与服务发现

3.1 静态配置 targets

配置项语法示例用途注意事项
job_namejob_name: 'my-app'定义一个监控任务的名称必须唯一,用于标识目标组
static_configsstatic_configs: - targets: ['10.0.0.10:8080', '10.0.0.11:8080'] labels: env: 'prod' team: 'backend'手动指定固定的目标列表及附加标签适用于少量、稳定不变的服务
targetstargets: ['host:port']列出所有待抓取的 HTTP 端点端口必须暴露 /metrics 接口
labelslabels: region: 'us-east' version: 'v2'为该组所有目标添加静态标签可用于 PromQL 过滤或聚合
metrics_pathmetrics_path: '/actuator/prometheus'指定非默认的指标路径Spring Boot 应用常用此路径
schemescheme: 'https'使用 HTTPS 协议拉取指标需配合 tls_config(高级配置)
scrape_intervalscrape_interval: 30s覆盖全局抓取间隔高频指标可设更短,但增加负载

3.2 基于文件的服务发现

步骤名称操作细节注意事项
创建目标文件编写 JSON 或 YAML 文件,如 targets.json:[{"targets": ["10.0.0.20:9100"], "labels": {"env": "staging"}}]文件格式必须为 JSON 数组,每个元素含 targets 和可选 labels
配置 file_sd_configsscrape_configs: - job_name: 'file-sd' file_sd_configs: - files: - '/etc/prometheus/targets/*.json' refresh_interval: 30s支持通配符;refresh_interval 控制重载频率
重载配置发送 SIGHUP 信号或调用 /-/reload(需启用 —web.enable-lifecycle)Prometheus 会自动监听文件变更
文件格式要求必须是 JSON/YAML 数组,每个对象含 targets(字符串数组)和 labels(键值对)错误格式会导致目标被忽略,无报错
权限与路径Prometheus 进程需有读取文件的权限建议将文件放在 /etc/prometheus/sd/ 下统一管理
动态更新优势无需修改主配置文件即可增删目标适合 CMDB 或脚本自动生成目标列表

3.3 Kubernetes 服务发现机制

发现类型配置示例用途注意事项
kubernetes_sd_configskubernetes_sd_configs: - role: pod api_server: https://k8s-api:6443 bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt自动发现 Pod、Service、Node 等资源需在集群内运行或配置 kubeconfig
role: noderole: node发现所有 Kubernetes 节点抓取地址为节点 IP + Node Exporter 端口
role: podrole: pod发现所有 Pod,自动提取 annotations 中的 prometheus.io/scrape 等需配合 relabeling 过滤
role: servicerole: service基于 Service 的 endpoints 发现目标适用于 headless service
role: endpointsrole: endpoints最常用,基于 Service 的 endpoints 列表每个 endpoint 对应一个 target
role: ingressrole: ingress发现 Ingress 资源较少用于指标抓取
常用 annotationsprometheus.io/scrape: "true" prometheus.io/port: "8080" prometheus.io/path: "/metrics"控制是否抓取及路径端口必须为字符串类型(YAML 中加引号)

3.4 其他服务发现方式(Consul、DNS 等)

服务发现类型配置示例用途注意事项
consul_sd_configsconsul_sd_configs: - server: 'consul.service.consul:8500' services: ['web', 'api']从 Consul 服务目录发现目标需 Consul ACL token(若启用)
dns_sd_configsdns_sd_configs: - names: ['_prometheus._tcp.example.com'] type: SRV port: 9090通过 DNS SRV 记录发现服务适用于传统微服务架构
ec2_sd_configsec2_sd_configs: - region: us-east-1 access_key: xxx secret_key: yyy port: 9100从 AWS EC2 实例标签发现目标需 IAM 权限;可用 instance role 替代密钥
azure_sd_configsazure_sd_configs: - subscription_id: xxx tenant_id: yyy client_id: zzz port: 9100发现 Azure VM需注册应用并授权
openstack_sd_configsopenstack_sd_configs: - identity_endpoint: https://openstack:5000/v3 username: admin password: xxx port: 9100用于 OpenStack 环境配置复杂,较少使用
通用限制大多数 SD 需要网络可达 + 认证凭证凭证建议通过文件或环境变量注入避免明文写入配置文件

3.5 relabel_configs 高级配置

配置字段语法示例用途注意事项
source_labelssource_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]指定输入标签可组合多个,如 [label1, label2]
separatorseparator: ';'多个 source_labels 的拼接分隔符默认为 ;
target_labeltarget_label: __tmp_scrape指定输出标签名常用于中间处理
regexregex: 'true'匹配 source_labels 拼接后的值支持正则捕获组
actionaction: keep动作类型:keep/drop/replace/labelmap/hashmodkeep/drop 用于过滤;replace 用于重写
replacementreplacement: $1替换模板,引用 regex 捕获组默认为 $1
modulusmodulus: 4用于 hashmod 动作,实现分片如将 targets 分配给 4 个 Prometheus 实例
keep 示例relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true仅保留 annotation 中 scrape=true 的 Pod最常用过滤方式
replace 示例relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port] target_label: __address__ regex: (.+) replacement: $1 action: replace将 annotation 中的 port 覆盖 address实际需结合原 IP 构造完整地址
drop 示例relabel_configs: - source_labels: [__meta_consul_tags] regex: .*dev.* action: drop排除含 “dev” 标签的 Consul 服务用于环境隔离
labelmap 示例relabel_configs: - regex: __meta_kubernetes_pod_label(.+) action: labelmap将 Pod 的所有 label 复制为普通标签便于 PromQL 直接使用业务标签

第四章:告警系统 Alertmanager

4.1 告警规则(alerting rules)编写

配置项语法示例用途注意事项
groupsgroups: - name: example 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: "High CPU usage on {{ $labels.instance }}"定义一组告警规则规则文件需通过 rule_files 引入 Prometheus
alertalert: HighMemoryUsage告警名称,唯一标识命名应清晰表达问题,如 DiskFull、APIErrorRateHigh
exprexpr: up == 0PromQL 表达式,结果为布尔向量表达式返回 true 的时间序列将触发告警
forfor: 10m持续满足条件多长时间才触发避免瞬时抖动误报;首次满足后开始计时
labelslabels: severity: critical team: infra附加标签,用于路由和抑制可覆盖目标原有标签
annotationsannotations: summary: "Instance {{ $labels.instance }} down" description: "{{ $labels.instance }} has been down for more than 5 minutes."提供可读性信息,用于通知模板支持模板变量(如 {{ $labels.instance }}
rule_files 引入rule_files: - "/etc/prometheus/rules/*.yml"在 prometheus.yml 中加载规则文件支持通配符;修改后需重载配置

4.2 Alertmanager 安装与配置

步骤名称操作细节注意事项
下载 Alertmanagerwget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz版本需与 Prometheus 兼容(通常宽松)
解压启动tar -xzf alertmanager-.tar.gz cd alertmanager- ./alertmanager --config.file=alertmanager.yml默认监听 9093 端口
配置 Prometheus 指向在 prometheus.yml 中添加:alerting: alertmanagers: - static_configs: - targets: ['localhost:9093']支持多个 Alertmanager 实例(高可用)
验证集成触发一条测试告警,查看 Alertmanager UI(http://<IP>:9093告警状态应为 “firing”
启用 API 生命周期启动时加 --web.enable-lifecycle,支持 /-/reload便于动态重载配置
systemd 服务(可选)创建 /etc/systemd/system/alertmanager.service,设置 User、ExecStart 等确保配置和数据目录权限正确

4.3 告警路由与分组策略

配置项语法示例用途注意事项
routeroute: receiver: 'default' group_by: ['alertname', 'cluster'] group_wait: 30s group_interval: 5m repeat_interval: 3h根路由,定义默认行为所有告警从此进入
receiverreceiver: 'slack-critical'指定通知接收器必须在 receivers 列表中定义
group_bygroup_by: ['team', 'severity']将相同标签值的告警合并为一组减少通知噪音;避免过度分组
group_waitgroup_wait: 30s新组创建后等待多久再发送首条通知用于收集同批告警
group_intervalgroup_interval: 5m同一组内新告警的最小发送间隔防止频繁更新通知
repeat_intervalrepeat_interval: 4h重复发送未解决告警的间隔不适用于已通知过的静默告警
match / match_rematch: severity: critical match_re: service: ^(api|db)$子路由匹配条件使用正则匹配服务名
continuecontinue: true匹配后是否继续尝试后续子路由默认 false,匹配即终止

4.4 抑制与静默机制

机制类型配置示例用途注意事项
inhibit_rulesinhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['instance']当存在 critical 告警时,抑制同一 instance 的 warning 告警避免告警风暴
source_matchsource_match: alertname: HostDown触发抑制的”源”告警条件必须处于 firing 状态
target_matchtarget_match: alertname: DiskFull被抑制的”目标”告警条件仅当 source 存在时才抑制
equalequal: ['instance', 'job']要求源和目标在这些标签上值相等是抑制生效的关键条件
静默(Silence)通过 Alertmanager Web UI 或 API 创建临时屏蔽特定告警(如维护期间)基于标签匹配,非规则级
静默匹配字段matcher: - name: instance value: 10.0.0.10:9100 isRegex: false定义静默范围支持正则(isRegex: true)
静默有效期startsAt: "2026-02-02T22:00:00Z" endsAt: "2026-02-02T23:00:00Z"设置静默时间窗口过期后自动恢复告警

4.5 通知渠道集成(Email、Slack、Webhook)

通知类型配置示例用途注意事项
email_configsreceivers: - name: 'email-admin' email_configs: - to: 'admin@example.com' smarthost: 'smtp.example.com:587' auth_username: 'alertbot' auth_password: 'xxx'发送邮件告警需 SMTP 服务器支持;密码建议用 secret 文件
slack_configsslack_configs: - api_url: 'https://hooks.slack.com/services/XXX' channel: '#alerts' text: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}"发送 Slack 消息api_url 为 Incoming Webhook URL
webhook_configswebhook_configs: - url: 'http://pagerduty.example.com/alert' send_resolved: true调用自定义 HTTP 接收端请求体为 JSON,含 alerts 数组
send_resolvedsend_resolved: true是否发送”已恢复”通知默认 false;部分系统需显式开启
templatingtext: "{{ template \"custom.slack.text\" . }}"使用自定义模板模板文件需放在 --template.pattern 指定路径
通用字段headers: Authorization: 'Bearer xxx'为 webhook 添加请求头用于认证或标识来源
测试通知使用 amtool 工具:amtool alert add test_alert instance=localhost验证通知链路需配置 amtool 连接 Alertmanager

第五章:Exporter 与自定义指标

5.1 常见 Exporter 介绍(Node、Blackbox、cAdvisor 等)

Exporter 名称用途暴露指标示例注意事项
Node Exporter采集 Linux 主机硬件和 OS 指标(CPU、内存、磁盘、网络等)node_cpu_seconds_total, node_memory_MemAvailable_bytes默认端口 9100;需 root 或 CAP_NET_ADMIN 权限获取部分指标
Blackbox Exporter通过 ICMP、HTTP、TCP、DNS 等协议探测服务可用性probe_success, probe_duration_seconds用于黑盒监控;需配置 modules(如 http_2xx)
cAdvisor采集容器资源使用情况(CPU、内存、网络、文件系统)container_cpu_usage_seconds_total, container_memory_usage_bytes通常运行在每个 Kubernetes 节点;默认端口 8080/metrics
MySQL Exporter监控 MySQL 数据库性能与状态mysql_global_status_threads_connected, mysql_slave_status_seconds_behind_master需创建专用监控用户;支持自动发现数据库
Redis Exporter采集 Redis 实例指标redis_connected_clients, redis_used_memory支持哨兵和集群模式;可配置密码
JMX Exporter通过 Java JMX 暴露 JVM 和应用指标jvm_memory_bytes_used, tomcat_sessions_active_current以 Java agent 方式注入,无需修改应用代码
Windows Exporter采集 Windows 系统指标(类似 Node Exporter)windows_cpu_time_total, windows_logical_disk_free_bytes适用于 Windows Server 监控

5.2 自定义应用埋点(Client Libraries)

语言客户端库初始化方式暴露指标端点注意事项
Gogithub.com/prometheus/client_golanghttp.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":8080", nil)/metrics使用 promauto 或 prometheus.Register 注册自定义指标,自动注册默认指标(如 go_goroutines)
Javaio.prometheus:simpleclientnew HTTPServer(8080); 或集成 Spring Boot Actuator/actuator/prometheus(Spring Boot)需添加 micrometer-registry-prometheus 依赖
Pythonprometheus_clientstart_http_server(8080) app = make_wsgi_app() 或集成 Flask/FastAPI/metrics多线程环境下需使用 Gauge.set_function 或加锁
Node.jsprom-clientconst server = http.createServer(prometheusMetrics) server.listen(8080)/metrics内置 default metrics(如 process_cpu_user_seconds_total)
.NETprometheus-netapp.UseMetricServer(port: 8080); // ASP.NET Core/metrics支持 Kestrel、IIS;自动收集 GC、线程池等
Rustprometheuslet registry = Registry::new(); let server = HttpServer::new(registry);/metrics需手动注册指标到 registry

5.3 编写自定义 Exporter(Go/Python 示例)

语言指标类型代码示例说明注意事项
GoCounterpackage main import "github.com/prometheus/client_golang/prometheus" var reqCounter = prometheus.NewCounterVec(prometheus.CounterOpts{Name: "http_requests_total"}, []string{"method", "status"}) func init() { prometheus.MustRegister(reqCounter) } func handler(w http.ResponseWriter, r *http.Request) { reqCounter.WithLabelValues(r.Method, "200").Inc() }每次请求递增计数器必须调用 MustRegister 注册指标
GoGaugevar tempGauge = prometheus.NewGauge(prometheus.GaugeOpts{Name: "room_temperature_celsius"}) tempGauge.Set(23.5)设置当前温度值可随时 Set、Inc、Dec
PythonCounterfrom prometheus_client import Counter REQUESTS = Counter('http_requests_total', 'Total HTTP Requests', ['method', 'status']) def handle_request(): REQUESTS.labels(method='GET', status='200').inc()标签需在初始化时声明多进程需使用 MultiProcessCollector
PythonHistogramfrom prometheus_client import Histogram REQ_DURATION = Histogram('http_request_duration_seconds', 'Request duration') @REQ_DURATION.time() def slow_function(): time.sleep(0.1)自动记录函数执行时间默认 buckets 为 [0.005, 0.01, …, 10]
GoSummaryvar latencySummary = prometheus.NewSummary(prometheus.SummaryOpts{Name: "api_latency_seconds"}) latencySummary.Observe(0.123)记录分位数(P50/P90/P99)不支持聚合,跨实例需用 Histogram
PythonGauge(动态)from prometheus_client import Gauge DISK_USAGE = Gauge('disk_usage_percent', 'Disk usage %') def update_disk(): DISK_USAGE.set(get_disk_percent())定期更新外部系统状态可配合后台线程定时刷新

5.4 指标类型(Counter、Gauge、Histogram、Summary)

指标类型说明适用场景注意事项
Counter单调递增的计数器,仅支持 Inc() 或 Add()请求总数、错误次数、任务完成数重启后归零;必须用 rate()/increase() 分析
Gauge可任意增减的数值,表示瞬时状态温度、内存使用量、队列长度可直接查询当前值;适合波动性指标
Histogram将观测值分桶统计,并提供 _count_sum_bucket 指标请求延迟、响应大小自动计算分位数需 histogram_quantile();桶边界可配置
Summary直接计算并暴露分位数(如 P90)、总和、计数高精度分位数需求(单机)不支持跨实例聚合;生产环境优先用 Histogram
Histogram vs SummaryHistogram 在服务端聚合,Summary 在客户端计算多副本服务用 Histogram;单机高精度用 SummaryPrometheus 官方推荐 Histogram
默认 bucketsHistogram 默认桶:[0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]适用于秒级延迟可通过 Buckets 参数自定义(如毫秒级)
标记规范指标名应清晰表达单位和语义,如 http_request_duration_seconds避免歧义单位建议用基本单位(seconds, bytes),非 milliseconds

第六章:可视化与 Grafana 集成

6.1 Grafana 安装与配置

步骤名称操作细节注意事项
下载安装包访问 https://grafana.com/grafana/download,选择对应平台(如 Linux x64 RPM/DEB 或二进制包)生产环境建议使用官方仓库(APT/YUM)便于升级
安装(Debian/Ubuntu)sudo apt-get install -y adduser libfontconfig1 musl wget https://dl.grafana.com/oss/release/grafana_10.3.3_amd64.deb sudo dpkg -i grafana_10.3.3_amd64.deb首次安装会创建 grafana 用户和 systemd 服务
安装(RHEL/CentOS)sudo yum install -y https://dl.grafana.com/oss/release/grafana-10.3.3-1.x86_64.rpm依赖 fontconfig 和 freetype
启动服务sudo systemctl start grafana-server sudo systemctl enable grafana-server默认监听 3000 端口
验证访问浏览器打开 http://<IP>:3000,初始账号 admin/admin首次登录强制修改密码
配置文件位置/etc/grafana/grafana.ini修改后需重启服务(部分支持热重载)
数据存储SQLite(默认)、MySQL、PostgreSQL生产环境建议外接数据库;仪表盘可导出为 JSON

6.2 添加 Prometheus 数据源

配置项操作细节注意事项
进入数据源页面登录 Grafana → Configuration(齿轮图标)→ Data Sources → Add data source支持多种数据源(Loki、InfluxDB 等)
选择类型选择 “Prometheus”官方原生支持,无需插件
URL 填写URL: http://prometheus-host:9090必须是 Grafana 服务器可访问的地址(非 localhost 若跨主机)
Access 方式Server (default)推荐 Server 模式(由 Grafana 后端代理请求)
认证(可选)若 Prometheus 启用 Basic Auth 或 Bearer Token,填写对应字段密钥建议使用 Grafana 的 secure json data 存储
保存测试点击 “Save & test”成功提示 “Data source is working”
多数据源可添加多个 Prometheus 实例(如 dev/staging/prod)查询时通过数据源下拉框切换

6.3 创建仪表盘与面板

操作名称操作细节注意事项
新建仪表盘Home → Create → Dashboard → Add new panel初始为空白仪表盘
选择数据源在 Query 编辑区顶部选择已配置的 Prometheus 数据源若未显示,检查数据源状态
编写 PromQL在 A 行输入:rate(http_requests_total[5m])支持自动补全和语法高亮
选择可视化类型右侧 Options → Visualization → Graph / Stat / Bar gauge 等Graph 用于趋势,Stat 用于单值
设置图例Legend format: {{ handler }} - {{ status }}使用标签变量动态生成图例
调整 Y 轴Axes → Unit(如 reqps、bytes、percent)提升可读性
保存仪表盘Apply → Save dashboard(命名如 “API Performance”)仪表盘 ID 自动生成,可导出 JSON 共享
导入模板Dashboards → Import → 输入 ID(如 1860 为 Node Exporter Full)社区提供大量现成模板(grafana.com/dashboards)

6.4 变量与模板使用

变量类型配置示例用途注意事项
Query 变量Name: job Type: Query Data source: Prometheus Query: label_values(up, job)动态获取 job 标签值列表可用于下拉筛选
Custom 变量Name: env Type: Custom Values: prod, staging, dev手动定义固定选项适用于环境切换
Interval 变量Name: interval Type: Interval Values: 30s, 1m, 5m控制查询窗口大小在 PromQL 中用 $interval
在 PromQL 中使用rate(http_requests_total{job=~"$job"}[$interval])实现动态过滤和参数化变量名前加 $,多选时自动转为 regex
All value 处理Include all option: true All value: .*支持”全选”语义需配合 =~ 使用
变量级联第二个变量 Query: label_values(http_requests_total{job="$job"}, handler)基于前一个变量结果过滤顺序很重要
模板通知在 Annotations 或 Dashboard description 中使用 $job动态展示上下文信息不适用于告警消息(Grafana 告警另配)

6.5 告警面板与联动

功能名称操作细节注意事项
面板内告警(旧版)Panel → Alert → Create Alert → 设置条件(如 avg() OF query(A, 5m, now) > 100Grafana 8+ 已弃用,改用统一告警规则
统一告警规则(推荐)Alerting → Alert rules → New alert rule → 关联查询基于 Grafana 托管的告警引擎(>=8.0)
条件设置Reduce operation: mean Threshold: 80支持多条件(AND/OR)
通知策略Assign to policy group → 选择 Contact point(如 Email、Slack)需预先配置 Contact points
联动 Prometheus 告警不直接联动;Grafana 告警独立于 Prometheus + Alertmanager可同时使用两套系统
Annotations 标记Dashboard settings → Annotations → Add annotation query:ALERTS{alertstate="firing"}在时间轴上显示 Prometheus 告警事件
告警状态可视化使用 Stat 面板 + Query: count(ALERTS{alertstate="firing"})实时显示当前 firing 告警数
静默与维护通过 Alertmanager UI 静默,Grafana Annotations 会同步消失Grafana 不管理 Prometheus 告警生命周期

第七章:持久化与高可用架构

7.1 Prometheus 本地存储机制

概念名称说明注意事项
内置 TSDB自 v2.0 起使用自研时序数据库(TSDB),取代 LevelDB高效压缩、支持 mmap、WAL 日志
数据目录默认为 ./data;可通过 --storage.tsdb.path 指定目录包含 chunks_head(内存映射)、wal(预写日志)、chunks(压缩块)
WAL(Write-Ahead Log)所有样本先写入 wal/ 目录,再批量刷入内存崩溃恢复依赖 WAL;不应手动删除
Block(数据块)每 2 小时生成一个不可变 block,含 index + chunks支持高效查询和后台压缩
Head Block当前活跃时间窗口的数据,驻留内存并定期 checkpoint查询最新数据需访问 Head
内存映射(mmap)chunks 文件通过 mmap 加载,减少内存拷贝大量时间序列会增加虚拟内存占用
限制单机设计,不支持横向扩展或集群不适用于超大规模(>10M series)场景

7.2 数据保留策略与压缩

配置项语法/启动参数用途注意事项
--storage.tsdb.retention.time--storage.tsdb.retention.time=15d设置数据保留时长(默认 15 天)支持 d/h/m/s 单位;旧于该时间的 block 被删除
--storage.tsdb.retention.size--storage.tsdb.retention.size=50GB按磁盘空间限制保留(实验性)需 Prometheus ≥ v2.30;与 time 互斥(取先触发者)
压缩(Compaction)自动后台执行,合并小 block 为大 block减少文件数量,提升查询效率可通过 --storage.tsdb.no-lock-file 禁用(不推荐)
降采样(Downsampling)本地 TSDB 不支持长期存储需 Thanos/Cortex 实现原始精度数据保留有限时间
查看当前使用prometheus_tsdb_storage_blocks_bytes监控磁盘使用结合 node_disk_usage 监控物理空间
手动清理删除 data/ 下过期 block 目录(危险!)仅在服务停止时操作推荐依赖自动 retention
WAL 回放时间启动时回放 WAL 可能耗时较长(GB 级)影响启动速度可通过 --storage.tsdb.wal-segment-size 调整段大小(高级)

7.3 Thanos 架构与长期存储

组件名称说明注意事项
Sidecar与 Prometheus 共部署,上传 block 到对象存储,并提供实时查询接口需启用 --web.enable-admin-api--web.enable-lifecycle
Store Gateway从对象存储(S3/GCS/Azure)加载历史 block,供 Query 查询无状态,可水平扩展
Query(Querier)聚合 Sidecar(实时) + Store(历史)数据,提供统一 PromQL 接口客户端(如 Grafana)指向 Query
Compactor对对象存储中的 block 执行降采样(5m/1h)和压缩降低长期查询成本
Ruler托管告警规则和记录规则,替代 Prometheus 规则评估支持跨集群规则
Bucket对象存储(如 AWS S3、MinIO)作为唯一持久化后端所有历史数据最终存于此
高可用查询多 Query 实例 + 负载均衡避免单点故障
优势无限存储、全局视图、降采样、多租户(逻辑隔离)运维复杂度高于单机 Prometheus

7.4 Cortex 简介与多租户支持

特性说明注意事项
架构模式微服务架构(Distributor, Ingester, Querier, Store 等)基于 Hashicorp Memberlist 或 Consul 发现
多租户通过 X-Scope-OrgID HTTP 头区分租户原生支持,适合 SaaS 场景
写入路径Client → Distributor → Ingester(内存)→ Flush to storageIngester 有副本(通常 3)
存储后端支持 Cassandra、DynamoDB、Bigtable、S3 等指标与索引可分离存储
水平扩展各组件独立扩缩容需 Kubernetes 或类似编排平台
与 Prometheus 集成Prometheus 配置 remote_write 指向 Cortex Distributor不再使用本地 TSDB(可关闭)
资源消耗内存密集型(Ingester 缓存热数据)需合理设置 chunk_age、retention
适用场景超大规模(百万级 series)、多团队共享、合规隔离运维复杂,适合平台团队

7.5 高可用部署方案(联邦、远程写入)

方案名称配置/架构说明用途注意事项
双 Prometheus + Alertmanager 集群部署两个相同配置的 Prometheus 实例,Alertmanager 去重避免单点故障需确保 scrape 配置一致;Alertmanager 配置 mesh_peer
联邦(Federation)上层 Prometheus 从下层抓取聚合指标:scrape_configs: - job_name: 'federate' honor_labels: true metrics_path: '/federate' params: 'match[]': ['{job=~"node.*"}']跨数据中心/团队聚合仅拉取部分指标,避免全量复制;增加查询延迟
远程写入(remote_write)在 prometheus.yml 中配置:remote_write: - url: "http://cortex-distributor:8080/api/v1/push" write_relabel_configs: - source_labels: [__name__] regex: 'expensive_metric' action: drop将数据复制到远程系统(Thanos/Cortex/M3)增加网络和 CPU 开销;支持队列和重试
远程读取(remote_read)remote_read: - url: "http://thanos-store:8080/read"查询外部存储的历史数据通常与 Thanos Query 配合,非直接使用
HAProxy 负载均衡前置 LB 轮询两个 Prometheus 实例客户端透明访问无法解决数据不一致问题(仅读高可用)
数据去重(Deduplication)Thanos Query 启用 --query.replica-label=prometheus_replica自动合并相同指标的不同副本需在 relabeling 中添加 replica 标签
成本 vs 可用性联邦适合只读聚合;远程写入适合全量备份;双实例适合简单 HA根据 SLA 选择避免过度设计;中小规模双实例 + Alertmanager HA 足够

第八章:Kubernetes 中的 Prometheus

8.1 kube-prometheus 项目介绍

项目组件说明注意事项
kube-prometheus基于 Prometheus Operator 的完整监控栈 Helm/Manifest 集合包含 Prometheus、Alertmanager、Grafana、Node Exporter、kube-state-metrics 等
Prometheus Operator核心控制器,通过 CRD(如 Prometheus、ServiceMonitor)管理 Prometheus 实例自动创建 StatefulSet、ConfigMap、Service 等
所含 ExporterNode Exporter(主机指标)、kube-state-metrics(K8s 对象状态)、blackbox-exporter(探测)默认已集成,无需手动部署
Grafana 预置仪表盘提供 Kubernetes / Nodes / Pods / Deployments 等官方模板通过 ConfigMap 注入,ID 如 315、6417
安装方式使用 jsonnet 生成 YAML 或直接应用 release manifests(如 github.com/prometheus-operator/kube-prometheus)推荐使用 stable release tag(如 v0.14.0)
命名空间默认部署在 monitoring 命名空间可通过 kustomize 修改
优势开箱即用、声明式配置、与 K8s 深度集成学习曲线略高于裸 Prometheus

8.2 监控 Pod、Node、Service

监控对象数据来源关键指标示例注意事项
NodeNode Exporter DaemonSetnode_cpu_seconds_total, node_memory_MemAvailable_bytes每个节点运行一个 Pod;需 hostNetwork 或 hostPort
PodcAdvisor(内置于 kubelet)container_cpu_usage_seconds_total, container_memory_working_set_bytes指标标签含 namespace、pod、container
Servicekube-state-metrics + Endpointskube_service_info, kube_endpoint_address_not_readyService 本身无指标,需监控其后端 Pod
kubeletkubelet /metrics/cadvisor 和 /metricskubelet_running_pod_count, rest_client_requests_total需配置 Prometheus 抓取 kubelet 10250 端口(认证)
API Serverkube-apiserver 指标端点apiserver_request_total, etcd_object_counts需 TLS 认证;通常由 control-plane 监控
IngressIngress Controller 暴露指标(如 Nginx Ingress)nginx_ingress_controller_requests, nginx_connections_active需启用 controller 的 metrics 端口

8.3 ServiceMonitor 与 PodMonitor

资源类型配置示例用途注意事项
ServiceMonitorapiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: my-app namespace: default spec: selector: matchLabels: app: my-app endpoints: - port: http-metrics interval: 30s声明式定义如何监控带有特定 label 的 ServicePrometheus Operator 自动发现并更新 scrape config
PodMonitorapiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: batch-job spec: selector: matchLabels: app: batch-worker podMetricsEndpoints: - port: metrics直接监控 Pod(无 Service 场景,如 Job)适用于短期任务或 headless 服务
selectormatchLabels: {app: web}匹配目标 Service/Pod 的标签必须与被监控对象标签一致
endpointsport: http-metrics path: /metrics scheme: http interval: 15s定义抓取端点参数port 必须在 Service 的 ports 中定义
namespaceSelectornamespaceSelector: matchNames: ["prod", "staging"]跨命名空间发现目标默认仅当前命名空间;any: true 表示所有
relabelingsrelabelings: - sourceLabels: [__meta_kubernetes_pod_label_team] targetLabel: team在抓取前重写标签语法同 Prometheus relabel_configs
targetLabelstargetLabels: ["team", "env"]将 Pod/Service 标签复制到时间序列简化 PromQL 过滤

8.4 RBAC 与安全配置

安全机制配置说明用途注意事项
ServiceAccountPrometheus Pod 使用专用 SA(如 prometheus-k8s)身份标识需绑定足够权限
ClusterRolerules: - apiGroups: [""] resources: ["nodes", "services", "endpoints"] verbs: ["get", "list", "watch"]授予访问 K8s API 的权限必须包含 nodes/services/endpoints/pods
ClusterRoleBinding将 ClusterRole 绑定到 Prometheus SA权限生效命名空间需匹配
kubelet 认证配置 Prometheus 使用 tokenFile:tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token抓取 kubelet /metrics需在 scrape config 中设置 bearer_token_file
TLS 配置tlsConfig: caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecureSkipVerify: false安全连接 API Server/kubelet不应跳过验证(insecureSkipVerify: true)
网络策略(NetworkPolicy)限制 Prometheus 仅能访问特定命名空间的 metrics 端点网络隔离需 CNI 支持
敏感信息保护使用 Secret 存储 remote_write 密钥、webhook token避免明文配置通过 volumeMount 挂载

8.5 自动发现与动态配置

发现机制实现方式说明注意事项
ServiceMonitor 自动发现Prometheus Operator 监听 ServiceMonitor CR 变更无需重启 Prometheus新增 SM 后数秒内生效
Pod 自动发现通过 PodMonitor 或 kube-state-metrics + relabeling动态跟踪新 PodJob/CronJob 需 PodMonitor
annotation 驱动Pod/Service 添加 prometheus.io/scrape: "true"传统方式(非 Operator)需配置 kubernetes_sd_configs + relabeling
动态标签注入应用 Deployment 添加 labels:labels: team: backend env: prod通过 targetLabels 自动传播到指标便于多维查询
配置热重载Prometheus Operator 更新 Secret(prometheus-)触发 Prometheus 重载依赖 --web.enable-lifecycle
多集群联邦上层 Prometheus 通过 federation 抓取各集群 Thanos Sidecar全局视图需网络打通和认证
自动扩缩容Prometheus StatefulSet 支持 PVC 扩容;Operator 不支持自动 scale存储扩容需手动内存/CPU 需预先规划

第九章:性能调优与最佳实践

9.1 采集频率与资源消耗平衡

配置项推荐值用途注意事项
global.scrape_interval15s ~ 60s控制默认抓取频率高频(<10s)显著增加 CPU/内存/网络负载
job 级 scrape_interval按需设置:关键服务:15s,批处理:60s+精细化控制不同目标的采集密度避免”一刀切”
evaluation_interval与 scrape_interval 一致或略大控制记录规则和告警评估频率过高导致规则引擎压力大
scrape_timeout通常为 scrape_interval 的 50%~80%单次抓取超时阈值默认 10s;慢 Exporter 需调大
样本数估算series × (3600 / scrape_interval) samples/hour预估存储与内存需求10万序列 @30s ≈ 12M samples/hour
动态调整策略对非关键指标使用 longer interval + recording rules 聚合减少原始样本量例如:每分钟聚合 QPS 再存储
资源监控指标prometheus_target_scrapes_sample_limit_reached_total prometheus_engine_query_duration_seconds观测抓取瓶颈若 sample_limit 被触发,需优化或扩容

9.2 查询优化技巧

优化方法示例说明注意事项
避免全量扫描使用标签过滤:http_requests_total{job="api"}缩小时间序列范围无标签过滤的查询极慢
限制结果集topk(10, rate(...))仅返回 Top N 结果防止 UI 渲染卡死
预聚合记录规则recording_rules: - record: job:http_requests:rate5m expr: sum by (job) (rate(http_requests_total[5m]))将高频计算转为低频存储查询时直接读聚合结果
避免嵌套范围查询❌ rate(rate(metric[5m])[1h])PromQL 不支持会报错或返回空
使用 avg_over_time 替代复杂函数avg_over_time(node_load1[5m])简单统计比自定义函数高效内置函数经高度优化
控制时间窗口查询窗口 ≤ 1h(除非必要)减少 I/O 和内存大窗口易触发 OOM
利用索引标签顺序影响性能(内部实现)高频过滤标签放前实际影响较小,但可作为习惯

9.3 避免高基数问题

问题来源风险解决方案注意事项
用户 ID / 请求 ID 作为标签基数爆炸(百万+ series)移除或聚合(如按 tenant_id)永远不要将唯一标识作为标签
HTTP 路径未规范化/user/123, /user/456 → 无数序列使用路径模板:/user/{id}应用层需暴露规范路径
动态生成的标签值如 version=git-commit-hash改为固定版本号或截断保留语义即可,无需完整 hash
未过滤的 kube-state-metrics所有 Pod/Service 全量采集通过 relabeling 丢弃无关对象例如:drop namespace=default
监控指标过多应用暴露上千指标使用 metric_relabel_configs 丢弃无用指标在 scrape_config 中配置
检测高基数查询:count by (__name__) ({__name__=~".+"})找出系列数最多的指标可结合 topk 使用
基数上限建议单 Prometheus 实例 ≤ 500 万时间序列超出需分片或 Thanos实际取决于硬件

9.4 内存与磁盘使用监控

监控指标PromQL 表达式用途注意事项
内存使用process_resident_memory_bytes观测 Prometheus 进程实际内存应 < 物理内存 70%
时间序列总数prometheus_tsdb_head_series当前活跃序列数持续增长可能预示高基数
WAL 文件大小prometheus_tsdb_wal_segment_current预写日志段编号突增可能因抓取失败堆积
磁盘使用prometheus_tsdb_storage_blocks_bytesTSDB 数据块总大小结合 node_filesystem_avail_bytes 监控
抓取延迟prometheus_target_interval_length_seconds{quantile="0.9"}90% 抓取是否按时完成> scrape_interval 表示过载
查询并发prometheus_engine_queries当前执行的查询数高并发可能阻塞写入
告警规则评估耗时prometheus_rule_group_last_duration_seconds规则是否超时> evaluation_interval 需优化
告警内存使用 > 80%、磁盘剩余 < 10%、series 数突增 50%提前预警资源瓶颈建议配置自动清理或扩容

9.5 生产环境部署 checklist

检查项验证方式说明注意事项
高可用部署至少 2 个 Prometheus 实例 + Alertmanager 集群避免单点故障实例配置需一致
数据持久化PVC 或本地 SSD 挂载到 /prometheus防止 Pod 重建丢数据不要用 emptyDir
资源限制设置 requests/limits(CPU 2+,内存 8GB+)防止 OOMKill根据 series 数调整
安全配置启用 RBAC、TLS、网络策略符合安全合规禁用 --web.enable-admin-api(生产)
告警覆盖包含:实例宕机、磁盘满、CPU 高、告警静默核心 SLO 监控使用 mixin 或 kube-prometheus 默认规则
远程备份配置 remote_write 到 Thanos/Cortex 或定期备份 data/防数据丢失对象存储更可靠
日志收集stdout 日志接入 Loki/ELK便于排障关注 error/warn 级别
版本管理使用固定版本 tag(非 latest)避免意外升级定期评估新版本特性
灾难恢复文档化恢复流程(如从对象存储还原)RTO/RPO 达标定期演练
监控自身Prometheus 被另一个 Prometheus 监控(federation)自监控闭环避免”盲区”

第十章:综合实战项目

10.1 设计企业级监控体系

组件设计要点用途注意事项
分层架构接入层(Exporter)→ 采集层(Prometheus)→ 存储层(Thanos/Cortex)→ 查询层(Grafana)职责分离,便于扩展避免单体部署
多集群支持每个 K8s 集群部署本地 Prometheus + Thanos Sidecar本地高可用 + 全局视图跨集群网络需打通
指标规范命名统一(如 app_http_requests_total)、标签标准化(env, team, region)提升可维护性制定团队指标治理文档
告警生命周期触发 → 路由 → 通知 → 静默 → 复盘闭环管理集成工单系统(如 Jira)
权限控制Grafana 组织/文件夹权限 + Alertmanager receiver 隔离多团队安全协作避免 prod 告警发给 dev 团队
成本优化热数据本地存储(15d),冷数据对象存储 + 降采样平衡性能与成本Thanos Compactor 自动处理
SLI/SLO 定义基于 RED(Rate, Errors, Duration)或 USE(Utilization, Saturation, Errors)模型量化服务质量与业务目标对齐

10.2 多环境(dev/staging/prod)监控隔离

隔离方式配置示例用途注意事项
标签隔离所有指标含 env="prod" 标签,通过 relabeling 注入单 Prometheus 实例多环境PromQL 过滤:{env="prod"}
独立 Prometheus 实例dev/staging/prod 各部署一套 Prometheus完全隔离,避免干扰运维成本高,适合强合规场景
Thanos 多租户使用 --query.replica-label=env 区分全局查询时可筛选需在抓取时注入 env 标签
Grafana 文件夹创建 Prod / Staging / Dev 文件夹,分配不同团队权限可视化隔离结合 LDAP/SSO 集成
Alertmanager 路由route: match: env: prod receiver: 'prod-pager' match: env: dev receiver: 'dev-slack'告警通道隔离避免测试告警打扰值班人员
网络隔离NetworkPolicy 限制 dev Prometheus 仅能访问 dev 命名空间安全边界需 CNI 支持
配置管理使用 Helm/Kustomize 模板,通过 values.yaml 切换环境参数一致性部署避免手动修改

10.3 告警分级与值班机制

告警级别特征通知方式注意事项
P0(紧急)核心服务宕机、支付失败率 > 5%电话 + 短信 + Slack + PagerDuty必须 5 分钟内响应
P1(高)API 错误率突增、CPU 持续 > 90%Slack + 邮件 + 企业微信30 分钟内响应
P2(中)磁盘使用 > 80%、非核心服务异常邮件 + 每日汇总4 小时内处理
P3(低)证书即将过期、建议优化项周报或工单系统无需即时响应
值班轮换集成 Opsgenie 或自建 on-call 表确保 7×24 覆盖在 Alertmanager receiver 中动态替换联系人
告警抑制inhibit_rules: - source_match: {severity: "critical"} target_match: {severity: "warning"} equal: [instance]避免风暴仅抑制同实例低优先级告警
静默审批通过内部平台申请静默,自动调用 Alertmanager API防止随意屏蔽记录静默原因和时间
告警疲劳治理定期 review firing 告警,关闭无效规则提升信噪比目标:MTTA < 10 分钟

10.4 故障复盘与指标回溯

操作步骤操作细节用途注意事项
时间锚定记录故障开始/结束时间(如 2026-02-02T20:15:00Z)精准回溯与日志时间戳对齐
关联指标查询查询相关指标在故障窗口的表现:rate(http_requests_total{status=~"5.."}[5m]) offset 1h对比历史同期使用 offset 发现异常模式
多维下钻按 handler、region、version 分组分析定位根因例如:仅 v2.1 出现错误
仪表盘快照Grafana → Share → Snapshot(保留 7 天)会议共享证据敏感数据需脱敏
告警历史Alertmanager UI 查看 firing/resolved 记录验证告警有效性检查是否漏报/误报
指标导出使用 Prometheus HTTP API 导出 CSV:GET /api/v1/query_range?query=...&start=...&end=...离线分析可导入 Excel 或 Python
复盘报告模板包含:现象、影响范围、根因、改进措施、Owner标准化流程示例:MTTR 从 60min → 15min
自动化归档脚本定期备份 /metrics 和 rules 到对象存储满足审计要求保留至少 1 年

10.5 与 CI/CD 和日志系统联动

联动系统集成方式用途注意事项
CI/CD(如 GitLab CI)部署后自动验证指标:新版本 QPS ≥ 旧版、错误率 < 0.1%防止劣化上线使用 promtool 或 curl 调用 PromQL API
日志系统(Loki/ELK)Grafana 同面板展示日志 + 指标快速关联上下文通过 trace_id 或 pod_name 关联
分布式追踪(Jaeger)在指标中注入 trace_id 标签从告警跳转到完整链路需应用埋点支持
自动扩缩容(HPA)K8s HPA 基于 custom.metrics.k8s.io(由 Prometheus Adapter 提供)弹性伸缩例如:CPU > 70% 时扩容
工单系统(Jira)Alertmanager webhook → 内部服务 → 创建 Jira ticket自动化跟踪包含告警摘要和链接
ChatOps(Slack)告警消息含 “Acknowledge” 按钮(通过 webhook 回调)快速响应需开发中间服务处理交互
发布标记(Annotation)CI 成功后调用 Grafana API 添加 annotation:POST /api/annotations { "dashboardId": 1, "text": "v2.1 deployed" }标记部署时间点便于对比发布前后指标
健康检查门禁Pre-prod 环境运行 smoke test,验证 /metrics 可达且关键指标正常阻断异常部署作为 CI 最后一步