设为首页 收藏本站
查看: 1350|回复: 0

[经验分享] Zabbix应用五:Zabbix监控多Tomcat

[复制链接]

尚未签到

发表于 2017-12-31 15:07:17 | 显示全部楼层 |阅读模式
  利用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=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监控页面中创建监控项,来接收存放客户端发来的数据。
  首先创建一个模版,方便套用:
  配置-模版-创建模版,输入模版的名字和应用的主机即可。
  创建监控项:
  配置-模版-监控项-创建监控项,如下图:
DSC0000.png

  注意其中类型、键值和信息类型几项。这里信息类型选择浮点行,是因为采集到的数据有小数。
  按照以上创建所有需要监控的项。
  2、添加计划任务,每分钟采集一次数据发送给zabbix服务端:
  

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

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

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

  最后生成模版:
  zbx_export_templates.xml

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-430277-1-1.html 上篇帖子: 自动化监控利器 下篇帖子: zabbix常用配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表