Spring Boot Actuator詳解與深刻應用(三):Prometheus+Grafana應用監控

《Spring Boot Actuator詳解與深刻應用》預計包括三篇,第一篇重點講Spring Boot Actuator 1.x的應用與定製端點;第二篇將會對比Spring Boot Actuator 2.x 與1.x的區別,以及應用和定製2.x的端點;第三篇將會介紹Actuator metric指標與Prometheus和Grafana的使用結合。這部份內容很經常使用,且較爲入門,歡迎你們的關注。mysql

前文回顧

本文系《Spring Boot Actuator詳解與深刻應用》中的第三篇。在前兩篇文章,咱們主要講了Spring Boot Actuator 1.x與 2.x 的應用與定製端點。相比於Actuator 1.x,基於Spring Boot 2.0的Actuator 2.x 在使用和定製方面有很大變化,對於Actuator的擴展也更加靈活。建議讀者重點關注一下Actuator 2.x,關於Spring Boot 2.x流行的趨勢是顯而易見的。git

Actuator提供端點將數據暴露出來,咱們獲取這些數據進行分析,可是僅僅這樣,對於咱們的分析並不能顯得直觀和方便。微服務架構中,擁有的微服務實例數量每每很龐大。數據可視化是咱們一向所指望的,開源項目:Spring Boot Admin提供了對Spring boot的Actuator Endpoint UI界面支持,同時也提供了對 Spring cloud的一些支持。本文將會對比首先介紹Spring Boot Admin的使用,而後重點介紹Spring Boot 2.x 中的應用監控:Actuator + Prometheus + Grafana。github

應用Spring Boot Admin

Spring Boot Admin是一個Web應用程序,用於管理和監視Spring Boot應用程序。每一個應用程序都被視爲客戶端並註冊到管理服務器。實現的原理則是基於Spring Boot Actuator提供的端點。web

這一部分,咱們將描述配置Spring Boot Admin服務器以及應用程序如何成爲客戶端的步驟。spring

Admin Server

引入依賴

首先,咱們須要引入相關的依賴:sql

<dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-server</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-server-ui</artifactId>
            <version>2.0.1</version>
        </dependency>
複製代碼

分別引入了admin-server和admin-server-ui。docker

配置Admin Server

應用程序的入口增長註解@EnableAdminServer將會開啓服務。數據庫

server:
 port: 8088

management:
 endpoints:
 web:
 exposure:
 include: "*"
 endpoint:
 health:
 show-details: always
複製代碼

Admin UI

打開http://localhost:8088/,咱們能夠看到以下的界面:springboot

下面咱們註冊客戶端服務到Admin Server上。bash

Admin Client

引入依賴

<dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-client</artifactId>
            <version>2.0.1</version>
        </dependency>
複製代碼

在各個服務中,增長admin client的依賴。

配置Admin Client

server:
 port: 8081

spring:
 application:
 name: admin-client

---
spring.boot.admin.client.url: "http://localhost:8088"
management.endpoints.web.exposure.include: "*"
---
management:
 endpoint:
 health:
 show-details: always
 defaults:
 enabled: true

eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/
複製代碼

咱們指定了Admin Server的地址http://localhost:8088。暴露出全部的Actuator的端點,而且顯示健康檢查的詳細信息。

經過如上的配置,即完成了一個簡單的Admin Server和Client的搭建。

UI界面

當咱們的客戶端註冊到Admin Server以後,打開Admin的界面,能夠看到以下的信息截圖:

上圖爲loggers界面的截圖,咱們在上一篇介紹過,Actuator 2.x是CRUD模型,因此咱們這裏也能夠更改日誌的等級。

使用服務發現

如上的示例中,咱們配置Admin Server是經過指定URL。在微服務集羣中,服務通常都會註冊到服務發現與註冊組件中,咱們能夠引入現有的組件,如Eureka、Consul等,輕鬆實現客戶端註冊。

實現此處略過,感興趣的讀者能夠參見GitHub源碼:github.com/keets2012/S…

使用Prometheus與Grafana監控

經過Actuator收集的各類指標信息,存儲到Prometheus統計,Grafana則提供了一個友好的界面展現。下面咱們將介紹如何整合這三個組件,進行應用服務與系統的監控。

暴露Prometheus端點

咱們在以前的基礎上,增長micrometer的依賴:

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
複製代碼

並將端點暴露,增長以下配置:

management:
 metrics:
 export:
 prometheus:
 enabled: true
 step: 1m
 descriptions: true
 web:
 server:
 auto-time-requests: true
 endpoints:
 prometheus:
 id: springmetrics
 web:
 exposure:
 include: health,info,env,prometheus,metrics,httptrace,threaddump,heapdump,springmetrics

