OpenWebinars

Big Data

Monitorizando datos con InfluxDB, Telegraf y Grafana

Aprende a monitorizar instancias, máquinas virtuales con sistemas operativos GNU/Linux y Windows, hasta de contenedores Docker o Podman con InfluxDB, Telegraf y Grafana.

Jerson Martínez

Jerson Martínez

Experto DevOps

Lectura 5 minutos

Publicado el 4 de marzo de 2022

Compartir

Más y más empresas se suman a tener un mayor control de su infraestructura, ya sea en la nube o en sus instalaciones, comprendiendo que, entre las mejores herramientas para manejo de datos de series temporales, agentes para recopilar métricas y monitorizar por medio de un análisis de datos de alta calidad es clave para manejar mejor los costes y mitigar incidencias dentro de la organización. ¡Es altamente recomendable que aprendas este Stack!

Conceptos

Repasamos rápidamente sus conceptos, sin embargo, dejando referencia a teoría en abundancia en esta misma plataforma, donde te puedes nutrir más de los mismos.

· Grafana: Es una solución de código abierto que sirve para ejecutar análisis de datos, extraer métricas que dan sentido ante enormes cantidades de datos y monitorear aplicaciones y recursos hardware con la ayuda de atractivos paneles de control personalizables. Aquí tienes un artículo para conocer más acerca de Grafana y primeros pasos.

· Telegraf: Es un agente de servidor basado en complementos para recopilar e informar métricas. Este servicio recopila datos como el uso de disco, carga del sistema, uso de la memoria RAM, carga de la CPU, entre otros recursos. También tenemos un artículo que te permitirá conocer mejor Telegraf y primeros pasos.

· InfluxDB: Es una base de datos de series temporales diseñada para el almacenamiento rápido y de alta disponibilidad y la recuperación de datos de series temporales. Previamente ya publicamos un post en el que puedes aprender más acerca de InfluxDB y primeros pasos.

Instalando InfluxDB, Telegraf y Grafana con Docker Compose

La red está cundida de información sobre cómo instalar este Stack de forma procedural por medio de scripts en bash como de hacerlo manualmente en la línea de comandos del sistema operativo, en este caso, iremos un poco más allá, algo que te acerque a una vía profesional que te retribuirá mayor conocimiento y dominio sobre estos temas, por lo cual, se utilizará Docker o Podman para lanzar estos servicios.

Además de esto, tienes acceso a un repositorio en GitHub donde podrás descargar el código fuente y levantar los servicios con un par de instrucciones de comandos. Por supuesto, si aún no dominas el tema de contenedores, te recomiendo el Curso de Docker.

· Descargar repositorio

> https://github.com/jersonmartinez/docker-compose-influxdb-telegraf-grafana.git

· Instalando servicios
Acceder al repositorio en local y lanzar la siguiente instrucción Docker Compose.

> docker-compose up -d
Creating network "docker-compose-influxdb-telegraf-grafana_default" with the default driver
Creating influxdb ... done
Creating grafana         ... done
Creating telegraf        ... done
Creating telegraf_second ... done

Para verificar que estos contenedores se han lanzado correctamente, verificamos sus procesos:

> docker-compose ps
     Name                 Command           State                          Ports
--------------------------------------------------------------------------------------------------------
grafana           /run.sh                   Up      0.0.0.0:3000->3000/tcp
influxdb          /entrypoint.sh influxd    Up      0.0.0.0:8086->8086/tcp
telegraf          /entrypoint.sh telegraf   Up      8092/udp, 8094/tcp, 0.0.0.0:8125->8125/tcp, 8125/udp
telegraf_second   /entrypoint.sh telegraf   Up      8092/udp, 8094/tcp, 8125/udp, 0.0.0.0:8126->8126/tcp

Imagen 0 en Monitorizando datos con InfluxDB, Telegraf y Grafana

Ya por levantado el sistema distribuido, el frontal es http://127.0.0.1:3000/ o bien, la dirección IP local que tiene asignada más el puerto 3000.

Explicación del Docker Compose

Se adjunta el script en formato YML para ejecutar con Docker Compose.

  • Tiene 4 services:

    • telegraf
    • telegraf_second
    • influxdb
    • grafana

Los contenedores telegraf y telegraf_second son lo que se estarán monitorizando en el ámbito de contenedores.

