Supported OS

Versión de la integración4.1.1

Dashboard de Gunicorn

Información general

El Datadog Agent recopila una métrica principal sobre Gunicorn: el número de procesos de workers en ejecución. También envía un check de servicio: si Gunicorn se está ejecutando o no.

El propio Gunicorn puede proporcionar más métricas utilizando DogStatsD, incluyendo:

  • Frecuencia total de solicitudes
  • Frecuencia de solicitudes por código de estado (2xx, 3xx, 4xx, 5xx)
  • Duración de solicitudes (media, mediana, máxima, percentil 95, etc.)
  • Frecuencia de mensajes de log por nivel de log (crítico, error, advertencia, excepción)

Configuración

Instalación

El check de Gunicorn del Datadog Agent está incluido en el paquete del Datadog Agent, por lo que no necesitas instalar nada más en tus servidores Gunicorn.

El check de Gunicorn requiere que el entorno Python de tu aplicación Gunicorn tenga el paquete setproctitle. Sin él, el Datadog Agent informa que no puede encontrar un proceso principal gunicorn (y por lo tanto, tampoco puede encontrar workers). Instala el paquete setproctitle en el entorno Python de tu aplicación si quieres recopilar la métrica gunicorn.workers.

Configuración

Edita el archivo gunicorn.d/conf.yaml, en la carpeta conf.d/ en la raíz de tu directorio de configuración del Agent para comenzar a recopilar tus métricas y logs de Gunicorn. Consulta el ejemplo gunicorn.yaml para conocer todas las opciones de configuración disponibles.

Recopilación de métricas

Conexión de Gunicorn con DogStatsD
  1. A partir de la versión 19.1, Gunicorn te ofrece la opción de enviar tus métricas a un daemon que implemente el protocolo StatsD, como DogStatsD. Como sucede con muchas opciones de Gunicorn, puedes pasarlo a gunicorn en la CLI (--statsd-host) o configurarlo en el archivo de configuración de tu aplicación (statsd_host). Para asegurarte de recopilar todas las métricas de Gunicorn, configura tu aplicación para que envíe métricas a DogStatsD en "localhost:8125" y reinicia la aplicación.

  2. Añade este bloque de configuración a tu archivo gunicorn.d/conf.yaml para empezar a recopilar tus métricas de Gunicorn:

init_config:

instances:
    ## @param proc_name - string - required
    ## The name of the gunicorn process. For the following gunicorn server:
    ##
    ## gunicorn --name <WEB_APP_NAME> <WEB_APP_CONFIG>.ini
    ##
    ## the name is `<WEB_APP_NAME>`
  - proc_name: <YOUR_APP_NAME>
  1. Reinicia el Agent para comenzar a enviar métricas de Gunicorn a Datadog.

Recopilación de logs

