Prometheus 与 Grafana 深度技术研究报告

摘要

本报告旨在为读者提供关于 Prometheus 和 Grafana 这两大云原生监控核心工具的全面技术分析。作为现代可观测性技术栈的基石,Prometheus 负责指标的收集、存储和告警,而 Grafana 则专注于数据可视化和仪表盘展示。本报告将从架构原理、核心组件、高可用部署、安全加固、告警体系等多个维度进行深入探讨,并结合 Kubernetes 环境下的实际部署场景,为生产环境实施提供详尽的最佳实践指导。


第一章:引言与背景

1.1 云原生监控的演进

在现代微服务架构和容器化技术的推动下,传统的监控系统已经难以满足动态、弹性、分布式环境下的可观测性需求。Prometheus 作为云原生计算基金会(CNCF)的毕业项目,已经成为 Kubernetes 环境中监控的事实标准。Grafana 则以其强大的可视化能力和多数据源支持,成为展示监控数据的首选平台。

Prometheus 的设计理念深受 Borgmon 启发,采用拉取模式的指标采集方式,配合多维数据模型和强大的查询语言 PromQL,为监控带来了全新的范式。Grafana 则通过插件化架构,支持从 Prometheus、InfluxDB、Elasticsearch 等多种数据源获取数据,并将其转化为直观的仪表盘和告警 [[1]][[2]][[3]]。

1.2 研究范围与目标

本报告将覆盖以下核心研究领域:

  • Prometheus 技术深度分析:包括数据模型、存储引擎、远程读写能力、查询优化
  • Grafana 架构与可视化能力:组件交互、插件生态、多实例支持
  • 高可用性与灾难恢复:Kubernetes 环境下的部署策略、Thanos 集成、数据持久化
  • 安全加固实践:TLS 加密、认证授权、RBAC 策略、密钥管理
  • 告警与通知体系:规则设计、Alertmanager 配置、多渠道通知集成

第二章:Prometheus 核心架构与技术深度解析

2.1 架构总览

Prometheus 采用模块化的架构设计,主要包含以下核心组件:

Prometheus Server 是整个系统的核心,负责指标的抓取、存储和查询。它由三个主要部分组成:Retrieval 负责从目标拉取指标数据;TSDB(Time Series Database)负责时序数据的本地存储;HTTP Server 提供 PromQL 查询接口和 Web UI [[4]][[5]][[6]]。

Exporters 是指标的暴露者,将应用程序或系统的内部状态转换为 Prometheus 可以抓取的格式。常见的 Exporter 包括 Node Exporter(主机指标)、kube-state-metrics(Kubernetes 状态指标)、MySQL Exporter 等。

Pushgateway 用于支持短期任务或无法被直接抓取的服务推送指标,但需要注意,Pushgateway 可能成为单点故障和潜在的资源瓶颈 [[7]]。

Alertmanager 处理来自 Prometheus Server 的告警,负责去重、分组、路由和通知发送。它支持多种通知渠道,包括邮件、Slack、PagerDuty 等 [[8]][[9]][[10]]。

2.2 数据模型与时序数据库

2.2.1 多维数据模型

Prometheus 采用多维数据模型,每个时序数据由指标名称和一组键值对(称为标签)唯一标识。这种设计允许用户通过 PromQL 对数据进行灵活的切片和聚合。

1
http_requests_total{method="GET", handler="/api/v1/users", status="200"}

上述示例中,http_requests_total 是指标名称,methodhandlerstatus 是标签,共同定义了一个唯一的时序数据流。

2.2.2 存储引擎演进

Prometheus 2.0 引入了全新的存储引擎,这是一个重大的架构变革。新存储引擎显著提升了性能,包括更快的启动时间、减少内存使用、提高查询性能和降低资源消耗 [[11]][[12]][[13]]。新存储引擎的设计理念包括:

分层存储结构:数据按时间窗口组织为”块”(Block),每个块包含该时间范围内的所有数据。这种设计使得数据压缩和过期清理更加高效。

内存映射文件:使用 mmap 将数据文件映射到内存空间,减少内存拷贝,提高查询效率。

预写日志(WAL):所有写入操作首先记录到 WAL,确保数据持久性和崩溃恢复能力 [[14]][[15]]。

Prometheus 2.0 版本的性能改进是革命性的,在 CPU 和磁盘空间使用率方面有显著降低,并能更好地适应动态环境 [[16]]。

2.3 远程读写能力深度解析

2.3.1 远程写入机制

远程写入允许 Prometheus 将收集到的指标数据异步发送到远程存储系统或其他系统 [[17]][[18]][[19]]。这一功能对于实现更好的可扩展性、持久性和数据存储外包至关重要 [[20]]。

配置结构

1
2
3
4
5
6
7
8
9
remote_write:
- url: "http://thanos-sidecar:10908/api/v1/receive"
queue_config:
max_samples_per_send: 1000
capacity: 2500
write_relabel_configs:
- source_labels: [__name__]
regex: 'go_.*'
action: drop

远程写入配置中的关键参数包括:

  • URL:远程存储端点的地址
  • Queue Config:控制发送队列行为,优化吞吐量和延迟
  • Write Relabel Configs:在发送前对指标进行重标记或过滤

性能考量:远程写入可能增加 Prometheus 的内存使用率 [[21]]。在 Prometheus 2.13.0 及后续版本中,针对读取 API 的资源瓶颈问题进行了修复,流式远程读 API 也得到了改进 [[22]][[23]]。多个版本(如 2.7.0, 2.33.0)对远程写入性能进行了优化,包括优化内存分配、处理积压、修复错误等 [[24]][[25]][[26]]。

2.3.2 远程读取机制

