精华内容
下载资源
问答
  • zabbix自动发现JAVA进程,并进行自动添加监控JAVA 进程的JVM数据,统计分析告警监控。 支持多种中间件,tomcat、weblogic、微服务方式部署JAVA应用监控。...自带发现脚本和监控脚本,以及zabbix导入模板。
  • 用于zabbix监控脚本-批量获取docker容器名称及容器中的java进程ID,将结果格式化为json格式,直接返回给zabbix
  • 1. 在zabbix agent上修改配置文件 vi /usr/local/zabbix/conf/zabbix.agentd.conf 有两种修改方式: 第一种: 找到 # UnsafeUserParameters=0 改为 ...key:服务器添加监控时需用到的key值 shell co..

    1. 在zabbix agent上修改配置文件

    vi /usr/local/zabbix/conf/zabbix.agentd.conf

    有两种修改方式:

    第一种:

    找到 # UnsafeUserParameters=0 改为  UnsafeUserParameters=1

    找到 # UserParameter=  在下面直接添加用户参数

    UserParameter=<key>,<shell command>

    key:服务器添加监控时需用到的key值

    shell command:监控脚本的绝对路径

    例:UserParameter=tomcat,/home/zabbix/monitor/tomcat.sh         (注意用逗号隔开)

    如果要添加多个监控项,就依次写多个UserParameter

    第二种:

    找到 # Include=/usr/local/etc/zabbix_agentd.conf.d/    在下面添加读取用户参数的文件路径

    Include=/usr/local/zabbix/conf/zabbix_agentd/

    然后在/usr/local/zabbix/conf/zabbix_agentd/下创建userparameter.conf 文件,编辑此文件

    vi /usr/local/zabbix/conf/zabbix_agentd/userparameter.conf

    添加想要监控的项,比如UserParameter=tomcat,/home/zabbix/monitor/java.sh

    多个自定义监控项都可写在这个文件里

    配置完成后重启zabbix agent服务

    2. 在zabbix server端

    用zabbix_get命令获取添加的监控项检测是否生效

    如:/usr/local/zabbix/bin/zabbix_get -s 192.168.179.128 -k tomcat

    -s:添加自定义脚本的zabbix agent的主机ip

    -k:key值

    示例

     

    zabbix自带的默认模版里包括了很多监控项,有时候为了满足业务需求,需要根据自己的监控项目自定义监控项,这里介绍一种自定义监控项的方式。

    首先编写自定义监控脚本,本文以监控mysql进程是否存在为例。

      脚本名字:check_mysql.sh

      脚本目录(这个目录可以自定义):/etc/zabbix/zabbix_scripts

      脚本内容:

    mysql_master=$1
    master_slave=$3
    
    mysql_master_port=$2
    master_slave_port=$4
    
    user=$5
    password=$6
    
    master_logpos=`mysql -h ${mysql_master} -P ${mysql_master_port} -u ${user} -p${password} -e 'show master status;' |awk '{print $2}' |tail -1`
    slave_logpos=`mysql -h ${master_slave} -P ${master_slave_port} -u ${user} -p${password} -e 'show slave status\G' |grep Exec_Master_Log_Pos |awk '{print $2}'`
    
    Slave_IO_status=`mysql -h ${master_slave} -P ${master_slave_port} -u ${user} -p${password} -e 'show slave status\G' |grep -E 'Slave_IO_Running:' |awk '{print $2}'`
    Slave_SQL_status=`mysql -h ${master_slave} -P ${master_slave_port} -u ${user} -p${password}  -e 'show slave status\G' |grep -E 'Slave_SQL_Running:' |awk '{print $2}'`
    
    
    print_info() {
    
    	echo "" 
    	echo "`date`"
    	echo "${mysql_master} ${master_slave} checksum result:" 
    	echo Slave_IO_status: ${Slave_IO_status} 
    	echo Slave_SQL_status: ${Slave_SQL_status}
    	echo master_logpos: ${master_logpos}
    	echo slave_logpos: ${slave_logpos}
    }
    
    
    if [ ${Slave_IO_status} == 'Yes' ] && [ ${Slave_SQL_status} == 'Yes' ];then
    
    	if [ ${master_logpos} -eq ${slave_logpos} ];then
    
    		print_info
    		echo checkcums is ok
    
    	else
    
    		print_info
    		echo checkcums is failed
    
    	fi	
    
    else
    
    	print_info
    	echo checkcums is failed
    
    fi	
    

    2,修改zabbix_agentd.conf配置文件

      第一个:默认为0,此处我们将它改为1,改为1以后,表示用户自定义的脚本中可以包含特殊字符。

             第二个:为我们自定义监控项,格式为:UserParameter=<键值>,<命令>。这里我们自定义键值为:check_mysql,要执行的命令为执行check_mysql.sh这个脚本。

    说明:添加完成以后,重启zabbix_agentd才会生效。

    ### Option: UnsafeUserParameters
    #       Allow all characters to be passed in arguments to user-defined parameters.
    #       The following characters are not allowed:
    #       \ ' " ` * ? [ ] { } ~ $ ! & ; ( ) < > | # @
    #       Additionally, newline characters are not allowed.
    #       0 - do not allow
    #       1 - allow
    #
    # Mandatory: no
    # Range: 0-1
    # Default:
    UnsafeUserParameters=1
    
    ### Option: UserParameter
    #       User-defined parameter to monitor. There can be several user-defined parameters.
    #       Format: UserParameter=<key>,<shell command>
    #       See 'zabbix_agentd' directory for examples.
    #
    # Mandatory: no
    # Default:
    UserParameter=mysql_check,sh /etc/zabbix/zabbix_scripts/check_mysql.sh

    3,选择要增加监控项的主机

     

     

    4,创建监控项

     

    查看监控数据 

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • zabbix_get是zabbix获取监控项的可执行文件,通过指定监控的机器以及端口、监控key,可以获取相应的监控value。...我们可以通过java-proxy对java进行jmx监控,获取java-proxy的监控项比较特殊,所以需要具体的脚本
  • 一.zabbix监控nginx 1.安装nginx 服务 rpm -ivh nginx-1.8.0-1.el6.ngx.x86_64.rpm 2.编辑nginx的配置文件cd /etc/nginx/conf.d/ vim default.conf server { listen 80; server_name localhost; #charse...

    一.zabbix监控nginx

    1.安装nginx 服务
    rpm -ivh nginx-1.8.0-1.el6.ngx.x86_64.rpm
    2.编辑nginx的配置文件cd /etc/nginx/conf.d/
    vim default.conf
    server {
    listen 80;
    server_name localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;
    
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    
    location /status {
        stub_status   on;
        # Nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 本模块默认是不会编译进Nginx的,如果你要使用该模块,则要在编译安装Nginx时指定:./configure –with-http_stub_status_module 
        access_log    off;
        # 关闭日志记录
        allow 127.0.0.1;        # 只允许本机访问
        deny all;
    }
    

    这里写图片描述
    3.利用curl http://127.0.0.1/status访问nginx用来做测试
    这里写图片描述
    4.过滤监控参数(访问次数,连接次数等等)
    curl -s http://127.0.0.1/status | grep Active | awk ‘{print $NF}’
    将过滤出来的参数以key—value键值对的形式存储:

    cd /etc/zabbix/zabbix_agentd.d 
    cp userparameter_mysql.conf userparameter_nginx.conf   # 利用监控mysql服务的配置文件模版复制一份给nginx服务
    vim userparameter_nginx.conf
    UserParameter=nginx.active,curl -s http://127.0.0.1/status | grep Active | awk '{print $NF}'       # 获取连接数
    UserParameter=nginx.accepts,curl -s http://127.0.0.1/status | awk NR==3 | awk '{print $1}'          # 获取接受请求数
    UserParameter=nginx.handled,curl -s http://127.0.0.1/status | awk NR==3 | awk '{print $2}'          # 获取建立三次握手的次数
    UserParameter=nginx.requests,curl -s http://127.0.0.1/status | awk NR==3 | awk '{print $3}'        # 获取请求次数

    5.打开zabbix-agent ,可以在监控主机中监控
    /etc/init.d/zabbix-agent start

    6.在监控主机中(server1)中安装rpm -ivh zabbix-get-3.4.6-1.el7.x86_64.rpm

    zabbix_get 是 zabbix 服务端的一个命令,用于检测 agent 端的配置是否正确,可以很方便地知道 key是否能正常获取到数据,在测试自定义监控的时候特别有用

    获取agent端的键值:zabbix_get -s 172.25.1.4 -p 10050 -k ‘nginx.active’
    7.在zabbix网页中加入监控项和图形,开始检测
    (1)选择监控主机
    这里写图片描述
    (2)添加监控项(可多次添加)
    这里写图片描述
    这里写图片描述
    这里写图片描述
    (3)添加监控图形
    这里写图片描述

    二.向zabbix监控中导入模版监控mysql的模版percona

    在server1(zabbix监控端)中:
    1.安装percona-zabbix模版
    rpm -ivh percona-zabbix-templates-1.1.8-1.noarch.rpm
    这里写图片描述
    2.拷贝userparameter_percona_mysql.conf 文件到被监控的mysql服务器上(此时也是server1主机)

    cd /var/lib/zabbix/percona/templates
    cp userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/

    3.测试percona的脚本,过滤监控项有190个

    /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg    # 测试脚本
    cd /etc/zabbix/zabbix_agentd.d
    cat userparameter_percona_mysql.conf      # 监控项

    systemctl restart zabbix_agent
    4.由于percona的监控脚本是使用php写的,所以需要准备好php运行环境,这里直接用yum安装.安装完成后将zabbix的数据库和密码写入php脚本中…

    yum install php php_fpm
    vim ~zabbix/.my.cnf
    [client]
    user = root
    password =jay
    systemctl restart zabbix-agent

    5.在zabbix的web端导入模版
    这里写图片描述
    这里写图片描述
    在模版库中查看:
    这里写图片描述
    可以尝试在让某台主机使用该模版,添加进去则为成功:
    这里写图片描述

    三、zabbix使用JMX监控tomcat

    1.在server4(agent的客户端)上安装tomcat和jdk,并打开tomcat

    rpm -ivh jdk-8u121-linux-x64.rpm
    tar zxf  apache-tomcat-7.0.90.tar.gz -C /usr/local/
    cd /usr/local/
    ln -s apache-tomcat-7.0.90/ tomcat   # 做软连接
    cd bin/
    ./startup.sh
    netstat -antlp

    这里写图片描述
    查看8080端口是否被打开:
    这里写图片描述
    2.向tomcat中添加JMX的参数
    —–JMX全称Java Management Extensions, 为Java应用提供管理扩展功能

    vim catalina.sh
    CATALINA_OPTS='-Dcom.sun.management.jmxremote
      -Dcom.sun.management.jmxremote.port=8888
      # 监听端口号,方便远程访问
      -Dcom.sun.management.jmxremote.ssl=false
      # 是否对连接开启SSL加密,默认开启
      -Dcom.sun.management.jmxremote.authenticate=false'
      # 是否需要开启用户认证,默认开启
    
    # OS specific support.  $var _must_ be set to either true or false.
    
    
    ./shutdown.sh 
    ./startup.sh   # 重新启动tomcat

    3.在server1(zabbix服务端)上:

    yum install zabbix-java-gateway-3.4.6-1.el7.x86_64.rpm
    systemctl start zabbix-java-gateway
    

    4.在zabbix的web界面
    (1)选择监控主机
    (2)添加模版
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

    四.连接zabbix与告警系统

    当我们在zabbix设置好了种种需要监控的主机和服务时,如果某个服务出错需要人为解决,那么我们怎样才能第一时间得知,有一个很好的告警系统—one alter云告警系统来及时将告警信息通知到我们..
    1.在zabbix的配置文件中查看zabbix的监控告警目录
    vim /etc/zabbix/zabbix_server.conf
    这里写图片描述
    2.获取应用key
    (1)登陆云告警系统(www.oneitem.com)并设置个人信息,如果需要告警发送到微信,则需要绑定微信
    这里写图片描述
    (2)在配置—>应用—->添加应用—–>zabbix
    这里写图片描述
    3.在zabbix的监控告警目录下解压安装告警软件(必须在该路径下,否则会报错,告警不能及时送达)

    tar zxf oneitsm_zabbix_release-1.2.0.tar.gz
    cd oneitsm/bin/
    ./install.sh  17fbfa27-5581-c92b-da67-1d90f2832bb6     # 利用应用key安装

    这里写图片描述
    4.在zabbix的web界面中添加告警媒介
    管理—–>告警媒介类型—–>创建媒体类型(右上角)
    这里写图片描述

    这里写图片描述
    5.排除别的可以触发告警的告警源(在该实验环境下,我们监控的mysql数据库没有slave端,这时可以触发告警的,所以我们需要将与mysql的slave相关的全部禁用)
    这里写图片描述
    6.查看告警用户
    这里写图片描述
    7.触发器触动告警条件
    这里写图片描述
    8.测试:在server4端关闭zabbix-agent
    过了告警处理时间,告警系统会根据你设定的告警媒介发送告警消息,同时在告警系统中也可以看到告警情况,当有人认领该告警接着处理告警后,也会在告警系统中送达,:
    这里写图片描述
    在zabbix的web端也可以看到告警的处理情况:
    这里写图片描述

    展开全文
  • 用于zabbix监控脚本-批量获取docker容器名称及容器中的java进程ID,将结果格式化为json格式,直接返回给zabbix
  • zabbix 监控java程序

    2016-11-10 10:05:00
    利用了周末的时间,通过使用shell脚本+java工具jstat+zabbix实现监控主机上多jvm实例的功能。 第一章:概念的理解  首先,既然要监控jvm状态,那就必须要了解jvm里面的信息,楼主通过搜索资料加自动脑补,把网上的...

    http://www.tuicool.com/articles/IRnM7f

    http://transcoder.baidu.com/from=1012852q/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401320_1004%2Cta%40iphone_2_6.0_11_8.1/baiduid=BF9750A8FBBD8D7B1A6C0FF1B11B9361/w=0_10_/t=iphone/l=3/tc?ref=www_iphone&lid=11643698853529475530&order=8&fm=alop&tj=www_normal_8_0_10_title&vit=osres&m=8&srd=1&cltj=cloud_title&asres=1&title=Zabbix%E4%BD%BF%E7%94%A8%E8%87%AA%E5%8A%A8%E5%8F%91%E7%8E%B0%E5%8A%9F%E8%83%BD%E7%9B%91%E6%8E%A7%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%90%84JVM%E8%BF%9B%E7%A8%8B%E7%8A%B6%E6%80%81_%E6%9C%8D%E5%8A%A1...&dict=20&w_qd=IlPT2AEptyoA_yifHUGfIjivFDRVjGKcJwCUrP_fdP2Z&sec=16560&di=c71bd6d2d6498662&bdenc=1&tch=124.523.279.1377.1.467&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IEQGG_yJR0CumpEm9xP4kHREsRFv7Lmq3ZpPPdj0PtwIFuWGdWWUp8BF1t0IwdzW&eqid=a196ba6a943f5800100000045823c2ab&wd=&clk_info=%7B%22srcid%22%3A%221599%22%2C%22tplname%22%3A%22www_normal%22%2C%22t%22%3A1478738753820%2C%22xpath%22%3A%22div-a-h3%22%7D

     

     

     

    Zabbix使用自动发现功能监控服务器各JVM进程状态

    [日期:2016-09-12] 来源:Linux社区

    前言
    ==========
    为什么需要做服务器jvm自动发现的监控呢?这个事情主要有两点原因:
        1.zabbix默认监控jvm状态是使用jmx中转进行监控的,监控效率比较低下
        2.zabbix使用jmx监控jvm的时候由于一个主机上的键值不能重复,也就导致了一台主机上只能监控一个jvm实例
        以上两点原因导致zabbix通过jmx监控jvm的实现不是很理想,加上最近老大要求收集服务器上面跑的所有java应用的信息,于是自己琢磨了下,还是自己动手,丰衣足食。利用了周末的时间,通过使用shell脚本+java工具jstat+zabbix实现监控主机上多jvm实例的功能。
    第一章:概念的理解
     首先,既然要监控jvm状态,那就必须要了解jvm里面的信息,楼主通过搜索资料加自动脑补,把网上的资料取其精华,去其糟粕,整理了一下。JVM中的内存分类分为堆内存和非堆内存,堆内存是给实际应用使用的,非堆内存是给jvm容器使用的。我们主要关心的是堆内存这块。在堆内存里面,给内存分为如下几块:
     1.Young代(年轻代)
     2.Old代(老年代)
     3.Perm代(永久代)(关于这一点,在JDK7和JDK8中情况不一样,将在后面进行分析)
     其中,年轻代里面又分成了三块,如下:
     1.Eden代(伊甸园代)
     2.survivor0代(0号幸存区)
     3.survivor1代(1号幸存区)
     至于更详细的关于JVM堆内存的信息,各位可以自行百度或者google,我这里就不赘述了,毕竟我也是个半桶水,自己找了点资料外加脑补到的一些东西,不敢在关公门前耍大刀了。
     当然,还得科普一个东西,那就是GC,所谓的GC就是JVM在运行的时候会有一个垃圾回收机制,这个垃圾回收机制是什么情况呢?就是在程序运行的时候会产生很多已经不使用的空间,但还是被占用了的情况,这样会造成很多不必要的浪费,于是JVM就有一个垃圾回收机制,针对程序中已经不使用的内存资源,会进行回收释放,这个过程就叫做GC。当然,关于GC还有很多内容我这里也没有详述,理由同上条。各位看官只需要知道GC是JVM监控里面的一个很重要的参数就行了。
     第一章,关于JVM中概念的理解结束了,预知后事如何,请听下回分解。
    第二章:JAVA工具的选用
     java工具有很多,关于jvm监控的工具主要有如下几个:
     + jstat
     + jmap
     + jstack
     其中jmap --heap pid可以抓出挺多的关于某个jvm的运行参数,但是老大提醒我最好不要使用jmap进行jvm监控,具体没有说明原因。于是本着打破砂锅问到底的精神,我又去搜了一把,发现了如下内容:
     jmap最主要的危险操作是下面这三种:
    1. jmap -dump
    这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。
    2. jmap -permstat
    这个命令执行,JVM会去统计perm区的状况,这整个过程也会比较的耗时,并且同样也会暂停应用。
    3. jmap -histo:live
    这个命令执行,JVM会先触发gc,然后再统计信息。
    上面的这三个操作都将对应用的执行产生影响,所以建议如果不是很有必要的话,不要去执行。
    所以,从上面三点来看,jmap命令对jvm状态影响还是比较大的,而且执行jmap --heap的时间也比较长,效率较低,予以排除。
    接下来是jstack,这个命令可以深入到JVM里面对JVM运行问题进行排查,据说还可以统计JVM里面的线程数量。但是这个命令执行效率也比较低,被排除掉了。
    于是剩下的只有一个jstat命令了。下面来详细的讲解该命令的使用了,咳咳,各位快点打起点精神来,这可是重头戏来了。
    首先,列出jstat命令的一些使用案例吧:
    ============================================
    1.jstat -gc pid
                可以显示gc的信息,查看gc的次数,及时间。
                其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
    S0C    S1C    S0U    S1U      EC      EU        OC        OU      PC    PU    YGC    YGCT    FGC    FGCT    GCT   
    9792.0 10048.0  0.0  5143.2 242048.0 220095.4  323200.0  211509.3  186368.0 114451.6    317    4.850  4      0.971    5.821
     S0C    S1C    S0U    S1U      EC      EU        OC        OU      MC    MU    CCSC  CCSU  YGC    YGCT    FGC    FGCT    GCT   
    1024.0 1024.0  0.0  320.0  11776.0  11604.6  260608.0  149759.6  39344.0 38142.6 4528.0 4303.1  5473  24.010  2      0.128  24.138
    2.jstat -gccapacity pid
                可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,
                如 PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,
                PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。
                其他的可以根据这个类推, OC是old内纯的占用量。
     NGCMN    NGCMX    NGC    S0C  S1C      EC      OGCMN      OGCMX      OGC        OC      PGCMN    PGCMX    PGC      PC    YGC    FGC 
     87360.0 262144.0 262144.0 9792.0 10048.0 242048.0  174784.0  786432.0  323200.0  323200.0 131072.0 262144.0 186368.0 186368.0    317    4
     NGCMN    NGCMX    NGC    S0C  S1C      EC      OGCMN      OGCMX      OGC        OC      MCMN    MCMX      MC    CCSMN    CCSMX    CCSC    YGC    FGC 
     1536.0 174592.0  13312.0  512.0  512.0  11776.0  260608.0  349696.0  260608.0  260608.0      0.0 1083392.0  39344.0      0.0 1048576.0  4528.0  5474    2
    3.jstat -gcutil pid
                统计gc信息统计。
      S0    S1    E      O      P    YGC    YGCT    FGC    FGCT    GCT   
      0.00  51.19  83.29  65.44  61.41    317    4.850    4    0.971    5.821
      S0    S1    E      O      M    CCS    YGC    YGCT    FGC    FGCT    GCT   
     68.75  0.00  46.74  57.47  96.95  95.03  5474  24.014    2    0.128  24.143
    4.jstat -gcnew pid
              年轻代对象的信息。
     S0C    S1C    S0U    S1U  TT MTT  DSS      EC      EU    YGC    YGCT 
    9792.0 10048.0    0.0 5143.2  3  15 9792.0 242048.0 198653.2    317    4.850
     S0C    S1C    S0U    S1U  TT MTT  DSS      EC      EU    YGC    YGCT 
     512.0  512.0  352.0    0.0 15  15  512.0  11776.0  8446.4  5474  24.014
    5.jstat -gcnewcapacity pid
              年轻代对象的信息及其占用量。
    NGCMN      NGCMX      NGC      S0CMX    S0C    S1CMX    S1C      ECMX        EC      YGC  FGC 
      87360.0  262144.0  262144.0  87360.0  9792.0  87360.0  10048.0  262016.0  242048.0  317    4
    NGCMN      NGCMX      NGC      S0CMX    S0C    S1CMX    S1C      ECMX        EC      YGC  FGC 
      1536.0  174592.0    13312.0  57856.0    512.0  57856.0    512.0  173568.0    11776.0  5475    2
    6.jstat -gcold pid
              old代对象的信息。
      PC      PU        OC          OU      YGC    FGC    FGCT    GCT   
    186368.0 114451.6    323200.0    211509.3    317    4    0.971    5.821
      MC      MU      CCSC    CCSU      OC          OU      YGC    FGC    FGCT    GCT   
     39344.0  38142.6  4528.0  4303.1    260608.0    149783.6  5475    2    0.128  24.148
    7.jstat -gcoldcapacity pid
              old代对象的信息及其占用量。
      OGCMN      OGCMX        OGC        OC      YGC  FGC    FGCT    GCT   
      174784.0    786432.0    323200.0    323200.0  317    4    0.971    5.821
      OGCMN      OGCMX        OGC        OC      YGC  FGC    FGCT    GCT   
      260608.0    349696.0    260608.0    260608.0  5475    2    0.128  24.148
    8.jstat -gcpermcapacity pid
              perm对象的信息及其占用量。
      PGCMN      PGCMX      PGC        PC      YGC  FGC    FGCT    GCT   
      131072.0  262144.0  186368.0  186368.0  317    4    0.971    5.821
    没有
    9.jstat -class pid
              显示加载class的数量,及所占空间等信息。
    Loaded  Bytes  Unloaded  Bytes    Time   
     25315 45671.7    5976  7754.1      15.19
    Loaded  Bytes  Unloaded  Bytes    Time   
      6472 11893.0        0    0.0      5.97
    10.jstat -compiler pid
              显示VM实时编译的数量等信息。
    Compiled Failed Invalid  Time  FailedType FailedMethod
        4219      3      0    63.36          1 org/aspectj/weaver/ResolvedType addAndRecurse
    Compiled Failed Invalid  Time  FailedType FailedMethod
      11364      1      0  107.53          1 sun/nio/cs/UTF_8$Decoder decode
    11.stat -printcompilation pid
              当前VM执行的信息。
    Compiled  Size  Type Method
        4219  2232    1 net/spy/memcached/protocol/ascii/BaseGetOpImpl initialize
    Compiled  Size  Type Method
      11364    212    1 com/alibaba/rocketmq/client/impl/consumer/RebalanceService run
      ==================================================

      可以看出上面我列出的命令执行结果为什么有两行呢,这是因为是用不同的jdk版本执行的。
      上面是JDK7执行结果,下面是JDK8执行结果,这两个版本之间输出的结果是有差距的,下面,就来分析为什么会产生这种差异。
    JDK7和JDK8中JVM堆内存划分差异
      如果记性好的童鞋们应该还能记得我上面在介绍JVM堆内存分类的时候括号里写的那个东东吧,没错,就是这个东西导致的。在JDK7中的Perm代(永久代)在JDK8中被废除了,取而代之的是Metadata代(元数据代),据说这个元数据代相对于永久代进行了优化,如果不设置最大值的话,默认会按需增长, 不会造成像Perm代中内存占满后会爆出内存溢出的错误,元数据代也可以设置最大值,这样的话,当内存区域被消耗完的时候将会和Perm代一样爆出内存溢出的错误。(PS:原谅我的班门弄斧,只能解释到这一个层面了。)
    好了,解释清楚了JDK7和JDK8的差异以后,接下来我们来解释jstat抓到的这些参数了。
    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 jstat命令获取参数解析
    ======================================================================================
    * S0C 年轻代中第一个survivor(幸存区)的容量 (字节)jstat -gcnew $pid|tail -1|awk '{print $1*1024}'
    * S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节)jstat -gcnew $pid|tail -1|awk '{print $3*1024}'
    * S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比jstat -gcutil $pid|tail -1|awk '{print $1}'
    * S0CMX 年轻代中第一个survivor(幸存区)的最大容量 (字节)jstat -gcnewcapacity $pid|tail -1|awk '{print $4*1024}'

    * S1C 年轻代中第二个survivor(幸存区)的容量 (字节)jstat -gcnew $pid|tail -1|awk '{print $2*1024}'
    * S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节)jstat -gcnew $pid|tail -1|awk '{print $4*1024}'
    * S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比jstat -gcutil $pid|tail -1|awk '{print $2}'
    * S1CMX  年轻代中第二个survivor(幸存区)的最大容量 (字节)jstat -gcnewcapacity $pid|tail -1|awk '{print $6*1024}'
    * DSS 当前需要survivor(幸存区)的容量 (字节)(Eden区已满)jstat -gcnew $pid|tail -1|awk '{print $7*1024}'

    * EC 年轻代中Eden(伊甸园)的容量 (字节)jstat -gcnew $pid|tail -1|awk '{print $8*1024}'
    * EU 年轻代中Eden(伊甸园)目前已使用空间 (字节)jstat -gcnew $pid|tail -1|awk '{print $9*1024}'
    * ECMX 年轻代中Eden(伊甸园)的最大容量 (字节)jstat -gcnewcapacity $pid|tail -1|awk '{print $8*1024}'
    * E 年轻代中Eden(伊甸园)已使用的占当前容量百分比jstat -gcutil $pid|tail -1|awk '{print $3}'

    * NGCMN 年轻代(young)中初始化(最小)的大小 (字节)jstat -gccapacity $pid|tail -1|awk '{print $1*1024}'
    * NGCMX 年轻代(young)的最大容量 (字节)jstat -gccapacity $pid|tail -1|awk '{print $2*1024}'
    * NGC 年轻代(young)中当前的容量 (字节)jstat -gccapacity $pid|tail -1|awk '{print $3*1024}'

    * OC Old代的容量 (字节)jstat -gcold $pid|tail -1|awk '{print $3*1024}'
    * OU Old代目前已使用空间 (字节)jstat -gcold $pid|tail -1|awk '{print $4*1024}'
    * OGCMX old代的最大容量 (字节)jstat -gccapacity $pid|tail -1|awk '{print $8*1024}'
    * OGCMN old代中初始化(最小)的大小 (字节)jstat -gccapacity $pid|tail -1|awk '{print $7*1024}'
    * O old代已使用的占当前容量百分比jstat -gcutil $pid|tail -1|awk '{print $4}'
    * OGC old代当前新生成的容量 (字节)jstat -gccapacity $pid|tail -1|awk '{print $9*1024}'

    * PC Perm(持久代)的容量 (字节)jstat -gccapacity $pid|tail -1|awk '{print $14*1024}'
    * PU Perm(持久代)目前已使用空间 (字节)jstat -gc $pid|tail -1|awk '{print $10*1024}'
    * PGCMX perm代的最大容量 (字节)jstat -gccapacity $pid|tail -1|awk '{print $12*1024}'
    * PGCMN perm代中初始化(最小)的大小 (字节)jstat -gccapacity $pid|tail -1|awk '{print $11*1024}'
    * P perm代已使用的占当前容量百分比 jstat -gcutil $pid|tail -1|awk '{print $5*1024}'
    * PGC perm代当前新生成的容量 (字节)jstat -gccapacity $pid|tail -1|awk '{print $13*1024}'

    * YGC 从应用程序启动到采样时年轻代中gc次数jstat -gccapacity $pid|tail -1|awk '{print $15}'
    * YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)jstat -gcutil $pid|tail -1|awk '{print $7}'
    * FGC从应用程序启动到采样时old代(全gc)gc次数jstat -gccapacity $pid|tail -1|awk '{print $16}'
    * FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)jstat -gcutil $pid|tail -1|awk '{print $9}'
    * GCT 从应用程序启动到采样时gc用的总时间(s)jstat -gcutil $pid|tail -1|awk '{print $10}'

    * TT  持有次数限制jstat -gcnew $pid|tail -1|awk '{print $5}'
    * MTT  最大持有次数限制jstat -gcnew $pid|tail -1|awk '{print $6}'
    *
    * Loadedjvm加载class数量
    * Unloadedjvm未加载class数量
    *
    * M元数据区使用比例
    * MC当前元数据空间大小
    * MU元数据空间使用大小
    * MCMN最小元数据容量 
    * MCMX最大元数据容量

    * CCS压缩使用比例
    * CCSC当前压缩类空间大小
    * CCSU压缩类空间使用大小
    * CCSMN最小压缩类空间大小
    * CCSMX最大压缩类空间大小
    ====================================================

    好了,上面就是我找到的一些对jstat获取的数据意思的统计,各位看官可以做个参考。
    好了,这一章的内容到此基本结束,前面的东西都是一些理论类的东西,没有实际的操作。俗话说,光说不练假把式。接下来,我们将开启下一章的旅程,脚本+jstat的使用。
    第三章:脚本+jstat获取数据
    首先,我们来看一下该章节介绍的几个脚本吧:
    1.jvm_list.sh 获取该机器上所有运行的JVM的进程对应的程序根目录以及程序名称
    2.get_jvmlist.sh 将获取的该机器上的所有进程对应的程序名称序列化成json格式并发送给zabbix服务器
    3.get_jvmstatus.sh 通过获取的程序根目录获取到对应的程序进程,再通过jstat抓取数据写入到文件中缓存
    4.set_jvmstatus.sh zabbix通过调用该脚本获取缓存文件中的关于某个JVM进程的状态信息
    好了,简单介绍了上面几个脚本的功能,下面我们列出这几个脚本的实际内容:
        #cat jvm_list.sh 
        #!/bin/bash
        packagePath=/usr/local/etc/scripts/package_path.txt
        echo -n >$packagePath
        for i in `ps -fC java|tail -n +2|grep -v 'flume'|awk '{print $2}'`;
        do
                pgrootpath=`ls -l /proc/$i/cwd|awk '{print $NF}'`
                if [[ -r $pgrootpath/appconfig ]] && [  `grep ^packagename= $pgrootpath/appconfig|wc -l`==1 ];then
                                packagename=$(grep ^packagename= $pgrootpath/appconfig 2>/dev/null|awk -F'"' '{print $2}')
                elif [[ -r $pgrootpath/webconfig ]] && [  `grep ^packagename= $pgrootpath/webconfig|wc -l`==1 ];then
                                packagename=$(grep ^packagename= $pgrootpath/webconfig 2>/dev/null|awk -F'"' '{print $2}')
                else
                        packagename=$(basename $pgrootpath)-1.0.0-bin.tar.gz
                fi
                echo "$packagename $pgrootpath" >> $packagePath
        done

    该脚本的目的是先通过使用ps -fC java命令获取该机器上面除了flume进程外的所有其他java进程(我这边使用的是flume来收集业务日志的。)
    然后,通过获取到的PID使用ll /proc/pid/cwd命令获取该进程的程序根目录,后面那些判断是获取该进程对应的包名(这一步各位可以根据自己公司的情况自行修改,我这边取包名的方式并不能够匹配各位公司的设置,在下爱莫能助了。)
    最后是将获取到的程序根目录和包名存放在变量packagePath对应的文件中。
        #cat get_jvmlist.sh 
        #!/bin/bash
        TABLESPACE=`awk '{print $1}' /usr/local/etc/scripts/package_path.txt`
        COUNT=`echo "$TABLESPACE" |wc -l`
        INDEX=0
        echo '{"data":['
        echo "$TABLESPACE" | while read LINE; do
            echo -n '{"{#TABLENAME}":"'$LINE'"}'
            INDEX=`expr $INDEX + 1`
            if [ $INDEX -lt $COUNT ]; then
                echo ','
            fi
        done
        echo ']}'

    这个脚本的作用就是通过读取文件里面的包名,然后将包名进行json序列化输出,没什么好讲的,套路套一个循环脚本就行。
    接下来就是重要的脚本了,调用jstat获取JVM状态,并缓存到文件中。
    #cat get_jvmstatus.sh 
        #!/bin/bash
        MAINCLASS="*Main.class"
        scriptPath=/usr/local/etc/scripts
        cat $scriptPath/package_path.txt|while read line
        do
        packageName=$(echo $line|awk '{print $1}')
        pgRootPath=$(echo $line|awk '{print $2}')
        if [[ -d $pgRootPath/tomcat ]];then
        pid=$(cat $pgRootPath/tomcat/tomcat.pid)
        else
        mainPath=$(find $pgRootPath -name $MAINCLASS)
        appName=$(echo ${mainPath##*classes/}|sed 's#/#.#g'|sed 's#.class##g')
        pid=$(ps -fC java|grep "$appName"|awk '{print $2}')
        fi
        javaHome=/usr/local/java/jdk1.8.0
        #javaHome=/usr/local/java/latest
        #if [[ -r $pgRootPath/appconfig ]] && [  `grep ^JAVA_HOME= $pgRootPath/appconfig|wc -l` == 1 ] && [ `grep ^JAVA_HOME= $pgRootPath/appconfig|grep 8|wc -l` == 1 ];then
                                #javaHome=$(grep ^JAVA_HOME= $pgRootPath/appconfig 2>/dev/null|awk -F'=' '{print $2}')
        #javaHome=/usr/local/java/jdk1.8.0
                #else
                #        if [[ -r $pgRootPath/webconfig ]] && [ `grep ^'export JAVA_HOME=' $pgRootPath/webconfig|wc -l` == 1 ] && [ `grep ^'export JAVA_HOME=' $pgRootPath/webconfig|grep 8|wc -l` == 1 ];then
                #                #javaHome=$(grep ^'export JAVA_HOME=' $pgRootPath/webconfig 2>/dev/null|awk -F'"' '{print $2}')
                #        javaHome=/usr/local/java/jdk1.8.0
        #fi
        #fi
        #echo --------------------------------$pgRootPath
        #echo $javaHome
        echo -------------------------------$pid
        sleep 5
        #echo -n >$scriptPath/package/$packageName
        #$javaHome/bin/jstat -gccapacity $pid > ./package/$packageName 2>/dev/null
        #$javaHome/bin/jmap -heap $pid>>./package/$packageName 2>/dev/null
        echo gcnew >> $scriptPath/package/$packageName 2>/dev/null
        $javaHome/bin/jstat -gcnew $pid >> $scriptPath/package/$packageName 2>/dev/null
        echo gcutil >> $scriptPath/package/$packageName 2>/dev/null
        $javaHome/bin/jstat -gcutil $pid >> $scriptPath/package/$packageName 2>/dev/null
        echo gcnewcapacity >> $scriptPath/package/$packageName 2>/dev/null
        $javaHome/bin/jstat -gcnewcapacity $pid >> $scriptPath/package/$packageName 2>/dev/null
                echo gccapacity >> $scriptPath/package/$packageName 2>/dev/null
        $javaHome/bin/jstat -gccapacity $pid >> $scriptPath/package/$packageName 2>/dev/null
                #echo gcold >> $scriptPath/package/$packageName 2>/dev/null
        #$javaHome/bin/jstat -gcold $pid >> $scriptPath/package/$packageName 2>/dev/null
                echo gc >> $scriptPath/package/$packageName 2>/dev/null
        $javaHome/bin/jstat -gc $pid >> $scriptPath/package/$packageName 2>/dev/null
                echo class >> $scriptPath/package/$packageName 2>/dev/null
        $javaHome/bin/jstat -class $pid >> $scriptPath/package/$packageName 2>/dev/null
        echo cpu >> $scriptPath/package/$packageName 2>/dev/null
        echo -e "CPU\n$( ps aux|grep $pid|grep -v grep|awk '{print $3}')" >> $scriptPath/package/$packageName 2>/dev/null
        echo mem >> $scriptPath/package/$packageName 2>/dev/null
        echo -e "MEM\n$( ps aux|grep $pid|grep -v grep|awk '{print $6}')" >> $scriptPath/package/$packageName 2>/dev/null
        done

    这里面首先是通过获取到程序的根目录,然后我这的java程序除了tomcat跑的之外,其他的java程序都是通过Main.class启动的,所以可以获取到AppName,这样通过ps命令就能找到其对应的PID了,而如果是tomcat启动的进程的话,在程序根目录下面的tomcat目录下有一个tomcat.pid文件里面有该程序的PID。后面被注释的那一端代码其实之前是加上去的,那段代码的作用是判断该进程使用的是JDK7还是JDK8启动的,当初的计划是想着如果是JDK7启动的进程就用JDK7的jstat去获取数据,如果是JDK8启动的进程就用JDK8的jstat去获取数据,后来发现不同版本的JDK获取的数据格式不同,于是。。。。。。后悔莫及的把那段代码注释掉了。后面综合公司实际情况考虑,JDK8的程序用得比较多,JDK7的程序相对来说比较少,并且慢慢都会向JDK8进行转换,所以,权衡利弊之下,之后将jstat的JDK全部换成了JDK8,这样的影响就是获取不到JDK7的永久代数据。当然,各位有兴趣的话,也可以JDK7和JDK8同时使用,在过滤输出文件的时候加一个标志位进行判断,当然,我这里暂时没有做这方面的修改。。。毕竟时间有限。。。
    第四个脚本,个人感觉写的最烂的一个脚本。。。但是。。。没办法,技术水平有限,各位将就着看吧(捂脸哭)
    # cat set_jvmstatus.sh 
        #!/bin/bash
        packageName=$1
        key=$2
        if [ $2 == "S0C" -o $2 == "S0U" -o $2 == "S1C" -o $2 == "S1U" -o $2 == "DSS" -o $2 == "EC" -o $2 == "EU" ];then
        part=gcnew
        elif [ $2 == "S0" -o $2 == "S1" -o $2 == "E" -o $2 == "O" -o $2 == "M" -o $2 == "CCS" -o $2 == "YGCT" -o $2 == "FGCT" -o $2 == "GCT" ];then
        part=gcutil
        elif [ $2 == "S0CMX" -o $2 == "S1CMX" -o $2 == "ECMX" ];then
        part=gcnewcapacity
        elif [ $2 == "NGCMN" -o $2 == "NGCMX" -o $2 == "NGC" -o $2 == "OGCMX" -o $2 == "OGCMN" -o $2 == "OGC" -o $2 == "MCMN" -o $2 == "MCMX" -o $2 == "MC" -o $2 == "CCSMN" -o $2 == "CCSMX" -o $2 == "CCSC" -o $2 == "YGC" -o $2 == "FGC" ];then
        part=gccapacity
        elif [ $2 == "MU" -o $2 == "CCSU" -o $2 == "OC" -o $2 == "OU" ];then
        part=gc
        elif [ $2 == "Loaded" -o $2 == "Unloaded" ];then
        part=class
        elif [ $2 == "CPU" ];then
        part=cpu
        elif [ $2 == "MEM" ];then
                part=mem
        else
        echo "Error input:"
        exit 0
        fi
        case $2 in
        S0C)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $1*1024}'
        ;;
        S0U)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $3*1024}'
        ;;
        S0)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%f\n", $0}'
        ;;
        S0CMX)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $4*1024}'
        ;;
        S1C)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $2*1024}'
        ;;
        S1U)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $4*1024}'
        ;;
        S1)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%f\n", $2}'
        ;;
        S1CMX)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $6*1024}'
        ;;
        DSS)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $7*1024}'
        ;;
        EC)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $8*1024}'
        ;;
        EU)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $9*1024}'
        ;;
        ECMX)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $8*1024}'
        ;;
        E)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%f\n", $3}'
        ;;
        NGCMN)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $1*1024}'
        ;;
        NGCMX)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $2*1024}'
        ;;
        NGC)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $3*1024}'
        ;;
        OC)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $7*1024}'
        ;;
        OU)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $8*1024}'
        ;;
        OGCMX)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $8*1024}'
        ;;
        OGCMN)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $7*1024}'
        ;;
        O)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%f\n", $4}'
        ;;
        OGC)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $9*1024}'
        ;;
        M)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%f\n", $5}'
        ;;
        MC)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $13*1024}'
        ;;
        MU)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $10*1024}'
        ;;
        MCMN)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $11*1024}'
        ;;
        MCMX)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $12*1024}'
        ;;
        CCS)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%f\n", $6}'
        ;;
        CCSC)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $13*1024}'
        ;;
        CCSU)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $12*1024}'
        ;;
        CCSMN)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $14*1024}'
        ;;
        CCSMX)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $15*1024}'
        ;;
        YGC)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $17}'
        ;;
        YGCT)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%f\n", $8}'
        ;;
        FGC)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $18}'
        ;;
        FGCT)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%f\n", $10}'
        ;;
        GCT)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%f\n", $11}'
        ;;
        TT)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $5}'
        ;;
        MTT)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $6}'
        ;;
        Loaded)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $1}'
        ;;
        Unloaded)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $3}'
        ;;
        CPU)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%f\n", $1}'
        ;;
        MEM)
        grep -wA 2 ^"$part" /usr/local/etc/scripts/package/$1|tail -1|awk '{printf "%d\n", $1*1024}'
        ;;
        *)
        echo "Error input:"
        ;;
        esac
        exit 0

    这套脚本没什么讲的,就是重复的进行一些判断,抓数据并输出(注意,之前写的获取的jstat参数的值其实是不准确的,获取的值是以KB为单位而不是以字节为单位,所以我取完数据后对数据进行成字节为单位了。)
    接下来,讲一下这几个脚本该怎么部署。我这里的zabbix_agentd是通过yum安装的,所以安装在/usr/local目录下,配置文件在/usr/local/etc目录下,需要在zabbix_agentd.conf里面添加下面两行获取数据的key(注意,添加好后一定要记得重启zabbix_agentd进程):
    UserParameter=jmx.discovery,/usr/local/etc/scripts/get_jvmlist.sh
    UserParameter=jmx.resource[*],/usr/local/etc/scripts/set_jvmstatus.sh $1 $2

    然后脚本都放置在/usr/local/etc/scripts/目录下,该目录下的脚本权限如下:
     -rwxr-xr-x 1 zabbix zabbix  326 3月  26 22:29 get_jvmlist.sh
     -rwxr-xr-x 1 root  root  2956 3月  28 20:57 get_jvmstatus.sh
     -rwxr-xr-x 1 root  root    818 3月  26 22:33 jvm_list.sh
     drwxr-xr-x 2 zabbix zabbix 4096 3月  26 23:05 package
     -rw-r--r-- 1 zabbix zabbix 1947 3月  29 11:23 package_path.txt
     -rwxr-xr-x 1 zabbix zabbix 5240 3月  28 20:50 set_jvmstatus.sh

    然后需要在crontab里面定义jvm_list.sh和get_jvmstatus.sh脚本的定时任务,我这里定义的如下:
    12 * */1 * * * /usr/local/etc/scripts/jvm_list.sh
    */5 * * * * /usr/local/etc/scripts/get_jvmstatus.sh

    注意这两个脚本必须要以root权限去执行,因为里面涉及到的一些命令只有root用户才有权限去执行。
    之后可以手动执行脚本去获取数据,看是否能够抓取到相应的数据。
    好了,这章的脚本讲完了,下一章,就是怎样通过zabbix获取相应的数据了。
    第四章:zabbix获取数据

    通过之前的脚本部署,可以在zabbix_server上面通过zabbix_get命令去检查是否获取到了相应的数据:

        # zabbix_get  -s xx.xx.xx.xx -k jmx.resource[Abcdefg-1.0.0-rc-bin.tar.gz,MEM]
        641036288
    我这里可以获取到数据了(注意IP被我注释掉了,为了保护隐私哈,包名也被我刻意修改了,隐私隐私哈)
    接下来就可以部署模板了,至于模板我已经做好了,可以直接在附件里面下载。至于模板我制作了一些简单的key的值收集,以及图像的展示,至于监控报警值的设置,由于各个公司的环境不一样,需要各位自己根据自己需求自行设置。

    Zabbix模板到Linux公社资源站下载:

    ------------------------------------------分割线------------------------------------------

    免费下载地址在http://linux.linuxidc.com/

    用户名与密码都是www.linuxidc.com

    具体下载目录在 /2016年资料/9月/12日/Zabbix使用自动发现功能监控服务器各JVM进程状态/

    下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

    ------------------------------------------分割线------------------------------------------

    本文永久更新链接地址http://www.linuxidc.com/Linux/2016-09/135139.htm

     
    提示: 原网站已由百度转码,以便在移动设备上查看
    展开全文
  • zabbix监控java进程

    2017-08-01 15:30:00
    编辑zabbix_agentd配置文件,增加键值vi /etc/zabbix/zabbix_agentd.confUserParameter=java,ps -ef|grep bootstrap.jar|grep -v grep|awk '{print $2}'ps -ef|grep bootstrap.jar|grep -v grep|awk '{print $2}'这...

    编辑zabbix_agentd配置文件,增加键值

    vi /etc/zabbix/zabbix_agentd.conf

    UserParameter=java,ps -ef|grep bootstrap.jar|grep -v grep|awk '{print $2}'

    ps -ef|grep bootstrap.jar|grep -v grep|awk '{print $2}'这个就是取得jar包所运行的pid作为一个键值返回给zabbix server

    修改完成之后一定要重启zabbix agentd

    ps -ef|grep zabbix|grep -v grep|awk '{print $2}'|xargs kill -s 9

    /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf

    配置触发器,添加上刚才的键值


    java  2017-08-01 14:31:07  24833  图形


    就能在最新数据里面获得java进程的pid了

    有了数值之后就可以配置触发器进行告警了

    这个方法只是在这台主机上创建键值和触发器,目前还没有模板化。

    当改变键值的时候

    UserParameter=java,ps -ef|grep bootstrap123.jar|grep -v grep|awk '{print $2}'

    ps -ef|grep bootstrap123.jar|grep -v grep|awk '{print $2}' 返回的为空值,但是这个时候在zabbix server上显示最新数据那一项为灰色,看来空值zabbix

    是无法识别的。必须再重新写一个脚本对进程返回值进行判断

    [root@vshkfcatwebtest01 scripts]# cat get_javaproess.sh
    #!/bin/bash

    javapid=`ps -ef|grep bootstrap123.jar|grep -v grep|awk '{print $2}'`

    if [ "$javapid" = "" ];then
        echo 0
    else
        echo $javapid
       
    fi

    修改键值

    UserParameter=java,bash /etc/zabbix/scripts/get_javaproess.sh

    重启zabbix

    当javapid为空,echo 0 返回给zabbix server的数值不被识别,该监控项无效

    image

    重新修改了下脚本

    #!/bin/bash

    javapid=`ps -ef|grep bootstrap123.jar|grep -v grep|awk '{print $2}'`

    if [ "$javapid" = "" ];then
        javapid=0
    fi
    echo $javapid

    转载于:https://www.cnblogs.com/woailifang/p/7268815.html

    展开全文
  • 一、安装zabbix-java-gateway zabbix@zabbix:~$ sudo apt-get install zabbix-java-gateway 二、安装JDK并配置环境变量(JDK7+TOMCAT7) 1、 查看系统版本 sudo uname –a //是64位系统,那么我们选择64位的JDK ...
  • zabbix想要监控java,tomcat等最常见的就是运用jmx来监控,这样的话当监控多个tomcat或者java进程的时候会出现普遍的添加端口方式 操作起来比较麻烦,下面我们运用python脚本结合自动发现规则来实现监控一台机器上的...
  • Zabbix 通过shell脚本监控PostgreSQL

    千次阅读 2018-07-05 16:37:05
    编辑zabbix客户端配置文件,添加监控项 [root@localhost zabbix]# vim /etc/zabbix/zabbix_agentd.conf [root@localhost zabbix]# systemctl restart zabbix-agent UserParameter=pg_chk[*],/etc/zabbix/chk_pg.sh $...
  • 监控工具zabbix安装及使用详解

    千次阅读 2020-12-20 20:02:04
    zabbix一、zabbix相关简介二、zabbix的安装部署三、zabbix的相关配置四、percona模版监控mysql五、自定义模版监控nginx状态 一、zabbix相关简介 zabbix是完全开源的工具,整合了cacti和nagios等特性。 SNMP(udp161 ...
  • zabbix监控添加JMX(实现对java监控) 配置server2 下载软件jdk-8u121-linux-x64.rpm和apache-tomcat-8.5.24.tar.gz; 1.##安装软件jdk和tomcat [root@server2 ~]# rpm -ivh jdk-8u121-linux-x64.rpm [root@...
  • 安装Zabbix5.0,监控java spring进程和MySQL进程1.zabbix安装需求:需求:监控云服务器上的进程地址:https://www.zabbix.com/1.1 安装Zabbix server端1.2 安装MySQL1.3.安装Zabbix 5.0监控平台1.4 在Server端安装...
  •  需使用Zabbix-server监控每个Agent上的jvm进程(监控项具体在模板中展示) 三、准备环境:  1.jvm.py脚本(非本人原创,从Github上直接copy的,此处附上Github地址,可直接去目标地址查看相关说明)  2....
  • zabbix监控java/jmx/jvm

    2020-04-13 15:20:57
    jvm监控需要在配置zabbix编译环境的时候支持java --enable-java #需要安装依赖包 yum install java* -y https://zh.osdn.net/projects/sfnet_zabbix/releases/1. 重新编译安装zabbix ./configure --prefix=/usr/...
  • JAVA-GATEWAY Zabbix本身不支持直接监控Java,在zabbix 1.8以前,只能使用Zapcat来做代理监控,而且要修改源代码,非常麻烦。所有后来为了解决这个监控问题,ZabbixJava双方应运生成了各自的代理监控程序:zabbix...
  • Zabbix监控JVM 垃圾回收(GC)状态

    千次阅读 2019-09-29 12:07:49
    linux下监控jvm的gc状态的工具为jdk自带 jstat 这里我的java进程名为SocketPlatform.jar [user1@localhost ~]$ jps -l 47856 sun.tools.jps.Jps 35902 /opt/app/SocketPlatform/SocketPlatform.jar [user1@...
  • Zabbix在线监控tomcat的线程数,因为线上没有配置jmx,所以使用jstack pid的方式获取thread线程。脚本结合zabbix的自动发现,可以实现多个tomcat实例的自动发现配置。免去以后tomcat增加后一个个手动添加的烦恼。 ...
  • 但是使用命令jstat只能查看一段时间的数据,不能总是盯着屏幕手动查看,于是想到了将jstat的数据通过zabbix进行绘图展现并报警。同时,一台服务器上可能会有多个Java程序在运行,包括不同的Tomcat,或者是其他Java...
  • 监控系统的功能5.zabbix特点二、功能介绍1.zabbix 数据收集2.zabbix数据展示3.zabbix故障检测4.zabbix告警发送5.zabbix安全和认证6.zabbix自动化Zabbix提供2个自动化手段来帮助技术人员高效管理设备监控7.zabbix API...
  • zabbix通过orabbix和自定义脚本监控oracle数据库 原文地址http://www.iyunv.com/thread-94249-1-1.html 由于公司要上oracle数据库,需要对这个东西惊醒监控,于是去网上淘资料,发现有一个套件orabbix监控oracle...
  • Zabbix监控JVM(微服务进程)

    千次阅读 2018-06-06 15:13:39
    老的方法感觉效果不好,又写了一个模板和脚本,请移步: ... 有兴趣的可以继续往下看。...Zabbix服务器需安装java,编译需添加启动参数--enable-java 本次安装的编译参数为: ./configure --prefi...
  • zabbix监控kafka_Zabbix的Kafka监控

    千次阅读 2020-09-05 17:17:20
    zabbix监控kafka 介绍 (Introduction) Apache Kafka is modern, powerful and fancy service provides storing and managing messages for real-time data processing. Apache Kafka是一种现代,功能强大且新颖的...
  • zabbix4.0学习三:Zabbix监控tomcat和java

    万次阅读 2019-02-14 09:58:56
    zabbix4.0学习三:Zabbix监控tomcat和java 前言 想理解怎么监控tomcat,必需识下图 zabbix-Web前端界面,它通过数据库里数据展示。和其它组件不直接关联 zabbix-server运行在10051端口,Zabbix-server要知道java...
  • 一、zabbix监控nginx 1.搭建nginx环境 [root@server2 ~]# ls nginx-1.20.1.tar.gz simkai.ttf [root@server2 ~]# tar -zxf nginx-1.20.1.tar.gz #解压 [root@server2 ~]# ls nginx-1.20.1 nginx-1.20.1.tar.gz ...
  • 20: zabbix监控java jvm原理 tomcat weblogic jboss resin tomcat: 开启监控接口 #安装tomcat rpm -ivh jdk-8u102-linux-x64.rpm mkdir /app tar xf apache-tomcat-8.0.27.tar.gz -C /app/ /app/apache-tomcat-...
  • Server2上有一个Tomcat(或者说java虚拟机JVM(java virtual machine)),zabbix监控JVM 在server2上安装tomcat rpm -ivh jdk-8u121-linux-x64.rpm tar zxf apache-tomcat-8.5.24.tar.gz -C /usr/local/ ln -s apache...
  • 小Z同学最近遇到个项目需求,需求是用zabbix监控运行在windows的进程。然鹅,当小Z同学在网上搜了一大堆,发现基本上都是使用官方的proc.num(***.exe)键值拿到进程数量,很显然,这并不符合客户实际的需求,如果是只...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,548
精华内容 1,819
关键字:

java监控脚本zabbix

java 订阅