Parte 7 – Monitorización Docker Prometheus + Grafana

Lo que no puede faltar es un Dasboard para ver el estado de nuestra plataforma asi que vamos a monitorizar nuestros Host Docker y containers, para ello vamos a utilizar:

Prometheus, se va a encarga de recoger todas las métricas en una DB para poder visualizarlas. Prometheus – Monitoring system & time series database

Node Exporter, recogerá las métricas de hardware y sistema operativo. Monitoring Linux host metrics with the Node Exporter | Prometheus

CAdvisor, recoge las métricas de los containers. Monitoring Docker container metrics using cAdvisor | Prometheus

Grafana, Se encargará de pintar todos nuestros datos en un dashboard. Grafana | Prometheus

Requisitos

Vamos a ver cómo crear nuestro fichero de configuración, con todos los componentes.

Necesitaremos nuestro entorno de Docker, ya sea un host o un Swarm, con Docker engine y compose instalado.

Crearemos una carpeta para guardar nuestra configuración.

Prometheus

Primero generamos nuestro fichero Docker-compose.yml, muy básico solo necesitaremos configurar los volúmenes y comandos, y generar el fichero de configuración de prometheus que guardamos en la carpeta que hemos creado. Installation | Prometheus

version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus:/var/lib/prometheus
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=30d'
    restart: unless-stopped
    ports:
      - '9090:9090'

Podremos agregar más comandos para nuestro prometheus Storage | Prometheus

También generar una red personalizada para la monitorización, con algo como lo siguiente.

    networks:
      - Monitoring
networks:
        Monitoring:
          driver: bridge
          ipam:
            driver: default
            config:
              - subnet: 10.0.0.0/24
                gateway: 10.0.0.1

Ahora el fichero prometheus.yml con la configuración.

global:
  scrape_interval: 5s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090'] ## Nombre o IP del servidor prometheus

Arrancamos nuestro Container.

docker-compose -f fichero.yml up -d

Accedemos a la consola http://IP-Host:9090

cAdvisor

Una vez que tenemos nuestro servidor de prometheus corriendo vamos a por cAdvisor para recoger las métricas de Docker.

Lo primero será habilitar el acceso de recogida de datos en Docker, editaremos el fichero /etc/docker/daemon.json

sudo vi etc/docker/daemon.json

Configuraremos los siguiente, en vez de 0.0.0.0 podremos poner la IP del Host o Swarm.

{
  "metrics-addr" : "0.0.0.0:9323",
  "experimental" : true
}

Reiniciamos el servicio de docker

systemctl restart docker.service

Ahora agregamos la configuración del Container cAdvisor, lo volúmenes que necesitaran son del Host.

version: '3'
services:
  prometheus:
  ....
  cadvisor:
    image: google/cadvisor:latest
    ports:
      - '8080:8080'
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    networks:
      - Monitoring
networks:
        Monitoring:
          driver: bridge
          ipam:
            driver: default
            config:
              - subnet: 10.0.0.0/24
                gateway: 10.0.0.1

Editamos el fichero prometheus.yml y agregamos al final.

  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']  ## Nombre de maquina configurado en el yml

Actualizado el servicio y reiniciamos el container de prometheus.

docker-compose -f fichero.yml up -d
docker restart prometheus

Accedemos al portal http://IP-Host:8080

Verificamos el portal de prometheus, http://IP-Host:9090

Node Exporter

Ahora toca recoger métricas del servidor con node exporter, mismos procedimiento, editamos el fichero de docker-compose.yml

version: '3.8'
services:
  prometheus:

  ...
  cadvisor:
  ...
  node-exporter:
    image: prom/node-exporter
    ports:
      - '9100:9100'
    depends_on:
      - prometheus
    networks:
      - Monitoring
networks:
  ...

Editamos el fichero prometheus.yml y agregamos:

  - job_name: 'node-exporter'
        static_configs:
        - targets: ["node-exporter:9100"]

Actualizar el servicio y reiniciamos el container de prometheus.

docker-compose -f fichero.yml up -d
docker restart prometheus

Comprobamos que accedemos http://IP-Host:9100/metrics

Verificamos el portal de prometheus, http://IP-Host:9090

Grafana