远程读取允许 Prometheus 从远程存储中查询原始指标 [[27]][[28]][[29]]。这使得 Prometheus 可以作为统一查询入口,同时访问本地和远程数据。

配置示例

1
2
3
4
5
remote_read:
- url: "http://thanos-query:19192/api/v1/read"
read_recent: true
required_matchers:
job: "critical-service"

远程读取支持 read_recent 参数,控制是否优先从远程存储读取最近的数据。这在数据迁移或联邦场景中非常有用。

2.4 PromQL 查询语言深度解析

PromQL(Prometheus Query Language)是 Prometheus 的核心查询语言,提供了强大的时序数据查询和聚合能力。

2.4.1 数据类型

PromQL 支持四种数据类型:

即时向量:返回一组时序数据,每个时序包含一个最新的样本值。

区间向量:返回一组时序数据,每个时序包含指定时间范围内的样本值。

标量:一个简单的数字值,如 102.5

字符串:字符串值,在查询中较少直接使用。

2.4.2 操作符与函数

PromQL 提供了丰富的操作符和函数:

二元操作符:支持算术(+、-、*、/、%)、比较(==、!=、>、<)、逻辑,如 sum()avg()max()min()count(),以及特殊的聚合操作符,如 topk()bottomk()

函数:包括 rate()(计算速率)、irate()(计算瞬时速率)、increase()(计算增长量)、histogram_quantile()(计算分位数)等。

查询性能优化:多个 Prometheus 版本持续改进 PromQL 查询性能,包括正则表达式匹配器性能提升 [[30]][[31]]。用户应避免在高基数标签上进行聚合,合理使用 recording rules 预计算常用查询。

2.5 服务发现机制

Prometheus 支持多种服务发现机制,能够动态发现监控目标:

Kubernetes 服务发现:自动发现 Kubernetes 集群中的 Pod、Service、Node、Endpoint 等资源。配置示例:

1
2
3
4
5
6
7
8
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true

其他服务发现:支持 Consul、Etcd、DNS SRV、EC2、Azure、GCE 等多种云平台和配置中心的服务发现。

2.6 版本演进与特性概览

虽然搜索结果中没有直接提及 Prometheus 2.50 版本的具体细节 [[32]][[33]]但 Prometheus 持续在每个版本中引入改进。以下是基于搜索结果整理的主要版本演进:

Prometheus 2.0.0:引入全新的存储引擎,实现重大性能突破,包括更快的启动时间、减少内存使用、提高查询性能 [[34]][[35]][[36]]。

Prometheus 2.5.0 - 2.6.0:持续的性能优化,包括 WAL 读取速度提升、内存使用减少 [[37]][[38]]。

Prometheus 2.13.0:修复读取 API 的资源瓶颈问题,引入流式远程读 API [[39]][[40]]。

Prometheus 2.17.0 - 2.20.0:远程写入性能改进、查询优化、新功能引入 [[41]][[42]]。

Prometheus 2.33.0:进一步的远程写入性能优化和正则表达式性能提升 [[43]]。

每个版本都在存储效率、查询性能、远程读写能力等方面持续改进,体现了 Prometheus 项目对生产环境稳定性和性能的持续关注。


第三章:Grafana 架构与可视化技术深度解析

3.1 Grafana 架构总览

Grafana 是一个跨平台的开源度量分析和可视化工具,能够将采集的数据可视化展示,并提供灵活的交互式可视化能力 [[44]][[45]]。作为前端应用,Grafana 主要用于数据源的交互和可视化后端 [[46]][[47]][[48]]。

3.1.1 核心组件架构

Grafana Server 是核心组件,处理用户认证、仪表盘创建、数据源交互、Web 界面和 API [[49]][[50]]。Server 组件采用 Go 语言编写,具有轻量、高性能的特点。

数据源层:Grafana 与各种数据源通信以获取数据,Prometheus 是 Grafana 的内置支持数据源之一 [[51]][[52]][[53]]。Grafana 支持多种数据源,包括 Prometheus、Graphite、InfluxDB、Elasticsearch 等 [[54]][[55]]。

仪表盘和面板系统:用户创建和自定义仪表盘来显示来自选定数据源的数据可视化 [[56]][[57]][[58]]。仪表盘由多个面板组成,每个面板是一个主要可视化元素,用于展示指标,每种面板类型有自己的查询编辑器 [[59]][[60]][[61]]。

查询编辑器:允许用户查询数据源中的指标,并对数据进行筛选和聚合 [[62]][[63]][[64]]。针对 Prometheus 数据源,Grafana 提供了专门的 PromQL 查询编辑器,支持语法高亮、自动补全、查询验证等功能。

插件架构:Grafana 支持插件架构,允许与多种数据源交互,无需创建数据副本 [[65]][[66]]。插件系统扩展了 Grafana 的能力,包括数据源插件、面板插件和应用插件。

3.2 与 Prometheus 的集成交互

3.2.1 集成架构流程

Grafana 与 Prometheus 的集成遵循清晰的架构流程:应用程序或导出器暴露指标,Prometheus 按照特定时间间隔抓取指标并存储在本地数据库,Grafana 通过 PromQL 查询 Prometheus 进行可视化 [[67]][[68]]。

数据格式对接:Prometheus 将指标以时间序列格式存储 [[69]][[70]]Grafana 通过 PromQL(Prometheus Query Language)查询这些指标 [[71]][[72]][[73]]。

多实例支持:Grafana 可以显示来自多个 Prometheus 实例的指标,并将其组合到一个仪表盘中 [[74]]。这一能力对于跨集群、跨数据中心的监控场景至关重要。

3.2.2 配置步骤详解

