天天看点

Zabbix低级发现结合jstat命令自动监控Java进程(jdk 1.8版本)

jstat无法使用的问题

因为java是tomcat启动的,所以使用jstat命令,报not found错误。

解决方法,网上很多都不行,以下可以

Zabbix低级发现结合jstat命令自动监控Java进程(jdk 1.8版本)

简单的说,就是sudo -u tomcat /usr/java/jdk/bin/jstat -gcutil 22631

2.vim /etc/sudoers

增加这两行

<code>zabbix ALL=(tomcat) NOPASSWD:</code><code>/bin/netstat</code><code>,</code><code>/usr/bin/omreport</code><code>,</code><code>/usr/java/jdk/bin/jstat</code><code>,</code><code>/usr/bin/python</code>

<code>tomcat ALL=(ALL) NOPASSWD:</code><code>/bin/kill</code><code>,</code><code>/bin/chown</code><code>,</code><code>/usr/java/jdk/bin/jstat</code><code>,</code><code>/usr/bin/python</code><code>,</code><code>/bin/netstat</code><code>,</code><code>/usr/bin/omreport</code>

就是zabbix必须sudo成tomcat

3.jstat的输出变化

java1.8取消了永久区

<code>sudo</code> <code>-u tomcat </code><code>/usr/java/jdk/bin/jstat</code> <code>-gc 22631</code>

<code> </code><code>S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   </code>

<code>19968.0 20992.0  0.0   4810.3 88576.0  42080.7   393216.0   32415.5   43952.0 42767.3 5296.0 5074.8     25    0.428   2      0.150    0.578</code>

与1.7的不同,去掉了Perm

MC:方法区大小

MU:方法区使用大小

CCSC:压缩类空间大小

CCSU:压缩类空间使用大小

4.zabbix agentd配置变化

<code>cat</code> <code>/usr/local/zabbix/etc/zabbix_agentd</code><code>.conf.d</code><code>/discovery_java_status</code><code>.conf </code>

<code>UserParameter=java.discovery,</code><code>/usr/bin/python</code> <code>/usr/local/zabbix/bin/java_discovery</code><code>.py</code>

<code>UserParameter=java.discovery_status[*],</code><code>/usr/bin/python</code> <code>/usr/local/zabbix/bin/jstat_status</code><code>.py $1 $2</code>

cd /usr/local/zabbix/bin

<code>cat</code> <code>java_discovery.py</code>

<code>#/usr/bin/python</code>

<code>#This script is used to discovery disk on the server</code>

<code>import</code> <code>subprocess</code>

<code>import</code> <code>os</code>

<code>import</code> <code>socket</code>

<code>import</code> <code>json</code>

<code>import</code> <code>glob</code>

<code> </code> 

<code>java_names_file=</code><code>'java_names.txt'</code>

<code>javas=[]</code>

<code>if</code> <code>os.path.isfile(java_names_file):</code>

<code>#   print 'java_names_file exists!'</code>

<code>#####</code>

<code>##### here should use % (java_names_file) instead of using the python variable java_names_file directly inside the '''   ''' quotes</code>

<code>   </code><code>args=</code><code>''</code><code>'awk -F'</code><code>:</code><code>' '</code><code>{print $1</code><code>':'</code><code>$2}</code><code>' %s'</code><code>''</code>  <code>% (java_names_file)</code>

<code>   </code><code>t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0]</code>

<code>elif</code> <code>glob.glob(</code><code>'/opt/xx/*_tomcat'</code><code>) and not os.path.isdir(</code><code>'/opt/logs/logstash'</code><code>) and not os.path.isdir(</code><code>'/opt/app/elasticsearch/config'</code><code>):</code>

<code>   </code><code>t=subprocess.Popen(</code><code>'cd /opt/xx &amp;&amp; ls *_tomcat|grep _tomcat'</code><code>,shell=True,stdout=subprocess.PIPE)</code>

<code>  </code> 

<code>for</code> <code>java </code><code>in</code> <code>t.stdout.readlines():</code>

<code>    </code><code>if</code> <code>len(java) != 0:</code>

<code>       </code><code>javas.append({</code><code>'{#JAVA_NAME}'</code><code>:java.strip(</code><code>'\n'</code><code>).strip(</code><code>':'</code><code>)})</code>

<code>print json.dumps({</code><code>'data'</code><code>:javas},indent=4,separators=(</code><code>','</code><code>,</code><code>':'</code><code>))</code>

自己做修改,修改命令 cd /opt/xx &amp;&amp; ls *_tomcat|grep _tomcat

这里说明以下,tomcat应用最好起统一的名字,比如xx_tomcat等,这样写脚本起来方便。

<code>cat</code> <code>jstat_status.py</code>

<code>#!/usr/bin/python</code>

<code>import</code> <code>sys</code>

<code>__maintainer__ = </code><code>"John Wang"</code>

<code>jps = </code><code>'/usr/java/jdk/bin/jps'</code>

<code>jstat = </code><code>'/usr/java/jdk/bin/jstat'</code>

<code>zabbix_sender = </code><code>"/usr/local/zabbix/bin/zabbix_sender"</code>

<code>zabbix_conf = </code><code>"/usr/local/zabbix/etc/zabbix_agentd.conf"</code>      

<code>send_to_zabbix = 1</code>

<code>ip=os.popen(</code><code>"ifconfig|grep 'inet '|grep -v '127.0'|xargs|awk -F '[ :]' '{print $3}'"</code><code>).readline().rstrip()</code>

<code>serverip=</code><code>"你的zabbix服务端ip"</code>

<code>#"{#JAVA_NAME}":"tomcat_web_1"</code>

<code>def usage():</code>

<code>    </code><code>""</code><code>"Display program usage"</code><code>""</code>

<code>    </code><code>print </code><code>"\nUsage : "</code><code>, sys.argv[0], </code><code>" java_name alive|all"</code>

<code>    </code><code>print </code><code>"Modes : \n\talive : Return pid of running processs\n\tall : Send jstat stats as well"</code>

<code>    </code><code>sys.</code><code>exit</code><code>(1)</code>

<code>class Jprocess:</code>

<code>    </code><code>def __init__(self, arg):</code>

<code>        </code><code>self.pdict = {</code>

<code>        </code><code>"jpname"</code><code>: arg,</code>

<code>        </code><code>}</code>

