利用Zabbix Trapper方式监控多Tomcat实例

Zabbix自带的模版(JMX Tomcat、JMX Generic)默认只能在一台机器上监控一个tomcat实例(因为监控项中的key不能重复),而实际生产环境中一台服务器往往会启动多个tomcat实例,这就显得比较鸡肋。

然而,我们可以自定义监控项,将搜集到的jvm数据发送给zabbix服务端,然后创建监控项、图形等。

基本思路:

1、在tomcat服务器中编写自动发现tomcat服务的脚本,并搜集每个tomcat实例的名称(作为辨别)和PID(便于使用jstat工具搜集JVM数据)。

2、调用JAVA的jstat工具,分别获取每个tomcat的性能参数,保存到临时文件中。

3、在Zabbix服务端设置监控项,填写监控名称、key等信息

4、调用zabbix_sender命令,将保存数据的文件通过Zabbix Trapper通道发送给Zabbix服务端。

5、Zabbix服务端收到数据,根据数据创建图形。

好,思路捋清后,接下来就是撸撸撸起袖子加油干干干:

1、Tomcat服务上运行的数据搜集脚本如下:

#!/usr/bin/python

import os
import sys
import commands tomcats=[]
tomcat_pid={} jstat='/data/java/jdk1.7/bin/jstat'
jstack='/data/java/jdk1.7/bin/jstack'
zbx_sender='/usr/local/zabbix/bin/zabbix_sender'
zbx_tmp_file='/tmp/zbx_tmp_file'
HostName='192.168.154.6'
jstat_dict = {
"S0":"Young.Space0.Percent",
"S1":"Young.Space1.Percent",
"E":"Eden.Space.Percent",
"O":"Old.Space.Percent",
"P":"Perm.Space.Percent",
"FGC":"Old.Gc.Count",
"FGCT":"Old.Gc.Time",
"YGC":"Young.Gc.Count",
"YGCT":"Young.Gc.Time",
"GCT":"Total.Gc.Time",
"PGCMN":"Perm.Gc.Min",
"PGCMX":"Perm.Gc.Max",
"PGC":"Perm.Gc.New",
"PC":"Perm.Gc.Cur",
"Tomcat.Thread":"Tomcat.Thread"
}
#1,get tomcat name & pid
def discoveryNamePid():
getTomcatName_cmd="ps -ef | grep '.service'| grep -v grep | awk -F '/' '{print $(NF-1)}'| awk -F '.' '{print $1}'"
ResName=os.popen(getTomcatName_cmd).readlines()
for name in ResName:
tomcats.append(name.strip('\n'))
for i in tomcats:
cmd="ps -ef | grep %s | grep -v grep | awk '{print $2}'" % i
pid=os.popen(cmd).read()
tomcat_pid[i]=pid.strip('\n')
return tomcat_pid #2,get tomcat status def getStatus(cmd,args,pid):
value=commands.getoutput('%s -%s %s' % (cmd,args,pid)).strip().split('\n')
kv=[]
vv=[]
for i in value[0].split(' '):
if i != '':
kv.append(i)
for i in value[1].split(' '):
if i != '':
vv.append(i)
data=dict(zip(kv,vv))
return data def getThread(pid):
value=commands.getoutput('%s %s | grep http | wc -l' % (jstack,pid))
data={"Tomcat.Thread":value}
return data def fileEmpty():
with open(zbx_tmp_file,'w') as f:
f.truncate() def getJVMStatus(TomcatName,pid):
gcutil_data=getStatus(jstat,"gcutil",pid)
gccapacity_data=getStatus(jstat,"gccapacity",pid)
thread_data=getThread(pid)
data_dict=dict(gcutil_data.items()+gccapacity_data.items()+thread_data.items())
for jmxkey in data_dict.keys():
if jmxkey in jstat_dict.keys():
cur_key=jstat_dict[jmxkey]
zbx_data="%s jstat[%s,%s] %s" %(HostName,TomcatName,cur_key,data_dict[jmxkey])
with open(zbx_tmp_file,'a') as file_obj:
file_obj.write(zbx_data + '\n')
def sendData():
send_cmd="%s -z 192.168.153.12 -s '192.168.154.6' -i %s" % (zbx_sender,zbx_tmp_file)
os.system(send_cmd) if len(zbx_tmp_file) !=0:
fileEmpty()
for TomcatName in discoveryNamePid().keys():
pid=tomcat_pid[TomcatName]
getJVMStatus(TomcatName,pid)
sendData()

