背景
負(fù)責(zé)一個(gè)java項(xiàng)目污桦,分布在四臺(tái)服務(wù)器上亩歹,為了監(jiān)控所有服務(wù)器的使用狀態(tài)、運(yùn)行狀態(tài)凡橱、項(xiàng)目執(zhí)行狀態(tài)小作,每天早起進(jìn)行一遍系統(tǒng)巡檢,即便如此也難免有漏網(wǎng)之魚稼钩,為了預(yù)防系統(tǒng)出問(wèn)題顾稀、出問(wèn)題及時(shí)收到通知,特此搭建Prometheus+Grafana監(jiān)控JVM實(shí)現(xiàn)企業(yè)微信報(bào)警坝撑。
因?yàn)槭且呀?jīng)實(shí)現(xiàn)后復(fù)盤础拨,所以避掉了中間采坑和各種開(kāi)關(guān)服務(wù)環(huán)節(jié),用最快的順序記下過(guò)程绍载。
環(huán)境
1個(gè)主服務(wù)器(IP:10.0.16.16)诡宗,3個(gè)副服務(wù)器(IP:10.0.16.98,IP:10.0.16.161击儡,IP:10.0.16.165)塔沃,每個(gè)服務(wù)器運(yùn)行八個(gè)微服務(wù)(config,eureka,fs,lv,fsscweb,fsscservice,fsscapp),我們監(jiān)控其中兩個(gè):fsscweb和fsscservice
1.下載文件并解壓(帶星號(hào)標(biāo)識(shí)為所有待監(jiān)控服務(wù)器上安裝阳谍,不帶星號(hào)標(biāo)識(shí)只在主服務(wù)器安裝即可)
1.1 prometheus (https://prometheus.io/download/#prometheus)
[root@FCUAT-WEB2 /]# cd /opt/soft/monitor/
[root@FCUAT-WEB2 monitor]# wget https://github.com/prometheus/prometheus/releases/download/v2.28.0/prometheus-2.28.0.linux-amd64.tar.gz
[root@FCUAT-WEB2 monitor]# tar -zxvf prometheus-2.28.0.linux-amd64.tar.gz
1.2 *node_exporter(https://github.com/prometheus/node_exporter/)
[root@FCUAT-WEB2 monitor]# wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz
[root@FCUAT-WEB2 monitor]# tar -zxvf node_exporter-1.1.2.linux-amd64
1.3 grfana (https://grafana.com/grafana/download )
[root@FCUAT-WEB2 monitor]# wget https://dl.grafana.com/oss/release/grafana-8.0.3.linux-amd64.tar.gz
[root@FCUAT-WEB2 monitor]# tar -zxvf grafana-8.0.3.linux-amd64.tar.gz
1.4 alertmanager (https://prometheus.io/docs/alerting/latest/alertmanager/)
[root@FCUAT-WEB2 monitor]# wget https://github.com/prometheus/alertmanager/releases/download/v0.22.2/alertmanager-0.22.2.linux-amd64.tar.gz
[root@FCUAT-WEB2 monitor]# tar -zxvf alertmanager-0.22.2.linux-amd64.tar.gz
1.5 *JMX
[root@FCUAT-WEB2 monitor]# mkdir jmx
[root@FCUAT-WEB2 monitor]# cd jmx
[root@FCUAT-WEB2 jmx]# wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.12.0/jmx_prometheus_javaagent-0.12.0.jar
2.各文件配置
2.1 運(yùn)行node_exporter(所有服務(wù)器運(yùn)行蛀柴;默認(rèn)端口9100螃概,指定端口使用:./node_exporter --web.listen-address localhost:9100)
[root@FCUAT-WEB2 /]# cd /opt/soft/monitor/
[root@FCUAT-WEB2 monitor]# cd node_exporter-1.1.2.linux-amd64
[root@FCUAT-WEB2 node_exporter-1.1.2.linux-amd64]# nohup ./node_exporter & > node.log
測(cè)試:http://10.0.16.16:9100/metrics
2.2 添加JMX配置,并修改項(xiàng)目啟動(dòng)方式添加JMX(所有服務(wù)器運(yùn)行鸽疾;端口可變吊洼,這里使用3010和3011)
[root@FCUAT-WEB2 /]# cd /opt/soft/monitor/jmx
[root@FCUAT-WEB2 jmx]# vim config.yml
添加jmx配置(此配置是grafana儀表盤8563模板配置,參考:https://grafana.com/grafana/dashboards/8563)
lowercaseOutputLabelNames: true
lowercaseOutputName: true
whitelistObjectNames: ["java.lang:type=OperatingSystem"]
blacklistObjectNames: []
rules:
- pattern: 'java.lang<type=OperatingSystem><>(committed_virtual_memory|free_physical_memory|free_swap_space|total_physical_memory|total_swap_space)_size:'
name: os_$1_bytes
type: GAUGE
attrNameSnakeCase: true
- pattern: 'java.lang<type=OperatingSystem><>((?!process_cpu_time)\w+):'
name: os_$1
type: GAUGE
原項(xiàng)目啟動(dòng)方式:
nohup java -Xms100m -Xmx1024m -Dfile.encoding=utf-8 -jar /home/publish/web_git/jar/fsscservice.jar & >/home/publish/web_git/logs/fsscservice.log
nohup java -Xms100m -Xmx1024m -Dfile.encoding=utf-8 -jar /home/publish/web_git/jar/fsscweb.jar & >/home/publish/web_git/logs/fsscweb.log
新啟動(dòng)方式添加JMX(端口指定3010和3011):
nohup java -javaagent:/opt/soft/monitor/jmx/jmx_prometheus_javaagent-0.12.0.jar=3010:/opt/soft/monitor/jmx/config.yml -Xms100m -Xmx1024m -Dfile.encoding=utf-8 -jar /home/publish/web_git/jar/fsscservice-0.0.1-SNAPSHOT.jar & >/home/publish/web_git/logs/fsscservice.log
nohup java -javaagent:/opt/soft/monitor/jmx/jmx_prometheus_javaagent-0.12.0.jar=3011:/opt/soft/monitor/jmx/config.yml -Xms100m -Xmx1024m -Dfile.encoding=utf-8 -jar /home/publish/web_git/jar/fsscweb.jar & >/home/publish/web_git/logs/fsscservice.log
測(cè)試:http://10.0.16.16:3010/ 制肮; http://10.0.16.16:3011/
2.3 配置node_exporter和jmx到Prometheus并啟動(dòng)(主服務(wù)器啟動(dòng)冒窍;默認(rèn)端口9090)
[root@FCUAT-WEB2 /]# cd /opt/soft/monitor/prometheus-2.28.0.linux-amd64
[root@FCUAT-WEB2 prometheus-2.28.0.linux-amd64]# vim prometheus.yml
在scrape_configs:節(jié)點(diǎn)添加node_exporter和 jmx,監(jiān)控節(jié)點(diǎn)為所有服務(wù)器
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 采集node exporter監(jiān)控?cái)?shù)據(jù)
- job_name: 'node'
static_configs:
- targets: ['localhost:9100','10.0.16.98:9100','10.0.16.161:9100','10.0.16.165:9100']
#JMX
- job_name: 'java'
static_configs:
- targets: ['localhost:3011','localhost:3010','10.0.16.98:3011','10.0.16.98:3010','10.0.16.161:3011','10.0.16.161:3010','10.0.16.165:3011','10.0.16.165:3010']
主服務(wù)器啟動(dòng)Prometheus
[root@FCUAT-WEB2 prometheus-2.28.0.linux-amd64]# nohup ./prometheus & >prometheus.log
測(cè)試:http://10.0.16.16:9090
在搜索框輸入jvm 或者 node 有提示出現(xiàn)表示啟動(dòng)成功并添加jmx和node_exporter成功。
2.4 注冊(cè)并獲取企業(yè)微信信息
2.4.1 到企業(yè)微信官網(wǎng)注冊(cè)企業(yè)微信https://work.weixin.qq.com/(按照順序注冊(cè)就行豺鼻,不需要驗(yàn)證主體就可以使用综液,過(guò)程略)
2.4.2 到通訊錄下獲取待通知用戶信息(此處為ZhangYaNan)
2.4.3 到我的企業(yè)-->企業(yè)ID下獲取企業(yè)ID
2.4.4 到應(yīng)用管理下創(chuàng)建新應(yīng)用,以后報(bào)警信息就是該應(yīng)用發(fā)送
2.4.5 獲取新應(yīng)用的ID和密碼儒飒,secret需要點(diǎn)擊查看管理員可以收到該密碼
2.5 配置并啟動(dòng)altermanager(主服務(wù)器啟動(dòng)谬莹;端口默認(rèn)9093)
在2.4中獲取到四個(gè)企業(yè)微信信息:企業(yè)微信ID、應(yīng)用ID桩了、應(yīng)用密碼附帽、待通知人賬號(hào)。將這四個(gè)信息配置到altermanager中:
[root@FCUAT-WEB2 /]# cd /opt/soft/monitor/
[root@FCUAT-WEB2 monitor]# cd alertmanager-0.22.2.linux-amd64
[root@FCUAT-WEB2 alertmanager-0.22.2.linux-amd64]# vim grafana.yml
global:
resolve_timeout: 5m
templates:
- '/opt/soft/monitor/alertmanager-0.22.2.linux-amd64/wechat.tmpl' #微信模板井誉,同級(jí)目錄下wechat.tmpl
route:
group_by: ['alertname']
group_wait: 5s
#同一組內(nèi)警報(bào)士葫,等待group_interval時(shí)間后,再繼續(xù)等待repeat_interval時(shí)間
group_interval: 1m
#當(dāng)group_interval時(shí)間到后送悔,再等待repeat_interval時(shí)間后慢显,才進(jìn)行報(bào)警
repeat_interval: 5m
receiver: 'wechat'
receivers:
- name: 'wechat'
wechat_configs:
- corp_id: 'wwbb4ce576226853f3' #企業(yè)微信ID
agent_id: '1000002' #應(yīng)用ID
api_secret: 'u-R207uYmKXaSmIWyB4-SYClp2sAAlvznDf8RZatyFE' #應(yīng)用密碼
to_user: 'ZhangYaNan' #通知用戶賬號(hào),多個(gè)賬號(hào)可用“欠啤,”分割
send_resolved: true
上面提到templates荚藻,也需要配置,該模板不需要修改洁段,可根據(jù)個(gè)人喜好進(jìn)行修改樣式:
[root@FCUAT-WEB2 alertmanager-0.22.2.linux-amd64]# vim wechat.tmpl
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
==========異常告警==========
告警類型: {{ $alert.Labels.alertname }}
告警級(jí)別: {{ $alert.Labels.severity }}
告警詳情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障時(shí)間: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- if gt (len $alert.Labels.instance) 0 }}
實(shí)例信息: {{ $alert.Labels.instance }}
{{- end }}
{{- if gt (len $alert.Labels.namespace) 0 }}
命名空間: {{ $alert.Labels.namespace }}
{{- end }}
{{- if gt (len $alert.Labels.node) 0 }}
節(jié)點(diǎn)信息: {{ $alert.Labels.node }}
{{- end }}
{{- if gt (len $alert.Labels.pod) 0 }}
實(shí)例名稱: {{ $alert.Labels.pod }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
==========異秤τ恢復(fù)==========
告警類型: {{ $alert.Labels.alertname }}
告警級(jí)別: {{ $alert.Labels.severity }}
告警詳情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障時(shí)間: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
恢復(fù)時(shí)間: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- if gt (len $alert.Labels.instance) 0 }}
實(shí)例信息: {{ $alert.Labels.instance }}
{{- end }}
{{- if gt (len $alert.Labels.namespace) 0 }}
命名空間: {{ $alert.Labels.namespace }}
{{- end }}
{{- if gt (len $alert.Labels.node) 0 }}
節(jié)點(diǎn)信息: {{ $alert.Labels.node }}
{{- end }}
{{- if gt (len $alert.Labels.pod) 0 }}
實(shí)例名稱: {{ $alert.Labels.pod }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- end }}
{{- end }}
啟動(dòng)altermanager,配置文件使用grafana.yml
[root@cwdev-web1 alertmanager-0.22.2.linux-amd64]# nohup ./alertmanager --config.file=grafana.yml --storage.path=data/ --log.level=debug &
測(cè)試:http://10.0.16.16:9093/#/status
2.5 啟動(dòng)Grafana(主服務(wù)器啟動(dòng)祠丝;端口默認(rèn)3000)
[root@FCUAT-WEB2 /]# cd /opt/soft/monitor/
[root@FCUAT-WEB2 monitor# cd grafana-8.0.3/bin
[root@FCUAT-WEB2 bin]# nohup ./grafana-server & > grafana.log
測(cè)試:http://10.0.16.16:3000/login (管理員默認(rèn)賬號(hào):admin 默認(rèn)密碼:admin)
3.grafana配置
3.1 添加數(shù)據(jù)源
設(shè)置Name和URL疾呻,把Default打開(kāi)
設(shè)置完后進(jìn)行測(cè)試,點(diǎn)擊SAVE&TEST写半,出現(xiàn)“DATA source is working”表示設(shè)置成功岸蜗。
3.2 配置企業(yè)微信報(bào)警
點(diǎn)擊左邊鈴鐺圖標(biāo),進(jìn)行添加報(bào)警源
新建報(bào)警源(New channel)叠蝇,Name隨意填寫璃岳,Type選擇 Prometheus AlterManager,Url填寫主服務(wù)器的altermanager地址 http://10.0.16.16:9093。
填寫完后點(diǎn)擊Test 進(jìn)行測(cè)試铃慷,這時(shí)候企業(yè)微信會(huì)收到一條應(yīng)用的報(bào)警信息单芜,格式是步驟2.5配置的模板格式
3.3添加JVM可視化儀表盤
Grafana官網(wǎng)提供很多可以導(dǎo)入的儀表盤模板 https://grafana.com/grafana/dashboards
我們這次添加8563模板JMX prometheus exporter。https://grafana.com/grafana/dashboards/8563
確認(rèn)Name和job并導(dǎo)入儀表盤
導(dǎo)入后可以看到JVM監(jiān)控儀表盤犁柜,這里有啟動(dòng)狀態(tài)洲鸠、啟動(dòng)時(shí)間、jvm版本馋缅、內(nèi)存狀態(tài)等等
修改Instance可以監(jiān)控不同jvm
3.4 jvm監(jiān)控添加報(bào)警
例:監(jiān)控主服務(wù)器下的堆內(nèi)存信息
修改jvm內(nèi)存使用信息扒腕,原模板使用的是參數(shù),需要改為常量股囊,由
jvm_memory_bytes_used{area="$memarea",job="$job",instance="$instance"}
改為
jvm_memory_bytes_used{area="heap",job="java",instance="10.0.16.98:3011"}
Data Source 也由$datasource 改為Prometheus
不然模板的參數(shù)信息不允許用于報(bào)警
修改模板信息后袜匿,到Alert頁(yè)簽下創(chuàng)建報(bào)警信息
修改紅框內(nèi)信息更啄,其中Rule-Name 是報(bào)警的名稱稚疹,Evaluate ever是報(bào)警頻率,我們用于測(cè)試設(shè)置成10s-1m
下面Conditions是觸發(fā)報(bào)警條件祭务,條件是When内狗,添加的話可以選擇關(guān)聯(lián)關(guān)系A(chǔ)ND、OR义锥,類似于SQL柳沙。我們選擇avg(),query(A,10s,now)拌倍,HAS NO VALUE赂鲤。觸發(fā)條件表示A下平均10s內(nèi)的監(jiān)控?cái)?shù)據(jù)為空時(shí),報(bào)警柱恤。Message是報(bào)警的內(nèi)容数初。
點(diǎn)擊配置頁(yè)最下方 TestRule ,出現(xiàn)state:OK表示創(chuàng)建警告成功。
保存后回到面板
我們到服務(wù)器中把jvm殺掉
一會(huì)兒收到消息:
再次啟動(dòng)項(xiàng)目后梗顺,收到恢復(fù)消息:
至此泡孩,Prometheus+Grafana監(jiān)控JVM實(shí)現(xiàn)企業(yè)微信報(bào)警實(shí)現(xiàn)。