Escribiendo una verificación de agente personalizada

Descripción general

Esta página le guía a través del proceso de construir un básico “¡Hola mundo!” verificación de agente personalizada. También le muestra cómo cambiar el intervalo mínimo de recolección para la verificación.

Configuración

Instalación

Antes de crear una verificación de agente personalizada, instale el Datadog Agent.

Para trabajar con la última versión del Agent, su verificación de agente personalizada debe ser compatible con Python 3.

Configuración

  1. Cambie al directorio conf.d en su sistema. Para más información sobre dónde encontrar el directorio conf.d, consulte los archivos de configuración del Agent.

  2. En el directorio conf.d, cree un nuevo archivo de configuración para su nueva verificación de agente. Asigne un nombre al archivo custom_checkvalue.yaml.

  3. Edite el archivo para incluir lo siguiente:

    conf.d/custom_checkvalue.yaml

    init_config:
    instances:
      [{}]

  4. Cree un archivo de verificación en el directorio checks.d. Asigne un nombre al archivo custom_checkvalue.py.

    Nombrando sus verificaciones:
    • Es una buena idea prefijar su verificación con custom_ para evitar conflictos con el nombre de una integración de Datadog Agent preexistente. Por ejemplo, si tiene una verificación personalizada de Postfix, nombre sus archivos de verificación custom_postfix.py y custom_postfix.yaml en lugar de postfix.py y postfix.yaml.
    • Los nombres de los archivos de configuración y verificación deben coincidir. Si su verificación se llama custom_checkvalue.py, su archivo de configuración debe llamarse custom_checkvalue.yaml.
  5. Edite el archivo para incluir lo siguiente:

    checks.d/custom_checkvalue.py

    from checks import AgentCheck
    class HelloCheck(AgentCheck):
      def check(self, instance):
        self.gauge('hello.world', 1)

  6. Reinicie el Agent y espere a que aparezca una nueva métrica llamada hello.world en el Resumen de Métricas.

Si tiene problemas para que su verificación personalizada funcione, verifique los permisos del archivo. El archivo de verificación debe ser legible y ejecutable por el usuario del Agent. Para más pasos de solución de problemas, consulte Solucionar una verificación de agente.

Actualizando el intervalo de recolección

Para cambiar el intervalo de recolección de su verificación, utilice la configuración min_collection_interval en su archivo custom_checkvalue.yaml y especifique un ajuste en segundos. El valor predeterminado es de 15 segundos. Debe agregar el min_collection_interval a nivel de instancia. Si su verificación personalizada está configurada para monitorear múltiples instancias, debe configurar el intervalo individualmente por instancia.

Establecer el min_collection_interval en 30 no garantiza que la métrica se recoja cada 30 segundos. El recolector de Agente intenta ejecutar la verificación cada 30 segundos, pero la verificación puede terminar en cola detrás de otras integraciones y verificaciones, dependiendo de cuántas integraciones y verificaciones estén habilitadas en el mismo Agente. Si un método check tarda más de 30 segundos en completarse, el Agent nota que la verificación aún se está ejecutando y omite su ejecución hasta el siguiente intervalo.

Establezca un intervalo de recolección

Para una sola instancia, utilice esta configuración para establecer el intervalo de recolección en 30 segundos:

conf.d/custom_checkvalue.yaml

init_config:

instances:
  - min_collection_interval: 30

El ejemplo a continuación demuestra cómo cambiar el intervalo para una verificación personalizada hipotética que monitorea un servicio llamado my_service en dos servidores separados:

init_config:

instances:
  - host: "http://localhost/"
    service: my_service
    min_collection_interval: 30

  - host: "http://my_server/"
    service: my_service
    min_collection_interval: 30

Verificando su verificación

Para verificar que su verificación se está ejecutando, utilice el siguiente comando:

sudo -u dd-agent -- datadog-agent check <CHECK_NAME>

Después de verificar que su verificación se está ejecutando, reinicie el Agent para incluir la verificación y comenzar a reportar datos.

Escribiendo verificaciones que ejecutan programas de línea de comandos

