Compartir comentarios
Las respuestas se generan en base a la documentación.

Recopilar métricas de Docker con Prometheus

Prometheus es un conjunto de herramientas de código abierto para la monitorización y alerta de sistemas. Puedes configurar Docker como un objetivo de Prometheus.

Warning

Las métricas disponibles y los nombres de estas métricas están en desarrollo activo y pueden cambiar en cualquier momento.

Por ahora, solo puedes monitorizar el propio Docker. No puedes monitorizar tu aplicación utilizando el objetivo de Docker.

Ejemplo

El siguiente ejemplo muestra cómo configurar tu demonio de Docker, configurar Prometheus para que se ejecute como un contenedor en tu máquina local y monitorizar tu instancia de Docker utilizando Prometheus.

Configurar el demonio

Para configurar el demonio de Docker como un objetivo de Prometheus, debes especificar el parámetro metrics-addr en el archivo de configuración daemon.json. El demonio espera que el archivo esté ubicado de forma predeterminada en una de las siguientes ubicaciones. Si el archivo no existe, créalo.

  • Linux: /etc/docker/daemon.json
  • Windows Server: C:\ProgramData\docker\config\daemon.json
  • Docker Desktop: Abre la configuración de Docker Desktop y selecciona Docker Engine para editar el archivo.

Agrega la siguiente configuración:

{
  "metrics-addr": "127.0.0.1:9323"
}

Guarda el archivo o, en el caso de Docker Desktop para Mac o Docker Desktop para Windows, guarda la configuración. Reinicia Docker.

Docker ahora expone métricas compatibles con Prometheus en el puerto 9323 a través de la interfaz de bucle de retorno (loopback). Puedes configurarlo para utilizar la dirección comodín 0.0.0.0 en su lugar, pero esto expondrá el puerto de Prometheus a la red externa. Considera cuidadosamente tu modelo de amenazas al decidir qué opción se adapta mejor a tu entorno.

Crear una configuración de Prometheus

Copia el siguiente archivo de configuración y guárdalo en una ubicación de tu elección, por ejemplo, /tmp/prometheus.yml. Este es un archivo de configuración estándar de Prometheus, a excepción de la adición de la definición del trabajo (job) de Docker en la parte inferior del archivo.

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: "codelab-monitor"

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first.rules"
  # - "second.rules"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: prometheus

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

  - job_name: docker
      # metrics_path defaults to '/metrics'
      # scheme defaults to 'http'.

    static_configs:
      - targets: ["host.docker.internal:9323"]

Ejecutar Prometheus en un contenedor

A continuación, inicia un contenedor de Prometheus utilizando esta configuración.

$ docker run --name my-prometheus \
    --mount type=bind,source=/tmp/prometheus.yml,destination=/etc/prometheus/prometheus.yml \
    -p 9090:9090 \
    --add-host host.docker.internal=host-gateway \
    prom/prometheus

Si estás utilizando Docker Desktop, la opción --add-host es opcional. Esta opción garantiza que la IP interna del host se exponga al contenedor de Prometheus. Docker Desktop hace esto de forma predeterminada. La IP del host se expone como el nombre de host host.docker.internal. Esto coincide con la configuración definida en prometheus.yml en el paso anterior.

Abrir el panel de control de Prometheus

Verifica que el objetivo de Docker aparezca en http://localhost:9090/targets/.

Página de objetivos de Prometheus
Note

No puedes acceder directamente a las URL de los extremos (endpoints) en esta página si utilizas Docker Desktop.

Usar Prometheus

Crea un gráfico. Selecciona el enlace Graphs en la interfaz de usuario de Prometheus. Elige una métrica en la casilla de selección combinada situada a la derecha del botón Execute y selecciona Execute. La siguiente captura de pantalla muestra el gráfico para engine_daemon_network_actions_seconds_count.

Informe de Prometheus inactivo

El gráfico muestra una instancia de Docker bastante inactiva, a menos que ya estés ejecutando cargas de trabajo activas en tu sistema.

Para hacer que el gráfico sea más interesante, ejecuta un contenedor que realice algunas acciones de red iniciando la descarga de algunos paquetes mediante un gestor de paquetes:

$ docker run --rm alpine apk add git make musl-dev go

Espera unos segundos (el intervalo de raspado predeterminado es de 15 segundos) y recarga tu gráfico. Deberías ver un incremento en el gráfico, que muestra el aumento del tráfico de red causado por el contenedor que acabas de ejecutar.

Informe de Prometheus que muestra el tráfico

Próximos pasos

El ejemplo que se proporciona aquí muestra cómo ejecutar Prometheus como un contenedor en tu sistema local. En la práctica, probablemente ejecutarás Prometheus en otro sistema o como un servicio en la nube. Puedes configurar el demonio de Docker como un objetivo de Prometheus también en esos contextos. Configura el parámetro metrics-addr del demonio y agrega la dirección del demonio como un extremo de raspado (scrape endpoint) en tu configuración de Prometheus.

- job_name: docker
  static_configs:
    - targets: ["docker.daemon.example:<PORT>"]

Para obtener más información sobre Prometheus, consulta la documentación de Prometheus.