docker 安装 Prometheus 和 Grafana 实现对 Springcloud 微服务的监控

阿里云产品限时红包,最高 ¥1888 元,立即领取

目前我们团队实施的项目后端采用了基于 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 两者可以很方便的集成。

基础步骤

  1. 在 pom.xml 中添加对 spring-boot-starter-actuator、micrometer-registry-prometheus 的依赖
1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
  1. 在 application.properties 等配置中开放 /actuator/prometheus 端口的访问
1
management.endpoints.web.exposure.include=prometheus

按照以上两步,微服务就算完成了基础的 Prometheus 的接入。

  1. 为了演示其他的效果,我们在每个微服务的 Application 类中添加如下代码:
1
2
3
4
5
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(
@Value("${spring.application.name}") String applicationName) {
return (registry) -> registry.config().commonTags("application", applicationName);
}

这里我们为采集的信息添加了一个 application 标签,与微服务的应用名称一致。

Eureka 注册中心接入

由于 Prometheus 官方没有提供 Eureka 注册中心的接入支持,我们可以通过 eureka-consul-adapter 来利用官方提供的对 Consul 的支持达成目标。

pom.xml 中添加依赖

1
2
3
4
5
<dependency>
<groupId>at.twinformatics</groupId>
<artifactId>eureka-consul-adapter</artifactId>
<version>1.4.0</version>
</dependency>

Eureka 注册客户端接入

按照基础步骤接入就可以了。

运行微服务

Eureka 注册中心和 Demo 项目运行起来之后,Eureka 界面如下:

Eureka 界面

访问微服务的 /actuator/prometheus 端点,界面大致如下:

/actuator/prometheus 端点

如需项目源码,可关注我的公众号 up2048,并回复 prometheus-demo 获取。

docker 安装 Prometheus

编辑 prometheus.yml:

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
# 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']

下载并启动容器

1
2
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。界面如下:

prometheus targets

其中 http://ip:12345 是 Eureka 实例,http://ip:8099http://ip:9999 是两个 RON-DEMO 实例。

docker 安装 grafana

下载并启动容器

1
2
docker pull grafana/grafana
docker run -d -p 3000:3000 --name grafana -v /path/to/grafana/data/:/var/lib/grafana grafana/grafana

浏览器访问 localhost:3000

grafana 首次打开

输入默认用户名: admin,密码:admin 登录。首次登录后会提示修改密码。

首次登录提示修改密码

修改密码后进入首页

首次进入首页

添加数据源,选择 Prometheus

编辑相关信息

编辑 prometheus 信息

保存,出现绿色提示,表示成功。

数据库配置成功

Grafana 的 DashBoard 和 Panel 都支持自定义,这里不做阐述。

此外,Grafana 官方的 DashBoard 市场 Grafana Lab - Dashboards 提供了可拿来即用的强大而通用的 DashBoard。这里我介绍两款:

  • Id 为 4701 的 JVM (Micrometer)
  • Id 为 10280 的 Spring Boot 2.1 Statistics

安装市场上的 DashBoard

左上角 [ + ],点击 Import

在 Grafana.com Dashboard 框中输入 Id,点击 Load

设置数据源,Import

DashBoard 导入数据源

现成的 DashBoard 就可以使用了。

这里分别贴一张 JVM (Micrometer) 和 Spring Boot 2.1 Statistics 的截图供大家参考。

JVM (Micrometer)

Spring Boot 2.1 Statistics

基于 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 版本之后,可以在应用配置中添加如下属性,达到一样的效果。

1
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