prometheus 集成 spring boot 2

Prometheus 簡介

Prometheus 中文名稱爲普羅米修斯,受啓發於Google的Brogmon監控系統,從2012年開始由前Google工程師在Soundcloud以開源軟件的形式進行研發,2016年6月發佈1.0版本。Prometheus 能夠看做是 Google 內部監控系統 Borgmon 的一個實現java

首先了解下 prometheus 架構圖
Prometheus架構圖web

Prometheus監控模式

目前,監控系統採集指標有兩種方式,一種是『推』,另外一種就是『拉』:正則表達式

推的表明有 ElasticSearch,InfluxDB,OpenTSDB 等,須要你從程序中將指標使用 TCP,UDP 等方式推送至相關監控應用,只是使用 TCP 的話,一旦監控應用掛掉或存在瓶頸,容易對應用自己產生影響,而使用 UDP 的話,雖然不用擔憂監控應用,可是容易丟數據。spring

拉的表明,主要表明就是 Prometheus,讓咱們不用擔憂監控應用自己的狀態。並且能夠利用 DNS-SRV 或者 Consul 等服務發現功能就能夠自動添加監控。架構

監控java 應用

prometheus 監控應用的方式很是簡單,只須要進程暴露了一個用於獲取當前監控樣本數據的HTTP訪問地址。這樣的一個程序稱爲Exporter,Exporter的實例稱爲一個Target。Prometheus經過輪訓的方式定時從這些Target中獲取監控數據樣本,對於java 應用來說,只須要暴露一個包含監控數據的http訪問地址便可,固然提供的數據須要知足必定的格式,這個格式就是 Metrics 格式app

Metircs 格式

metircs 的格式很是簡單ide

metric name>{<label name>=<label value>, ...}

主要分爲三個部分
各個部分需符合相關的正則表達式
metric name:指標的名稱,主要反映被監控樣本的含義 a-zA-Z_:*
label name: 標籤 反映了當前樣本的特徵維度 [a-zA-Z0-9_]*
label value: 各個標籤的值,不限制格式
須要注意的是,label value 最好使用枚舉值,而不要使用無限制的值,好比用戶 ID,Email 等,否則會消耗大量內存,也不符合指標採集的意義spring-boot

Metrics類型

Prometheus定義了4中不一樣的指標類型(metric type):Counter(計數器)、Gauge(儀表盤)、Histogram(直方圖)、Summary(摘要)。
Counter:只增不減的計數器
Gauge:可增可減的儀表盤
Histogram:直方圖,內置分析樣本的分佈狀況
Summary:摘要 自定義樣本分佈狀況ui

spring boot 集成 prometheus

加入prometheus依賴

prometheus 官方提供了spring boot 的依賴,可是該客戶端已經不支持spring boot 2url

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

因爲 spring boot 2 的actuator 使用了 Micrometer 進行監控數據統計,
而Micrometer 提供了prometheus 支持,咱們可使用 micrometer-registry-prometheus 來集成 spring boot 2
加入相應依賴

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
  </dependency>
 <dependency>
        <groupId>io.micrometer</groupId>
         <artifactId>micrometer-core</artifactId>
 </dependency>
 <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
 </dependency>

添加監控項

統計http 請求的總數量

若是要統計http 請求的總數量,咱們能夠直接使用prometheus 提供的 Counter 類
首先咱們註冊一個 Counter 實例到spring 容器

@Bean
    public Counter requestTotalCountCollector(){
        return  Counter.build()
         .name("http_requests_total")
         .labelNames("path", "method", "code")
         .help("http請求總計數").register(collectorRegistry);
    }

繼承HandlerInterceptorAdapter ,聲明一個攔截器

public class PrometheusInterceptor extends HandlerInterceptorAdapter {

     @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

在 prehandle 中 執行

requestTotalCountCollector.labels(requestURI, method,code).inc();

在配置文件 applicaion.yml 中啓用metrics,prometheus監控

management:
  metrics:
    export:
      prometheus:
        enabled: true
  endpoint:
    metrics:
      enabled: true
    prometheus:
      enabled: true
  endpoints:
    web:
      exposure:
        include: ["prometheus","health"]

啓動項目,訪問路徑下的 /actuator/prometheus,便可看到監控項
圖片描述

統計正常及自定義錯誤碼的接口響應時間

自定義一個metrics 收集器
只須要繼承 prometheus 的 Collector,重寫抽象方法collect

public class RequestTimeCollector extends Collector{
    @Override
    public List<MetricFamilySamples> collect() {
    }
}

註冊RequestTimeCollector 到 spring 容器

@Bean
    @Primary
    public RequestTimeCollector requestTimeCollector(){
        return new RequestTimeCollector("request_time","接口請求時間",Arrays.asList("url","method", "status")).register(collectorRegistry);
    }

聲明一個around 切面攔截controller方法

@Around("execution(* com.xxx.controller..*.*(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    try {
            requestTimeCollector.setValue(diff, uri, method, String.valueOf(200));
            return proceed;
        } catch (Throwable throwable) {
            if (throwable instanceof BaseException) {
                requestTimeCollector.setValue(diff, uri, method, String.valueOf(statEnum.key()));
            }
            throw throwable;
          }
        }
    }

啓動項目,訪問路徑下的 /actuator/prometheus,便可看到監控項
圖片描述

相關文章
相關標籤/搜索