<code>        </code><code>self.zdict = {</code>

<code>        </code><code>"Heap_used"</code> <code>: 0,</code>

<code>                </code><code>"Heap_ratio"</code> <code>: 0,</code>

<code>        </code><code>"Heap_max"</code> <code>: 0,</code>

<code>        </code><code>"Perm_used"</code> <code>: 0,</code>

<code>                </code><code>"Perm_ratio"</code> <code>: 0,</code>

<code>        </code><code>"Perm_max"</code>  <code>: 0,</code>

<code>                </code><code>"S0_used"</code>   <code>: 0,</code>

<code>                </code><code>"S0_ratio"</code>  <code>: 0,</code>

<code>                </code><code>"S0_max"</code>    <code>: 0,</code>

<code>                </code><code>"S1_used"</code>   <code>: 0,</code>

<code>                </code><code>"S1_ratio"</code>  <code>: 0,</code>

<code>                </code><code>"S1_max"</code>    <code>: 0,</code>

<code>                </code><code>"Eden_used"</code> <code>: 0,</code>

<code>                </code><code>"Eden_ratio"</code> <code>: 0,</code>

<code>                </code><code>"Eden_max"</code>  <code>: 0,</code>

<code>                </code><code>"Old_used"</code>  <code>: 0,</code>

<code>                </code><code>"Old_ratio"</code> <code>: 0,</code>

<code>                </code><code>"Old_max"</code>   <code>: 0,</code>

<code>                </code><code>"YGC"</code>       <code>: 0,</code>

<code>                </code><code>"YGCT"</code>      <code>: 0,</code>

<code>                </code><code>"YGCT_avg"</code>      <code>: 0,</code>

<code>                </code><code>"FGC"</code>       <code>: 0,</code>

<code>                </code><code>"FGCT"</code>      <code>: 0,</code>

<code>                </code><code>"FGCT_avg"</code>      <code>: 0,</code>

<code>                </code><code>"GCT"</code>       <code>: 0,</code>

<code>                </code><code>"GCT_avg"</code>       <code>: 0,</code>

<code>                 </code> 

<code>    </code><code>def chk_proc(self):</code>

<code>#  ps -ef|grep java|grep tomcat_web_1|awk '{print $2}'</code>

<code>#                print self.pdict['jpname']</code>

<code>                </code><code>pidarg = </code><code>''</code><code>'ps -ef|grep java|grep %s|grep -v grep|awk '</code><code>{print $2}</code><code>' '</code><code>''</code> <code>%(self.pdict[</code><code>'jpname'</code><code>]) </code>

<code>                </code><code>pidout = subprocess.Popen(pidarg,shell=True,stdout=subprocess.PIPE) </code>

<code>                </code><code>pid = pidout.stdout.readline().strip(</code><code>'\n'</code><code>) </code>

<code>                </code><code>if</code> <code>pid != </code><code>""</code> <code>:</code>

<code>                   </code><code>self.pdict[</code><code>'pid'</code><code>] = pid</code>

<code>#                   print "Process found :", java_name, "with pid :", self.pdict['pid']</code>

<code>                </code><code>else</code><code>:</code>

<code>                   </code><code>self.pdict[</code><code>'pid'</code><code>] = </code><code>""</code>

<code>#                   print "Process not found"</code>

<code>                </code><code>return</code> <code>self.pdict[</code><code>'pid'</code><code>]</code>

<code>    </code><code>def get_jstats(self):</code>

<code>        </code><code>if</code> <code>self.pdict[</code><code>'pid'</code><code>] == </code><code>""</code><code>:</code>

<code>            </code><code>return</code> <code>False</code>

<code>        </code><code>self.pdict.update(self.fill_jstats(</code><code>"-gc"</code><code>))</code>

<code>        </code><code>self.pdict.update(self.fill_jstats(</code><code>"-gccapacity"</code><code>))</code>

<code>        </code><code>self.pdict.update(self.fill_jstats(</code><code>"-gcutil"</code><code>))</code>

<code>#        print "\nDumping collected stat dictionary\n-----\n", self.pdict, "\n-----\n"</code>

<code>    </code><code>def fill_jstats(self, opts):</code>

<code>#        print "\nGetting", opts, "stats for process", self.pdict['pid'], "with command : sudo", jstat, opts, self.pdict['pid'] ,"\n"</code>

<code>        </code><code>jstatout = subprocess.Popen([</code><code>'sudo'</code><code>,</code><code>'-u'</code><code>,</code><code>'tomcat'</code><code>, jstat, opts, self.pdict[</code><code>'pid'</code><code>]], stdout=subprocess.PIPE)</code>

<code>        </code><code>stdout, stderr = jstatout.communicate()</code>

<code>        </code><code>legend, data = stdout.</code><code>split</code><code>(</code><code>'\n'</code><code>,1)</code>

<code>        </code><code>mydict = dict(zip(legend.</code><code>split</code><code>(), data.</code><code>split</code><code>()))</code>

<code>        </code><code>return</code> <code>mydict</code>

<code>    </code><code>def compute_jstats(self):</code>

<code>        </code><code>self.zdict[</code><code>'S0_used'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'S0U'</code><code>]) * 1024,</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'S0_max'</code><code>] =  </code><code>format</code><code>(float(self.pdict[</code><code>'S0C'</code><code>]) * 1024,</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'S0_ratio'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'S0'</code><code>]),</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'S1_used'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'S1U'</code><code>]) * 1024,</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'S1_max'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'S1C'</code><code>]) * 1024,</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'S1_ratio'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'S1'</code><code>]),</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'Old_used'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'OU'</code><code>]) * 1024,</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'Old_max'</code><code>] =  </code><code>format</code><code>(float(self.pdict[</code><code>'OC'</code><code>]) * 1024,</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'Old_ratio'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'O'</code><code>]),</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'Eden_used'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'EU'</code><code>]) * 1024,</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'Eden_max'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'EC'</code><code>]) * 1024,</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'Eden_ratio'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'E'</code><code>]),</code><code>'0.2f'</code><code>)            </code>

<code># self.zdict['Perm_used'] = format(float(self.pdict['PU']) * 1024,'0.2f')</code>

<code># self.zdict['Perm_max'] = format(float(self.pdict['PC']) * 1024,'0.2f')</code>

<code># self.zdict['Perm_ratio'] = format(float(self.pdict['P']),'0.2f')</code>

<code>                </code> 

<code>        </code><code>self.zdict[</code><code>'Heap_used'</code><code>] = </code><code>format</code><code>((float(self.pdict[</code><code>'EU'</code><code>]) + float(self.pdict[</code><code>'S0U'</code><code>]) + float(self.pdict[</code><code>'S1U'</code><code>])  + float(self.pdict[</code><code>'OU'</code><code>])) * 1024,</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'Heap_max'</code><code>] = </code><code>format</code><code>((float(self.pdict[</code><code>'EC'</code><code>]) + float(self.pdict[</code><code>'S0C'</code><code>]) + float(self.pdict[</code><code>'S1C'</code><code>])  + float(self.pdict[</code><code>'OC'</code><code>])) * 1024,</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'Heap_ratio'</code><code>] = </code><code>format</code><code>(float(self.zdict[</code><code>'Heap_used'</code><code>]) / float(self.zdict[</code><code>'Heap_max'</code><code>])*100,</code><code>'0.2f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'YGC'</code><code>] = self.pdict[</code><code>'YGC'</code><code>]</code>

<code>        </code><code>self.zdict[</code><code>'FGC'</code><code>] = self.pdict[</code><code>'FGC'</code><code>]</code>

<code>        </code><code>self.zdict[</code><code>'YGCT'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'YGCT'</code><code>]),</code><code>'0.3f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'FGCT'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'FGCT'</code><code>]),</code><code>'0.3f'</code><code>)</code>

<code>        </code><code>self.zdict[</code><code>'GCT'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'GCT'</code><code>]),</code><code>'0.3f'</code><code>) </code>

<code>    </code> 

<code>        </code><code>if</code> <code>self.pdict[</code><code>'YGC'</code><code>] == </code><code>'0'</code><code>:</code>

<code>           </code><code>self.zdict[</code><code>'YGCT_avg'</code><code>] = </code><code>'0'</code>

<code>        </code><code>else</code><code>: </code>

<code>           </code><code>self.zdict[</code><code>'YGCT_avg'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'YGCT'</code><code>])</code><code>/float</code><code>(self.pdict[</code><code>'YGC'</code><code>]),</code><code>'0.3f'</code><code>)</code>

<code>        </code><code>if</code> <code>self.pdict[</code><code>'FGC'</code><code>] == </code><code>'0'</code><code>:</code>

<code>           </code><code>self.zdict[</code><code>'FGCT_avg'</code><code>] = </code><code>'0'</code>

<code>        </code><code>else</code><code>:</code>

<code>           </code><code>self.zdict[</code><code>'FGCT_avg'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'FGCT'</code><code>])</code><code>/float</code><code>(self.pdict[</code><code>'FGC'</code><code>]),</code><code>'0.3f'</code><code>)</code>

<code>        </code><code>if</code> <code>self.pdict[</code><code>'YGC'</code><code>] == </code><code>'0'</code> <code>and self.pdict[</code><code>'FGC'</code><code>] == </code><code>'0'</code><code>:</code>

<code>           </code><code>self.zdict[</code><code>'GCT_avg'</code><code>] = </code><code>'0'</code> 

<code>           </code><code>self.zdict[</code><code>'GCT_avg'</code><code>] = </code><code>format</code><code>(float(self.pdict[</code><code>'GCT'</code><code>])/(float(self.pdict[</code><code>'YGC'</code><code>]) + float(self.pdict[</code><code>'FGC'</code><code>])),</code><code>'0.3f'</code><code>) </code>

<code>                  </code> 

<code>       </code><code># print "Dumping zabbix stat dictionary\n-----\n", self.zdict, "\n-----\n"</code>