代码大体思路就是:

  .1、定义需要搜集项的数据名称

  .2、收集系统中运行的tomcat实例,取名称和PID

  .3、根据PID调用jstat命令生成jvm性能数据

  .4、将生成的数据存放在临时文件中

  .5、调用zabbix_sender命令,将临时文件发送给zabbix服务端

生成的临时文件内数据格式如下(节选):

192.168.154.6 jstat[content,Young.Space1.Percent] 34.38
192.168.154.6 jstat[content,Young.Space0.Percent] 0.00
192.168.154.6 jstat[content,Young.Gc.Time] 6.342
192.168.154.6 jstat[content,Old.Gc.Time] 0.221
192.168.154.6 jstat[content,Perm.Gc.New] 75264.0
192.168.154.6 jstat[content,Total.Gc.Time] 6.564
192.168.154.6 jstat[product,Young.Space1.Percent] 0.00
192.168.154.6 jstat[product,Young.Space0.Percent] 87.50
192.168.154.6 jstat[product,Young.Gc.Count] 3990
192.168.154.6 jstat[product,Young.Gc.Time] 22.918
192.168.154.6 jstat[product,Old.Gc.Time] 1.597
192.168.154.6 jstat[product,Perm.Gc.New] 131072.0
192.168.154.6 jstat[product,Total.Gc.Time] 24.516
192.168.154.6 jstat[order,Young.Space1.Percent] 0.00
192.168.154.6 jstat[order,Young.Space0.Percent] 3.23
192.168.154.6 jstat[order,Eden.Space.Percent] 48.40
192.168.154.6 jstat[order,Old.Space.Percent] 59.65
192.168.154.6 jstat[order,Perm.Space.Percent] 83.46

其中,第一列是主机名(注意:和zabbix配置文件中的Hostname相同),第二列是key(创建监控项时的key),第三列就是值了。

2、客户端采集到数据后,zabbix服务端需要接收这些数据。但是数据放在哪呢?监控项!需要在zabbix监控页面中创建监控项,来接收存放客户端发来的数据。

首先创建一个模版,方便套用:

配置-模版-创建模版,输入模版的名字和应用的主机即可。

创建监控项:

配置-模版-监控项-创建监控项,如下图:

注意其中类型、键值和信息类型几项。这里信息类型选择浮点行,是因为采集到的数据有小数。

按照以上创建所有需要监控的项。

2、添加计划任务,每分钟采集一次数据发送给zabbix服务端:

*/1 * * * * /scripts/zabbix_tomcat/jvmstatus.py

3、如果一切正常,在zabbix监控页面‘最新数据’中即可收到发来的数据,并且可自动生成图形,如下图:

点击右侧的图形,就可以看到趋势图了:

最后生成模版:

zbx_export_templates.xml

