天天看點

12、Zabbix Low Lever Discovery功能

Low Lever Discovery是什麼?看看zabbix官網的解釋:

官網位址:

https://www.zabbix.com/documentation/2.2/manual/discovery/low_level_discovery

Low-level discovery provides a way to automatically create items, triggers, and graphs for different entities on a computer. For instance, Zabbix can automatically start monitoring file systems or network interfaces on your machine, without the need to create items for each file system or network interface manually. Additionally it is possible to configure Zabbix to remove unneeded entities automatically based on actual results of periodically performed discovery.

In Zabbix, three types of item discovery are supported out of the box:

discovery of file systems;

discovery of network interfaces;

discovery of SNMP OIDs.

相比較于自動注冊和自動發現,low-level discovery更底層點,用于發現item、trigger、graph等等。我們最常用如:filesystem(如/、/home、/proc、C:、D:等),network(eth0,eth1等)

LLD監控,要求Key的傳回值為JSON格式。例如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<code>{</code>

<code>  </code><code>"data"</code><code>:[</code>

<code>  </code> 

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/"</code><code>,                           </code><code>"{#FSTYPE}"</code><code>:</code><code>"rootfs"</code>   <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/sys"</code><code>,                        </code><code>"{#FSTYPE}"</code><code>:</code><code>"sysfs"</code>    <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/proc"</code><code>,                       </code><code>"{#FSTYPE}"</code><code>:</code><code>"proc"</code>     <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/dev"</code><code>,                        </code><code>"{#FSTYPE}"</code><code>:</code><code>"devtmpfs"</code> <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/dev\/pts"</code><code>,                   </code><code>"{#FSTYPE}"</code><code>:</code><code>"devpts"</code>   <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/"</code><code>,                           </code><code>"{#FSTYPE}"</code><code>:</code><code>"ext3"</code>     <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/lib\/init\/rw"</code><code>,              </code><code>"{#FSTYPE}"</code><code>:</code><code>"tmpfs"</code>    <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/dev\/shm"</code><code>,                   </code><code>"{#FSTYPE}"</code><code>:</code><code>"tmpfs"</code>    <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/home"</code><code>,                       </code><code>"{#FSTYPE}"</code><code>:</code><code>"ext3"</code>     <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/tmp"</code><code>,                        </code><code>"{#FSTYPE}"</code><code>:</code><code>"ext3"</code>     <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/usr"</code><code>,                        </code><code>"{#FSTYPE}"</code><code>:</code><code>"ext3"</code>     <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/var"</code><code>,                        </code><code>"{#FSTYPE}"</code><code>:</code><code>"ext3"</code>     <code>},</code>

<code>  </code><code>{ </code><code>"{#FSNAME}"</code><code>:</code><code>"\/sys\/fs\/fuse\/connections"</code><code>, </code><code>"{#FSTYPE}"</code><code>:</code><code>"fusectl"</code>  <code>}</code>

<code>  </code><code>]</code>

<code>}</code>

注意:定義Key的字元串隻能為大寫,不能為小寫

LLD監控案例

背景:公司的某些阿裡雲主機上有多個java程式,都需要監控,zabbix自帶的“Template JMX Generic”這個監控模闆由于key相同的限制,隻能監控一個java程式。不能滿足需求。是以我們需要利用LLD實作多JMX執行個體監控。

在做LLD監控之前,首先我們要知道JMX監控項有哪些,如何擷取這些監控項的資料?

監控項我們參考zabbix自帶的監控模闆Template JMX Generic,要擷取這些Item的資料可以使用以下方式:

<code>[root@localhost scripts]</code><code># java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 | grep java.lang</code>

<code>java.lang:</code><code>type</code><code>=Compilation</code>

<code>java.lang:</code><code>type</code><code>=ClassLoading</code>

<code>java.lang:</code><code>type</code><code>=Memory</code>

<code>java.lang:name=Metaspace,</code><code>type</code><code>=MemoryPool</code>

<code>java.lang:name=Eden Space,</code><code>type</code><code>=MemoryPool</code>

<code>java.lang:</code><code>type</code><code>=Threading</code>

<code>java.lang:name=Survivor Space,</code><code>type</code><code>=MemoryPool</code>

<code>java.lang:name=Metaspace Manager,</code><code>type</code><code>=MemoryManager</code>

<code>java.lang:</code><code>type</code><code>=Runtime</code>

<code>java.lang:name=MarkSweepCompact,</code><code>type</code><code>=GarbageCollector</code>

<code>java.lang:name=Compressed Class Space,</code><code>type</code><code>=MemoryPool</code>

<code>java.lang:name=CodeCacheManager,</code><code>type</code><code>=MemoryManager</code>

<code>java.lang:name=Copy,</code><code>type</code><code>=GarbageCollector</code>

<code>java.lang:</code><code>type</code><code>=OperatingSystem</code>

<code>java.lang:name=Code Cache,</code><code>type</code><code>=MemoryPool</code>

<code>java.lang:name=Tenured Gen,</code><code>type</code><code>=MemoryPool</code>

上面這些都是ObjectName,每一個ObjectName都有對應的屬性(Attributes)

<code>[root@localhost scripts]</code><code># java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 java.lang:type=Memory</code>

<code>Attributes:</code>

<code> </code><code>Verbose: Verbose (</code><code>type</code><code>=boolean)</code>

<code> </code><code>ObjectPendingFinalizationCount: ObjectPendingFinalizationCount (</code><code>type</code><code>=int)</code>

<code> </code><code>HeapMemoryUsage: HeapMemoryUsage (</code><code>type</code><code>=javax.management.openmbean.CompositeData)</code>

<code> </code><code>NonHeapMemoryUsage: NonHeapMemoryUsage (</code><code>type</code><code>=javax.management.openmbean.CompositeData)</code>

<code> </code><code>ObjectName: ObjectName (</code><code>type</code><code>=javax.management.ObjectName)</code>

<code>Operations:</code>

<code> </code><code>gc: gc</code>

<code>  </code><code>Parameters 0, </code><code>return</code> <code>type</code><code>=void</code>

如果要擷取其中一個屬性的值,可以用以下方式實作:

<code>[root@localhost scripts]</code><code># java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 java.lang:type=Memory HeapMemoryUsage</code>

<code>01</code><code>/14/2016</code> <code>05:33:14 +0800 org.archive.jmx.Client HeapMemoryUsage: </code>

<code>committed: 31670272</code>

<code>init: 16777216</code>

<code>max: 249364480</code>

<code>used: 24961984</code>

利用上面指令就可以擷取堆記憶體的相關資訊,然後通過腳本擷取需要的資訊即可。

在上面的指令中,我們需要知道以下參數,

1、java程式開啟的監控端口号

2、ObjectName

3、Attributes

4、附加資訊,例如堆記憶體的committed、init、max、used

但是有些Attributes的值隻有一個,例如:  下面檢視到的線程的峰值資訊,傳回結果隻有一個

<code>[root@localhost scripts]</code><code># java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:12345 java.lang:type=Threading PeakThreadCount</code>

<code>01</code><code>/14/2016</code> <code>05:37:47 +0800 org.archive.jmx.Client PeakThreadCount: 31</code>

是以我們各種情況都需要考慮到,下面是監控腳本:

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

<code>import</code> <code>commands</code>

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

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

<code>java_com=commands.getoutput(</code><code>'/usr/bin/which java'</code><code>)</code>

<code>com=</code><code>"%s -jar /etc/zabbix/scripts/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:%s '%s' %s"</code> <code>% (java_com,sys.argv[1],sys.argv[2].replace(</code><code>'+'</code><code>,</code><code>','</code><code>),sys.argv[3])</code>

<code>output=commands.getoutput(com)</code>

<code>output_list=output.</code><code>split</code><code>(</code><code>'\n'</code><code>)</code>

<code>for</code> <code>_ </code><code>in</code> <code>output_list:</code>

<code>        </code><code>if</code> <code>len(output_list) == 1:</code>

<code>                </code><code>print _.</code><code>split</code><code>(</code><code>': '</code><code>)[-1]</code>

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

<code>                </code><code>item = _.</code><code>split</code><code>(</code><code>':'</code><code>)</code>

<code>                </code><code>if</code> <code>len(item) &gt; 1 and item[0] == sys.argv[4]:</code>

<code>                        </code><code>print item[1].strip()</code>

我們要給腳本傳遞的3個或者4個參數。當輸出結果為一行時,我們傳遞三個參數,當輸出結果有多行資訊時,我們傳遞4個參數

分别是監控端口号、ObjectName、Attributes、附加資訊(used、max、committed等)

PS:測試時自動發現的腳本沒有寫,直接寫在一個文檔内,寫成json格式:

<code>{“data</code><code>":[{"</code><code>{</code><code>#PORT}":"12345"},{"{#PORT}":"23456"},{"{#PORT}":"34567"}]}</code>

當然,在測試環境中我的主機上有三個tomcat,分别開啟了這三個監控端口

用戶端配置檔案:

etc/zabbix/zabbix_agentd.d/userparameter_jmx.conf

<code>UserParameter=jmx.port,</code><code>cat</code> <code>/etc/zabbix/scripts/port</code><code>.txt</code>

<code>UserParameter=jmx[*],</code><code>/etc/zabbix/scripts/test2</code><code>.py $1 </code><code>"$2"</code> <code>$3 $4</code>

注意:agent端的配置檔案/etc/zabbix/zabbix_agentd.conf 開啟以下設定:

<code>AllowRoot=1             </code><code>#以root身份啟動zabbix—agent,才有權限執行監控指令</code>

<code>Timeout=30              </code><code>#用戶端逾時時間,</code>

<code>UnsafeUserParameters=1</code>

設定好之後需要重新開機zabbix-agent服務

<code>[root@localhost zabbix_agentd.d]</code><code># /etc/init.d/zabbix-agent restart</code>

zabbix-server web端配置

1、建立一個Template

<a href="http://s1.51cto.com/wyfs02/M02/82/BD/wKioL1dfy7qyoEEEAAK0EaLFbtY368.png" target="_blank"></a>

2、建立discovery rule

注意key這裡一定要參照這裡寫

UserParameter=jmx.port,cat /etc/zabbix/scripts/port.txt

UserParameter=jmx[*],/etc/zabbix/scripts/test2.py $1 "$2" $3 $4

<a href="http://s5.51cto.com/wyfs02/M00/82/BF/wKiom1dfyt3x4VCXAAGOu0c-jjk425.png" target="_blank"></a>

3、建立監控項Item  prototypes

注意key的表達式jmx[$1,$2,$3,$4],資料類型一定要注意,機關也要注意,zabbix中預設的容量機關為B,時間機關為毫秒,這些機關不确定的可參考zabbix自帶的模闆。包括監控的時間間隔。

<a href="http://s2.51cto.com/wyfs02/M01/82/BF/wKiom1dfy1Xw0H_-AAKE6hbAGxw361.png" target="_blank"></a>

需要注意的問題:

1、key中的第二個參數,某些的ObjectName(例如:”java.lang:type=MemoryPool,name=CMS Old Gen")帶有空格和逗号,導緻無法擷取到資料,後經查證發現這是一個bug,解決方法:

在腳本中對第二個參數使用replace方法,将web上填寫的參數中的”+“号,替換成”,“号。另外在

UserParameter=jmx[*],/etc/zabbix/scripts/test2.py $1 "$2" $3 $4  中将$2用引号引起來。

2、不支援的監控項建議Disable掉,否則在Web端的Queue中會有很多隊列堵住。

本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1789196,如需轉載請自行聯系原作者