最佳实践之基于 Prometheus + Grafana 搭建微服务监控系统
最佳实践之基于 Prometheus + Grafana 搭建微服务监控系统
1、前言
1.1、何为监控
监控是指对分布式系统中各个服务的运行状态、性能指标和交互情况进行实时监测、收集、分析和告警的过程。随着微服务架构的广泛应用,搭建一套完整的、智能化的监控系统成为了保障系统稳定运行的关键环节,以便及时发现和解决潜在的问题,而这也是服务治理中的重要概念。
1.2、监控系统主要分类
监控系统按照原理和作用可以大致分为三类:
- 日志类(
Log):主要收集和分析系统产生的日志信息,典型解决方案:ELK(Elasticsearch + Logstash + Kibana) - 链路追踪类(
Tracing):主要追踪请求在微服务间的完整调用路径,帮助定位跨服务的问题,典型解决方案:Zipkin、Skywalking - 度量指标类(
Metrics):度量类监控基于时间序列数据库,记录系统各项指标随时间变化的趋势,如:请求量、QPS、TPS、RT 等,典型解决方案:Prometheus
1.3、当前主流的解决方案
很多厂商都采用自研或是基于开源组件的方式来搭建监控平台,当然也有很多流行的开源监控系统,其中最流行的莫过于 Zabbix 和 Prometheus。
1.3.1、Zabbix
Zabbix 始创于 1998 年,最初用于企业内部监控,后公开开源,它由 Server、Agent、Frontend 和 Proxy(非必要) 组成,其中 Server 端与 Agent 端是用 C 语言开发,Frontend 端是用 PHP 及 Javascript 开发。Zabbix 是老牌监控系统的优秀代表之一,功能全面、使用广泛。
1.3.2、Prometheus
随着微服务架构及容器技术的兴起,Prometheus 逐渐崭露头角,它是一套 100% 开源的系统监控报警框架,采用 Go 语言开发,由社区强力驱动,专为云原生设计,天然支持 Kubernetes 及其他云和容器管理器集成,因此非常受欢迎。
Prometheus 的主要特性包括:
- 自带时间序列数据库,支持服务器节点的本地存储,不依赖于分布式存储
- 单机可存储百万级时间序列,每秒可处理千万级数据写入
- 采用
Http请求主动Pull的模式拉取被监控的目标数据并存储到数据库中 - 提供了
PromQL的查询语言来查询分析数据 - 通过服务发现或静态配置发现目标
- 支持多种图形和仪表盘模式
- 自带一个简易的查询页面,但通常与
Grafana配合使用
Prometheus 的主要组件包括:
Prometheus Server:核心Server端,抓取并存储时间序列数据Client Libaries:用于对应用程序代码进行埋点的客户端库Push Gateway:用于支持短生命周期作业的推送网关Alert Manager:用于监控预警管理各种 Exporters:用于采集不支持直接埋点的系统指标
2、动手搭建
前面我们已经对监控有了一个基础的了解,接下来我们将重点介绍如何动手搭建一套 Prometheus + Grafana 的监控系统。
假设:
- 服务器
IP地址为:192.168.1.100Java应用部署的地址为:192.168.1.101:8080,192.168.1.102:8080
2.1、在 Spring Boot 项目中加入“监控探头”
在 pom.xml 中新增以下依赖:
<!-- Spring Boot 提供的应用健康监控 -->
<!-- 此处 Spring Boot 版本为 3.2.4 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 将Java应用程序的性能指标数据转换暴露给prometheus数据中心 -->
<!-- 此处版本为 1.12.4 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>在 application.yml 中新增开启端点的配置(注意不同的版本可能配置不同):
management:
endpoints:
web:
exposure:
# 控制哪些端点可以通过HTTP公开暴露,*表示所有,生产环境不建议这样做
# 常用可选值配置:
# include: health,info,metrics,prometheus
include: "*"
endpoint:
shutdown:
# 控制是否启用shutdown端点,若启用则可以通过/actuator/shutdown停止应用,生产环境禁止
enabled: false
health:
# 控制健康检查详情的显示级别,可选值:always(总是显示详细信息),never(不显示详细信息),when_authorized(仅对授权用户显示,生产环境推荐)
show-details: always
prometheus:
# 控制是否启用prometheus端点
enabled: true
metrics:
tags:
# 为所有指标添加自定义标签,在这里使用应用的名称作为标签
application: ${spring.application.name}
prometheus:
metrics:
export:
# 控制是否向prometheus导出指标
enabled: true
# 设置指标收集的时间间隔(抓取频率),该值应该与prometheus的scrape_interval 配置相匹配
step: 15s此时启动应用,访问 http://{IP}:{PORT}/actuator/prometheus 即可看到数据。
2.2、部署 Prometheus 数据监控中心
在这里,我们将采用 docker 的方式进行安装部署,下同。
登录服务器(假设已安装好 docker 环境并部署了 Java 应用),执行以下命令:
# 创建程序目录
mkdir -p /usr/local/program/prometheus
cd /usr/local/program/prometheus
# 创建配置和数据目录
mkdir -p conf data
# 有时候可能需要授权,否则容器访问无权限
chmod 777 data
# 拉取prometheus镜像
docker pull prom/prometheus:v3.5.0
# 先创建一个临时的容器以便拿到默认配置
docker run --name prometheus -p 9090:9090 -d prom/prometheus:v3.5.0
docker cp prometheus:/etc/prometheus/prometheus.yml conf/prometheus.yml修改 conf/prometheus.yml 的以下配置:
scrape_configs:
# 定义一个Job去拉取数据
- job_name: "demo-app"
# 端点路径,可通过HTTP访问,如:http://192.168.1.101:8080/actuator/prometheus
metrics_path: "/actuator/prometheus"
static_configs:
# Java应用IP及端口,支持多个实例
- targets: ["192.168.1.101:8080", "192.168.1.102:8080"]
labels:
app: "demo-app"创建 start.sh 脚本文件:
docker rm -f prometheus
docker run \
--restart always \
--name prometheus \
--memory 1g \
-p 9090:9090 \
-e TZ='Asia/Shanghai' \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
-v /usr/local/program/prometheus/conf:/etc/prometheus \
-v /usr/local/program/prometheus/data:/prometheus \
-d prom/prometheus:v3.5.0执行以下命令重新启动:
chmod +x start.sh
./start.sh此时访问 http://192.168.1.100:9090 即可看到 Prometheus 自带的数据查询页面。