Es posible crear una verificación personalizada que ejecute un programa de línea de comandos y capture su salida como una métrica personalizada. Por ejemplo, una verificación puede ejecutar el comando vgs para reportar información sobre grupos de volúmenes.

Debido a que el intérprete de Python que ejecuta las verificaciones está incrustado en el entorno de ejecución Go multihilo, no se admite el uso de los módulos subprocess o multithreading de la biblioteca estándar de Python. Para ejecutar un subproceso dentro de una verificación, utilice la función get_subprocess_output() del módulo datadog_checks.base.utils.subprocess_output. El comando y sus argumentos se pasan a get_subprocess_output() en forma de lista, con el comando y sus argumentos como una cadena dentro de la lista.

Por ejemplo, un comando que se ingresa en el símbolo del sistema de esta manera:

vgs -o vg_free

debe pasarse a get_subprocess_output() de esta manera:

out, err, retcode = get_subprocess_output(["vgs", "-o", "vg_free"], self.log, raise_on_empty_output=True)

Cuando ejecute el programa de línea de comandos, la verificación captura la misma salida que al ejecutarlo en la línea de comandos en el terminal. Realice el procesamiento de cadenas en la salida y llame a int() o float() en el resultado para devolver un tipo numérico.

Si no realiza el procesamiento de cadenas en la salida del subproceso, o si no devuelve un entero o un flotante, la verificación parece ejecutarse sin errores pero no reporta ninguna métrica o evento. La verificación también falla en devolver métricas o eventos si el usuario del Agent no tiene los permisos correctos en los archivos o directorios referenciados en el comando, o los permisos correctos para ejecutar el comando pasado como argumento a get_subprocess_output().

Aquí hay un ejemplo de una verificación que devuelve los resultados de un programa de línea de comandos:

# ...
from datadog_checks.base.utils.subprocess_output import get_subprocess_output

class LSCheck(AgentCheck):
    def check(self, instance):
        files, err, retcode = get_subprocess_output(["ls", "."], self.log, raise_on_empty_output=True)
        file_count = len(files.split('\n')) - 1  #len() returns an int by default
        self.gauge("file.count", file_count,tags=['TAG_KEY:TAG_VALUE'] + self.instance.get('tags', []))

Enviando datos desde un balanceador de carga

Un caso de uso común para escribir una verificación personalizada del Agent es enviar métricas de Datadog desde un balanceador de carga. Antes de comenzar, siga los pasos en Configuración.

Para expandir los archivos para enviar datos desde su balanceador de carga:

  1. Reemplace el código en custom_checkvalue.py con lo siguiente (reemplazando el valor de lburl con la dirección de su balanceador de carga):

    checks.d/custom_checkvalue.py

    import urllib2
    import simplejson
    from checks import AgentCheck
    
    class CheckValue(AgentCheck):
      def check(self, instance):
        lburl = instance['ipaddress']
        response = urllib2.urlopen("http://" + lburl + "/rest")
        data = simplejson.load(response)
    
        self.gauge('coreapp.update.value', data["value"])

  2. Actualice el archivo custom_checkvalue.yaml (reemplazando ipaddress con la dirección IP de su balanceador de carga):

    conf.d/custom_checkvalue.yaml

    init_config:
    
    instances:
      - ipaddress: 1.2.3.4

  3. Reinicie su Agent. Dentro de un minuto, deberá ver una nueva métrica aparecer en el Resumen de Métricas llamada coreapp.update.value que envía las métricas desde su balanceador de carga.

  4. Cree un tablero para esta métrica.

Versionado del Agent

Utilice el siguiente bloque try/except para hacer que la verificación personalizada sea compatible con cualquier versión del Agent:

try:
    # first, try to import the base class from new versions of the Agent
    from datadog_checks.base import AgentCheck
except ImportError:
    # if the above failed, the check is running in Agent version < 6.6.0
    from checks import AgentCheck

# content of the special variable __version__ will be shown in the Agent status page
__version__ = "1.0.0"

class HelloCheck(AgentCheck):
    def check(self, instance):
        self.gauge('hello.world', 1, tags=['TAG_KEY:TAG_VALUE'] + self.instance.get('tags', []))

Lectura Adicional

Más enlaces, artículos y documentación útiles: