Hoy queremos compartir un caso que nos ha ocurrido mientras buscabamos un template para monitorización de Apache con la herramienta de monitorización Zabbix.
Zabbix es una herramienta de monitorización Open Source basada en templates, y es una buena alternativa a Nagios por su facilidad de uso y de configuración.
Encontramos un template muy interesante en la página donde los desarrolladores dejan sus templates para uso público, y encontramos uno para Apache llamado “Template Apache Status“. Este template se puede encontrar en el siguiente link: https://github.com/gpmidi/zabbix-apache-stats
Este template según la documentación se utiliza para la versión de Apache 2.4.13, y el código del fichero que realiza la recogida de datos y configura el envío de dichos datos al servidor de Zabbix, que está escrito en Python, tiene el formato para esta versión. La recogida de datos de Apache recoge 51 valores, y en cambio el template solamente gestiona 20 items. Al realizar las pruebas de código recibíamos un error:
failed to send parsed data: error returned from /usr/bin/zabbix_sender! ret: 2, out: ‘info from server: “processed: 20; failed: 31; total: 51; seconds spent: 0.000501”
sent: 51; skipped: 0; total: 51′, err: ‘zabbix_sender [14772]: DEBUG: answer [{“response”:”success”,”info”:”processed: 20; failed: 31; total: 51; seconds spent: 0.000501″}]’
ZBX_NOTSUPPORTED
Según el error, se aprecia claramente que los 20 items del template se procesan correctamente y el problema está en los otros 31 valores que se devuelven por parte del fichero que no son items del Template. La mejor solución para que esto funcione es reducir el número de valores enviados al número de items, y quitar los valores que devuelven error y que provocan la inconsistencia. Para ello, dentro del código del fichero, llamado check_apache, realizamos la siguiente modificación:
def main(): opts, args = get_opts() result = 0 try: server_status = fetchURL(opts.url, user = opts.user, passwd = opts.passwd) except Exception as e: zbx_fail('failed to read server-status: %s' % e) try: data = parse( data = server_status, version = opts.statusvers ) except Exception as e: zbx_fail('failed to parse server-status: %s' % e) payload = "" if opts.agentconfig: # agent check; assume hostname from zabbix agent config for key, val in data.items(): zabbix_items = ['Uptime','IdleWorkers','CPULoad','Closingconnection','Idlecleanupofworker','BytesPerReq','BytesPerSec','ReqPerSec','Logging','TotalAccesses','TotalkBytes','DNSLookup','Openslotwithnocurrentprocess','ReadingRequest','SendingReply','Keepaliveread','WaitingforConnection','BusyWorkers','Gracefullyfinishing','Startingup' ] if key in zabbix_items: payload += "-\tapache[%s]\t%s\n" % (key, val) try: …
A veces los problemas se arreglan con soluciones sencillas. Simplemente se hace un record con los nombres de los ítems que va a pedir zabbix, y se realiza un if para que si el valor coincide se guarde en la salida del fichero para enviarlo en Zabbix.
Con este cambio, ya se encuentra que solamente devuelve los 20 valores y empieza a recoger los datos y enviarlos correctamente a Zabbix.
Esperamos que esta entrada os sea de utilidad.
Un saludo,
Equipo DBA