基于Promethus与grafana的springboot服务监控

803 阅读5分钟
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它计算出来的值只是一个估算值,近似的"线性拟合",它求取的是一个不存在区间的值,所以出来了小数,对于这种情况,我们只能通过对计算的值向上或者向下取整来保证别人看到这个图时不会出现明明统计的是整数值为什么会有小数的这种疑惑。

由于我们使用的promethus进行拉取我们服务的监控数据,并没有通过promethus的push gateway进行push数据,服务如果主动push数据的话,这对我们的服务响应存在很大隐患,一旦promethus出现问题,push数据push不过来,我们的服务返回会存在很大问题。而拉取的话,不过就是promethus出现问题,监控数据拉取不到,但是服务还是会正常响应。
4.1.使用promethus的alert还是使用grafana自带的alert功能?
在做alert时,一直纠结于使用promethus的alert还是grafana的alert。promethus的alert最突出的是它的智能预警,就是你设置了阈值来判断是否达到预警标准,而刚开始突然出现了一个值的大小超过了你设置的阈值,这个时候如果是grafana的话会直接触发alert预警,但是promethus的话它只是将这个alert放入了它的pedding队列,在你设置的规定时间内,如果这个值一直大于你设置的阈值的时候,会将alert移入firing队列,这个时候才会进行alert预警。这种状况好的一点时,对于突然出现的一个异常点它不会一直报alert。而使用promethus的alert manager还有一点就是对于预警的条件你可以通过promethus提供的PromSQL进行编写,不需要在grafana对原始的计算在聚合来设置alert。alert manager也提供了alert silence来屏蔽alert。