簡介
Micrometer/Prometheus/Grafana體系是當前最成熟的低成本Java監控解決方案,而且通過其他的Prometheus exporter,還可以進行諸如我們可能需要的Windows操作系統監控/Mysql/Kakfka等常用組件的監控、
Prometheus
Prometheus(普羅米修斯)是一套比較完備的監控報警系統,其主要架構設計如圖:
主要是由以下組件構成:
- Prometheus server:服務中心,主要負責拉取和存儲時序書庫(Prometheus有自帶的時序數據庫)
- Client Libraries:客戶端庫,主要用於和具體的服務進行集成,採集監控數據,例如Micrometer
- Push gateway:另外一種數據push的採集方式(Prometheus默認使用pull的方式主動採集應用數據),用於適配一些沒有長期穩定的進程的服務
- Exporter:用於針對某些特定服務的數據採集工具,例如mysql/kafka/HA等
- Alert Manager:Prometheus的監控告警工具,主要通過webhook和其他告警系統進行集成告警,能夠進行告警規則的配置
- 其他工具
同時,Prometheus也有一套自己的查詢語法,用於已經採集的數據的結果查詢,具體可以參考:
https://prometheus.io/docs/prometheus/latest/querying/basics/
或者中文翻譯: https://www.jianshu.com/p/3bdc4cfa08da
Micrometer
Micrometer是Java的指標監控工具,而且建立了一套獨立的數據模型,能夠和大部分常見的監控工具進行整合,簡單快速的建立指標監控體系
Micrometer提供了包括Timer , Counter , Gauge ,
DistributionSummary , LongTaskTimer , FunctionCounter , FunctionTimer , TimeGauge等不同的監控工具,以適應不同的場景,例如Timer用於監控一個操作的消耗時間,並能在這個基礎上統計例如minx/max/avg/tp等指標
Grafana
Grafana是一個開源的度量分析與可視化套件。經常被用作基礎設施的時間序列數據和應用程序分析的可視化,它在其他領域也被廣泛的使用包括工業傳感器、家庭自動化、天氣和過程控制等。
Grafana支持許多不同的數據源。每個數據源都有一個特定的查詢編輯器,該編輯器定製的特性和功能是公開的特定數據來源。
其工作模式主要分爲三步:
- 設置數據源:可視化的基礎數據來源,例如從數據庫/Prometheus/ElasticSearch
- 配置數據抽取方式:例如通過數據庫的SQL/Prometheus的ProQuery等進行數據查詢
- 數據面板配置:Grafana支持多樣的數據呈現方式,例如折線圖/直方圖/熱力圖等等,通過簡單的配置,即可通過多樣化的數據呈現方式去展示監控數據
使用流程
Prometheus部署
寫在前面:默認的訪問地址 http://127.0.0.1:9090
PS: 下方有docker方式部署
開源的Prometheus是單節點模式,部署非常簡單,這裏以Windows下爲例,首先在Prometheus官方下載文件包,例如當前最新的Windows64版本爲:
https://github.com/prometheus/prometheus
下載完畢後解壓其目錄結構如下:
data爲Prometheus是自帶時序數據庫持久化的目錄,pometheus.yml爲整個Prometheus的配置文件,pometheus.exe爲服務啓動應用,默認可以直接啓動,這個時候Prometheus會使用最基本的默認配置,運行在本地9090端口,採集自身的運行的數據並持久化到時序數據
prometheus.yml的配置規則參考文檔:
https://prometheus.io/docs/prometheus/latest/configuration/configuration/
當Prometheus啓動完畢後,本地瀏覽器訪問
http://127.0.0.1:9090即可查看到Prometheus的查詢工具
值得注意的是,如果要啓用restful接口支持熱加載配置,需要在啓動的命令行增加參數: --web.enable-lifecycle ,這在生產環境中不停機更新非常重要
例如:cmd下執行:prometheus.exe --web.enable-lifecycle
CentOS下安裝
wget https://github.com/prometheus/prometheus/releases/download/v2.22.0/prometheus-2.22.0.linux-amd64.tar.gz
tar -zxvf prometheus-2.5.0.linux-amd64.tar.gz
// --config.file="prometheus/prometheus.yml": 指定配置文件,不寫爲默認
nohup /dimples/soft/prometheus-2.22.0/prometheus --config.file="/dimples/soft/prometheus-2.22.0/prometheus.yml" &
// 關閉
ps -aux | grep prometheus
kill -s 9 24204(上一步查詢出來的pid)
查看Prometheus監控的應用(Prometheus啓動時,默認監控的是自己)
此時我們可以看到,在Prometheus中只有一個自己的服務被監控了,那麼我們怎麼去將自己的服務加入監控呢?請往下看。
Grafana部署
寫在前面:默認的訪問地址 http://127.0.0.1:3000/login
Grafana的部署和Prometheus的部署類似,也非常簡單,這裏也以Windows爲例,首先需要從官方網站下載最新的安裝包:
https://grafana.com/grafana/download
這裏以zip包爲例,解壓後目錄結構爲:
配置文件路徑爲 conf/defaults.ini,這裏可以修改默認端口,配置持久化方式,默認用戶名和密碼
啓動執行文件爲 bin/grafana-server.exe,雙擊即可啓動。(默認端口爲3000,默認用戶名和密碼均爲admin)
啓動後瀏覽器訪問即可登錄使用,http://127.0.0.1:3000/login 第一次使用會強制修改密碼
CentOS下安裝
wget https://dl.grafana.com/oss/release/grafana-6.4.4-1.x86_64.rpm
yum install -y grafana-6.4.4-1.x86_64.rpm
yum clean all
// 安裝後需要手動啓動
service grafana-server start
service grafana-server stop
- 配置文件位於/etc/grafana/grafana.ini,這裏暫時保持默認配置即可
- 設置開機啓動
systemctl enable grafana-server
systemctl start grafana-server
配置第一個監控面板 - Prometheus
當Prometheus和Grafana部署完成之後,默認Prometheus就已經在開始採集自身的監控數據,所以我們就可以開始配置Prometheus的監控界面,首先需要登錄Grafana,在左側的設置界面配置數據源:
點擊 Add data source添加第一個數據源,由於我們這裏主要是以Prometheus作爲數據源,所以直接選擇Prometheus即可:
Name爲這個數據源的別稱,用於在多個數據源的時候進行區分,url爲Prometheus的restful接口地址,例如這裏就爲剛剛部署完畢的本地Prometheus服務,最後點擊最下的Save&Test即可添加成功,然後點擊back返回上一步即可查看到已經添加的數據源:
添加完畢數據源之後,則可以開始進行監控面板的設計了,這裏考慮到監控面板設計有一定的門檻,所以建議直接使用官方提供的監控面板模板,具體可以從官方的模板倉庫下載:https://grafana.com/grafana/dashboards
例如我們這裏需要進行Prometheus本身的監控,我們搜索 Prometheus stat:
此處可以選擇編號 1 的編號導入或者使用編號 2 ,下載JSON文件使用,此處我們使用下載json文件的方式
下載完畢之後,則可以導入到Grafana:
配置panel,有三種方式(編號 1、2、3 任選一種):上傳JOSN文件、填寫ID(然後點擊Load)、填寫JSON配置內容(然後點擊Load),此處我們選擇方便的填寫ID的方式,然後點擊對應框後的Load按鈕進入下一步
點擊import之前需要配置別名和選擇一個數據源,所以在import之前必須至少配置一個數據源,點擊import後即可看到監控窗口
到此,我們已經學會了啓動Grafana和Prometheus,同時學會了配置一個簡單的監控服務,即監控Prometheus本身。我們已經瞭解到其工作的一個基礎的流程,以後我們就要去配置監控 Java服務、MySQL、Redis數據庫等各種複雜的服務
監控第一個Java程序
在上面們簡單的將Prometheus採集的對於自身的數據通過Grafana進行了展示,而我們的核心是通過Prometheus去採集Java應用的數據,這就需要針對前面提到的通過Prometheus的pull模式定時去拉取SpringBoot通過Actuator暴露的Micrometer採集的監控指標
- 首先需要的做的是完成Java應用的Micrometer集成,訪問actuator/prometheus或者/prometheus能夠正常的返回Micrometer採集的數據指標
- 進入部署Prometheus的文件目錄,打prometheus.yml進行拉取節點的配置,這裏以我自己部署的java應用爲例,在配置文件的scrape_configs節點添加針對java的配置
SpringBoot 集成Micrometer
Micrometer的集成主要依託於SpringBoot的Actuator,Micrometer會默認採集JVM以及一些其他常用組件(例如HikariCP/Http/Tomcat/Logback)的各項指標,然後通過Actuator輸出,供Prometheus pull進行數據採集
由於歷史的原因,Micrometer的Java集成和SpringBoot版本有關
SpringBoot 2.x
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
激活配置:
management.endpoints.web.exposure.include=prometheus,health
management.metrics.tags.application=${spring.application.name}
spring.application.name= demo-project
SpringBoot 1.5.x
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-spring-legacy</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.0.3</version>
</dependency>
必須配置:
spring.application.name=dimples-demo-project
management.security.enabled=false
spring.metrics.export.includes=health,prometheus
公共配置
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags(@Value("${spring.application.name}") String application) {
return registry -> registry.config().commonTags("application", application);
}
激活後啓動程序,通過IDEA查看是否已經包含/actuator/prometheus端點:
訪問
http://${hostname}😒{port}/actuator/prometheus (2.x)
或者 http://${hostname}😒{port}/prometheus (1.5.x)
配置 Prometheus 監控
打開 Prometheus 的 prometheus.yml 文件,這裏我們配置一個Java服務
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs:
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
static_configs:
- targets: ['localhost:9090']
- job_name: 'demo'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['127.0.0.1:8080'] # []表示數組,我們可以配置多個服務
修改配置並保存之後,通過Prometheus的restful接口熱加載配置:
http://localhost:9090/-/reload
請求接口後返回 Lifecycle API is not enabled. 那麼就是啓動的時候沒有開啓熱更新配置,需要在啓動的命令行增加參數: --web.enable-lifecycle
這裏返回200表示執行成功,否則會提示錯誤信息(這裏需要post/put請求,所以這裏使用了postman來發起請求,如果Linux可以使用 curl -X POST http://localhost:9090/-/reload發起請求
更新指令執行成功之後,可以在web界面進行確認:
如果想驗證是否確實採集到數據,可以返回首頁的查詢界面:
隨意選擇一個jvm指標,點擊execute即可查詢對應的指標數據:
可以看到對應的指標已經有數據採集到,然後我們則可以到grafana進行監控面板的配置,同樣我們先下載一個面板模板:
導入之後選擇之前配置的數據源之後即可看到監控面板:
到此一個簡易的java監控則已經完成
配置服務器監控
這裏以監控Java程序爲例。需要使用到Windows-exporter的插件來隊windows操作系統進行數據採集,首先需要下載最新的exporter:
https://github.com/prometheus-community/windows_exporter/releases
安裝完畢後,瀏覽器訪問: http://localhost:9182/metrics 即可查看到採集的數據指標,在windows的服務中也能看到有windows_exporter啓動:
然後我們需要在Prometheus中配置採集節點,參考Java的配置模式:
同樣的需要刷新加載 http://localhost:9090/-/reload
同樣選擇一個Grafana模板,導入即可查看到具體的監控信息:
本節只是簡單的整合 Prometheus + Grafana 在監控Java服務方面的使用,但是在我們的微服務業務中,常常還有包括 MySQL、Redis、docker、微服務端點等應用,同時應用發生異常時,還需要發送預警短信或者郵件。那麼這些功能如何實現呢?請繼續閱讀第二章 -《Prometheus + Grafana (2) mysql、redis、Docker容器、服務端點以及預警》。
附錄 - 自定義監控面板
Grafana提供不同樣式的基礎數據層呈現樣式,大多數情況下默認的模板即可滿足我們的日常需求,如果我們需要進行自定義的面板設計,也可以非常簡單的完成的目標,這裏建議從已經存在的模板做參考開始,例如JVM的監控面板,隨機找一個面板:
選擇edit即可以查看是如何配置才能達到當前的效果:
需要配置的內容有:
- 數據源,例如這裏選擇的是Prometheus
- Metrics:查詢表達式,例如這裏是Prometheus的表達式,如果是用數據庫做數據源,這裏應該是SQL
- Legend:數據標題,這裏可以用表達式類似{{name}}這樣的格式
- Visualization:可視化樣式,這裏是Graph,也就是折線圖,也可以選擇其他的樣例其他的一些配置可以自己多嘗試看看效果