步骤一:部署 Grafana

在 Kubernetes 环境中,可以通过 Helm 安装 Grafana:

1
2
helm repo add grafana https://grafana.github.io/helm-charts
helm install grafana grafana/grafana --namespace monitoring

步骤二:连接 Prometheus 数据源

安装后,需要连接 Grafana 到 Prometheus 作为数据源 [[75]][[76]][[77]]。配置示例:

1
2
3
4
5
6
7
8
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus-server:9090
isDefault: true
editable: true

步骤三:创建和配置仪表板

Grafana 仪表板由面板组成,用户可以自定义仪表板,将原始指标数据转换为图表、热图等可视化形式 [[78]][[79]][[80]]。Grafana 提供了丰富的仪表板模板和预构建可视化 [[81]][[82]][[83]]。

3.3 Kubernetes 监控插件与面板类型

3.3.1 推荐插件

DevOpsProdigy KubeGraf:这是一个非常优秀的 Grafana Kubernetes 插件,用于可视化和分析 Kubernetes 集群的性能 [[84]][[85]][[86]]。它包括主要服务指标、特征、应用程序生命周期和错误日志。该插件是官方 Kubernetes 插件的升级版本,要求 Grafana 版本大于 5.0.0,并且依赖于 Grafana-piechart-panel 插件。

Kubernetes Monitoring:Grafana 提供了 “Kubernetes Monitoring” 解决方案,用于监控集群、性能和成本 [[87]]。这一解决方案提供了预构建的仪表板和告警规则。

Grafana Kubernetes Plugin:官方 Grafana Kubernetes 插件可以查看集群、节点、Pod 和容器的指标,如内存、CPU、磁盘容量和使用情况,并支持过滤和查找相关 Pod 指标 [[88]]。

Polystat Panel Plugin:Grafana Polystat 面板插件可以创建热图(六边形形式)来表示特定指标 [[89]],适合概览大量资源的状态。

3.3.2 面板类型选择

时间序列图:最常用的面板类型,适合展示指标随时间变化的趋势。

热图:适合展示分布数据,如请求延迟分布、资源使用分布。

仪表盘:适合展示单值指标,如当前 CPU 使用率、错误率。

饼图:适合展示比例数据,需要安装 piechart-panel 插件。

表格:适合展示结构化数据,支持排序、过滤和链接。

3.4 高可用性架构

在 Kubernetes 中实现高可用的 Grafana 架构需要考虑以下方面 [[90]]:

数据库支持:使用 MySQL 或 PostgreSQL 作为 Grafana 的后端数据库,支持高可用架构。配置示例:

1
2
3
4
5
6
[database]
type = mysql
host = mysql-primary:3306
name = grafana
user = grafana
password = ${GRAFANA_DB_PASSWORD}

配置持久化:通过配置 grafana.ini 确保高可用性,包括会话存储、仪表板存储等。

多副本部署:在 Kubernetes 中部署多个 Grafana 副本,配合负载均衡器实现高可用:

1
2
3
4
5
6
7
8
9
10
11
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
spec:
replicas: 2
selector:
matchLabels:
app: grafana
template:
# ... pod configuration

第四章:高可用性与灾难恢复架构

4.1 高可用性设计原则

在 Kubernetes 环境中实施 Prometheus 和 Grafana 的高可用性需要遵循以下原则 [[91]]:

高可用性设计:部署多个副本,消除单点故障。

自动扩展:利用 HPA(Horizontal Pod Autoscaler)和 ASG(Auto Scaling Group)实现资源弹性 [[92]]。

备份恢复:通过备份数据存储和定期测试确保恢复能力 [[93]]。

监控预警:建立全面的监控和告警体系,及时发现和处理问题 [[94]][[95]][[96]]。

4.2 Prometheus 高可用方案

4.2.1 基础高可用架构

最基本的 Prometheus 高可用方案是运行多个 Prometheus 实例,并使用负载均衡器和故障转移 [[97]]。但这种方案存在挑战:

  • 数据一致性问题
  • 配置同步复杂
  • 告警去重困难

4.2.2 Thanos 方案深度解析

Thanos 是一个开源项目,旨在解决 Prometheus 在大规模 Kubernetes 集群中的存储、查询和数据合并问题,提供高可用性、长期存储能力和全局查询视图 [[98]][[99]][[100]]。

Thanos 核心组件

Sidecar:作为 Prometheus 的 sidecar 进程运行,与 Prometheus 同一 Pod 中 [[101]][[102]][[103]]。它负责将 Prometheus 的数据备份到对象存储(如 S3),并提供 gRPC API 接口供 Thanos 其他组件访问 [[104]][[105]][[106]]。

Query(Querier):实现 Prometheus HTTP API,通过 Sidecar 或 Store Gateway 从多个数据源查询数据 [[107]][[108]]。

Store Gateway:从对象存储中提供历史数据查询 [[109]][[110]]。

Compactor:压缩对象存储中的数据,优化存储和查询性能 [[111]]。

Receiver:接收来自 Prometheus 的远程写入数据,并将其存储到对象存储中 [[112]][[113]]。

Thanos 架构优势

  • 长期存储:利用对象存储(如 S3)实现无限存储空间和长期保留指标 [[114]][[115]][[116]]。
  • 全局查询视图:支持跨多个 Prometheus 实例的查询,实现全局监控视图 [[117]][[118]]。
  • 高可用性:组件化设计实现灵活性和可扩展性 [[119]][[120]][[121]]。

4.3 Thanos 与 Prometheus 集成部署

4.3.1 Sidecar 部署模式