Zabbix应用五:Zabbix监控多Tomcat的更多相关文章

  1. 添加zabbix自动发现(监控多tomcat实例)

    说明 何为自动发现?首先我们监控多tomcat实例,如果一个个实例地添加或许可以完成当前需求.但是日后随着实例的增多,再手动一个个去添加就十分不方便了.这时候需要自动发现这个功能,来帮助我们自动添加监 ...

  2. zabbix监控MySQL,Tomcat及配置邮件报警

    目录 一.思路 二.部署.配置 环境 安装zabbix 对zabbix进行初步优化 添加监控主机 部署监控Tomcat 配置邮件报警 三.总结 一.思路 首先搭建zabbixserver,本机需要安装 ...

  3. 五 Zabbix全网监控

    监控的作用 我们的职责   1.保障企业数据的安全可靠.   2.为客户提供7*24小时服务.   3.不断提升用户的体验.在关键时刻,提前提醒我们服务器要出问题了当出问题之后,可以便于找到问题的根源 ...

  4. 分布式系统监视zabbix讲解五之web监控--技术流ken

    Web 监控 概况 你可以使用 Zabbix 检查几个网站可用性方面. 如果要使用 Web 检测功能,必须在 编译Zabbix 的时候加入 cURL(libcurl) 的支持. 要使用 Web 监控, ...

  5. 分布式系统监视zabbix讲解五之web监控

    Web 监控 概况 你可以使用 Zabbix 检查几个网站可用性方面. 如果要使用 Web 检测功能,必须在 编译Zabbix 的时候加入 cURL(libcurl) 的支持. 要使用 Web 监控, ...

  6. 分布式系统监视zabbix讲解十之监控tomcat--技术流ken

    前言 在Zabbix中,JMX监控数据的获取由专门的代理程序来实现,即Zabbix-Java-Gateway来负责数据的采集,Zabbix-Java-Gateway和JMX的Java程序之间通信获取数 ...

  7. Zabbix的集中式监控

    相对于传统的ZABBIX硬件系统级监控(CPU,内存,硬盘,网卡),应用级的监控就显得有些复杂了. 如果对不同的应该来不同的应用,配置会很多的. 如果我们能在一个指定的AGENT上监控所有的APACH ...

  8. 网站集群架构(LVS负载均衡、Nginx代理缓存、Nginx动静分离、Rsync+Inotify全网备份、Zabbix自动注册全网监控)--技术流ken

    前言 最近做了一个不大不小的项目,现就删繁就简单独拿出来web集群这一块写一篇博客.数据库集群请参考<MySQL集群架构篇:MHA+MySQL-PROXY+LVS实现MySQL集群架构高可用/高 ...

  9. 8、zabbix监控方式及分布式监控(04)

    zabbix支持的监控方式 zabbix所能够显示的且可指定为监控接口类型的监控方式: Agent passive active SNMP:Simple Network Management Prot ...

随机推荐

  1. mfc CSpinButton

    知识点: CSliderCtrl(滑块)控件 CSliderCtrl常用属性 CSliderCtrl类常用成员函数 CSliderCtrl运用示例 一.CSliderCtr常用属性 Orientati ...

  2. 在git与tortoisegit中使用openSSH与PuTTY

    问题 在使用Git与tortoisegit的时候,指定远程版本库的地址有2种方式: 使用https方式的git地址非常直接(https://xxx.oschina.net/xxx.git),基本上什么 ...

  3. 在 OSX 下使用 supervisor 管理服务

    我为什么想用 supervisor 来管理服务呢?因为我在系统管理上属于处女座+任性的气质. OSX 下办公用的是普通用户,我不想在 root 权限下做过多设置污染我的系统. OSX 下的服务管理我感 ...

  4. 软件测试_测试工具_LoadRunner

    最近正在逐步学习软件测试工具的使用,此文章也是用来当做笔记以供记录之用.如有问题,还请多多指出. 安装LoadRunner基本步骤从网上搜索即可找到,特此提供部分链接参考(其中附带软件下载): 1.L ...

  5. 32bit 天堂2脚本修改资料大全【客户端+服务端】

    该资料夹中所有教程资料全部适合天堂2初章32位服务端的脚本修改,已经1.2章相关客户端的修改. https://pan.baidu.com/s/1RuGMFNgERd2JMYQpdceQwg 提取码: ...

  6. Win10 + vs2017 编译并配置tesseract4.1.0

    tesseract 是一个开源的OCR (Optical Character Recognition , 光学字符识别) 引擎,本文就介绍一下自己在编译 tesseract4.1.0时遇到的一些坑,希 ...

  7. 在windows10上安装caffe和tensorflow

    最近在Windows10上安装了caffe和tensorflow,折腾了好久.在此记录一下. 安装caffe的过程已在另一篇博客中进行了记录,在此不再赘述.而tensorflow也是非常简单的,也不再 ...

  8. ini_set的用法介绍

    https://www.cnblogs.com/xieqian111/p/5367732.html

  9. linux内核分析第二周

    网易云课堂linux内核分析第二周 20135103                王海宁 <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

  10. 浅谈个人对RAID技术的理解

    RAID,字面意思为一种廉价的冗余磁盘阵列,它是通过将大量的磁盘分组,实现了数据冗余,目的是为了保护数据.RAID现已经应用于计算机各个领域.它的优点是降低了工作成本并提高了效率,并且使系统有稳定的运 ...