Ahora necesitamos ver todos nuestros datos en un Dashboard, crearemos dos carpetas desde estamos generando el proyecto.

Run Grafana Docker image | Grafana Labs

mkdir grafana_data
mkdir -p grafana_provisioning/datasource

Editamos docker-compose.yml

  grafana:
    image: grafana/grafana-oss:latest
    user: "1000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=password
    volumes:
      - ./grafana_data:/var/lib/grafana
      - ./grafana_provisioning:/etc/grafana/provisioning
    depends_on:
      - prometheus
    ports:
      - '3000:3000'
    networks:
      - Monitoring

Si necesitamos mas configuración para nuestro grafana Configure Grafana Docker image | Grafana Labs

Instalar plugins por defecto:

- GF_INSTALL_PLUGINS=http://plugin-domain.com/my-custom-plugin.zip;custom-plugin,grafana-clock-panel

Al crear el volumen de datos, tendremos que asignarle los permisos 472:472 para que no de error de permisos.

sudo chown -R 472:472 grafana_*

Agregar datasource por defecto

Ahora crearemos el fichero para configurar el Datasource de grafana, en /grafana_provisioning/datasource/automatic.yml y agregamos lo siguiente:

apiVersion: 1

datasources:
- name: Prometheus_db
  type: prometheus
  access: proxy
  url: http://prometheus:9090
  password:
  user:
  database:
  basicAuth: false
  basicAuthUser:
  basicAuthPassword:
  withCredentials:
  isDefault:
  jsonData:
     tlsAuth: false
     tlsAuthWithCACert: false
  secureJsonData:
    tlsCACert: ""
    tlsClientCert: ""
    tlsClientKey: ""
  version: 1
  editable: false

Agregar Dashboard por defecto

Si queremos también dejar nuestros Dashboard prefijados, necesitaremos los siguientes ficheros.

Creamos un fichero en /grafana_provisioning/dashboards/dashboard.yml y agregamos lo siguiente:

apiVersion: 1

providers:
- name: 'Prometheus'
  orgId: 1
  folder: ''
  type: file
  disableDeletion: false
  editable: true
  options:
    path: /etc/grafana/provisioning/dashboards

Ahora necesitaremos el fichero JSON del Dashboard, cogemos el fichero y lo copiamos en /grafana_provisioning/dashboards/

Abrimos la pagina y descargamos el fichero y lo copiamos en la ruta /grafana_provisioning/dashboards/ tantos como deseemos.

Reiniciamos el container de grafana.

Podemos descargar el json directamente desde grafana.com pero al llevar parametros para la configuración inicial habra que modificarlos para que sean correctos.

Os dejo algunos dashboard de Docker y Prometheus.

https://grafana.com/grafana/dashboards/893

https://grafana.com/grafana/dashboards/179

https://grafana.com/grafana/dashboards/11074

Validación

Accedemos al portal http://IP-Host:3000, usuario admin y password la que introducimos en el fichero de configuración.

Datasource creado automaticamente.

DataSource defecto

Ficheros

Os dejo los ficheros completos, docker-compose.yml

version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus:/var/lib/prometheus
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=30d'
    restart: unless-stopped
    ports:
      - '9090:9090'
    networks:
      - Monitoring
  cadvisor:
    image: google/cadvisor:latest
    ports:
      - '8080:8080'
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    networks:
      - Monitoring
  node-exporter:
    image: prom/node-exporter
    ports:
      - '9100:9100'
    depends_on:
      - prometheus
    networks:
      - Monitoring
  grafana:
    image: grafana/grafana-oss:latest
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=password
    volumes:
      - ./grafana:/var/lib/grafana
      - ./grafana_provisioning:/etc/grafana/provisioning
    depends_on:
      - prometheus
    ports:
      - '3000:3000'
    networks:
      - Monitoring
networks:
        Monitoring:
          driver: bridge
          ipam:
            driver: default
            config:
              - subnet: 10.0.0.0/24
                gateway: 10.0.0.1

Prometheus.yml

global:
  scrape_interval: 5s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090'] ## Nombre o IP del servidor prometheus
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']  ## Nombre o IP de maquina configurado en el yml
  - job_name: 'node-exporter'
    static_configs:
      - targets: ["node-exporter:9100"] ## Nombre o IP de maquina configurado en el yml

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *