运维

Prometheus+Grafana监控JVM实现企业微信报警

2021-07-15  本文已影响0人  张九戒

背景

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

上一篇下一篇

猜你喜欢

热点阅读