利用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. CSS快速入门-组合选择器

    <div class="gradefather"> hello1 <div class="father">hello2 <p cl ...

  2. 软件测试_Loadrunner_APP测试_性能测试_脚本录制_基本操作流程

    这次主要是写一下使用Loadrunner对APP进行性能测试的基本流程,有关性能测试监控指标请查看链接:软件测试_性能测试_关注点. 先决条件:已安装Loadrunner.如未安装,请查看链接:软件测 ...

  3. Markdown基本使用方法

    最近开通了博客,看到网上好多推荐markdown的,而且博客园支持markdown,所以决定学习一下. 百度百科对markdown的介绍: Markdown是一种可以使用普通文本编辑器编写的标记语言, ...

  4. 修炼内功_day01

    测试六段:    测试第一段:        - 能根据测试用例的描述步骤来执行用例        - 能对照用例的预期结果发现产品的问题        - 能够清晰准确的将问题记录下来后反馈给开发, ...

  5. c语言数字图像处理(三):仿射变换

    仿射变换及坐标变换公式 几何变换改进图像中像素间的空间关系.这些变换通常称为橡皮模变换,因为它们可看成是在一块橡皮模上印刷一幅图像,然后根据预定的一组规则拉伸该薄膜.在数字图像处理中,几何变换由两个基 ...

  6. [翻译]:Artificial Intelligence for games 5.3 STATE MACHINES:状态机

    目录 Chapter 5 Decision Making 5.3 STATE MACHINES:状态机 Chapter 5 Decision Making 5.3 STATE MACHINES:状态机 ...

  7. PAT甲题题解-1008. Elevator (20)-大么个大水题,这也太小瞧我们做题者的智商了

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <cstr ...

  8. 11.4 Daily Scrum

    今天依旧是学习阶段,大家继续学习安卓的一些相关内容,并尝试将要用到的数据的API应用到程序中去.   Today's tasks  Tomorrow's tasks 丁辛 餐厅列表json/xml数据 ...

  9. Linux内核分析-两种方式使用同一个系统调用

    实验部分 根据系统调用表,选取一个系统调用.我选得是mkdir这个系统调用,其系统调用号为39,即0x27 由于mkdir函数的原型为 int mkdir (const char *filename, ...

  10. 我与git“美妙”的一天

    今天是第一天使用git,苦不堪言,感觉服务器和自己都要爆炸了,弄了半天才马马虎虎会了一点,基本流程如下 1.在mukever.online注册用户 2.下载git for windows(一个客户端) ...