<code>    </code><code>def send_to_zabbix(self, metric):</code>

<code>####      {#JAVA_NAME} tomcat_web_1 </code>

<code>####      UserParameter=java.discovery,/usr/bin/python /opt/app/zabbix/sbin/java_discovery.py</code>

<code>####      UserParameter=java.discovery_status[*],/opt/app/zabbix/sbin/jstat_status.sh $1 $2 $3 $4 </code>

<code>####      java.discovery_status[tomcat_web_1,Perm_used]</code>

<code>####      java.discovery_status[{#JAVA_NAME},Perm_used]</code>

<code>        </code><code>key = </code><code>"java.discovery_status["</code> <code>+ self.pdict[</code><code>'jpname'</code><code>] + </code><code>","</code> <code>+ metric + </code><code>"]"</code>

<code>        </code><code>if</code> <code>self.pdict[</code><code>'pid'</code><code>] != </code><code>""</code> <code>and  send_to_zabbix &gt; 0:</code>

<code>           </code><code>#print key + ":" + str(self.zdict[metric])</code>

<code>           </code><code>try:</code>

<code>                                      </code> 

<code>                 </code><code>subprocess.call([zabbix_sender, </code><code>"-c"</code><code>, zabbix_conf, </code><code>"-k"</code><code>, key, </code><code>"-o"</code><code>, str(self.zdict[metric])], stdout=FNULL,stderr=FNULL, shell=False) </code>

<code>           </code><code>except OSError, detail:</code>

<code>                 </code><code>print </code><code>"Something went wrong while exectuting zabbix_sender : "</code><code>, detail</code>

<code>           </code><code>print </code><code>"Simulation: the following command would be execucted :\n"</code><code>, zabbix_sender, </code><code>"-c"</code><code>, zabbix_conf, </code><code>"-k"</code><code>, key, </code><code>"-o"</code><code>, self.zdict[metric], </code><code>"\n"</code>

<code>accepted_modes = [</code><code>'alive'</code><code>, </code><code>'all'</code><code>]</code>

<code>if</code> <code>len(sys.argv) == 3 and sys.argv[2] </code><code>in</code> <code>accepted_modes:</code>

<code>    </code><code>java_name = sys.argv[1]</code>

<code>    </code><code>mode = sys.argv[2]</code>

<code>else</code><code>:</code>

<code>    </code><code>usage()</code>

<code>#Check if process is running / Get PID</code>

<code>jproc = Jprocess(java_name) </code>

<code>pid = jproc.chk_proc()</code>

<code>if</code> <code>pid != </code><code>""</code> <code>and  mode == </code><code>'all'</code><code>:</code>

<code>   </code><code>jproc.get_jstats()</code>

<code>  </code><code># print jproc.zdict</code>

<code>   </code><code>jproc.compute_jstats()               </code>

<code>   </code><code>FNULL = </code><code>open</code><code>(os.devnull, </code><code>'w'</code><code>)</code>

<code>   </code><code>for</code> <code>key </code><code>in</code> <code>jproc.zdict:</code>

<code>       </code><code>#print key,jproc.zdict[key]</code>

<code>       </code><code>jproc.send_to_zabbix(key)</code>

<code>   </code><code>FNULL.close()</code>

<code>   </code><code>print pid</code>

<code>   </code><code>print 0</code>

<code>说明,跟参考文章的不同点</code>

<code>1.</code><code>'sudo'</code> <code>改成</code><code>'sudo'</code><code>,</code><code>'-u'</code><code>,</code><code>'tomcat'</code>

<code>2.注释perm段,因为jdk1.8 jstat输出没有了</code>

<code>3.send_to_zabbix 提示TypeError: cannot concatenate </code><code>'str'</code> <code>and </code><code>'int'</code> <code>objects</code>

<code>self.zdict[metric]换成str(self.zdict[metric])</code>

<code>4.[zabbix_sender, </code><code>"-c"</code><code>, zabbix_conf, </code><code>"-k"</code><code>, key, </code><code>"-o"</code><code>, str(self.zdict[metric])], stdout=FNULL,stderr=FNULL, shell=False)</code>