version: '3.6'
services:
  telegraf:
    image: telegraf
    container_name: telegraf
    restart: always
    volumes:
    - ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
    depends_on:
      - influxdb
    links:
      - influxdb
    ports:
    - '8125:8125'

  telegraf_second:
    image: telegraf
    container_name: telegraf_second
    restart: always
    volumes:
    - ./telegraf/telegraf_second.conf:/etc/telegraf/telegraf.conf:ro
    depends_on:
      - influxdb
    links:
      - influxdb
    ports:
    - '8126:8126'

  influxdb:
    image: influxdb:1.8-alpine
    container_name: influxdb
    restart: always
    environment:
      - INFLUXDB_DB=influx
      - INFLUXDB_ADMIN_USER=admin
      - INFLUXDB_ADMIN_PASSWORD=admin
    ports:
      - '8086:8086'
    volumes:
      - influxdb_data:/var/lib/influxdb

  grafana:
    image: grafana/grafana-enterprise
    container_name: grafana
    restart: always
    depends_on:
      - influxdb
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_INSTALL_PLUGINS=
    links:
      - influxdb
    ports:
      - '3000:3000'
    volumes:
      - grafana_data:/var/lib/grafana

volumes:
  grafana_data: {}
  influxdb_data: {}

· El contenedor telegraf

  • Se usa la imagen telegraf, integrando la configuración desde el fichero telegraf.conf.
  • Depende del contenedor influxdb y se enlaza al mismo.
  • Asigna el puerto: 8125
telegraf:
  image: telegraf
  container_name: telegraf
  restart: always
  volumes:
  - ./telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
  depends_on:
    - influxdb
  links:
    - influxdb
  ports:
  - '8125:8125'

· El contenedor telegraf_second

  • Se usa la imagen telegraf, integrando la configuración desde el fichero telegraf_second.conf.
  • Depende del contenedor influxdb y se enlaza al mismo.
  • Asigna el puerto: 8126 (Un número más que el contenedor telegraf).
telegraf_second:
  image: telegraf
  container_name: telegraf_second
  restart: always
  volumes:
  - ./telegraf/telegraf_second.conf:/etc/telegraf/telegraf.conf:ro
  depends_on:
    - influxdb
  links:
    - influxdb
  ports:
  - '8126:8126'

· El contenedor influxdb

  • Se usa la imagen influxdb:1.8-alpine.
  • Envía valores como nombre de la base de datos, usuario y contraseña por medio de las variables de entorno.
  • Asigna el puerto: 8086
influxdb:
  image: influxdb:1.8-alpine
  container_name: influxdb
  restart: always
  environment:
    - INFLUXDB_DB=influx
    - INFLUXDB_ADMIN_USER=admin
    - INFLUXDB_ADMIN_PASSWORD=admin
  ports:
    - '8086:8086'
  volumes:
    - influxdb_data:/var/lib/influxdb

· El contenedor grafana

  • Se usa la imagen grafana/grafana-enterprise.
  • Depende del contenedor influxdb.
  • Envía valores como usuario y contraseña por medio de las variables de entorno.
  • Asigna el puerto: 3000
grafana:
  image: grafana/grafana-enterprise
  container_name: grafana
  restart: always
  depends_on:
    - influxdb
  environment:
    - GF_SECURITY_ADMIN_USER=admin
    - GF_SECURITY_ADMIN_PASSWORD=admin
    - GF_INSTALL_PLUGINS=
  links:
    - influxdb
  ports:
    - '3000:3000'
  volumes:
    - grafana_data:/var/lib/grafana

Cuando ejecute Grafana por medio de la dirección: 127.0.0.1:3000, le pedirá que inicie sesión, teniendo como usuario y contraseña, admin y admin. Esto, por primera vez, ya que en la siguiente ventana le pedirá que actualice la contraseña a una personal.

· Configuración del telegraf para contenedores

Se manejan etiquetas globales, que son las entregadas a InfluxDB y Grafana las obtiene para ser controladas desde la interfaz gráfica y aplicar filtros. Entre los global tags tenemos los siguientes:

  • Si una variable tiene que contener el nombre del cliente, esta será customer.
  • En una infraestructura se trabajan en diferentes entornos o ambientes, ya sea de pruebas, desarrollo o producción, se tienen que definir y para que mejor que la variable environment.
  • Por supuesto, sería interesante hacer un filtro por sistema operativo y comprobar el comportamiento por medio de bonitos gráficos, ni más ni menos, la variable a usar será os, donde se define el sistema operativo en acción.
[global_tags]
  customer = "OpenWebinars"
  environment = "Dev"
  os = "Linux"

[agent]
  interval = "60s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  hostname = "docker-telegraf"
  omit_hostname = false

[[outputs.influxdb]]
  urls = ["http://influxdb:8086"]
  database = "influx"
  timeout = "5s"
  username = "telegraf"
  password = "metricsmetricsmetricsmetrics"