Disponible para las versiones 6.0 o posteriores del Agent

  1. La recopilación de logs está desactivada en forma predeterminada en el Datadog Agent, actívala en tu archivo datadog.yaml:

    logs_enabled: true
    
  2. Utiliza el siguiente comando para configurar la ruta del archivo de logs de acceso: --access-logfile <MY_FILE_PATH>

  3. Utiliza el siguiente comando para configurar la ruta del archivo de logs de error: --error-logfile FILE, --log-file <MY_FILE_PATH>

  4. Añade este bloque de configuración a tu archivo gunicorn.d/conf.yaml para empezar a recopilar logs de Gunicorn:

    logs:
      - type: file
        path: /var/log/gunicorn/access.log
        service: "<MY_SERVICE>"
        source: gunicorn
    
      - type: file
        path: /var/log/gunicorn/error.log
        service: "<MY_SERVICE>"
        source: gunicorn
        log_processing_rules:
          - type: multi_line
            name: log_start_with_date
            pattern: \[\d{4}-\d{2}-\d{2}
    

    Cambia los valores de los parámetros service y path y configúralos para tu entorno. Consulta el ejemplo gunicorn.yaml para conocer todas las opciones de configuración disponibles.

  5. Reinicia el Agent.

Validación

Ejecuta el subcomando de estado del Agent y busca gunicorn en la sección Checks.

Si el estado no es OK, consulte la sección Solucionar problemas.

Utiliza netstat para verificar que Gunicorn también envía tus métricas:

$ sudo netstat -nup | grep "127.0.0.1:8125.*ESTABLISHED"
udp        0      0 127.0.0.1:38374         127.0.0.1:8125          ESTABLISHED 15500/gunicorn: mas

Datos recopilados

Métricas

gunicorn.log.critical
(rate)
Tasa de declaraciones críticas registradas.
Se muestra como evento
gunicorn.log.error
(rate)
Tasa de errores registrados.
Se muestra como evento
gunicorn.log.exception
(rate)
Tasa de excepciones registradas.
Se muestra como evento
gunicorn.log.warning
(rate)
Tasa de advertencias registradas.
Se muestra como evento
gunicorn.request.duration.95percentile
(gauge)
Percentil 95 del tiempo de duración de la solicitud.
Se muestra en milisegundos
gunicorn.request.duration.avg
(gauge)
Tiempo medio de duración de la solicitud.
Se muestra en milisegundos
gunicorn.request.duration.count
(rate)
Tasa de solicitudes recibidas.
Se muestra como solicitud
gunicorn.request.duration.max
(gauge)
Tiempo máximo de duración de la solicitud.
Se muestra en milisegundos
gunicorn.request.duration.median
(gauge)
Tiempo medio de duración de la solicitud.
Se muestra en milisegundos
gunicorn.request.status.100
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 100.
Se muestra como solicitud
gunicorn.request.status.101
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 101.
Se muestra como solicitud
gunicorn.request.status.102
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 102.
Se muestra como solicitud
gunicorn.request.status.200
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 200.
Se muestra como solicitud
gunicorn.request.status.201
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 201.
Se muestra como solicitud
gunicorn.request.status.202
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 202.
Se muestra como solicitud
gunicorn.request.status.203
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 203.
Se muestra como solicitud
gunicorn.request.status.204
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 204.
Se muestra como solicitud
gunicorn.request.status.205
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 205.
Se muestra como solicitud
gunicorn.request.status.206
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 206.
Se muestra como solicitud
gunicorn.request.status.207
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 207.
Se muestra como solicitud
gunicorn.request.status.208
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 208.
Se muestra como solicitud
gunicorn.request.status.226
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 226.
Se muestra como solicitud
gunicorn.request.status.300
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 300.
Se muestra como solicitud
gunicorn.request.status.301
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 301.
Se muestra como solicitud
gunicorn.request.status.302
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 302.
Se muestra como solicitud
gunicorn.request.status.303
(rate)
Tasa de solicitudes que generan respuestas con un código de estado 303.
Se muestra como solicitud
gunicorn.request.status.304
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 304.
Se muestra como solicitud
gunicorn.request.status.305
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 305.
Se muestra como solicitud
gunicorn.request.status.307
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 307.
Se muestra como solicitud
gunicorn.request.status.308
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 308.
Se muestra como solicitud
gunicorn.request.status.400
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 400.
Se muestra como solicitud
gunicorn.request.status.401
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 401.
Se muestra como solicitud
gunicorn.request.status.402
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 402.
Se muestra como solicitud
gunicorn.request.status.403
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 403.
Se muestra como solicitud
gunicorn.request.status.404
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 404.
Se muestra como solicitud
gunicorn.request.status.405
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 405.
Se muestra como solicitud
gunicorn.request.status.406
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 406.
Se muestra como solicitud
gunicorn.request.status.407
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 407.
Se muestra como solicitud
gunicorn.request.status.408
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 408
Se muestra como solicitud
gunicorn.request.status.409
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 409.
Se muestra como solicitud
gunicorn.request.status.410
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 410.
Se muestra como solicitud
gunicorn.request.status.411
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 411.
Se muestra como solicitud
gunicorn.request.status.412
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 412.
Se muestra como solicitud
gunicorn.request.status.413
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 413.
Se muestra como solicitud
gunicorn.request.status.414
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 414.
Se muestra como solicitud
gunicorn.request.status.415
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 415.
Se muestra como solicitud
gunicorn.request.status.416
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 416.
Se muestra como solicitud
gunicorn.request.status.417
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 417.
Se muestra como solicitud
gunicorn.request.status.419
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 419.
Se muestra como solicitud
gunicorn.request.status.421
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 421.
Se muestra como solicitud
gunicorn.request.status.422
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 422.
Se muestra como solicitud
gunicorn.request.status.423
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 423.
Se muestra como solicitud
gunicorn.request.status.424
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 424.
Se muestra como solicitud
gunicorn.request.status.426
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 426.
Se muestra como solicitud
gunicorn.request.status.428
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 428.
Se muestra como solicitud
gunicorn.request.status.429
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 429.
Se muestra como solicitud
gunicorn.request.status.431
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 431.
Se muestra como solicitud
gunicorn.request.status.451
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 451.
Se muestra como solicitud
gunicorn.request.status.500
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 500.
Se muestra como solicitud
gunicorn.request.status.501
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 501.
Se muestra como solicitud
gunicorn.request.status.502
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 502.
Se muestra como solicitud
gunicorn.request.status.503
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 503.
Se muestra como solicitud
gunicorn.request.status.504
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 504.
Se muestra como solicitud
gunicorn.request.status.505
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 505.
Se muestra como solicitud
gunicorn.request.status.506
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 506.
Se muestra como solicitud
gunicorn.request.status.507
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 507.
Se muestra como solicitud
gunicorn.request.status.508
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 508.
Se muestra como solicitud
gunicorn.request.status.510
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 510.
Se muestra como solicitud
gunicorn.request.status.511
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 511.
Se muestra como solicitud
gunicorn.request.status.512
(rate)
Porcentaje de solicitudes que generan respuestas con un código de estado 512.
Se muestra como solicitud
gunicorn.requests
(rate)
Índice de solicitudes recibidas.
Se muestra como solicitud
gunicorn.workers
(gauge)
Número de workers etiquetados por estado (inactivo o activo). Un worker está activo si tiene un incremento de tiempo de CPU registrado en un intervalo de 0.1-seg (a través de psutil). Un worker está inactivo si no se detecta ningún cambio en el tiempo de CPU, incluso si el worker está bloqueado en E/S (como esperando llamadas HTTP/base de datos).
Se muestra como worker

Eventos

El check de Gunicorn no incluye eventos.

Checks de servicio

gunicorn.is_running

Devuelve CRITICAL si el Agent no puede encontrar el proceso principal de Gunicorn. Devuelve OK en caso contrario.

Estados: ok, crítico

Solucionar problemas

El Agent no encuentra el proceso Gunicorn

  Checks
  ======

    gunicorn (5.12.1)
    -----------------
      - instance #0 [ERROR]: 'Found no master process with name: gunicorn: master [my_web_app]'
      - Collected 0 metrics, 0 events & 1 service check
      - Dependencies:
          - psutil: 4.4.1

O bien Gunicorn realmente no se está ejecutando, o bien el entorno Python entorno de tu aplicación no tiene instalado el paquete setproctitle.

Si setproctitle no está instalado, Gunicorn aparece en la tabla de procesos de la siguiente forma:

$ ps -ef | grep gunicorn
ubuntu   18013 16695  2 20:23 pts/0    00:00:00 /usr/bin/python /usr/bin/gunicorn --config test-app-config.py gunicorn-test:app
ubuntu   18018 18013  0 20:23 pts/0    00:00:00 /usr/bin/python /usr/bin/gunicorn --config test-app-config.py gunicorn-test:app
ubuntu   18019 18013  0 20:23 pts/0    00:00:00 /usr/bin/python /usr/bin/gunicorn --config test-app-config.py gunicorn-test:app

Si está instalado, los procesos gunicorn aparecerán en el formato esperado por el Datadog Agent:

$ ps -ef | grep gunicorn
ubuntu   18457 16695  5 20:26 pts/0    00:00:00 gunicorn: master [my_app]
ubuntu   18462 18457  0 20:26 pts/0    00:00:00 gunicorn: worker [my_app]
ubuntu   18463 18457  0 20:26 pts/0    00:00:00 gunicorn: worker [my_app]

Referencias adicionales