Prometheus監控Springboot程序

Prometheus監控Springboot程序

1. 添加依賴

我本次使用的Springboot版本爲1.5.12.RELEASE,如果是Springboot2.0+,那麼監控的配置以及吐出的監控指標會有所不同。
添加maven依賴,pom文件配置如下:

<dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_spring_boot</artifactId>
            <version>${prometheus.client.version}</version>
        </dependency>
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient</artifactId>
            <version>${prometheus.client.version}</version>
        </dependency>
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_hotspot</artifactId>
            <version>${prometheus.client.version}</version>
        </dependency>

其中Prometheus的版本號爲:

<prometheus.client.version>0.5.0</prometheus.client.version>

2. 修改配置文件

修改application.properties配置文件,添加如下內容:

server.port=8080

# 啓用基礎認證
security.basic.enabled = false

# 安全路徑列表,逗號分隔,此處只針對/admin路徑進行認證
security.basic.path = /admin

# 認證使用的用戶名
security.user.name = admin

# 認證使用的密碼。 默認情況下,啓動時會記錄隨機密碼。
security.user.password = 123456

# 可以訪問管理端點的用戶角色列表,逗號分隔
management.security.roles = SUPERUSER

# actuator暴露接口使用的端口,爲了和api接口使用的端口進行分離
management.port = 8099

# actuator暴露接口的前綴
management.context-path = /admin

# actuator是否需要安全保證
management.security.enabled = false

# actuator的metrics接口是否需要安全保證
endpoints.metrics.sensitive = false

# actuator的metrics接口是否開啓
endpoints.metrics.enabled=true

# actuator的health接口是否需要安全保證
endpoints.health.sensitive=false

# actuator的health接口是否開啓
endpoints.health.enabled=true

application.yml 配置如下:

# actuator是否需要安全保證
management.security.enabled: false
endpoints:
  metrics:
    # actuator的metrics接口是否需要安全保證
    sensitive: false
    # actuator的metrics接口是否開啓
    enabled: true
  health:
    # actuator的health接口是否需要安全保證
    sensitive: false
    # actuator的health接口是否開啓
    enabled: true

3. 啓用Prometheus監控

在Springboot啓動類上添加註解@EnablePrometheusEndpoint,同時使用simpleclient_hotspot中提供的DefaultExporter該Exporter會在metrics endpoint中放回當前應用JVM的相關信息

@SpringBootApplication
@EnablePrometheusEndpoint
@EnableSpringBootMetricsCollector
public class CaseApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(CaseApplication.class, args);
    }

    @Override
    public void run(String... strings) throws Exception {
        DefaultExports.initialize();
    }

}

4. 監控埋點

4.1 新建攔截器

建立一個攔截器,用來攔截URL。

public class PrometheusMetricsInterceptor implements HandlerInterceptor {

    private Histogram.Timer histogramRequestTimer;
    private Histogram.Timer nacosTimer;
    private Histogram.Child nacosChild;

    static final Histogram requestLatencyHistogram = Histogram.build().labelNames("path", "method", "code")
            .name("io_namespace_http_requests_latency_seconds_histogram").help("Request latency in seconds.")
            .register();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("-------Histogram--------");
        histogramRequestTimer = requestLatencyHistogram
                .labels(request.getRequestURI(), request.getMethod(), String.valueOf(response.getStatus()))
                .startTimer();
        nacosTimer = MetricsMonitor.getConfigRequestMonitor(request.getMethod(), request.getRequestURI(), String.valueOf(response.getStatus()));
        nacosChild = MetricsMonitor.getNamingRequestMonitor(request.getMethod(), request.getRequestURI(), String.valueOf(response.getStatus()));
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        histogramRequestTimer.observeDuration();
        nacosTimer.observeDuration();
        nacosChild.startTimer();
    }
}

4.2 註冊攔截器

新建攔截器後需要註冊到服務中才可以攔截URL。

@Configuration
public class WebServletContextConfiguration extends WebMvcConfigurationSupport {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(getInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }

    @Bean
    public HandlerInterceptor getInterceptor() {
        return new PrometheusMetricsInterceptor();
    }

}

5. 驗證監控

啓動應用程序,訪問地址
http://localhost:8099/admin/prometheus,驗證是否存在監控指標。

監控結果

6. 指標類型

普羅米修斯客戶端庫提供了四種核心度量類型。目前,它們只在客戶端庫(爲了使api能夠根據特定類型的使用而定製)和wire協議中有所區別。Prometheus服務器還沒有利用類型信息,並將所有數據壓縮成無類型的時間序列。這種情況在未來可能會改變。

6.1 Counter

計數器是一個累積度量,它表示一個單調遞增的計數器,其值在重新啓動時只能遞增或重置爲零。例如,您可以使用計數器來表示服務的請求、完成的任務或錯誤的數量。
不要使用計數器來暴露可能降低的值。例如,不要爲當前正在運行的進程的數量使用計數器;而是使用量規。
示例代碼:

import io.prometheus.client.Counter;
class YourClass {
  static final Counter requests = Counter.build()
     .name("requests_total").help("Total requests.").register();