点击导航栏 Status -> Target health 即可看到上面配置的 job 状态。

2.3、部署 Grafana 数据看板
登录服务器,执行以下命令:
# 创建程序目录
mkdir -p /usr/local/program/grafana
cd /usr/local/program/grafana
# 创建配置和数据目录
mkdir -p conf data
# 有时候可能需要授权,否则容器访问无权限
chmod 777 data
# 拉取grafana镜像
docker pull grafana/grafana:main-ubuntu
# 先创建一个临时的容器以便拿到默认配置
docker run --name grafana -p 3000:3000 -d grafana/grafana:main-ubuntu
docker cp grafana:/etc/grafana/grafana.ini conf/grafana.ini创建 start.sh 脚本文件:
docker rm -f grafana
docker run \
--restart always \
--name grafana \
--memory 1g \
--network host \
-e TZ='Asia/Shanghai' \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
-v /data/grafana/conf/grafana.ini:/etc/grafana/grafana.ini \
-v /data/grafana/data:/var/lib/grafana \
-d grafana/grafana:main-ubuntu执行以下命令重新启动:
chmod +x start.sh
./start.sh此时访问 http://192.168.2.108:3000,默认账户 admin / admin,可以进入 Administration -> General -> Default preferences 修改语言设置。

2.4、创建炫酷面板
Grafana 可以创建丰富的看板和图表,每个图表本质上其实就是 PromQL 查询脚本,所以我们可以利用 PromQL 语句按照需求定制化图表,前提是我们要对 PromQL 有一定的了解。
除此之外,Grafana 官方还提供了大量的看板库,可以直接输入 ID 然后快速导入。因此我们先用这种方式导入个现成看板一饱眼福。
(1)添加数据源
连接 -> 数据源 -> 添加新数据源 -> Prometheus -> 填写名称 -> 填写地址:http://192.168.1.100:9090 -> 保存并测试


(2)导入面板
仪表板 -> 新建(导入) -> 输入ID:21319 -> 加载 -> 选择刚才创建的Prometheus数据源 -> 导入(保存)


(3)查看数据
回到仪表板列表页,点击刚才创建的看板即可看到实时的数据。

3、思考
- 如何开启
Actuator端点、Prometheus监控中心的权限认证?以保证数据安全性 - 目前是在
Prometheus中配置应用的IP和地址来监测的数据,如何基于注册中心服务发现(如Nacos)来动态监测实例数据?

