利用Zabbix低级发现结合jstat命令自动监控Java进程

本文介绍了如何利用Zabbix的低级发现功能和jstat命令,自动监控线上业务中的Java进程,特别是Tomcat和其他Java应用如Logstash、Elasticsearch。通过编写监控脚本,获取JVM内存信息,并通过zabbix_sender发送数据到Zabbix服务器,实现数据的图表展示和报警。此外,还分享了模板配置和调试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 应用场景描述

最近线上业务的Tomcat总是崩溃停止服务。使用jstat命令查看Java进程的JVM内存信息。但是使用命令jstat只能查看一段时间的数据,不能总是盯着屏幕手动查看,于是想到了将jstat的数据通过zabbix进行绘图展现并报警。同时,一台服务器上可能会有多个Java程序在运行,包括不同的Tomcat,或者是其他Java应用,例如Logstash,Elasticsearch等。这就需要用到Zabbix的Low Level Discovery功能。

二 编写监控脚本

在编写脚本之前需要了解jstat命令的使用,详细使用方法可以参考官方文档或者man手册。还有需要了解JVM虚拟机的内存管理和垃圾回收机制。知道什么是Eden Space,S0 Space,S1 Space和Old Space以及Perm Space等

关于Java内存管理和垃圾回收的理论知识可以参考文章

http://www.journaldev.com/2856/java-jvm-memory-model-and-garbage-collection-monitoring-tuning

$ sudo /opt/app/jdk/bin/jstat -gc 30166
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT   
195904.0 195904.0 19609.5  0.0   1567680.0 561577.4 13769152.0 2668191.5  42944.0 42827.3   8714  345.808   0      0.000  345.808

$ sudo /opt/app/jdk/bin/jstat -gcutil 30166
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
 10.01   0.00  90.27  19.38  99.73   8714  345.808     0    0.000  345.808
$ sudo /opt/app/jdk/bin/jstat -gccapacity 30166
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC 
1959488.0 1959488.0 1959488.0 195904.0 195904.0 1567680.0 13769152.0 13769152.0 13769152.0 13769152.0  21248.0 169984.0  42944.0  42944.0   8717     0

-gc 和 -gccapacity显示的大小是KB

显示两行信息

如果通过zabbix agent的方式获取不同字段的值

可以这样

sudo /opt/app/jdk/bin/jstat -gcutil 30166|awk ‘{print $4}’|grep -E ‘1

如果使用zabbix sender的方式发送数据,可以将显示的结果生成一个python字典

{‘S0’:7.43,‘S1’:0.00,‘E’:86.62’,…}

将这个字典中的数据全部通过zabbix_sender发送到zabbix_proxy或者zabbix_server,需要注意的是zabbix_sender指定的主机名需要和zabbix页面配置的主机名相同

Java服务发现脚本

java_discovery.py

脚本中的发现规则根据情况自己定义,这里定义三个规则,/opt/app/下面所有tomcat-开头的tomcat服务,/opt/logs/logstash/和/opt/app/elasticsearch目录下的规则

#/usr/bin/python
#This script is used to discovery disk on the server
import subprocess
import os
import socket
import json
import glob

java_names_file='java_names.txt'
javas=[]


if os.path.isfile(java_names_file):
#   print 'java_names_file exists!'
#####
##### here should use % (java_names_file) instead of using the python variable java_names_file directly inside the '''   ''' quotes
#####

   args='''awk -F':' '{print $1':'$2}' %s'''  % (java_names_file)
   t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0]
elif glob.glob('/opt/app/tomcat-*') and not os.path.isdir('/opt/logs/logstash') and not os.path.isdir('/opt/app/elasticsearch/config'):
   t=subprocess.Popen('ls /opt/app/tomcat-*|grep tomcat_',shell=True,stdout=subprocess.PIPE)

elif not glob.glob('/opt/app/tomcat-*') and os.path.isdir('/opt/logs/logstash') and not os.path.isdir('/opt/app
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值