  void processRequest() {
    requests.inc();
    // Your code here.
  }
}

6.2 Gauge

量規是一個度量單位,它表示一個可以任意上下移動的數值。
壓力錶通常用於測量溫度或當前內存使用情況等測量值,但也用於“計數”,比如併發請求的數量。
示例代碼:

class YourClass {
  static final Gauge inprogressRequests = Gauge.build()
     .name("inprogress_requests").help("Inprogress requests.").register();

  void processRequest() {
    inprogressRequests.inc();
    // Your code here.
    inprogressRequests.dec();
  }
}

6.3 Histogram

直方圖對觀察結果(通常是請求持續時間或響應大小之類的東西)進行採樣,並在可配置的桶中計數。它還提供所有觀測值的和。
示例代碼:

class YourClass {
  static final Histogram requestLatency = Histogram.build()
     .name("requests_latency_seconds").help("Request latency in seconds.").register();

  void processRequest(Request req) {
    Histogram.Timer requestTimer = requestLatency.startTimer();
    try {
      // Your code here.
    } finally {
      requestTimer.observeDuration();
    }
  }
}

6.4 Summary

與柱狀圖類似,摘要對觀察結果進行採樣(通常是請求持續時間和響應大小之類的內容)。雖然它還提供了觀察值的總數和所有觀察值的總和,但它計算了一個滑動時間窗口上的可配置分位數。

class YourClass {
  static final Summary receivedBytes = Summary.build()
     .name("requests_size_bytes").help("Request size in bytes.").register();
  static final Summary requestLatency = Summary.build()
     .name("requests_latency_seconds").help("Request latency in seconds.").register();

  void processRequest(Request req) {
    Summary.Timer requestTimer = requestLatency.startTimer();
    try {
      // Your code here.
    } finally {
      receivedBytes.observe(req.size());
      requestTimer.observeDuration();
    }
  }
}

6.5 自定義Collector

有時不可能直接測試代碼,因爲它不在您的控制範圍內。這要求您代理來自其他系統的指標。
爲此,您需要創建一個自定義收集器(需要將其註冊爲普通度量)。

class YourCustomCollector extends Collector {
  List<MetricFamilySamples> collect() {
    List<MetricFamilySamples> mfs = new ArrayList<MetricFamilySamples>();
    // With no labels.
    mfs.add(new GaugeMetricFamily("my_gauge", "help", 42));
    // With labels
    GaugeMetricFamily labeledGauge = new GaugeMetricFamily("my_other_gauge", "help", Arrays.asList("labelname"));
    labeledGauge.addMetric(Arrays.asList("foo"), 4);
    labeledGauge.addMetric(Arrays.asList("bar"), 5);
    mfs.add(labeledGauge);
    return mfs;
  }
}

// Registration
static final YourCustomCollector requests = new YourCustomCollector().register()

7. 安裝配置Prometheus

7.1 安裝配置

下載安裝包

wget https://github.com/prometheus/prometheus/releases/download/v2.12.0/prometheus-2.12.0.linux-amd64.tar.gz

解壓文件

tar -zxvf prometheus-2.12.0.linux-amd64.tar.gz

修改配置文件prometheus.yml採集Nacos metrics數據。配置監控的job以及目標服務器,每一個目標服務器都是一個實例。

cd prometheus-*

Prometheus配置文件修改

後臺啓動Prometheus服務,並出到日誌。

./prometheus --config.file=prometheus.yml > prometheus.log 2>&1 &

通過訪問http://{ip}:9090/graph可以看到prometheus的採集數據,在搜索欄搜索監控指標,例如:nacos_monitor可以搜索到Nacos數據說明採集數據成功
數據採集結果

在查詢條件框中輸入表達式,進行統計。例如:

sum(rate(nacos_client_request_seconds_count{url=~'/dialog/slu/nlp/parser', instance=~'39.97.161.102:30315|39.97.161.102:30316'}[1m])) by (method,url,instance)

結果如下圖:
查詢圖表結果

8. 安裝配置Grafana

8.1 安裝配置

安裝grafana,下載安裝包

wget https://dl.grafana.com/oss/release/grafana-6.5.2.linux-amd64.tar.gz
tar -zxvf grafana-6.5.2.linux-amd64.tar.gz

修改端口配置,複製一個配置文件,後續修改基於該自定義配置文件修改,不需要修改原始文件。

cd grafana-6.5.2/conf
cp sample.ini custom.ini
vi custom.ini

可以在該配置文件中修改端口號
在這裏插入圖片描述

訪問grafana: http://{ip}:3000,用戶名密碼默認爲:admin/admin。
在這裏插入圖片描述

登錄時提示修改默認密碼,如果不想修改可以跳過。

8.2 配置數據源

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

8.3 配置監控面板

監控面板可以自己配置,也可以通過導入json文件來進行修改,推薦使用配置好的json文件,修改起來會非常方便。

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

修改後的展示效果如圖所示:

在這裏插入圖片描述

注:此處grafana的模板文件是從別處下載的,可以根據需要導入自己的模板文件。

9. 參考文獻

  1. SpringBoot 應用監控踩坑集錦
  2. prometheus docs
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章