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

node_exporter测试

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成功。

jmx

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

altermanager

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登录页

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实现企业微信报警实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容