Prometheus+Grafana监控JVM实现企业微信报警
背景
负责一个java项目,分布在四台服务器上,为了监控所有服务器的使用状态、运行状态、项目执行状态,每天早起进行一遍系统巡检,即便如此也难免有漏网之鱼,为了预防系统出问题、出问题及时收到通知,特此搭建Prometheus+Grafana监控JVM实现企业微信报警。
因为是已经实现后复盘,所以避掉了中间采坑和各种开关服务环节,用最快的顺序记下过程。
环境
1个主服务器(IP:10.0.16.16),3个副服务器(IP:10.0.16.98,IP:10.0.16.161,IP:10.0.16.165),每个服务器运行八个微服务(config,eureka,fs,lv,fsscweb,fsscservice,fsscapp),我们监控其中两个:fsscweb和fsscservice
1.下载文件并解压(带星号标识为所有待监控服务器上安装,不带星号标识只在主服务器安装即可)
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 运行node_exporter(所有服务器运行;默认端口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
测试:http://10.0.16.16:9100/metrics
2.2 添加JMX配置,并修改项目启动方式添加JMX(所有服务器运行;端口可变,这里使用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
原项目启动方式:
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
新启动方式添加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
测试:http://10.0.16.16:3010/ ; http://10.0.16.16:3011/
jmx测试
2.3 配置node_exporter和jmx到Prometheus并启动(主服务器启动;默认端口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:节点添加node_exporter和 jmx,监控节点为所有服务器
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监控数据
- 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']
主服务器启动Prometheus
[root@FCUAT-WEB2 prometheus-2.28.0.linux-amd64]# nohup ./prometheus & >prometheus.log
测试:http://10.0.16.16:9090
在搜索框输入jvm 或者 node 有提示出现表示启动成功并添加jmx和node_exporter成功。
node_exporter
2.4 注册并获取企业微信信息
2.4.1 到企业微信官网注册企业微信https://work.weixin.qq.com/(按照顺序注册就行,不需要验证主体就可以使用,过程略)
2.4.2 到通讯录下获取待通知用户信息(此处为ZhangYaNan)
2.4.3 到我的企业-->企业ID下获取企业ID
获取企业ID
2.4.4 到应用管理下创建新应用,以后报警信息就是该应用发送
创建应用
2.4.5 获取新应用的ID和密码,secret需要点击查看管理员可以收到该密码
获取应用的账号密码
2.5 配置并启动altermanager(主服务器启动;端口默认9093)
在2.4中获取到四个企业微信信息:企业微信ID、应用ID、应用密码、待通知人账号。将这四个信息配置到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' #微信模板,同级目录下wechat.tmpl
route:
group_by: ['alertname']
group_wait: 5s
#同一组内警报,等待group_interval时间后,再继续等待repeat_interval时间
group_interval: 1m
#当group_interval时间到后,再等待repeat_interval时间后,才进行报警
repeat_interval: 5m
receiver: 'wechat'
receivers:
- name: 'wechat'
wechat_configs:
- corp_id: 'wwbb4ce576226853f3' #企业微信ID
agent_id: '1000002' #应用ID
api_secret: 'u-R207uYmKXaSmIWyB4-SYClp2sAAlvznDf8RZatyFE' #应用密码
to_user: 'ZhangYaNan' #通知用户账号,多个账号可用“,”分割
send_resolved: true
上面提到templates,也需要配置,该模板不需要修改,可根据个人喜好进行修改样式:
[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 }}
告警级别: {{ $alert.Labels.severity }}
告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- if gt (len $alert.Labels.instance) 0 }}
实例信息: {{ $alert.Labels.instance }}
{{- end }}
{{- if gt (len $alert.Labels.namespace) 0 }}
命名空间: {{ $alert.Labels.namespace }}
{{- end }}
{{- if gt (len $alert.Labels.node) 0 }}
节点信息: {{ $alert.Labels.node }}
{{- end }}
{{- if gt (len $alert.Labels.pod) 0 }}
实例名称: {{ $alert.Labels.pod }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 }}
==========异常恢复==========
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
恢复时间: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- if gt (len $alert.Labels.instance) 0 }}
实例信息: {{ $alert.Labels.instance }}
{{- end }}
{{- if gt (len $alert.Labels.namespace) 0 }}
命名空间: {{ $alert.Labels.namespace }}
{{- end }}
{{- if gt (len $alert.Labels.node) 0 }}
节点信息: {{ $alert.Labels.node }}
{{- end }}
{{- if gt (len $alert.Labels.pod) 0 }}
实例名称: {{ $alert.Labels.pod }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- end }}
{{- end }}
启动altermanager,配置文件使用grafana.yml
[root@cwdev-web1 alertmanager-0.22.2.linux-amd64]# nohup ./alertmanager --config.file=grafana.yml --storage.path=data/ --log.level=debug &
测试:http://10.0.16.16:9093/#/status
2.5 启动Grafana(主服务器启动;端口默认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
测试:http://10.0.16.16:3000/login (管理员默认账号:admin 默认密码:admin)
grafana主页
3.grafana配置
3.1 添加数据源
选择AddDataSource选择Prometheus
设置Name和URL,把Default打开
设置数据源
设置完后进行测试,点击SAVE&TEST,出现“DATA source is working”表示设置成功。
测试
3.2 配置企业微信报警
点击左边铃铛图标,进行添加报警源
添加报警源.png
新建报警源(New channel),Name随意填写,Type选择 Prometheus AlterManager,Url填写主服务器的altermanager地址 http://10.0.16.16:9093。
添加微信报警
填写完后点击Test 进行测试,这时候企业微信会收到一条应用的报警信息,格式是步骤2.5配置的模板格式
报警测试
3.3添加JVM可视化仪表盘
Grafana官网提供很多可以导入的仪表盘模板 https://grafana.com/grafana/dashboards
我们这次添加8563模板JMX prometheus exporter。https://grafana.com/grafana/dashboards/8563
导入 加载模板
确认Name和job并导入仪表盘
导入
导入后可以看到JVM监控仪表盘,这里有启动状态、启动时间、jvm版本、内存状态等等
JVM仪表盘
修改Instance可以监控不同jvm
不同jvm监控
3.4 jvm监控添加报警
例:监控主服务器下的堆内存信息
编辑面板信息
修改jvm内存使用信息,原模板使用的是参数,需要改为常量,由
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
不然模板的参数信息不允许用于报警
修改模板信息
修改模板信息后,到Alert页签下创建报警信息
create alert
修改红框内信息,其中Rule-Name 是报警的名称,Evaluate ever是报警频率,我们用于测试设置成10s-1m
下面Conditions是触发报警条件,条件是When,添加的话可以选择关联关系AND、OR,类似于SQL。我们选择avg(),query(A,10s,now),HAS NO VALUE。触发条件表示A下平均10s内的监控数据为空时,报警。Message是报警的内容。
报警信息
点击配置页最下方 TestRule ,出现state:OK表示创建警告成功。
报警测试
保存后回到面板
监控信息
我们到服务器中把jvm杀掉
98服务器堆信息消失
一会儿收到消息:
报警消息
再次启动项目后,收到恢复消息:
恢复消息
至此,Prometheus+Grafana监控JVM实现企业微信报警实现。