Thanos 可以无缝集成到现有的 Prometheus 部署中,通过与 Prometheus 共享同一主机或 Pod 的 Sidecar 进行集成 [[122]][[123]][[124]]。Prometheus 需要开启特定的 API 以允许 Thanos Sidecar 获取元数据和重新加载配置 [[125]]。

Prometheus 配置要求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: prometheus
spec:
template:
spec:
containers:
- name: prometheus
image: prom/prometheus:v2.x.x
args:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--storage.tsdb.retention.time=15d"
- "--web.enable-admin-api" # Thanos Sidecar 需要
- "--web.enable-lifecycle" # Thanos Sidecar 需要
- name: thanos-sidecar
image: thanosio/thanos:v0.x.x
args:
- "sidecar"
- "--tsdb.path=/prometheus"
- "--prometheus.url=http://localhost:9090"
- "--objstore.config-file=/etc/thanos/bucket-config.yaml"

对象存储配置

Thanos 需要配置对象存储(如 AWS S3)来存储长期数据 [[126]][[127]]。配置示例:

1
2
3
4
5
6
type: S3
config:
bucket: "thanos-bucket"
endpoint: "s3.amazonaws.com"
access_key: "${AWS_ACCESS_KEY_ID}"
secret_key: "${AWS_SECRET_ACCESS_KEY}"

4.3.2 远程写入集成

Prometheus 的 prometheus.yml 配置文件中需要添加 remote_write 部分,指向 Thanos Sidecar 或 Receiver 的地址 [[128]][[129]][[130]]:

1
2
3
4
5
remote_write:
- url: "http://thanos-sidecar:10908/api/v1/receive"
queue_config:
max_samples_per_send: 1000
capacity: 2500

Thanos Receiver 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: apps/v1
kind: Deployment
metadata:
name: thanos-receiver
spec:
template:
spec:
containers:
- name: thanos-receiver
image: thanosio/thanos:v0.x.x
args:
- "receive"
- "--tsdb.path=/thanos/receive"
- "--remote-write.address=0.0.0.0:10908"
- "--receive.local-endpoint=<receiver-endpoint>" # 避免错误
- "--objstore.config-file=/etc/thanos/bucket-config.yaml"

4.4 Kubernetes 环境高可用部署

4.4.1 部署架构

在 Kubernetes 集群中实现高可用 Prometheus 架构需要以下组件 [[131]]:

多副本部署:部署多个 Prometheus 副本确保系统的高可用性和容错能力 [[132]]。

数据持久化:使用 PV/PVC 和 SSD 存储确保数据持久化 [[133]]。

Thanos Query 高可用:部署多个 Thanos Query 实例,前端配置负载均衡。

对象存储:使用 S3 兼容存储作为长期存储后端。

4.4.2 Helm 部署方案

使用 Helm Chart 是部署 Prometheus-Thanos 高可用架构的推荐方式 [[134]][[135]][[136]]。

kube-prometheus-stack 配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# values.yaml
prometheus:
prometheusSpec:
replicas: 2
retention: "15d"
thanos:
baseImage: thanosio/thanos
version: v0.x.x
objectStorageConfig:
key: bucket-config.yaml
name: thanos-objectstorage
externalLabels:
cluster: "production"
replica: "$(POD_NAME)"
serviceMonitorSelector:
matchLabels:
release: prometheus

thanos:
query:
replicas: 2
stores:
- dnssrv+_grpc._tcp.prometheus-operated.monitoring.svc.cluster.local
- dnssrv+_grpc._tcp.thanos-store.monitoring.svc.cluster.local
storeGateway:
replicas: 1
compactor:
replicas: 1

安装命令

1
2
3
4
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
-f values.yaml

4.5 RBAC 权限配置

在 Kubernetes 环境中,Prometheus 和 Thanos 需要适当的 RBAC 权限 [[137]]。

Prometheus RBAC 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups: [""]
resources:
- nodes
- nodes/proxy
- nodes/metrics
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups: ["extensions", "networking.k8s.io"]
resources:
- ingresses
verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics", "/metrics/cadvisor"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus
namespace: monitoring

4.6 灾难恢复策略

4.6.1 数据备份策略

Prometheus 数据备份

  • 定期备份 Prometheus 数据目录(TSDB 数据)
  • 使用 Velero 等工具备份 PV 数据
  • 配置 Thanos 将数据备份到对象存储

Grafana 数据备份

  • 备份 Grafana 数据库(SQLite/MySQL/PostgreSQL)
  • 备份仪表板配置(导出 JSON)
  • 备份数据源配置和告警规则

4.6.2 恢复流程

灾难恢复测试:通过备份数据存储和定期测试确保恢复能力 [[138]]。

版本控制:将配置文件(Prometheus 规则、Grafana 仪表板)存储在 Git 中,实现 GitOps 管理 [[139]]。

多区域部署:考虑跨区域部署,实现地理冗余。


第五章:安全加固最佳实践

5.1 安全架构概述

在生产环境中保护 Prometheus 和 Grafana 需要多层次的安全措施 [[140]][[141]]。安全加固涵盖以下关键领域:

  • 传输层安全(TLS 加密)
  • 身份认证与授权
  • 基于角色的访问控制(RBAC)
  • 密钥管理
  • 网络隔离
  • 审计日志

5.2 TLS 加密配置

5.2.1 TLS 重要性

TLS 加密是保护监控数据和配置文件安全的关键措施 [[142]][[143]][[144]]。建议在生产环境中为所有组件启用 TLS 加密通信 [[145]][[146]]。

5.2.2 Prometheus TLS 配置

Prometheus 配置文件中可以配置 SSL/TLS 参数 [[147]][[148]]:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
global:
external_labels:
monitor: 'production'