<code>这行改为</code>

<code>[zabbix_sender, </code><code>"-c"</code><code>, zabbix_conf, </code><code>"-k"</code><code>, key, </code><code>"-o"</code><code>, str(self.zdict[metric]), </code><code>"-z"</code><code>, serverip, </code><code>"-s"</code><code>, ip]</code>

<code>原因在于zabbix_sender 发送数据的需要指定-s,具体参考上面ttlsa的链接</code>

5.重启zabbix_agentd

6.模板的话

7.zabbix_get和zabbix_send 测试

zabbix_get

/usr/local/zabbix/bin/zabbix_get -s $ip -p 10050 -k java.discovery_status[你的应用名字,all]

zabbix_send

/usr/local/zabbix/bin/zabbix_sender -c /usr/local/zabbix/etc/zabbix_agentd.conf -k "java.discovery_status[你的应用名字,GCT_avg]" -o '0.021' -s xx -z serverip

xx表示为zabbix_agentd里面的hostname,这里要注意一下

如果你这个hostname与web界面不一样,那么/var/log/zabbix_agentd.log(log是排错的重要手段)会报错,no active checks on server [xx:10051]: host [xx] not found

最好改成一致

hostname=你的客户端ip,我的web界面都是ip(太low了,需要改成ip+服务,看起来方便)

8.模板我改成了30分钟,正常30分钟出图

<a href="http://s1.51cto.com/wyfs02/M00/8A/96/wKioL1g09smD6xLWAAGy6q_hH4Y467.png-wh_500x0-wm_3-wmp_4-s_1681240738.png" target="_blank"></a>

首先看最新数据,有没有应用集,有那么你就成功了。

坑太多了,如果有问题,提出一起谈论下。

后期,这个脚本还是要修改的,增加第三步jstat输出的四个变量

最后提醒,一定要确认zabbix是否能获取数据

sudo -u zabbix /usr/bin/python /usr/local/zabbix/bin/jstat_status.py xx_tomcat all

因为碰到有几台机器不能出图,所以做一下最后的check

1.cat /etc/hosts

ip hostname

2.cat /etc/sudoers

zabbix ALL=(tomcat) NOPASSWD:/bin/netstat,/usr/bin/omreport,/usr/java/jdk/bin/jstat,/usr/bin/python

tomcat ALL=(ALL) NOPASSWD:/bin/kill,/bin/chown,/usr/java/jdk/bin/jstat,/usr/bin/python,/bin/netstat,/usr/bin/omreport

3.sudo -u zabbix /usr/bin/python /usr/local/zabbix/bin/jstat_status.py xx_tomcat all

没有数据,很有可能是zabbix权限问题。排查的第一点。终于完成了。

最后更新 2017.1.4

步骤一定要按评论里面一步步操作

sudo -u zabbix /usr/local/zabbix/bin/zabbix_sender -c /usr/local/zabbix/etc/zabbix_agentd.conf -k "java.discovery_status[xx_tomcat,GCT_avg]" -o '0.022' -s xx -z xx

当你尝试zabbix_sender的时候,我在线上,有几台没有出图。

原因在于,xx_tomcat是可以的,但是如果是这样xx-xx-xx_tomcat是会fail的

如果你用strace跟踪zabbix_sender

<a href="http://s5.51cto.com/wyfs02/M00/8C/73/wKiom1hss0mQ8FYjAACKtRb0X_M198.png-wh_500x0-wm_3-wmp_4-s_1800269666.png" target="_blank"></a>

最终只有2和0的区别,其他没显示,strace跟踪不行。

3.如果要调试,请参考

gdb 调试zabbix_server解决zabbix_sender不成功的问题

<a href="https://www.tiege.me/?p=188" target="_blank">https://www.tiege.me/?p=188</a>

此文章总结了根本原因

1、类型一定要是zabbix_trap类型;

2、allowed ip要填写zabbix_sender的ip地址,如果有多个,使用,分割;

3、zabbix_sender命令中的-s参数hostname要和server的web界面上一致;

终于完了。

本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1812342,如需转载请自行联系原作者