2012-04-23 17 views
10

Me gustaría controlar elasticsearch usando nagios. Básicamente, quiero saber si elasticsearch está activo.Cómo controlar elasticsearch usando nagios

creo que puedo usar la API del Clúster de Salud elasticsearch (see here)

y utilizar el 'status' de que regrese (verde, amarillo o rojo), pero todavía no saben cómo utilizar nagios para el caso (nagios está en un servidor y elasticsearc está en otro servidor).

¿Hay alguna otra manera de hacerlo?

EDITAR: Acabo de encontrar que - check_http_json. Creo que lo intentaré.

Respuesta

12

Después de un tiempo, he logrado controlar elasticsearch usando el nrpe. Quería usar la API elasticsearch Cluster Health, pero no pude usarla desde otra máquina, debido a problemas de seguridad ... Por lo tanto, en el servidor de supervisión creé un nuevo servicio, que check_command es check_command check_nrpe!check_elastic. Y ahora en el servidor remoto, donde el elasticsearch es que he Editted el archivo nrpe.cfg con lo siguiente:

command[check_elastic]=/usr/local/nagios/libexec/check_http -H localhost -u /_cluster/health -p 9200 -w 2 -c 3 -s green 

que admite, ya que este comando se ejecuta desde el servidor remoto - así que no hay problemas de seguridad aquí ...

Funciona! Seguiré intentando este comando check_http_json que publiqué en mi qeustion, pero por ahora, mi solución es lo suficientemente buena.

+0

¡Gracias por resolver esto! Además de trabajar en todos los sistemas para evitar problemas de seguridad, es ideal para monitorear clústeres en máquinas con diferentes estructuras de directorios. El complemento check_http está en 3 directorios diferentes en nuestros diversos servidores. Este método me permite ejecutar la verificación, pero deja que la máquina local administre la ruta del complemento. ¡Gracias de nuevo! –

6

Después de jugar con las sugerencias en esta publicación, escribí un simple script check_elasticsearch. Devuelve el estado como OK, WARNING y CRITICAL correspondiente al parámetro "estado" en la respuesta de estado del clúster ("verde", "amarillo" y "rojo", respectivamente).

También toma todos los otros parámetros de la página de estado y los vuelca en el formato estándar de Nagios.

¡Disfrútalo!

+1

funciona bien y no tiene dependencias estúpidas. ¡Gracias! –

1

Puede utilizar esta secuencia de comandos de Python para supervisar su clúster de Elasticsearch. Este script verifica su IP: puerto para el estado de Elasticsearch. Esta y más secuencias de comandos de Python para supervisar Elasticsearch se pueden encontrar en here.

#!/usr/bin/python 
from nagioscheck import NagiosCheck, UsageError 
from nagioscheck import PerformanceMetric, Status 
import urllib2 
import optparse 

try: 
    import json 
except ImportError: 
    import simplejson as json 


class ESClusterHealthCheck(NagiosCheck): 

    def __init__(self): 

     NagiosCheck.__init__(self) 

     self.add_option('H', 'host', 'host', 'The cluster to check') 
     self.add_option('P', 'port', 'port', 'The ES port - defaults to 9200') 

    def check(self, opts, args): 
     host = opts.host 
     port = int(opts.port or '9200') 

     try: 
      response = urllib2.urlopen(r'http://%s:%d/_cluster/health' 
             % (host, port)) 
     except urllib2.HTTPError, e: 
      raise Status('unknown', ("API failure", None, 
         "API failure:\n\n%s" % str(e))) 
     except urllib2.URLError, e: 
      raise Status('critical', (e.reason)) 

     response_body = response.read() 

     try: 
      es_cluster_health = json.loads(response_body) 
     except ValueError: 
      raise Status('unknown', ("API returned nonsense",)) 

     cluster_status = es_cluster_health['status'].lower() 

     if cluster_status == 'red': 
      raise Status("CRITICAL", "Cluster status is currently reporting as " 
         "Red") 
     elif cluster_status == 'yellow': 
      raise Status("WARNING", "Cluster status is currently reporting as " 
         "Yellow") 
     else: 
      raise Status("OK", 
         "Cluster status is currently reporting as Green") 

if __name__ == "__main__": 
    ESClusterHealthCheck().run()