tls_server_config:
cert_file: /etc/prometheus/ssl/cert.pem
key_file: /etc/prometheus/ssl/key.pem
client_ca_file: /etc/prometheus/ssl/ca.pem
client_auth_type: VerifyClientCertIfGiven

web:
tls_server_config:
cert_file: /etc/prometheus/ssl/cert.pem
key_file: /etc/prometheus/ssl/key.pem

5.2.3 Grafana TLS 配置

Grafana 可以通过配置文件或 ConfigMap 指定证书文件 [[149]]:

1
2
3
4
5
6
7
8
[server]
protocol = https
cert_file = /etc/grafana/ssl/cert.pem
cert_key = /etc/grafana/ssl/key.pem

[database]
# 数据库连接也可以使用 TLS
ssl_mode = require

5.2.4 反向代理方案

由于 Prometheus 和 Grafana 本身可能不直接内置 TLS 支持,可通过反向代理(如 Nginx、Traefik)来实现加密通信 [[150]][[151]][[152]]。

Nginx 反向代理配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
upstream prometheus {
server prometheus-server:9090;
}

server {
listen 443 ssl;
server_name prometheus.example.com;

ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;

location / {
proxy_pass http://prometheus;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

5.3 身份认证与授权

5.3.1 认证方法

Prometheus 和 Grafana 支持多种认证方式 [[153]][[154]]:

基本认证:用户名/密码认证,最简单的认证方式。

LDAP 集成:与企业目录服务集成,实现统一身份管理。

OAuth2/OIDC:支持 SAML、Okta OAuth2、GitHub OAuth2 等 [[155]]。

API 密钥:通过 API 密钥或环境变量注入敏感信息 [[156]]。

5.3.2 Grafana 认证配置

Grafana 支持配置 SAML、Okta OAuth2、GitHub OAuth2、数据库加密、数据库密钥加密(使用 HashiCorp Vault、AWS KMS、Azure Key Vault)以及与 HashiCorp Vault 集成 [[157]]。

OAuth2 配置示例

1
2
3
4
5
6
7
8
9
10
11
12
[auth.generic_oauth]
enabled = true
name = OAuth
allow_sign_up = true
client_id = ${OAUTH_CLIENT_ID}
client_secret = ${OAUTH_CLIENT_SECRET}
scopes = openid email profile
auth_url = https://oauth-provider.com/oauth2/v1/authorize
token_url = https://oauth-provider.com/oauth2/v1/token
api_url = https://oauth-provider.com/oauth2/v1/userinfo
team_ids =
allowed_organizations =

LDAP 配置示例

1
2
3
4
[auth.ldap]
enabled = true
config_file = /etc/grafana/ldap.toml
allow_sign_up = true

5.3.3 Prometheus 认证限制

需要注意的是,Prometheus 本身可能不直接提供多用户或登录支持 [[158]][[159]]。可以通过以下方式实现认证:

  • 使用反向代理添加认证层
  • 集成 SSO 或外部工具
  • 使用 OAuth 或 TLS 客户端证书进行身份验证 [[160]]

5.4 基于角色的访问控制(RBAC)

5.4.1 Kubernetes RBAC

在 Kubernetes 环境中,RBAC 是关键的安全功能,用于限制访问范围 [[161]][[162]][[163]]。通过配置服务账户、最小权限原则、Kubernetes Secrets 管理敏感信息 [[164]][[165]][[166]]。

Grafana RBAC 配置:Grafana 可配置用户和组权限以限制对仪表板的访问 [[167]][[168]]。

权限角色设计

1
2
3
# Viewer - 只读访问
# Editor - 可编辑仪表板
# Admin - 完全管理权限

5.4.2 最小权限原则

遵循最小权限原则配置 RBAC 权限 [[169]][[170]]:

1
2
3
4
5
6
7
8
9
10
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: prometheus-config-reader
namespace: monitoring
rules:
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["prometheus-config"]
verbs: ["get"]

5.5 密钥管理

5.5.1 敏感信息管理

安全管理敏感信息(如密码、API 密钥)至关重要 [[171]][[172]][[173]]。

Kubernetes Secrets:使用 Kubernetes Secrets 存储敏感信息 [[174]]:

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Secret
metadata:
name: grafana-admin-credentials
namespace: monitoring
type: Opaque
stringData:
admin-user: admin
admin-password: ${GRAFANA_ADMIN_PASSWORD}

环境变量注入:通过环境变量注入敏感信息 [[175]][[176]]。

5.5.2 HashiCorp Vault 集成

可以将数据库密钥加密存储到 HashiCorp Vault [[177]]。Vault Secrets Operator 用于在中央 HashiCorp Vault 和 Kubernetes 秘密存储之间同步密钥,并且可以使用 Prometheus Operator 和 Grafana 进行可观测性监控 [[178]]。

Vault 集成示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: grafana-secrets
spec:
refreshInterval: 1h
secretStoreRef:
name: vault-backend
kind: ClusterSecretStore
target:
name: grafana-secrets
data:
- secretKey: admin-password
remoteRef:
key: secret/grafana
property: admin-password

5.6 网络策略隔离

5.6.1 网络策略配置

实施网络策略和防火墙规则限制访问 [[179]][[180]]。创建网络策略控制 Prometheus 和 Grafana 的网络访问 [[181]]。

NetworkPolicy 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: prometheus-network-policy
namespace: monitoring
spec:
podSelector:
matchLabels:
app: prometheus
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: grafana
- podSelector:
matchLabels:
app: alertmanager
ports:
- protocol: TCP
port: 9090
egress:
- to:
- podSelector:
matchLabels:
app: kube-state-metrics
- podSelector:
matchLabels:
app: node-exporter
ports:
- protocol: TCP
port: 9100

5.6.2 其他安全措施

防火墙和 IP 限制:限制访问 IP 范围,限制 Prometheus 的暴露范围,使用 VPN 或私有网络 [[182]][[183]][[184]]。

端口转发和白名单:使用防火墙、端口转发、白名单控制访问 [[185]][[186]][[187]]。

WireGuard 安全连接:使用 WireGuard 等工具进行安全连接 [[188]]。

5.7 审计与合规

审计日志:定期审计用户操作日志 [[189]][[190]]。

配置备份:加密存储敏感信息,定期备份配置 [[191]][[192]]。

定期更新:定期更新软件版本以修复安全漏洞 [[193]][[194]]。

强密码策略:实施强密码策略,定期审查用户权限 [[195]]。


第六章:告警体系深度构建

6.1 告警架构概述

Prometheus 的告警体系由两部分组成:

Prometheus Server:负责定义告警规则,根据 PromQL 表达式评估告警条件,产生告警并发送到 Alertmanager。

Alertmanager:负责处理、分组、去重、路由和抑制告警,并管理通知渠道 [[196]][[197]][[198]]。

6.2 告警规则设计模式

6.2.1 告警规则配置

Prometheus 允许通过 PromQL 表达式定义告警条件 [[199]][[200]][[201]]。告警规则文件中可以定义告警名称、表达式、等待时间、标签、严重性、摘要和描述 [[202]][[203]][[204]]。

基础告警规则示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
groups:
- name: node_alerts
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 }}"
description: "CPU usage is above 80% (current: {{ $value }}%)"

- alert: MemoryUsageHigh
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage on {{ $labels.instance }}"
description: "Memory usage is above 85%"

6.2.2 高级告警规则模式

多条件告警:结合多个指标判断告警条件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- alert: HighErrorRate

expr: |

(
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
) > 0.05
and
sum(rate(http_requests_total[5m])) > 100
for: 5m
labels:
severity: critical
annotations:
summary: "High error rate detected"

description: "Error rate is {{ $value | humanizePercentage }}"

预测性告警:使用 predict_linear 函数预测资源使用趋势。

1
2
3
4
5
6
7
8
- alert: DiskSpacePredicted
expr: predict_linear(node_filesystem_free_bytes[1h], 4*3600) < 0
for: 5m
labels:
severity: warning
annotations:
summary: "Disk will be full in 4 hours"
description: "Disk {{ $labels.mountpoint }} will be full in approximately 4 hours"

分层告警:根据严重性级别定义不同的告警阈值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
groups:
- name: response_time_alerts
rules:
- alert: ResponseTimeSlow
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "95th percentile response time is slow"

- alert: ResponseTimeCritical
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 5
for: 2m
labels:
severity: critical
annotations:
summary: "95th percentile response time is critical"

6.3 Alertmanager 配置详解

6.3.1 核心功能

Alertmanager 支持:

  • 分组:将相似告警分组,避免通知风暴
  • 抑制:当某些告警触发时,抑制其他告警
  • 静默:临时静默特定告警
  • 路由:根据标签将告警路由到不同接收器
  • 去重:消除重复告警 [[205]][[206]][[207]]

6.3.2 配置示例

路由配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alertmanager@example.com'
smtp_auth_username: 'alertmanager'
smtp_auth_password: '${SMTP_PASSWORD}'

route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'default-receiver'
routes:
- match:
severity: critical
receiver: 'critical-receiver'
continue: false
- match:
severity: warning
receiver: 'warning-receiver'

receivers:
- name: 'default-receiver'
email_configs:
- to: 'team@example.com'
send_resolved: true

- name: 'critical-receiver'
pagerduty_configs:
- service_key: '${PAGERDUTY_KEY}'
severity: critical
slack_configs:
- api_url: '${SLACK_WEBHOOK_URL}'
channel: '#alerts-critical'

- name: 'warning-receiver'
slack_configs:
- api_url: '${SLACK_WEBHOOK_URL}'
channel: '#alerts-warning'

inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'cluster', 'service']

6.4 Grafana 告警集成

6.4.1 Grafana 与 Alertmanager 关系

Grafana 依赖 Alertmanager 处理告警,Grafana 本身不直接处理告警,而是通过 Alertmanager 进行告警管理 [[208]][[209]][[210]]。

Grafana 支持创建告警规则并定义通知方式,但核心告警逻辑由 Prometheus 和 Alertmanager 处理 [[211]]。

6.4.2 Webhook 集成

Alertmanager 可以通过 Webhook 将告警发送到外部系统 [[212]][[213]][[214]]。Grafana 也可以通过简单的 Webhook 将告警发送到 Alertmanager [[215]]。

Webhook 接收器配置

1
2
3
4
5
6
7
receivers:
- name: 'webhook-receiver'
webhook_configs:
- url: 'http://your-webhook-endpoint/alerts'
send_resolved: true
http_config:
bearer_token: '${WEBHOOK_TOKEN}'

6.4.3 Grafana OnCall 集成

Grafana OnCall 可以通过集成 Alertmanager 来接收 Prometheus 告警 [[216]][[217]][[218]]。

配置步骤

  1. 在 Grafana OnCall 中创建集成
  2. 复制 Webhook URL
  3. 在 Alertmanager 中配置 Webhook 接收器
  4. 调整路由配置
  5. 设置心跳监控

Alertmanager 配置

1
2
3
4
5
receivers:
- name: 'grafana-oncall'
webhook_configs:
- url: 'https://oncall.example.com/integrations/v1/alertmanager/YOUR_KEY/'
send_resolved: true

6.5 通知渠道配置

