Usuario:Luis.perez/sistemaspyaytozgz/watchdog

De WikiEducator
Saltar a: navegación, buscar

Monitorización de servidores y recolección de datos con Watchdog

¿ Qué es Watchdog ?

  • Librería para facilitar la monitorización de servicios y notificar o realizar acciones en respuesta a incidentes.
  • DSL propio para definir servicios y acciones
  • Api simple y pequeña

Instalación

Por ahora no está disponible por defecto en distribuciones. Basta con descargar:

https://raw.github.com/sebastien/watchdog/master/Sources/watchdog.py

e incluirlo en el pythonpath.

O bien clonar o descargar el repo https://github.com/sebastien/watchdog.git

e instalarlo mediante

$ python setup.py install

Estructura del DSL

Watchdog dsl.png

  • Los servicios se registran en el monitor
  • Un servicio puede tener varias reglas, que se comprueban con una frecuencia de tiempo configurable
  • Se pueden definir acciones cuando las reglas terminan con éxito o fracaso.

Reglas y acciones

  • Reglas: HTTP (prueba un servicio http), SystemHealth(comprueba que los niveles de cpu, disco, y memoria están por debajo de los niveles que establecemos), ProcessInfo, SystemInfo, Bandwith, Mem, Delta.
  • Acciones: Log, Print, Restart (para reiniciar procesos), Email, XMPP, Incident (para ejectutar otras acciones en base a multiples fallos seguidos), ZMQPublish (para publicar mensajes en colas ZeroMQ).
  • Podemos crear acciones y reglas personalizadas, extendiendo de Action y Rule.

Ejemplos

Ejemplo básico:

from watchdog import *
 
Monitor(
    Service(
        name="apache-ensure-up",
        monitor=(
            HTTP(
                GET="http://localhost:80/",
                freq=Time.ms(500),
                fail=[
                      Print("Apache is down!!")
                ]
            )
        )
    )
).run()

Enviando emails:

  HTTP(
     GET="http://myservice.com/,
     freq=Time.ms(500),
     fail=[
         Email(
           "admin@company.com",
           "[Watchdog] Service unreachable", "Latency over 500ms",
           "smtp.company.com", "username", "password"
     ]
  )

Incidentes, varios errores en un determinado tiempo:

  HTTP(
     GET="http://myservice.com/,
     freq=Time.ms(500),
     fail=[
         Incident(
           errors = 5,
           during = Time.s(10)
           actions = [ ... ]
     ]
  )

Monitorizando la salud del sistema:

    SystemInfo(
        freq=Time.s(1),
        success = (
            LogResult("myserver.system.mem=",  extract=lambda r,_:r["memoryUsage"]),
            LogResult("myserver.system.disk=", extract=lambda r,_:reduce(max,r["diskUsage"].values())),
            LogResult("myserver.system.cpu=",  extract=lambda r,_:r["cpuUsage"]),
            )
    ),
    Delta(
        Bandwidth("eth0", freq=Time.s(1)),
        extract = lambda v:v["total"]["bytes"]/1000.0/1000.0,
        success = [LogResult("myserver.system.eth0.sent=")]
    ),
    SystemHealth(
        cpu=0.90, disk=0.90, mem=0.90,
        freq=Time.s(60),
        fail=[Print("Health compromised!!")]
    )