[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false
  report_active = false

[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]

[[inputs.diskio]]
[[inputs.kernel]]
[[inputs.mem]]
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]

En este pedazo de configuración, se conecta a InfluxDB, realizando autenticación y para ello, agregando las credenciales tales como la dirección del server y puerto, base de datos a conectarse, nombre de usuario y contraseña. En la URL aparece influxdb:8086, que es equivalente también a 127.0.0.1:8086.

[[outputs.influxdb]]
  urls = ["http://influxdb:8086"]
  database = "influx"
  timeout = "5s"
  username = "telegraf"
  password = "metricsmetricsmetricsmetrics"

· Configuración del telegraf para Windows 11

¿Vamos a monitorizar Windows?
¡Claro que si! También vas a aprender cómo instalar Telegraf en Windows 11 por medio de Chocolatey en un abrir y cerrar de ojos.

Esta es la configuración del telegraf para la máquina Windows.

[global_tags]
  customer = "OpenWebinars"
  environment = "Dev"
  os = "Windows"

[agent]
  interval = "15s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "15s"
  flush_jitter = "0s"
  precision = ""
  debug = false
  quiet = false
  logfile = "/Program Files/Telegraf/telegraf.log"
  hostname = "openwebinars-dev"
  omit_hostname = false

###############################################################################
#                                  OUTPUTS                                    #
###############################################################################

[[outputs.influxdb]]
   urls = ["http://192.168.0.3:8086"]
   database = "influx"
   username = "telegraf"
   password = "metricsmetricsmetricsmetrics"

###############################################################################
#                                  INPUTS                                     #
###############################################################################

[[inputs.win_perf_counters]]
  [[inputs.win_perf_counters.object]]
    ObjectName = "Processor"
    Instances = ["*"]
    Counters = [
      "% Idle Time",
      "% Interrupt Time",
      "% Privileged Time",
      "% User Time",
      "% Processor Time",
      "% DPC Time",
    ]
    Measurement = "win_cpu"
    IncludeTotal=true

  [[inputs.win_perf_counters.object]]
    ObjectName = "LogicalDisk"
    Instances = ["*"]
    Counters = [
      "% Idle Time",
      "% Disk Time",
      "% Disk Read Time",
      "% Disk Write Time",
      "Current Disk Queue Length",
      "% Free Space",
      "Free Megabytes",
    ]
    Measurement = "win_disk"

  [[inputs.win_perf_counters.object]]
    ObjectName = "PhysicalDisk"
    Instances = ["*"]
    Counters = [
      "Disk Read Bytes/sec",
      "Disk Write Bytes/sec",
      "Current Disk Queue Length",
      "Disk Reads/sec",
      "Disk Writes/sec",
      "% Disk Time",
      "% Disk Read Time",
      "% Disk Write Time",
    ]
    Measurement = "win_diskio"

  [[inputs.win_perf_counters.object]]
    ObjectName = "Network Interface"
    Instances = ["*"]
    Counters = [
      "Bytes Received/sec",
      "Bytes Sent/sec",
      "Packets Received/sec",
      "Packets Sent/sec",
      "Packets Received Discarded",
      "Packets Outbound Discarded",
      "Packets Received Errors",
      "Packets Outbound Errors",
    ]
    Measurement = "win_net"

  [[inputs.win_perf_counters.object]]
    ObjectName = "System"
    Counters = [
      "Context Switches/sec",
      "System Calls/sec",
      "Processor Queue Length",
      "System Up Time",
    ]
    Instances = ["------"]
    Measurement = "win_system"

  [[inputs.win_perf_counters.object]]
    ObjectName = "Memory"
    Counters = [
      "Available Bytes",
      "Cache Faults/sec",
      "Demand Zero Faults/sec",
      "Page Faults/sec",
      "Pages/sec",
      "Transition Faults/sec",
      "Pool Nonpaged Bytes",
      "Pool Paged Bytes",
      "Standby Cache Reserve Bytes",
      "Standby Cache Normal Priority Bytes",
      "Standby Cache Core Bytes",

    ]
    Instances = ["------"]
    Measurement = "win_mem"

  [[inputs.win_perf_counters.object]]
    ObjectName = "Paging File"
    Counters = [
      "% Usage",
    ]
    Instances = ["_Total"]
    Measurement = "win_swap"

Logramos rescatar que las credenciales son las mismas, con la excepción de que ahora se agrega la IP de la máquina que mantiene el InfluxDB, ya que no se encuentra en la misma red de los contenedores, sin embargo, si se encuentra compartiendo adaptador de red local, por ende, se conocen y pueden conectar sin problemas.

