云原生监控体系搭建:Prometheus与Grafana实战指南
随着微服务与容器化技术的普及,构建一个可靠、可扩展的云原生监控体系已成为保障系统稳定性的关键环节。Prometheus作为云原生计算基金会(CNCF)的毕业项目,以其强大的多维数据模型和灵活的查询语言(PromQL)成为监控领域的事实标准。而Grafana则以其出色的数据可视化能力,与Prometheus珠联璧合,共同构成了云原生监控的黄金组合。
本文将手把手指导您从零开始,搭建一套基于Prometheus和Grafana的监控体系,并融入现代化数据库工具提升运维效率。
一、核心组件概述与架构设计
1.1 Prometheus:监控与告警工具箱
Prometheus是一个开源的系统监控和告警工具包。它的核心特性包括:
- 多维数据模型:通过指标名称和键值对标签来标识时间序列数据。
- 强大的查询语言PromQL:允许用户实时选择和聚合时间序列数据。
- 不依赖分布式存储:单个服务器节点是自治的。
- 基于HTTP的拉取(Pull)模型:定期从配置的目标(Targets)抓取指标。
- 可通过网关推送(Pushgateway)支持短期任务。
- 通过服务发现或静态配置发现监控目标。
1.2 Grafana:可视化与分析平台
Grafana是一个开源的指标分析与可视化套件。它最常用于可视化基础设施和应用程序分析的时间序列数据,但也可用于其他领域。它支持多种数据源,其中Prometheus是其“一等公民”。
1.3 整体架构
一个典型的监控架构如下:
- 被监控目标:应用(通过客户端库暴露指标)、节点(通过Node Exporter)、中间件等。
- Prometheus Server:负责抓取、存储时间序列数据。
- Alertmanager(可选):处理Prometheus发送的告警,进行去重、分组、路由(如邮件、钉钉、Webhook)。
- Grafana:从Prometheus查询数据并绘制丰富的仪表盘。
- Pushgateway(可选):用于临时性、批处理任务的指标推送。
二、实战部署:使用Docker Compose快速启动
我们使用Docker Compose来快速部署一套基础环境。请确保已安装Docker和Docker Compose。
2.1 创建项目目录与配置文件
首先,创建一个项目目录并编写docker-compose.yml文件。
# docker-compose.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=30d'
- '--web.enable-lifecycle'
ports:
- "9090:9090"
networks:
- monitoring
restart: unless-stopped
grafana:
image: grafana/grafana-oss:latest
container_name: grafana
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123 # 请在生产环境中修改!
ports:
- "3000:3000"
networks:
- monitoring
restart: unless-stopped
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
ports:
- "9100:9100"
networks:
- monitoring
restart: unless-stopped
networks:
monitoring:
driver: bridge
volumes:
prometheus_data:
grafana_data:
接下来,创建Prometheus的主配置文件prometheus/prometheus.yml。
# prometheus/prometheus.yml
global:
scrape_interval: 15s # 默认抓取间隔
evaluation_interval: 15s # 规则评估间隔
# 告警规则文件配置(可选,后续可添加)
# rule_files:
# - "alert_rules.yml"
# 抓取配置
scrape_configs:
# 监控Prometheus自身
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 监控Node Exporter
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
2.2 启动服务
在项目根目录下运行:
docker-compose up -d
等待片刻后,即可访问:
- Prometheus: http://localhost:9090
- Grafana: http://localhost:3000 (用户名:
admin, 密码:admin123) - Node Exporter指标: http://localhost:9100/metrics
三、Grafana配置与仪表盘创建
3.1 添加Prometheus数据源
- 登录Grafana (localhost:3000)。
- 点击左侧齿轮图标 ->
Data Sources->Add data source。 - 选择
Prometheus。 - 在URL处填写
http://prometheus:9090(注意:这里使用Docker Compose服务名,因为它们在同一个网络)。 - 点击
Save & Test,应显示“Data source is working”。
3.2 导入官方仪表盘
Grafana社区提供了大量精美的仪表盘模板。我们可以直接导入Node Exporter的仪表盘。
- 点击左侧
+号 ->Import。 - 在
Import via grafana.com输入框中输入仪表盘ID1860(Node Exporter Full)。 - 选择刚才添加的Prometheus数据源,点击
Import。
现在,您就能看到一个完整的服务器资源(CPU、内存、磁盘、网络)监控仪表盘了。
3.3 使用PromQL自定义查询
Grafana的强大之处在于可以灵活使用PromQL创建自定义面板。例如,在仪表盘中添加一个图,显示过去5分钟的平均CPU使用率:
# PromQL 查询示例:计算非空闲CPU使用率
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
在配置数据看板时,复杂的PromQL查询可能需要反复调试。这时,一个强大的SQL编辑器会非常有帮助。例如,dblens SQL编辑器(https://www.dblens.com)虽然主要针对数据库,但其智能提示、语法高亮和片段保存功能,对于编写和调试类似PromQL这样的查询语句的思路非常有借鉴意义,能帮助您更高效地组织监控查询逻辑。
四、应用监控:为你的服务添加指标
监控基础设施只是第一步,更重要的是监控您的业务应用。
4.1 在Go应用中集成Prometheus客户端
以下是一个简单的Go HTTP服务,集成了Prometheus的Go客户端库来暴露指标。
// main.go
package main
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
// 定义指标
var (
httpRequestsTotal = promauto.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests",
},
[]string{"method", "path", "status"},
)
httpRequestDuration = promauto.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Duration of HTTP requests in seconds",
Buckets: prometheus.DefBuckets,
},
[]string{"method", "path"},
)
)
func handler(w http.ResponseWriter, r *http.Request) {
// 使用计时器包装业务逻辑
timer := prometheus.NewTimer(httpRequestDuration.WithLabelValues(r.Method, r.URL.Path))
defer timer.ObserveDuration()
// 您的业务逻辑...
w.WriteHeader(http.StatusOK)
w.Write([]byte("Hello, World!"))
// 记录请求总数
httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path, "200").Inc()
}
func main() {
// 暴露Prometheus指标端点
http.Handle("/metrics", promhttp.Handler())
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
在编写和调试此类集成代码时,记录关键的设计决策、指标定义和配置细节至关重要。使用像QueryNote(https://note.dblens.com)这样的云笔记工具,可以方便地保存代码片段、配置示例和PromQL查询,并与团队共享,形成宝贵的监控知识库。
4.2 配置Prometheus抓取应用
修改prometheus/prometheus.yml,添加新的抓取任务。
# 在 scrape_configs 下添加
scrape_configs:
# ... 原有配置 ...
- job_name: 'my-go-app'
static_configs:
- targets: ['host.docker.internal:8080'] # 从Docker容器内访问宿主机上的应用
labels:
app: 'demo-go-app'
env: 'development'
修改后,需要让Prometheus重新加载配置。因为启动时添加了--web.enable-lifecycle参数,可以通过API触发重载:
curl -X POST http://localhost:9090/-/reload
现在,在Prometheus的Targets页面(Status -> Targets)应该能看到新的my-go-app任务状态为UP。
五、告警配置(简介)
Prometheus的告警规则定义在单独的YAML文件中。例如,创建一个prometheus/alert_rules.yml文件,定义一条CPU告警规则:
groups:
- name: host_alerts
rules:
- alert: HighCpuUsage
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 80
for: 5m # 持续5分钟才触发
labels:
severity: warning
annotations:
summary: "高CPU使用率 (实例 {{ $labels.instance }})"
description: "CPU使用率超过80%,当前值为 {{ $value }}%"
然后在prometheus.yml中取消rule_files部分的注释并指向该文件。告警产生后,需要配置Alertmanager来接收并发送通知(邮件、Slack等),此处因篇幅限制不再展开。
总结
通过本文的实战指南,我们完成了一套基础的云原生监控体系搭建:
- 部署核心组件:使用Docker Compose快速部署了Prometheus、Grafana和Node Exporter。
- 可视化监控:在Grafana中配置数据源并导入仪表盘,实现了基础设施指标的图形化展示。
- 扩展应用监控:通过示例学习了如何在业务应用中集成Prometheus客户端暴露自定义指标,并配置Prometheus进行抓取。
- 触及告警:简要介绍了告警规则的定义方式。
这套体系具备了高度的可扩展性。您可以进一步探索:
- 使用服务发现(Kubernetes, Consul等)动态管理监控目标。
- 部署Alertmanager配置完整的告警通知流水线。
- 利用Recording Rules预计算常用或昂贵的查询,提升仪表盘效率。
- 结合dblens SQL编辑器的思维来优化复杂的PromQL查询,并利用QueryNote等工具系统化管理您的监控配置、查询语句和运维经验,从而提升整个团队的监控运维成熟度。
监控体系的建设是一个持续迭代的过程,从基础资源监控到深入应用性能监控(APM)与业务监控,Prometheus与Grafana组成的生态将为您提供坚实的基石。
本文来自博客园,作者:DBLens数据库开发工具,转载请注明原文链接:https://www.cnblogs.com/dblens/p/19566617
浙公网安备 33010602011771号