给应用加上守卫-Prometheus实战

背景

最近和团队开发应用「京返吧」,开发完成后想完善一下监控报警。在公司,都是自研的监控体系,提供各种 metric 和报警策略,自己做项目,平时公司的工具必然使用不上,只能考虑合适的开源方案。

Prometheus 应该是目前监控体系里面的领导者,开箱即用,丰富的插件,配合 Grafana 图表展示,很直观的体现各种数据。

Prometheus

这里还是简单介绍一下什么是 Prometheus
由于本人也是第一次接触,所以,介绍和使用说明还是以官网介绍为准。

Power your metrics and alerting with the leading open-source monitoring solution.

从官网的描述可以知道,Prometheus 是一个支持指标和报警的开源监控解决方案。一个监控系统,核心能力是报警,报警的前提是有数据,有了数据,才能根据一些特征来决定系统或服务是否存在问题。

这里从官网引用一张架构图。可以看到有一个 server,从名字上可以知道这是一个服务端,这是 Prometheus 提供数据存储,查询数据等能力。Alertmanager 为监控报警,报警通知方式有邮件、webhook等方式。Prometheus WebUI 为可视化操作平台,或者使用 Grafana 可视化数据。Pushgateway 为推送网关。

架构图

数据交互主要有两种方式,推和拉,Prometheus 默认的方式是拉,就是说使用者需要提供指标查询接口供 Prometheus 查询。 另外一种方式,就是通过推,即我们的一些指标产生后,通过 Prometheus 提供的接口写入数据。Prometheus 并没有直接提供这种接口,而是由 Pushgateway 提供,这样设计达到和 Prometheus 解耦。Prometheus 在从 Pushgateway 拉取数据,这样就可以通过 Prometheus WebUI 查询我们的指标数据。

「京返吧」是通过 springboot 开发,可以通过 spring actuator 暴露指标数据,这种方式简单,但是不适合暴露在公网的服务,毕竟总有人在网上攻击。所以,最终采用的方案是通过暴露 Pushgateway,应用通过 Pushgateway 将指标数据写入 Prometheus。

除了 Pushgateway 外,Prometheus 还提供了很多的 exporter,用于指标直接上报 Prometheus,比如需要

方便我们监控 MySQL、RocketMQ 等。

PrometheusPushgatewayGrafana 三大件的安装方式略,可以参考 https://zhuanlan.zhihu.com/p/355075613

SpringBoot

上面三个工具安装好后,接下来就是代码配置相关能力。

micrometer-registry-prometheus 配置后才会上报,simpleclient_pushgateway 为 pushgateway 相关配置。引入下面依赖后,在 application.yml(或者 application.properties)配置 pushgateway 相关内容。

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
29
30
31
32
33
34
35
36
    <dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.10.2</version>
</dependency>

<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_pushgateway</artifactId>
</dependency>

<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_logback</artifactId>
</dependency>

<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_servlet</artifactId>
</dependency>

<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_spring_boot</artifactId>
</dependency>

<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_spring_web</artifactId>
</dependency>

<dependency>
<groupId>io.github.mweirauch</groupId>
<artifactId>micrometer-jvm-extras</artifactId>
<version>0.2.2</version>
</dependency>

配置好以下内容后,启动应用,会发现指标数据上报到 pushgateway

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
management:
metrics:
export:
simple:
enabled: false
prometheus:
enabled: true
pushgateway:
enabled: true
base-url: pushgateway 访问地址
username: 账号
password: 密码
pushRate: 10s
job: xxx
shutdown-operation: push
grouping-key:
instance: 'xxx'
tags:
application: ${spring.application.name}

在 Prometheus 配置 job 采集 Pushgateway 的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"

# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.

static_configs:
- targets: ["localhost:9093"]
# pushgateway
- job_name: "pushgateway"

#metrics_path: '/actuator/prometheus'
# scheme defaults to 'http'.
#enable_http2: false
static_configs:
- targets: ["localhost:9091"]

有了数据源,接下来就是展示功能了。

Grafana

图表展示这里使用 grafana,模板有很多人分享了,这里使用的是 https://grafana.com/grafana/dashboards/12856-jvm-micrometer/

效果还不错,能查看当前应用基本指标。