Alertmanager 支持多种通知方式 [[219]][[220]][[221]]:

邮件通知

1
2
3
4
5
6
7
8
receivers:
- name: 'email-receiver'
email_configs:
- to: 'team@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'alertmanager'
auth_password: '${SMTP_PASSWORD}'

Slack 通知

1
2
3
4
5
6
7
8
receivers:
- name: 'slack-receiver'
slack_configs:
- api_url: '${SLACK_WEBHOOK_URL}'
channel: '#alerts'
title: '{{ .GroupLabels.alertname }}'
text: '{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}'
send_resolved: true

钉钉通知

1
2
3
4
5
receivers:
- name: 'dingtalk-receiver'
webhook_configs:
- url: 'http://dingtalk-webhook/alerts'
send_resolved: true

第七章:生产环境最佳实践

7.1 部署规划

7.1.1 资源规划

Prometheus 资源需求

  • CPU:取决于抓取目标和查询负载
  • 内存:主要受时间序列数量和查询复杂度影响
  • 存储:取决于指标保留时间和数据压缩率

经验公式

1
2
内存需求 ≈ 时间序列数量 × 每序列内存开销 + 查询缓存
存储需求 ≈ 每秒样本数 × 每样本大小 × 保留时间 × 压缩比

7.1.2 高可用部署建议

Prometheus 高可用

  • 部署多个 Prometheus 实例(至少 2 个)
  • 使用相同的配置,抓取相同的目标
  • 配置外部标签区分实例
1
2
3
4
global:
external_labels:
cluster: 'production'
replica: 'prometheus-1'

Grafana 高可用

  • 部署多个 Grafana 副本
  • 使用外部数据库
  • 配置共享会话存储

7.2 性能优化

7.2.1 Prometheus 性能优化

抓取优化

  • 合理设置抓取间隔(建议 15-60 秒)
  • 使用 scrape_timeout 控制超时
  • 避免抓取高基数指标

