利用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. ubuntu 12.04 桌面版关闭图形界面

    对于12.04的ubuntu桌面系统,如果想在开机的时候直接进入字符界面,那可以: 编辑文件 /etc/init/lightdm.conf,在第12行附近,原句“ and runlevel [!06] ...

  2. JAVA eclipse Maven项目红叹号解决方案

    我是通过 Windows --> show view --> problems 查看到发现 ch.qos.logback 1.1.1 出现了错误, 于是我换成了 ch.qos.logbac ...

  3. dubbo见解

    调用关系说明 服务容器负责启动,加载,运行服务提供者. 服务提供者在启动时,向注册中心注册自己提供的服务. 服务消费者在启动时,向注册中心订阅自己所需的服务. 注册中心返回服务提供者地址列表给消费者, ...

  4. python 函数学习

    print dic.items() #[('a', 'hello'), ('c', 'you'), ('b', 'how')] print dic.iteritems() #<dictionar ...

  5. fis入门-单文件编译之文件优化(optimize)

    FIS(Front-end Integrated Solution ),是百度的前端集成解决方案.最近几天在研究前端构建的东西,就顺便了解了下,果断各种高大上,可以到FIS官网围观感受一下.如果对fi ...

  6. Scrapy持久化存储

    基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作; 执行输出指定格式进行存储:将爬 ...

  7. WebShell代码分析溯源(第1题)墨者学院

    一.访问链接 二.下载系统源码后直接放到D盾里扫描,扫到后门文件 三.查看该木马文件 <?php error_reporting(0); $_GET['POST']($_POST['GET']) ...

  8. final评论1

    1-约跑APP 小组准备的非常的充分,还带了摄像头,发布过程清晰.团队的约跑项目界面相较于Beta版本进行了美化,增加了背景图片,使项目看起来更美观.同时项目支持聊天信息的接收和发送,个人觉得他们组的 ...

  9. 获取select的 text

    JS获取select的value和text值的简单实例 感谢 3lian8 的投递 时间:2014-02-27 来源:三联教程 本篇文章主要是对JS获取select的value和text值的简单实例进 ...

  10. ionic npm安装报错 no such file ,解决办法

    Install the latest version of NodeJS from their website (e.g. 6.X.X). Open the Node.js command promp ...