簡介
Micrometer/Prometheus/Grafana體系是當(dāng)前最成熟的低成本Java監(jiān)控解決方案政模,而且通過其他的Prometheus exporter,還可以進(jìn)行諸如我們可能需要的Windows操作系統(tǒng)監(jiān)控/Mysql/Kakfka等常用組件的監(jiān)控热某、
Prometheus
Prometheus(普羅米修斯)是一套比較完備的監(jiān)控報(bào)警系統(tǒng),其主要架構(gòu)設(shè)計(jì)如圖:
主要是由以下組件構(gòu)成:
- Prometheus server:服務(wù)中心,主要負(fù)責(zé)拉取和存儲(chǔ)時(shí)序書庫(Prometheus有自帶的時(shí)序數(shù)據(jù)庫)
- Client Libraries:客戶端庫昔馋,主要用于和具體的服務(wù)進(jìn)行集成筹吐,采集監(jiān)控?cái)?shù)據(jù),例如Micrometer
- Push gateway:另外一種數(shù)據(jù)push的采集方式(Prometheus默認(rèn)使用pull的方式主動(dòng)采集應(yīng)用數(shù)據(jù))秘遏,用于適配一些沒有長期穩(wěn)定的進(jìn)程的服務(wù)
- Exporter:用于針對(duì)某些特定服務(wù)的數(shù)據(jù)采集工具丘薛,例如mysql/kafka/HA等
- Alert Manager:Prometheus的監(jiān)控告警工具,主要通過webhook和其他告警系統(tǒng)進(jìn)行集成告警邦危,能夠進(jìn)行告警規(guī)則的配置
- 其他工具
同時(shí)洋侨,Prometheus也有一套自己的查詢語法,用于已經(jīng)采集的數(shù)據(jù)的結(jié)果查詢倦蚪,具體可以參考:
https://prometheus.io/docs/prometheus/latest/querying/basics/
或者中文翻譯: http://www.reibang.com/p/3bdc4cfa08da
Micrometer
Micrometer是Java的指標(biāo)監(jiān)控工具希坚,而且建立了一套獨(dú)立的數(shù)據(jù)模型,能夠和大部分常見的監(jiān)控工具進(jìn)行整合审丘,簡單快速的建立指標(biāo)監(jiān)控體系
Micrometer提供了包括Timer , Counter , Gauge ,
DistributionSummary , LongTaskTimer , FunctionCounter , FunctionTimer , TimeGauge等不同的監(jiān)控工具吏够,以適應(yīng)不同的場景,例如Timer用于監(jiān)控一個(gè)操作的消耗時(shí)間滩报,并能在這個(gè)基礎(chǔ)上統(tǒng)計(jì)例如minx/max/avg/tp等指標(biāo)
Grafana
Grafana是一個(gè)開源的度量分析與可視化套件锅知。經(jīng)常被用作基礎(chǔ)設(shè)施的時(shí)間序列數(shù)據(jù)和應(yīng)用程序分析的可視化,它在其他領(lǐng)域也被廣泛的使用包括工業(yè)傳感器脓钾、家庭自動(dòng)化售睹、天氣和過程控制等。
Grafana支持許多不同的數(shù)據(jù)源可训。每個(gè)數(shù)據(jù)源都有一個(gè)特定的查詢編輯器,該編輯器定制的特性和功能是公開的特定數(shù)據(jù)來源昌妹。
其工作模式主要分為三步:
- 設(shè)置數(shù)據(jù)源:可視化的基礎(chǔ)數(shù)據(jù)來源,例如從數(shù)據(jù)庫/Prometheus/ElasticSearch
- 配置數(shù)據(jù)抽取方式:例如通過數(shù)據(jù)庫的SQL/Prometheus的ProQuery等進(jìn)行數(shù)據(jù)查詢
- 數(shù)據(jù)面板配置:Grafana支持多樣的數(shù)據(jù)呈現(xiàn)方式握截,例如折線圖/直方圖/熱力圖等等飞崖,通過簡單的配置,即可通過多樣化的數(shù)據(jù)呈現(xiàn)方式去展示監(jiān)控?cái)?shù)據(jù)
使用流程
Prometheus部署
寫在前面:默認(rèn)的訪問地址 http://127.0.0.1:9090
PS: 下方有docker方式部署
開源的Prometheus是單節(jié)點(diǎn)模式谨胞,部署非常簡單固歪,這里以Windows下為例,首先在Prometheus官方下載文件包胯努,例如當(dāng)前最新的Windows64版本為:
https://github.com/prometheus/prometheus
下載完畢后解壓其目錄結(jié)構(gòu)如下:
data為Prometheus是自帶時(shí)序數(shù)據(jù)庫持久化的目錄牢裳,pometheus.yml為整個(gè)Prometheus的配置文件,pometheus.exe為服務(wù)啟動(dòng)應(yīng)用叶沛,默認(rèn)可以直接啟動(dòng)蒲讯,這個(gè)時(shí)候Prometheus會(huì)使用最基本的默認(rèn)配置,運(yùn)行在本地9090端口灰署,采集自身的運(yùn)行的數(shù)據(jù)并持久化到時(shí)序數(shù)據(jù)
prometheus.yml的配置規(guī)則參考文檔:
https://prometheus.io/docs/prometheus/latest/configuration/configuration/
當(dāng)Prometheus啟動(dòng)完畢后判帮,本地瀏覽器訪問
http://127.0.0.1:9090即可查看到Prometheus的查詢工具
值得注意的是局嘁,如果要啟用restful接口支持熱加載配置,需要在啟動(dòng)的命令行增加參數(shù): --web.enable-lifecycle ,這在生產(chǎn)環(huán)境中不停機(jī)更新非常重要
例如:cmd下執(zhí)行: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": 指定配置文件脊另,不寫為默認(rèn)
nohup /dimples/soft/prometheus-2.22.0/prometheus --config.file="/dimples/soft/prometheus-2.22.0/prometheus.yml" &
// 關(guān)閉
ps -aux | grep prometheus
kill -s 9 24204(上一步查詢出來的pid)
查看Prometheus監(jiān)控的應(yīng)用(Prometheus啟動(dòng)時(shí)导狡,默認(rèn)監(jiān)控的是自己)
此時(shí)我們可以看到,在Prometheus中只有一個(gè)自己的服務(wù)被監(jiān)控了偎痛,那么我們?cè)趺慈⒆约旱姆?wù)加入監(jiān)控呢?請(qǐng)往下看独郎。
Grafana部署
寫在前面:默認(rèn)的訪問地址 http://127.0.0.1:3000/login
Grafana的部署和Prometheus的部署類似踩麦,也非常簡單,這里也以Windows為例氓癌,首先需要從官方網(wǎng)站下載最新的安裝包:
https://grafana.com/grafana/download
這里以zip包為例谓谦,解壓后目錄結(jié)構(gòu)為:
配置文件路徑為 conf/defaults.ini,這里可以修改默認(rèn)端口贪婉,配置持久化方式反粥,默認(rèn)用戶名和密碼
啟動(dòng)執(zhí)行文件為 bin/grafana-server.exe,雙擊即可啟動(dòng)疲迂。(默認(rèn)端口為3000才顿,默認(rèn)用戶名和密碼均為admin)
啟動(dòng)后瀏覽器訪問即可登錄使用,http://127.0.0.1:3000/login 第一次使用會(huì)強(qiáng)制修改密碼
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
// 安裝后需要手動(dòng)啟動(dòng)
service grafana-server start
service grafana-server stop
- 配置文件位于/etc/grafana/grafana.ini尤蒿,這里暫時(shí)保持默認(rèn)配置即可
- 設(shè)置開機(jī)啟動(dòng)
systemctl enable grafana-server
systemctl start grafana-server
配置第一個(gè)監(jiān)控面板 - Prometheus
當(dāng)Prometheus和Grafana部署完成之后郑气,默認(rèn)Prometheus就已經(jīng)在開始采集自身的監(jiān)控?cái)?shù)據(jù),所以我們就可以開始配置Prometheus的監(jiān)控界面腰池,首先需要登錄Grafana尾组,在左側(cè)的設(shè)置界面配置數(shù)據(jù)源:
點(diǎn)擊 Add data source添加第一個(gè)數(shù)據(jù)源,由于我們這里主要是以Prometheus作為數(shù)據(jù)源示弓,所以直接選擇Prometheus即可:
Name為這個(gè)數(shù)據(jù)源的別稱讳侨,用于在多個(gè)數(shù)據(jù)源的時(shí)候進(jìn)行區(qū)分,url為Prometheus的restful接口地址奏属,例如這里就為剛剛部署完畢的本地Prometheus服務(wù)跨跨,最后點(diǎn)擊最下的Save&Test即可添加成功,然后點(diǎn)擊back返回上一步即可查看到已經(jīng)添加的數(shù)據(jù)源:
添加完畢數(shù)據(jù)源之后拍皮,則可以開始進(jìn)行監(jiān)控面板的設(shè)計(jì)了歹叮,這里考慮到監(jiān)控面板設(shè)計(jì)有一定的門檻,所以建議直接使用官方提供的監(jiān)控面板模板铆帽,具體可以從官方的模板倉庫下載:https://grafana.com/grafana/dashboards
例如我們這里需要進(jìn)行Prometheus本身的監(jiān)控咆耿,我們搜索 Prometheus stat:
此處可以選擇編號(hào) 1 的編號(hào)導(dǎo)入或者使用編號(hào) 2 ,下載JSON文件使用爹橱,此處我們使用下載json文件的方式
下載完畢之后萨螺,則可以導(dǎo)入到Grafana:
配置panel,有三種方式(編號(hào) 1、2慰技、3 任選一種):上傳JOSN文件椭盏、填寫ID(然后點(diǎn)擊Load)、填寫JSON配置內(nèi)容(然后點(diǎn)擊Load)吻商,此處我們選擇方便的填寫ID的方式掏颊,然后點(diǎn)擊對(duì)應(yīng)框后的Load按鈕進(jìn)入下一步
點(diǎn)擊import之前需要配置別名和選擇一個(gè)數(shù)據(jù)源,所以在import之前必須至少配置一個(gè)數(shù)據(jù)源艾帐,點(diǎn)擊import后即可看到監(jiān)控窗口
到此乌叶,我們已經(jīng)學(xué)會(huì)了啟動(dòng)Grafana和Prometheus,同時(shí)學(xué)會(huì)了配置一個(gè)簡單的監(jiān)控服務(wù)柒爸,即監(jiān)控Prometheus本身准浴。我們已經(jīng)了解到其工作的一個(gè)基礎(chǔ)的流程,以后我們就要去配置監(jiān)控 Java服務(wù)捎稚、MySQL乐横、Redis數(shù)據(jù)庫等各種復(fù)雜的服務(wù)
監(jiān)控第一個(gè)Java程序
在上面?zhèn)兒唵蔚膶rometheus采集的對(duì)于自身的數(shù)據(jù)通過Grafana進(jìn)行了展示,而我們的核心是通過Prometheus去采集Java應(yīng)用的數(shù)據(jù)今野,這就需要針對(duì)前面提到的通過Prometheus的pull模式定時(shí)去拉取SpringBoot通過Actuator暴露的Micrometer采集的監(jiān)控指標(biāo)
- 首先需要的做的是完成Java應(yīng)用的Micrometer集成葡公,訪問actuator/prometheus或者/prometheus能夠正常的返回Micrometer采集的數(shù)據(jù)指標(biāo)
- 進(jìn)入部署Prometheus的文件目錄,打prometheus.yml進(jìn)行拉取節(jié)點(diǎn)的配置腥泥,這里以我自己部署的java應(yīng)用為例匾南,在配置文件的scrape_configs節(jié)點(diǎn)添加針對(duì)java的配置
SpringBoot 集成Micrometer
Micrometer的集成主要依托于SpringBoot的Actuator,Micrometer會(huì)默認(rèn)采集JVM以及一些其他常用組件(例如HikariCP/Http/Tomcat/Logback)的各項(xiàng)指標(biāo)蛔外,然后通過Actuator輸出蛆楞,供Prometheus pull進(jìn)行數(shù)據(jù)采集
由于歷史的原因,Micrometer的Java集成和SpringBoot版本有關(guān)
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);
}
激活后啟動(dòng)程序夹厌,通過IDEA查看是否已經(jīng)包含/actuator/prometheus端點(diǎn):
訪問
http://{port}/actuator/prometheus (2.x)
或者 http://{port}/prometheus (1.5.x)
配置 Prometheus 監(jiān)控
打開 Prometheus 的 prometheus.yml 文件,這里我們配置一個(gè)Java服務(wù)
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'] # []表示數(shù)組豹爹,我們可以配置多個(gè)服務(wù)
修改配置并保存之后,通過Prometheus的restful接口熱加載配置:
http://localhost:9090/-/reload
請(qǐng)求接口后返回 Lifecycle API is not enabled. 那么就是啟動(dòng)的時(shí)候沒有開啟熱更新配置矛纹,需要在啟動(dòng)的命令行增加參數(shù): --web.enable-lifecycle
這里返回200表示執(zhí)行成功臂聋,否則會(huì)提示錯(cuò)誤信息(這里需要post/put請(qǐng)求,所以這里使用了postman來發(fā)起請(qǐng)求或南,如果Linux可以使用 curl -X POST http://localhost:9090/-/reload發(fā)起請(qǐng)求
更新指令執(zhí)行成功之后孩等,可以在web界面進(jìn)行確認(rèn):
如果想驗(yàn)證是否確實(shí)采集到數(shù)據(jù),可以返回首頁的查詢界面:
隨意選擇一個(gè)jvm指標(biāo)采够,點(diǎn)擊execute即可查詢對(duì)應(yīng)的指標(biāo)數(shù)據(jù):
可以看到對(duì)應(yīng)的指標(biāo)已經(jīng)有數(shù)據(jù)采集到肄方,然后我們則可以到grafana進(jìn)行監(jiān)控面板的配置,同樣我們先下載一個(gè)面板模板:
導(dǎo)入之后選擇之前配置的數(shù)據(jù)源之后即可看到監(jiān)控面板:
到此一個(gè)簡易的java監(jiān)控則已經(jīng)完成
配置服務(wù)器監(jiān)控
這里以監(jiān)控Java程序?yàn)槔虐P枰褂玫絎indows-exporter的插件來隊(duì)windows操作系統(tǒng)進(jìn)行數(shù)據(jù)采集权她,首先需要下載最新的exporter:
https://github.com/prometheus-community/windows_exporter/releases
安裝完畢后虹茶,瀏覽器訪問: http://localhost:9182/metrics 即可查看到采集的數(shù)據(jù)指標(biāo),在windows的服務(wù)中也能看到有windows_exporter啟動(dòng):
然后我們需要在Prometheus中配置采集節(jié)點(diǎn)隅要,參考Java的配置模式:
同樣的需要刷新加載 http://localhost:9090/-/reload
同樣選擇一個(gè)Grafana模板蝴罪,導(dǎo)入即可查看到具體的監(jiān)控信息:
本節(jié)只是簡單的整合 Prometheus + Grafana 在監(jiān)控Java服務(wù)方面的使用,但是在我們的微服務(wù)業(yè)務(wù)中步清,常常還有包括 MySQL要门、Redis、docker尼啡、微服務(wù)端點(diǎn)等應(yīng)用暂衡,同時(shí)應(yīng)用發(fā)生異常時(shí),還需要發(fā)送預(yù)警短信或者郵件崖瞭。那么這些功能如何實(shí)現(xiàn)呢?請(qǐng)繼續(xù)閱讀第二章 -《Prometheus + Grafana (2) mysql撑毛、redis书聚、Docker容器、服務(wù)端點(diǎn)以及預(yù)警》藻雌。
附錄 - 自定義監(jiān)控面板
Grafana提供不同樣式的基礎(chǔ)數(shù)據(jù)層呈現(xiàn)樣式雌续,大多數(shù)情況下默認(rèn)的模板即可滿足我們的日常需求,如果我們需要進(jìn)行自定義的面板設(shè)計(jì)胯杭,也可以非常簡單的完成的目標(biāo)驯杜,這里建議從已經(jīng)存在的模板做參考開始,例如JVM的監(jiān)控面板做个,隨機(jī)找一個(gè)面板:
選擇edit即可以查看是如何配置才能達(dá)到當(dāng)前的效果:
需要配置的內(nèi)容有:
- 數(shù)據(jù)源鸽心,例如這里選擇的是Prometheus
- Metrics:查詢表達(dá)式,例如這里是Prometheus的表達(dá)式居暖,如果是用數(shù)據(jù)庫做數(shù)據(jù)源顽频,這里應(yīng)該是SQL
- Legend:數(shù)據(jù)標(biāo)題,這里可以用表達(dá)式類似{{name}}這樣的格式
- Visualization:可視化樣式太闺,這里是Graph糯景,也就是折線圖,也可以選擇其他的樣例其他的一些配置可以自己多嘗試看看效果