一、引言
在当今微服务架构盛行的技术环境中,一个健壮的监控系统已经成为保障应用稳定运行的必备组件。随着业务的增长,API接口数量激增,如何实时掌握每个接口的健康状况成为开发和运维团队的共同挑战。
1. 微服务监控的重要性
微服务架构将应用拆分为多个独立服务,虽然提高了开发效率和系统弹性,但也带来了更复杂的运维挑战:
服务间调用关系复杂,故障定位困难
单个服务异常可能引发连锁反应
性能瓶颈难以直观发现
系统整体健康状况不易把握
没有有效的监控手段,就像在没有仪表盘的情况下驾驶一辆高速行驶的汽车——危险且不可控。
2. 为什么选择Prometheus和Grafana
在众多监控工具中,Prometheus和Grafana的组合已成为业界标准:
Prometheus优势:
强大的多维度数据模型
灵活的查询语言(PromQL)
无需依赖外部存储的自包含系统
基于HTTP的pull模式数据采集
支持服务发现和动态配置
Grafana优势:
丰富的可视化图表类型
强大的查询编辑器
支持多种数据源整合
灵活的告警机制
活跃的社区和插件生态
这两者的结合为我们提供了一套完整的从数据采集到可视化展示的解决方案。
3. 本文将解决的问题
本文将详细介绍如何在Spring Boot应用中集成Prometheus和Grafana,实现以下监控目标:
实时监控每个Controller接口的请求数
追踪每个接口的异常发生次数
按Controller和Method进行数据筛选和展示
设置合理的告警阈值和通知机制
构建直观的监控面板
4. 实现效果预览
完成本文的实践后,你将获得类似下图的监控面板:
可自定义调整成想要的样式
通过这个面板,你可以:
一目了然地看到所有API接口的请求量和异常数
快速定位异常高发的接口
分析接口调用的时间分布规律
接收异常阈值告警通知
二、技术栈介绍
1. Spring Boot简介
Spring Boot是构建Java应用的首选框架,它简化了Spring应用的初始搭建和开发过程。其特点包括:
内嵌Tomcat等Web服务器
自动配置Spring和第三方库
提供生产级别的监控和健康检查
无需XML配置
在监控领域,Spring Boot Actuator提供了一系列内置端点,使得应用监控变得简单高效。
2. Prometheus工作原理
Prometheus是一个开源的系统监控和告警工具包,最初由SoundCloud开发。其核心工作原理如下:
数据采集:Prometheus通过HTTP协议定期从配置的目标(如应用暴露的/metrics端点)拉取(pull)指标数据
数据存储:采集的时间序列数据存储在本地时间序列数据库中
数据查询:通过PromQL(Prometheus查询语言)进行多维度数据查询
告警:基于PromQL表达式定义告警规则,触发告警
Prometheus的数据模型基于时间序列,每个时间序列由指标名称和键值对标签组成,这种模型非常适合存储和查询API监控数据。
3. Grafana可视化能力
Grafana是一个开源的度量分析与可视化套件,主要功能包括:
多样化图表:支持折线图、柱状图、热力图等多种可视化方式
动态仪表盘:支持变量和模板,实现动态筛选和展示
多数据源:除Prometheus外,还支持InfluxDB、Elasticsearch等多种数据源
告警系统:可基于查询结果设置告警规则和通知渠道
用户权限:细粒度的用户权限控制和组织管理
Grafana的强大之处在于它能将复杂的数据转化为直观的可视化图表,帮助用户快速理解数据背后的趋势和异常。
4. 技术栈之间的协作关系
在我们的监控系统中,各技术组件的协作关系如下:
Spring Boot应用:
集成Micrometer库收集指标
通过Actuator暴露/actuator/prometheus端点
使用AOP切面拦截Controller方法调用并记录指标
Prometheus服务器:
定期从Spring Boot应用拉取指标数据
存储历史指标数据
提供数据查询API
Grafana:
连接Prometheus数据源
创建可视化仪表盘展示API监控数据
配置告警规则和通知渠道
这三者形成了一个完整的监控闭环:数据采集 → 数据存储 → 数据可视化 → 异常告警。
三、环境准备
1. 所需软件版本
为确保本教程的顺利实施,建议使用以下版本的软件:
JDK: 11或更高版本
Spring Boot: 2.6.0或更高版本
Prometheus: 2.30.0或更高版本
Grafana: 8.3.0或更高版本
Maven: 3.6.0或更高版本(或Gradle 7.0+)
2. 开发环境配置
在开始前,确保你的开发环境已正确配置:
JDK安装与配置:
下载并安装JDK
设置JAVA_HOME环境变量
将JDK的bin目录添加到PATH环境变量
Maven/Gradle配置:
安装Maven或Gradle
配置本地仓库和镜像(可选,但推荐国内用户配置)
IDE准备:
推荐使用IntelliJ IDEA或Spring Tool Suite
安装Lombok插件(如果项目使用Lombok)
Docker环境(可选):
如果你计划使用Docker运行Prometheus和Grafana,请安装Docker和Docker Compose
3. 测试环境搭建建议
对于测试环境,有以下建议:
资源配置:
至少2GB内存用于Spring Boot应用
至少2GB内存用于Prometheus和Grafana
至少20GB磁盘空间用于Prometheus数据存储(取决于数据保留策略)
网络配置:
确保Prometheus能够访问Spring Boot应用的/actuator/prometheus端点
确保Grafana能够访问Prometheus服务
如使用防火墙,开放必要端口(默认:Spring Boot 8080,Prometheus 9090,Grafana 3000)
安全考虑:
在生产环境中,建议为Actuator端点添加安全认证
为Prometheus和Grafana配置适当的访问控制
考虑使用HTTPS加密传输监控数据
四、Spring Boot应用配置
1. 添加Maven/Gradle依赖
Maven配置:
在pom.xml
文件中添加以下依赖:
<!-- Spring Boot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer Prometheus Registry -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<!-- Hutool工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.18</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
Gradle配置:
如果使用Gradle,在build.gradle
文件中添加:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
implementation 'cn.hutool:hutool-all:5.8.18'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
2. 配置文件设置
application.properties配置
在
src/main/resources/application.properties
文件中添加以下配置:
# 应用名称
spring.application.name=your-app-name
# 启用所有Actuator端点
#management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.include=health,prometheus,shutdown
# 启用Prometheus端点
management.endpoint.prometheus.enabled=true
# 配置指标
management.metrics.tags.application=${spring.application.name}
management.metrics.distribution.percentiles-histogram.http.server.requests=true
# 非法IP允许计数(可选,根据你的需求调整)
illegal.ip.allowed.count=5
application.yml配置选项
如果你偏好YAML格式,可以使用以下配置:
spring:
application:
name: your-app-name
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
prometheus:
enabled: true
metrics:
tags:
application: ${spring.application.name}
distribution:
percentiles-histogram:
http.server.requests: true
illegal:
ip:
allowed:
count: 5
端点暴露设置:
Actuator默认只暴露health和info端点,我们需要显式启用prometheus端点:
可以选择暴露所有端点(不推荐生产环境):
management.endpoints.web.exposure.include=*
或者只暴露必要的端点(推荐):
management.endpoints.web.exposure.include=prometheus,health,info
如果担心安全问题,可以添加安全控制:
# 需要添加Spring Security依赖 spring.security.user.name=actuator spring.security.user.password=your-secure-password spring.security.user.roles=ACTUATOR_ADMIN