利用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. OpenCV实战:人脸关键点检测(FaceMark)

    Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author:    Amusi Date:       2018-03-20 ...

  2. spfa 单源最短路究极算法

    学习博客链接:SPFA 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm.     SPFA算法是西南交通大学段凡丁于1994年发表的.    从名字我 ...

  3. springboot @PropertySource

    @ConfigurationProperties(prefix="person") 默认加载全局配置文件 application.properties或application.ym ...

  4. Harbor私有镜像仓库无坑搭建

    转载:https://k8s.abcdocker.com/kubernetes_harbor.html 一.介绍 Docker容器应用的开发和运行路不开可靠的镜像管理,虽然Docker官方也提供了公共 ...

  5. docker 学习笔记(2)--doucker file命令

    FROM base       ---- imageRUN                  ---- 执行命令ADD   ---- 添加文件COPY         ---- 拷贝文件CMD    ...

  6. B1015 德才论 (25 分)

    19/25 #include<bits/stdc++.h> using namespace std; /* 1.de>=H && cai>=H 2.de> ...

  7. 了不起的Node.js--之四

    阻塞与非阻塞IO 绝大多数对node.js的讨论都把关注点放在了其处理高并发的能力上.Node框架给开发者提供了构建高性能网络应用的强大能力. 我使用的开发工具是Mac版的WebStorm,这个工具支 ...

  8. sqlserver-表分区

    最近对公司数据库性能方面改造.现已初建成效. 公司原先数据库问题颇多,简单列举下: 1.数据表文档缺失. 2.数据库900多张表,接近一半都是备份和一些报表,没有分库处理 3.大数量的表按照年份人工导 ...

  9. PAT甲题题解-1025. PAT Ranking (25)-排序

    排序,求整体的排名和局部的排名整体排序,for循环一遍同时存储整体目前的排名和所在局部的排名即可 #include <iostream> #include <cstdio> # ...

  10. Linux实验报告

    第一次链接: http://www.cnblogs.com/L1nke/p/4966820.html 第二次链接: http://www.cnblogs.com/L1nke/p/4992758.htm ...