Nagios: мониторинг Tomcat

Автор: | 03/07/2015
 

nagios_logoПлагин написан на Python.

Имеет возможность отслеживать статус, использование памяти, количество потоков и .т.д.

Предполагается, что Nagios установлен согласно посту Nagios: установка на CentOS 7 + NGINX.

Загружаем файл плагина:

# cd /tmp
# wget https://github.com/dduenasd/check_tomcat.py/archive/v2.0.tar.gz
# tar xfp v2.0.tar.gz
# cd check_tomcat.py-2.0

Копируем плагин:

# cp check_tomcat.py /usr/lib64/nagios/plugins
# chmod +x /usr/lib64/nagios/plugins/check_tomcat.py

Если нету – то устанавливаем Tomcat manager:

# yum install tomcat7-admin-webapps

Для Tomcat должен автивирован пользователь в файле /etc/tomcat/tomcat-users.xml:

<tomcat-users>
    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <user name="admin" password="adminadmin" roles="manager-gui, manager-script"" />
</tomcat-users>

Кроме того – можно поправить реалм LockOutRealm, что бы не забанить самого себя во время проверок.

Для этого – в файле /etc/tomcat7/server.xml редактируем блок:

      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

И в первой строке дописываем failureCount="0" и lockOutTime="0":

<Realm className="org.apache.catalina.realm.LockOutRealm" failureCount="0" lockOutTime="0">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
       ...

Проверяем:

# /usr/lib64/nagios/plugins/check_tomcat.py -H localhost -p 8080 -u admin -a adminadmin -m mem -w 1 -c 20
WARNING Used memory 25.9 MB of 241.7 MB(10.71%)|'Used_memory'=11%;1;20

Примечание: для Python 2.6 и 2.7 – отредактируйте файл плагина, и в строке 176 измените:

format_string = '{:.%sf} {}' % (num_decimals)

на:

format_string = '{0:.%sf} {1}' % (num_decimals)

Кратко – как плагин работает.

Он обращается к URL в виде HOSTNAME (переданный в параметре -H), и добавляет к нему строку “/status?XML=true“:

#open and read XML from tomcat manager/status?XML=true
def read_page_status_XML(host,port,url,user,password):

    url_status_xml = url+"/status?XML=true"
    page,error_page = read_page(host,port,url_status_xml,user,password)
    # End of Open manager status
    if(error_page):
        return page,error_page
    else:
    # Read xml string
        root = ET.fromstring(page)
        #show XML tree
        if args.verbosity>1:
            print "XML tree:"
            print ET.dump(root)
            print ""
        return root,False

XML-файл выглядит примерно так:

<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="/manager/xform.xsl" ?>
<status>
	<jvm>
		<memory free='8628128' total='34742272' max='253427712'/>
		<memorypool name='Eden Space' type='Heap memory' usageInit='4521984' usageCommitted='9633792' usageMax='69926912' usageUsed='6084968'/>
		<memorypool name='Survivor Space' type='Heap memory' usageInit='524288' usageCommitted='1179648' usageMax='8716288' usageUsed='1179640'/>
		<memorypool name='Tenured Gen' type='Heap memory' usageInit='11206656' usageCommitted='23928832' usageMax='174784512' usageUsed='18849536'/>
		<memorypool name='Code Cache' type='Non-heap memory' usageInit='2555904' usageCommitted='6488064' usageMax='251658240' usageUsed='6387712'/>
		<memorypool name='Compressed Class Space' type='Non-heap memory' usageInit='0' usageCommitted='1966080' usageMax='1073741824' usageUsed='1774464'/>
		<memorypool name='Metaspace' type='Non-heap memory' usageInit='0' usageCommitted='17956864' usageMax='-1' usageUsed='17321704'/>
	</jvm>
	<connector name='"ajp-bio-8009"'>
		<threadInfo  maxThreads="200" currentThreadCount="0" currentThreadsBusy="0" />
		<requestInfo  maxTime="0" processingTime="0" requestCount="0" errorCount="0" bytesReceived="0" bytesSent="0" />
		<workers></workers>
	</connector>
	<connector name='"http-bio-8080"'>
		<threadInfo  maxThreads="200" currentThreadCount="10" currentThreadsBusy="1" />
		<requestInfo  maxTime="250" processingTime="437" requestCount="78" errorCount="46" bytesReceived="0" bytesSent="146940" />
		<workers>
			<worker  stage="R" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="&#63;" virtualHost="&#63;" method="&#63;" currentUri="&#63;" currentQueryString="&#63;" protocol="&#63;" />
			<worker  stage="R" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="&#63;" virtualHost="&#63;" method="&#63;" currentUri="&#63;" currentQueryString="&#63;" protocol="&#63;" />
			<worker  stage="S" requestProcessingTime="3" requestBytesSent="0" requestBytesReceived="0" remoteAddr="194.105.145.69" virtualHost="52.6.24.174" method="GET" currentUri="/manager/status" currentQueryString="XML=true" protocol="HTTP/1.1" />
		</workers>
	</connector>
</status>

После чего с помощью ElementTree парсит результаты:

...
            memory = tree_xml.find('.//memory')
            free_memory = float(memory.get('free'))
            total_memory = float(memory.get('total'))
            max_memory = float(memory.get('max'))
            available_memory = free_memory + max_memory - total_memory
            used_memory = max_memory - available_memory
            percent_used_memory = float((used_memory * 100)/max_memory)
...

Редактируем файл /usr/local/nagios/etc/objects/commands.cfg, и добавляем новые проверки:

define command{
        command_name    check-tomcat-mem
        command_line    /usr/lib64/nagios/plugins/check_tomcat.py -H '$HOSTADDRESS$' -p 'ARG1$' -u $ARG2$' -a $ARG3$' -m mem -w 20 -c 50
        }

define command{
        command_name    check-tomcat-status
        command_line    /usr/lib64/nagios/plugins/check_tomcat.py -H '$HOSTADDRESS$' -p $ARG1$' -u $ARG2$' -a $ARG3$' -m status
        }

Редактируем файл настроек хоста, в данном случае – /usr/local/nagios/etc/objects/localhost.cfg, и добавляем их вызов:

define command{
        command_name    check-tomcat-mem
        command_line    /usr/lib64/nagios/plugins/check_tomcat.py -H '$HOSTADDRESS$' -p '$ARG1$' -u '$ARG2$' -a '$ARG3$' -m mem -w 20 -c 50
        }

define command{
        command_name    check-tomcat-status
        command_line    /usr/lib64/nagios/plugins/check_tomcat.py -H '$HOSTADDRESS$' -p '$ARG1$' -u '$ARG2$' -a '$ARG3$' -m status
        }

Перезапускаем Nagios:

# service nagios restart
Restarting nagios (via systemctl):                         [  OK  ]

Несколько минут ждём – готово:

nagios_install_centos_7_3