存储优化

  • 设置合理的保留时间(--storage.tsdb.retention.time
  • 使用 SSD 存储提高 I/O 性能
  • 定期压缩和清理历史数据

查询优化

  • 使用 Recording Rules 预计算常用查询
  • 避免高基数标签聚合
  • 使用 rate() 而非 increase() 计算速率

远程写入优化

1
2
3
4
5
6
7
remote_write:
- url: "http://remote-storage/api/v1/receive"
queue_config:
max_samples_per_send: 1000
max_shards: 200
capacity: 2500
batch_send_deadline: 5s

7.2.2 Grafana 性能优化

数据库优化

  • 使用 MySQL 或 PostgreSQL 替代 SQLite
  • 配置数据库连接池
  • 定期清理会话和仪表板版本历史

查询缓存

1
2
3
4
5
6
[dataproxy]
timeout = 30
dial_timeout = 10
keep_alive = 90
max_idle_connections = 100
idle_conn_timeout = 90

仪表板优化

  • 避免单仪表板过多面板
  • 合理设置刷新间隔
  • 使用变量减少重复查询

7.3 监控监控

7.3.1 自监控指标

Prometheus 自身暴露了丰富的监控指标:

  • prometheus_tsdb_head_samples_appended_total:写入样本数
  • prometheus_tsdb_head_series:当前时间序列数量
  • prometheus_scrape_duration_seconds:抓取耗时
  • prometheus_rule_evaluation_duration_seconds:规则评估耗时

7.3.2 监控告警规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
groups:
- name: prometheus_self_monitoring
rules:
- alert: PrometheusDown
expr: up{job="prometheus"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Prometheus instance is down"

- alert: PrometheusScrapeSlow
expr: histogram_quantile(0.99, rate(prometheus_scrape_duration_seconds_bucket[5m])) > 10
for: 5m
labels:
severity: warning
annotations:
summary: "Prometheus scrape is slow"

- alert: PrometheusTSDBCompactionsFailing
expr: increase(prometheus_tsdb_compactions_failed_total[1h]) > 0
for: 0m
labels:
severity: critical
annotations:
summary: "Prometheus TSDB compactions failing"

- alert: PrometheusRemoteWriteQueueFull
expr: prometheus_remote_storage_shards_max / prometheus_remote_storage_shards > 0.9
for: 5m
labels:
severity: warning
annotations:
summary: "Remote write queue is near full"

7.4 配置管理

7.4.1 GitOps 实践

将 Prometheus 和 Grafana 配置存储在 Git 仓库中,实现版本控制和自动化部署:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
├── prometheus/
│ ├── rules/
│ │ ├── node-alerts.yaml
│ │ ├── kubernetes-alerts.yaml
│ │ └── application-alerts.yaml
│ ├── prometheus.yml
│ └── alertmanager.yml
├── grafana/
│ ├── dashboards/
│ │ ├── kubernetes-overview.json
│ │ └── application-metrics.json
│ └── datasources/
│ └── prometheus.yaml
└── kubernetes/
├── prometheus-deployment.yaml
├── grafana-deployment.yaml
└── configmaps.yaml

7.4.2 使用 kube-prometheus-stack

kube-prometheus-stack 是一个集成了 Prometheus、Grafana 和 Alertmanager 的综合解决方案 [[222]]:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# values.yaml
prometheus:
prometheusSpec:
retention: 15d
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: ssd
resources:
requests:
storage: 100Gi
resources:
requests:
cpu: 500m
memory: 2Gi
limits:
cpu: 2
memory: 8Gi

grafana:
replicas: 2
persistence:
enabled: true
size: 10Gi
adminPassword: "${GRAFANA_ADMIN_PASSWORD}"

alertmanager:
alertmanagerSpec:
replicas: 2

7.5 运维清单

7.5.1 日常运维

  • 检查 Prometheus 抓取目标状态
  • 检查告警规则是否正常触发
  • 检查远程写入队列状态
  • 检查存储使用情况
  • 检查 Grafana 仪表板是否正常加载
  • 检查备份任务是否成功

7.5.2 定期维护

  • 审查和优化告警规则
  • 清理不再使用的指标和标签
  • 更新 Exporter 版本
  • 检查安全补丁
  • 验证灾难恢复流程

第八章:总结与展望

8.1 核心要点回顾

本报告深入分析了 Prometheus 和 Grafana 的技术架构、部署实践、安全加固和告警体系。核心要点包括:

架构层面

  • Prometheus 采用拉取模式采集指标,配合多维数据模型和 PromQL 提供强大的查询能力
  • Grafana 通过插件架构支持多种数据源,提供丰富的可视化能力
  • Thanos 为 Prometheus 提供高可用和长期存储解决方案

部署层面

  • Kubernetes 环境中推荐使用 Helm Chart 部署
  • 多副本部署实现高可用
  • 对象存储作为长期数据后端

安全层面

  • TLS 加密保护通信安全
  • 多种认证方式支持企业集成
  • RBAC 实现细粒度访问控制
  • 密钥管理保护敏感信息

告警层面

  • 规则设计遵循分级、预测、多条件原则
  • Alertmanager 实现分组、去重、路由
  • 多渠道通知支持灵活响应

8.2 技术发展趋势

可观测性融合:Prometheus 和 Grafana 正在与日志、链路追踪等可观测性领域融合,形成统一的全栈监控平台。

云原生集成:与 Kubernetes、Service Mesh 的深度集成,提供更自动化的监控能力。

AI/ML 增强:引入机器学习能力进行异常检测、根因分析和智能告警。

边缘计算:支持边缘场景的轻量级部署和联邦查询。

8.3 实践建议

  1. 从小规模开始:先部署基础架构,逐步扩展监控范围
  2. 重视指标设计:遵循 RED(Rate、Errors、Duration)和 USE(Utilization、Saturation、Errors)原则设计指标
  3. 合理规划容量:根据业务规模和增长预期规划资源
  4. 建立运维流程:建立完整的监控、告警、响应流程
  5. 持续优化:定期审查告警规则、仪表板和存储策略

附录:常用配置模板

A. Prometheus 完整配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: 'production'
replica: 'prometheus-1'

alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093

rule_files:
- /etc/prometheus/rules/*.yml

scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']

- job_name: 'kubernetes-apiservers'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https

- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)

- 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__

remote_write:
- url: http://thanos-sidecar:10908/api/v1/receive
queue_config:
max_samples_per_send: 1000
capacity: 2500

remote_read:
- url: http://thanos-query:19192/api/v1/read
read_recent: true

B. Alertmanager 完整配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alertmanager@example.com'
smtp_auth_username: '${SMTP_USER}'
smtp_auth_password: '${SMTP_PASSWORD}'
slack_api_url: '${SLACK_WEBHOOK_URL}'

templates:
- '/etc/alertmanager/templates/*.tmpl'

route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'default-receiver'
routes:
- match:
severity: critical
receiver: 'critical-team'
continue: false
- match:
severity: warning
receiver: 'warning-team'

inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'cluster', 'service']

receivers:
- name: 'default-receiver'
email_configs:
- to: 'team@example.com'
send_resolved: true

- name: 'critical-team'
pagerduty_configs:
- service_key: '${PAGERDUTY_KEY}'
slack_configs:
- channel: '#alerts-critical'
title: '{{ .GroupLabels.alertname }}'
text: '{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}'
send_resolved: true

- name: 'warning-team'
slack_configs:
- channel: '#alerts-warning'
title: '{{ .GroupLabels.alertname }}'
text: '{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}'
send_resolved: true

C. Kubernetes 部署清单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# prometheus-deployment.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: monitoring
data:

prometheus.yml: |

global:
scrape_interval: 15s
evaluation_interval: 15s
# ... 完整配置

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: prometheus
namespace: monitoring
spec:
serviceName: prometheus
replicas: 2
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
serviceAccountName: prometheus
containers:
- name: prometheus
image: prom/prometheus:v2.x.x
args:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--storage.tsdb.retention.time=15d"
- "--web.enable-admin-api"
- "--web.enable-lifecycle"
ports:
- containerPort: 9090
volumeMounts:
- name: prometheus-config
mountPath: /etc/prometheus
- name: prometheus-storage
mountPath: /prometheus
- name: thanos-sidecar
image: thanosio/thanos:v0.x.x
args:
- "sidecar"
- "--tsdb.path=/prometheus"
- "--prometheus.url=http://localhost:9090"
- "--objstore.config-file=/etc/thanos/bucket-config.yaml"
volumeMounts:
- name: prometheus-storage
mountPath: /prometheus
- name: thanos-config
mountPath: /etc/thanos
volumes:
- name: prometheus-config
configMap:
name: prometheus-config
- name: thanos-config
secret:
secretName: thanos-objectstorage
volumeClaimTemplates:
- metadata:
name: prometheus-storage
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: ssd
resources:
requests:
storage: 100Gi

结语

Prometheus 和 Grafana 作为云原生监控的核心组件,其深度学习和实践对于构建现代化的可观测性平台至关重要。本报告从架构原理到部署实践,从安全加固到告警体系,提供了全面的技术指导和最佳实践。

随着技术的不断发展,建议读者持续关注 Prometheus 和 Grafana 的版本更新和新特性,结合实际业务需求不断优化监控策略,为系统的稳定运行提供坚实保障。