目前我们团队实施的项目后端采用了基于 Springcloud 的微服务,其中 Eureka 用作注册中心,其他服务作为 Eureka 客户端接入。采用 Prometheus 和 Grafana 可以有效的监控微服务的运行情况。
这篇文章中,我会编写 2 个微服务集成 Prometheus,并通过 docker 来安装 Prometheus 和 Grafana 来展示对微服务的监控。
软件信息
以下列出文中提及的各软件版本:
springboot: 2.1.4.RELEASE
springcloud: Greenwich.RELEASE
prometheus: prom/prometheus:v2.11.2 镜像
grafana: grafana/grafana 镜像,实际上是 6.7.2 版本
微服务接入
Prometheus 基本原理是通过 HTTP 协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供 HTTP 接口就可以接入监控系统。
Springboot 中则通过 spring-boot-starter-actuator 可以以不同的 HTTP 端口来暴露应用的状态等信息。同时 Springboot 2.x 版本中引入了 io.micrometer,通过 micrometer-registry-prometheus 两者可以很方便的集成。
基础步骤
在 pom.xml 中添加对 spring-boot-starter-actuator、micrometer-registry-prometheus 的依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>io.micrometergroupId>
<artifactId>micrometer-registry-prometheusartifactId>
dependency>
在 application.properties 等配置中开放 /actuator/prometheus
端口的访问
management.endpoints.web.exposure.include=prometheus
按照以上两步,微服务就算完成了基础的 Prometheus 的接入。
为了演示其他的效果,我们在每个微服务的 Application 类中添加如下代码:
@Bean
MeterRegistryCustomizer configurer(
@Value("${spring.application.name}") String applicationName) {
return (registry) -> registry.config().commonTags("application", applicationName);
}
这里我们为采集的信息添加了一个 application 标签,与微服务的应用名称一致。
Eureka 注册中心接入
由于 Prometheus 官方没有提供 Eureka 注册中心的接入支持,我们可以通过 eureka-consul-adapter
来利用官方提供的对 Consul 的支持达成目标。
pom.xml 中添加依赖
<dependency>
<groupId>at.twinformaticsgroupId>
<artifactId>eureka-consul-adapterartifactId>
<version>1.4.0version>
dependency>
Eureka 注册客户端接入
按照基础步骤接入就可以了。
运行微服务
Eureka 注册中心和 Demo 项目运行起来之后,Eureka 界面如下:
![](https://img6.php1.cn/3cdc5/999c/978/c528e6401ed5ddf0.png)
访问微服务的 /actuator/prometheus
端点,界面大致如下:
![](https://img6.php1.cn/3cdc5/999c/978/3f4e66b66ce64041.png)
如需项目源码,可关注我的公众号 up2048
,并回复 prometheus-demo 获取。
docker 安装 Prometheus
编辑 prometheus.yml:
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
- job_name: 'microservice'
scheme: http
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
consul_sd_configs:
#consul 地址
- server: '192.168.0.102:12345'
scheme: http
services: [RON-DEMO]
- job_name: 'eureka'
scheme: http
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['192.168.0.102:12345']
下载并启动容器
docker pull prom/prometheus:v2.11.2
docker run -d -v path/to/prometheus.yml:/etc/prometheus/prometheus.yml -p 9090:9090 --name prometheus prom/prometheus:v2.11.2
容器启动成功后,在浏览器中访问 localhost:9090/targets
。界面如下:
![](https://img6.php1.cn/3cdc5/999c/978/138a217cca55cd94.png)
其中 http://ip:12345
是 Eureka 实例,http://ip:8099
和 http://ip:9999
是两个 RON-DEMO 实例。
docker 安装 grafana
下载并启动容器
docker pull grafana/grafana
docker run -d -p 3000:3000 --name grafana -v path/to/grafana/data/:/var/lib/grafana grafana/grafana
浏览器访问 localhost:3000
![](https://img6.php1.cn/3cdc5/999c/978/fe3c525f5eb2cd10.png)
输入默认用户名:admin,密码:admin 登录。首次登录后会提示修改密码。
![](https://img6.php1.cn/3cdc5/999c/978/5cb9112e386dfa56.png)
修改密码后进入首页
![](https://img6.php1.cn/3cdc5/999c/978/00e9c376b9d7dd93.png)
添加数据源,选择 Prometheus
![](https://img6.php1.cn/3cdc5/999c/978/3c2b5be95eeee93c.png)
编辑相关信息
![](https://img6.php1.cn/3cdc5/999c/978/0c3acd352b247292.png)
保存,出现绿色提示,表示成功。
![](https://img6.php1.cn/3cdc5/999c/978/190605a31274ead2.png)
Grafana 的 DashBoard 和 Panel 都支持自定义,这里不做阐述。
此外,Grafana 官方的 DashBoard 市场 Grafana Lab - Dashboards 提供了可拿来即用的强大而通用的 DashBoard。这里我介绍两款:
安装市场上的 DashBoard
左上角 [ + ],点击 Import:
![](https://img6.php1.cn/3cdc5/999c/978/a9ebd1cba21ef00b.png)
在 Grafana.com Dashboard 框中输入 Id,点击 Load
![](https://img6.php1.cn/3cdc5/999c/978/3909ecf19ac12350.png)
设置数据源,Import
![](https://img6.php1.cn/3cdc5/999c/978/f246962f895c8395.png)
现成的 DashBoard 就可以使用了。
这里分别贴一张 JVM (Micrometer) 和 Spring Boot 2.1 Statistics 的截图供大家参考。
![](https://img6.php1.cn/3cdc5/999c/978/9e9487d3c5c6bbfd.png)
![](https://img6.php1.cn/3cdc5/999c/978/cc79d96f6e4e5e82.png)
基于 Prometheus 与 Grafana 微服务监控体系到这里就算初步搭建完了。
踩到的坑
Prometheus targets 中找不到监控的微服务
最开始使用的是 Prometheus 最新版本的镜像,eureka-consul-adapter
是 1.1.0 版本,按照上面一样的配置之后,在 /targets
页面上看不到监控的微服务。报了大致如下的日志:404 /v1/health/service/ron-demo not found.
后来发现 eureka-consul-adapter
是没有提供 Consul 的 health 类端口的,可能因为这个原因,无法被 Prometheus 发现。但是很多参考材料上都是可行的,于是我针对参考材料发布的时间,找到了那个时间段发布的 Prometheus 版本,将版本回退到 v2.11.2 之后,/targets
页面终于出现了预期的画面。
经之后的测试发现,Prometheus 换成最新版本,eureka-consul-adapter
是 1.4.0 版本以后,这个问题也可以解决。
因此,如果大家遇到这个问题,很可能是 Prometheus 和 eureka-consul-adapter
版本不匹配导致的。
Prometheus 日志中出现 503 的问题
这个是在解决第一个问题过程中,发现其他人遇到的问题,详见:prometheus报错Error refreshing service Unexpected response code: 503解决办法。当我解决了第一个问题之后,查看日志,也发现了一样的 503 错误。解决方案可以参看我链接的文章。
Grafana 在使用 Import 进来的 DashBoard 时,不显示 Application
这主要是因为没有给 Prometheus 采集的信息添加 application 标签导致。因为我最初的代码并没有加入前文微服务接入 -> 基础步骤 -> 3 章节中的相关代码。在 MicroMeter 1.1.0 版本之后,可以在应用配置中添加如下属性,达到一样的效果。
management.metrics.tags.application: ${spring.application.name}
参考
Actuator + Prometheus + Grafana搭建微服务监控平台
Prometheus-Consul-Api
prometheus报错Error refreshing service Unexpected response code: 503解决办法
基于docker 搭建Prometheus+Grafana
SpringCloud使用Prometheus监控(基于Eureka)
Spring Cloud 集成 Prometheus Grafana
基于Prometheus搭建SpringCloud全方位立体监控体系
Prometheus Configuration
![](https://img6.php1.cn/3cdc5/999c/978/49ca50136cffabc6.jpeg)
![](https://img6.php1.cn/3cdc5/999c/978/fa15a36fec92797f.png)