[[outputs.influxdb]]
   urls = ["http://192.168.0.3:8086"]
   database = "influx"
   username = "telegraf"
   password = "metricsmetricsmetricsmetrics"

Ya se que tengas virtualizado el sistema operativo Windows o instalado como máquina base, harás la instalación del gestor de paquetes llamado Chocolatey o de cariño, simplemente choco.

Instalando Choco, el gestor de paquetes

Chocolatey es un gestor de paquetes y dependencias de los mismos, donde vienen integradas para ser instaladas de la forma más sencilla posible.

Ejecute la siguiente instrucción desde PowerShell:

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('http://internal/odata/repo/ChocolateyInstall.ps1'))

Instalando Telegraf en Windows

Es tan sencilla hacer la instalación que tan solo es ejecutar sobre PowerShell, después de haber instalado Chocolatey, la siguiente instrucción:

> choco install telegraf

Además, también puedes actualizarlo e incluso, desinstalarlo desde choco:

> choco upgrade telegraf
> choco uninstall telegraf

Ya por instalado, se agrega la configuración del telegraf para que se conecte y envíe métricas a InfluxDB, no sin antes validar que el servicio telegraf está corriendo sin problemas.

El fichero a modificar es: C:\Program Files\telegraf\telegraf.conf.

Monitorización con Grafana

He elaborado un dashboard sencillo, donde ya se hace monitorización tanto de los contenedores como las máquinas virtuales GNU/Linux y Windows. Para reutilizar el dashboard, es tan sencillo de importar el .json que dejo aquí a su disposición.

Imagen 1 en Monitorizando datos con InfluxDB, Telegraf y Grafana

· Monitorizando la CPU

Nos enfocaremos en revisar las métricas de la máquina Windows, donde ciertamente representa mayor complejidad, así que como es observable en la imagen, se toman en cuenta las siguientes características y parámetros:

  • El tipo de gráfico es: Graph (old)
  • Se monitoriza el CPU, donde el host, según la configuración impuesta en el telegraf es openwebinars-dev, y cliente, OpenWebinars así como los demás filtros para reconocer que es una máquina en específica.
  • La unidad se mide en porcentajes de 0% - 100%.

Imagen 2 en Monitorizando datos con InfluxDB, Telegraf y Grafana

Esta misma tiene definida una alerta, donde indica un límite de consumo de CPU, en este caso se configura al 80%, si se pasa, generará una alerta, donde bien puede estar configurado para que envíe un correo eletrónico, envíe un mensaje a aplicaciones como Slack, Teams y otros. Así de esta manera, estar informados ante cualquier incidente, incluso, para enviar señales de autoescalado.

monitorizando-vm-cpu-alert

· Monitorizando la memoria RAM

  • La unidad de medida es en Bytes(SI).
  • Se señala el límite de memoria RAM, en este caso, la máquina tiene 4GB como máximo.
  • Se le agrega una alerta, en este caso, si baja, enviar notificación.

monitorizando-vm-memory

· Monitorizando el Disco

  • La unidad de medida es en megabytes.
  • Se señala el límite de disco de almacenamiento, en este caso, la máquina tiene 130GB como máximo.
  • Se le agrega una alerta, en este caso, si baja, enviar notificación.

monitorizando-vm-disk

Grafana tiene la capacidad de conectarse a un sinnúmero de fuentes de datos. Te permite agregar complementos que nos ayudan a estudiar, analizar y monitorear el hardware y software, además que se puede sacar mayor provecho para rastrear comportamiento del usuario y de la aplicación.

Conclusión

Se ha compartido una vasta información teórica sobre los conceptos e importancia de los servicios que conforman el Stack que en este artículo abordamos. Nos hemos adentrado en un terreno completamente práctico, donde no solo arrancamos los servicios Telegraf, InfluxDB y Grafana, sino que también aprovechamos a recurrir a una solución que lleva Docker y Docker Compose, algo que te acerca aún más al área de DevOps. Hemos ido en esta aventura de acá para allá, instalando, configurando, implementando y analizando métricas.

¡Espero que este artículo te sume mucho valor!

Compartir este post

También te puede interesar

Icono de la tecnología
Curso

Monitorización con Grafana y Prometheus

Intermedio
1 h. y 22 min.

Este curso trata sobre como monitorizar aplicaciones, servicios o procesos utilizando Grafana y Prometheus además presentaremos y probaremos...

Asier Gómez Akasuso
4.2