server:
 port: 8082
複製代碼

Prometheus介紹

Prometheus 是 Cloud Native Computing Foundation 項目之一,是一個系統和服務監控系統。它的工做方式是被監控的服務須要公開一個Prometheus端點,這端點是一個HTTP接口,該接口公開了度量的列表和當前的值,而後Prometheus應用今後接口定時拉取數據,通常能夠存放在時序數據庫中,而後經過可視化的Dashboard(如Grafana)進行數據展現。

Prometheus特性:

  • 多維度數據模型(由度量名稱和鍵/值維度集定義的時間序列)
  • 靈活的查詢語言 來利用這種維度
  • 不依賴分佈式存儲;單個服務器節點是自治的
  • 時間序列採集經過HTTP上的 pull model 發生
  • 推送時間序列 經過中間網關獲得支持
  • 經過服務發現或靜態配置來發現目標
  • 多種模式的圖形和儀表盤支持
  • 支持分級和水平federation

支持的prometheus metrics,如Counter,Gauge,Histogram和Summary等。須要注意的是counter只能增不能減,適用於服務請求量,用戶訪問數等統計,可是若是須要統計有增有減的指標須要用Gauge。支持的exporter不少,能夠方便的監控不少應用,同時也能夠自定義開發非官方提供的exporter。

安裝Prometheus

能夠經過壓縮直接安裝,筆者偷懶直接採用docker鏡像。

docker run -it  -p 9090:9090 -v /etc/spring-boot-samples/spring-boot-actuator-prometheus/src/main/resources/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
複製代碼

配置Prometheus文件以下:

# Prometheus全局配置項
global:
 scrape_interval:     15s # 設定抓取數據的週期,默認爲1min
 evaluation_interval: 15s # 設定更新rules文件的週期,默認爲1min
 scrape_timeout: 15s # 設定抓取數據的超時時間,默認爲10s
 external_labels: # 額外的屬性,會添加到拉取得數據並存到數據庫中
 monitor: 'codelab_monitor'


# Alertmanager配置
alerting:
 alertmanagers:
 - static_configs:
 - targets: ["localhost:9093"] # 設定alertmanager和prometheus交互的接口,即alertmanager監聽的ip地址和端口

# rule配置,首次讀取默認加載,以後根據evaluation_interval設定的週期加載
rule_files:
 - "alertmanager_rules.yml"
 - "prometheus_rules.yml"

# scape配置
scrape_configs:
- job_name: 'prometheus' # job_name默認寫入timeseries的labels中,能夠用於查詢使用
 scrape_interval: 15s # 抓取週期,默認採用global配置
 static_configs: # 靜態配置
 - targets: ['localdns:9090'] # prometheus所要抓取數據的地址,即instance實例項

- job_name: 'example-random'
 static_configs:
 - targets: ['localhost:8082']
複製代碼

如上爲prometheus的配置文件,8082端口爲上一小節啓動的應用的端口。prometheus的端口爲9090。此外還配置了Alertmanager,用於email等類型的告警。

Grafana介紹

Grafana是一個開源的Dashboard展現工具,能夠支持不少主流數據源,包括時序性的和非時序性的。其提供的展現配置以及可擴展性能知足絕大部分時間序列數據展現需求,是一個比較優秀的工具。支持的數據源包括:prometheus、zabbix、elasticsearch、mysql和openTSDB等。

安裝

Grafana一樣是使用docker鏡像安裝,執行以下的啓動命令:

docker run -d -p 3000:3000 grafana/grafana
複製代碼

並增長prometheus的數據源,以下:

配置數據源:

配置Dashboard:

統計界面

通過如上的配置,咱們能夠看到以下圖所示的統計圖:

固然咱們還能夠安裝插件,以下所示:

上圖展現了筆者配置的一些插件,如zabbix、k8s等,配置較爲簡單,不在此處一一列出。

此部分設計的代碼和監本,參見:github.com/keets2012/S…

總結

本文較爲簡單,主要講告終合Actuator的監控應用,首先講了Spring Boot Admin的應用並給出示例程序;而後講了使用prometheus+grafana進行集成監控。總的來講,後一種方式功能更爲強大,更爲專業,支持更豐富的數據源,讀者能夠自行嘗試。

訂閱最新文章,歡迎關注個人公衆號

微信公衆號

參考

  1. grafana docs
  2. prometheus+grafana+springboot2監控集成配置
相關文章
相關標籤/搜索