promethus是一个新一代的监控框架,一个 Prometheus server 可以处理数百万的 metrics,而grafana各式各样的图像展示中间件服务。本文中主要讲述我们在使用promethus+grafana来监控springboot微服务的请求响应时间。
1.部署promethus
工欲善其事必先利其器,我们要使用promethus首先要部署promethus。无论你是docker部署还是使用zip包解压命令直接启动,由于没有配置promethus应该监控的服务地址,所以promethus会默认将自己设置为监控的服务。
2. 配置promethus
打开promethus默认的配置文件,promethus.yml文件
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
alerting: #alert manager服务的地址
alertmanagers:
- static_configs:
- targets: ["localhost:8200"]
# 设置alert manager触发alert的条件文件,
如果不使用promethus的alert预警此项不用管
rule_files:
- "alert.rules"
scrape_configs:
# The job name is added as a label `job=<job_name>` to any
timeseries scraped from this config.
- job_name: 'sync_bigdata_platform'
# Override the global default and scrape targets from
this job every 5 seconds.
scrape_interval: 5s
#服务暴露给promethus的api,promethus将通过这个拉取
服务端暴露的metric信息
metrics_path: '/actuator/prometheus'
#默认使用http协议拉取
scheme: http
#服务暴露的地址
static_configs:
- targets: ['localhost:8080']
此时配置完成了一个简单的从服务器端拉取metric监控信息的job,重启promethus,可以在promethus的http://localhost:9090/targets来查看自己注册的job instance是否正常,如果不正常则promethus是拉取不到metric信息的
3.配置监控自己的springboot服务
springboot是通过什么方式将统计自定义的metric信息呢?
只需要在springboot项目中引入以下的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
springboot-actuator为应用提供了强大的监控能力,在2.x之后,Actuator将 底层修改成了Micrometer(千分尺)。Micrometer是一个监控门面,可以借助Micrometer对接各种监控系统。在引入了依赖包之后配置文件需要配置actuator的配置启用信息:
management:
endpoint:
health:
enabled: false
endpoints:
web:
exposure:
include: '*'
exclude: env,beans
metrics:
enable:
http: false
hikaricp: false
启动springboot服务,可以通过http://localhost:8080/actuator/prometheus接口查看到统计到的jvm的一些metric信息,那如何自定义统计自己的监控metric信息呢?
3.1 注册MeterRegistry到自己的服务类,metricRegistry是Micrometer提供的一个抽象类,相当于Micrometer的仓库,通过这个可以添加一些meterFilter,对于一些结果统计进行求percentiles(0.5,0.75,0.9)的操作,如果只是单纯统计服务访问的Counter,以及服务器端的响应时间Timer,可以直接使用如下进行统计:
Metrics.counter("http_requests_total", Tags.of("service", service,"category", category, "method", method)).increment();
Metrics.timer("requests_latency",Tags.of("service", service,"category", category, "method", method)).record(Duration.ofMillis(time));
3.2 在Prometheus的首页可以查看到各种指标的值,也可以对值进行一系列Prometheus的值进行聚合
4 在grafana中绘制所需要的图
在grafana中使用Prometheus统计的数据进行绘制需要的图时,Prometheus好的一点是你统计的一条数据他一直都会是一条,不会进行数据条数的增加。Prometheus官方文档的函数也会对使用场景进行描述,比如绘制1分钟以内的平均请求延迟时间:
rate(requests_latency_seconds_sum{job=~"$job",
instance=~"$instance",service=~"$service"}[1m]) /rate(requests_latency_seconds_count{job=~"$job",
instance=~"$instance",
service=~"$service"}[1m])
因为我们取的是平均的一个值,并不是瞬时的值,所以我们使用的rate函数。 在统计request count时,发现函数计算出来的值为小数,count数怎么还有小数的问题?这个问题是由于promethus它计算出来的值只是一个估算值,近似的"线性拟合",它求取的是一个不存在区间的值,所以出来了小数,对于这种情况,我们只能通过对计算的值向上或者向下取整来保证别人看到这个图时不会出现明明统计的是整数值为什么会有小数的这种疑惑。