Cómo instalar TIG Stack (Telegraf, InfluxDB y Grafana) en Debian 12

La pila TIG (Telegraf, InfluxDB y Grafana) es el acrónimo de una plataforma de herramientas de código abierto para facilitar la recopilación, almacenamiento, representación gráfica y alerta de las métricas del sistema. Puedes supervisar y visualizar métricas como la memoria, el espacio en disco, los usuarios registrados, la carga del sistema, el uso de swap, el tiempo de actividad, los procesos en ejecución, etc. desde un solo lugar. Las herramientas utilizadas en la pila son las siguientes:

  • Telegraf – es un agente de recopilación de métricas de código abierto para recoger y enviar datos y eventos de bases de datos, sistemas y sensores IoT. Admite varios complementos de salida, como InfluxDB, Graphite, Kafka, etc., a los que puede enviar los datos recopilados.
  • InfluxDB – es una base de datos de series temporales de código abierto escrita en lenguaje Go. Está optimizada para un almacenamiento rápido y de alta disponibilidad, y es adecuada para todo lo que implique grandes cantidades de datos con marcas temporales, como métricas, eventos y análisis en tiempo real.
  • Grafana – es una suite de visualización y monitorización de datos de código abierto. Admite varios plugins de entrada, como Graphite, ElasticSearch, InfluxDB, etc. Proporciona un bonito panel de control y análisis de métricas que te permite visualizar y supervisar cualquier tipo de métricas del sistema y datos de rendimiento.

En este tutorial, aprenderás a instalar y configurar TIG Stack en un único servidor Debian 12.

Requisitos previos

  1. Un servidor que ejecute Debian 12 con un mínimo de 1 GB de RAM.
  2. Un usuario no usuario con privilegios de root.
  3. El Cortafuegos sin complicaciones (UFW) está activado y en ejecución.
  4. Un Nombre de Dominio Completamente Cualificado (FQDN) como grafana.example.com apuntando a tu servidor.
  5. Una cuenta SMTP con un servicio de correo electrónico como Amazon SES o Mailgun para recibir notificaciones por correo electrónico de las alertas de servicio.
  6. Asegúrate de que todo está actualizado.
    $ sudo apt update && sudo apt upgrade
    
  7. Se necesitan algunos paquetes esenciales para que funcionen el tutorial y Craft CMS. Algunos de ellos ya estarán en tu servidor.
    $ sudo apt install curl wget nano software-properties-common dirmngr apt-transport-https ca-certificates lsb-release debian-archive-keyring gnupg2 ufw unzip -y
    

Paso 1 – Configurar el cortafuegos

Antes de instalar ningún paquete, el primer paso es configurar el cortafuegos para que abra puertos para InfluxDB y Grafana.

Comprueba el estado del cortafuegos.

$ sudo ufw status

Deberías ver algo como lo siguiente

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Abre el puerto 8086 para InfluxDB y el 3000 para el servidor Grafana.

$ sudo ufw allow 8086
$ sudo ufw allow 3000

Permite los puertos HTTP y HTTPs.

$ sudo ufw allow http
$ sudo ufw allow https

Vuelve a comprobar el estado para confirmarlo.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
8086                       ALLOW       Anywhere
3000                       ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
8086 (v6)                  ALLOW       Anywhere (v6)
3000 (v6)                  ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Paso 2 – Instalar InfluxDB

Utilizaremos el repositorio oficial de InfluxDB para instalarlo.

Descarga la clave GPG de InfluxDB.

$ wget -q https://repos.influxdata.com/influxdata-archive_compat.key

Importa la clave GPG al servidor.

$ echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
influxdata-archive_compat.key: OK

Importa el repositorio de InfluxDB.

$ echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list

Actualiza la lista de repositorios del sistema.

$ sudo apt update

Tienes la opción de instalar InfluxDB 1.8.x o 2.0.x. Sin embargo, es mejor utilizar la última versión. Instala InfluxDB.

$ sudo apt install influxdb2

Inicia el servicio InfluxDB.

$ sudo systemctl start influxdb

Comprueba el estado del servicio.

$ sudo systemctl status influxdb
? influxdb.service - InfluxDB is an open-source, distributed, time series database
     Loaded: loaded (/lib/systemd/system/influxdb.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-01-02 02:39:41 UTC; 1s ago
       Docs: https://docs.influxdata.com/influxdb/
    Process: 5584 ExecStart=/usr/lib/influxdb/scripts/influxd-systemd-start.sh (code=exited, status=0/SUCCESS)
   Main PID: 5585 (influxd)
      Tasks: 8 (limit: 2299)
     Memory: 53.1M
        CPU: 735ms
     CGroup: /system.slice/influxdb.service
             ??5585 /usr/bin/influxd
........

Paso 3 – Crear la base de datos InfluxDB y las credenciales de usuario

Para almacenar los datos de Telegraf, necesitas configurar la base de datos y el usuario de Influx.

InfluxDB viene con una herramienta de línea de comandos llamada influx para interactuar con el servidor InfluxDB. Piensa en influx como la herramienta de línea de comandos mysql.

Ejecuta el siguiente comando para realizar la configuración inicial de Influx.

$ influx setup
> Welcome to InfluxDB 2.0!
? Please type your primary username navjot
? Please type your password ***************
? Please type your password again ***************
? Please type your primary organization name howtoforge
? Please type your primary bucket name tigstack
? Please type your retention period in hours, or 0 for infinite 360
? Setup with these parameters?
  Username:          navjot
  Organization:      howtoforge
  Bucket:            tigstack
  Retention Period:  360h0m0s
 Yes
User    Organization    Bucket
navjot  howtoforge      tigstack

Necesitas configurar tu nombre de usuario inicial, tu contraseña, el nombre de la organización, el nombre del bucket primario para almacenar datos y el periodo de retención en horas para esos datos. Tus datos se almacenan en el archivo /home/username/.influxdbv2/configs.

También puedes realizar esta configuración iniciando la URL http://<serverIP>:8086/ en tu navegador. Una vez que hayas realizado la configuración inicial, puedes iniciar sesión en la URL con las credenciales creadas anteriormente.

Página de inicio de sesión de InfluxDB

Aparecerá el siguiente panel de control.

Panel de InfluxDB

El proceso de configuración inicial crea un token por defecto que tiene acceso total de lectura y escritura a todas las organizaciones de la base de datos. Necesitarás un nuevo token por motivos de seguridad, que sólo se conectará a la organización y al cubo a los que queremos conectarnos.

Para crear un nuevo token, haz clic en el siguiente icono de la barra lateral izquierda y haz clic en el enlace Tokens API para continuar.

Menú Tokens API InfluxDB

Accederás a la página Tokens de la API. Aquí verás el token por defecto que creamos en el momento de la configuración inicial.

Página de tokens de InfluxDB

Haz clic en el botón Generar token de API y selecciona la opción Token de API personalizado para lanzar una nueva ventana emergente superpuesta. Dale un nombre al Token (telegraf) y despliega la sección Recursos y selecciona el cubo por defecto que creamos en las secciones Lectura y Escritura.

Crear token InfluxDB

Haz clic en Generar para terminar de crear el token. Haz clic en el botón COPIAR A CLIPBOARD para copiar el token. Puede que el botón no funcione en algunos casos, así que asegúrate de confirmar antes de cerrar la ventana emergente.

Ventana emergente del token telegráfico de InfluxDB

Guárdalo por ahora, ya que lo necesitaremos más adelante.

Esto completa la instalación y configuración de InfluxDB. A continuación, tenemos que instalar Telegraf.

Paso 4 – Instalar Telegraf

Telegraf e InfluxDB comparten el mismo repositorio. Esto significa que puedes instalar Telegraf directamente.

$ sudo apt install telegraf

El servicio de Telegraf se activa e inicia automáticamente durante la instalación.

Telegraf es un agente basado en plugins y tiene 4 tipos de plugins:

  1. Los plugins deentrada recogen métricas.
  2. Los pluginsprocesadores transforman, decoran y filtran las métricas.
  3. Los pluginsagregadores crean y agregan métricas.
  4. Los plugins desalida definen los destinos a los que se envían las métricas, incluido InfluxDB.

Telegraf almacena la configuración de todos estos plugins en el archivo /etc/telegraf/telegraf.conf. El primer paso es conectar Telegraf a InfluxDB activando el plugin de salida influxdb_v2. Abre el archivo /etc/telegraf/telegraf.conf para editarlo.

$ sudo nano /etc/telegraf/telegraf.conf

Busca la línea [[outputs.influxdb_v2]] y descoméntala eliminando el # que hay delante. Edita el código que hay debajo de la siguiente manera.

# # Configuration for sending metrics to InfluxDB 2.0
 [[outputs.influxdb_v2]]
#   ## The URLs of the InfluxDB cluster nodes.
#   ##
#   ## Multiple URLs can be specified for a single cluster, only ONE of the
#   ## urls will be written to each interval.
#   ##   ex: urls = ["https://us-west-2-1.aws.cloud2.influxdata.com"]
    urls = ["http://127.0.0.1:8086"]
#
#   ## Token for authentication.
   token = "$INFLUX_TOKEN"
#
#   ## Organization is the name of the organization you wish to write to.
   organization = "howtoforge"
#
#   ## Destination bucket to write into.
   bucket = "tigstack"

Pega el valor del token InfluxDB guardado anteriormente en lugar de la variable $INFLUX_TOKEN en el código anterior.

Busca la línea INPUT PLUGINS y verás los siguientes plugins de entrada activados por defecto.

# Read metrics about cpu usage
[[inputs.cpu]]
  ## Whether to report per-cpu stats or not
  percpu = true
  ## Whether to report total system cpu stats or not
  totalcpu = true
  ## If true, collect raw CPU time metrics
  collect_cpu_time = false
  ## If true, compute and report the sum of all non-idle CPU states
  report_active = false
  ## If true and the info is available then add core_id and physical_id tags
  core_tags = false


# Read metrics about disk usage by mount point
[[inputs.disk]]
  ## By default stats will be gathered for all mount points.
  ## Set mount_points will restrict the stats to only the specified mount points.
  # mount_points = ["/"]

  ## Ignore mount points by filesystem type.
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]

  ## Ignore mount points by mount options.
  ## The 'mount' command reports options of all mounts in parathesis.
  ## Bind mounts can be ignored with the special 'bind' option.
  # ignore_mount_opts = []


# Read metrics about disk IO by device
[[inputs.diskio]]
....
....

# Get kernel statistics from /proc/stat
[[inputs.kernel]]
  # no configuration


# Read metrics about memory usage
[[inputs.mem]]
  # no configuration
  
# Get the number of processes and group them by status
[[inputs.processes]]
  # no configuration


# Read metrics about swap memory usage
[[inputs.swap]]
  # no configuration


# Read metrics about system load & uptime
[[inputs.system]]
  # no configuration

Puedes configurar plugins de entrada adicionales en función de tus necesidades, como Apache Server, contenedores Docker, Elasticsearch, cortafuegos iptables, Kubernetes, Memcached, MongoDB, MySQL, Nginx, PHP-fpm, Postfix, RabbitMQ, Redis, Varnish, Wireguard, PostgreSQL, etc.

Cuando hayas terminado, guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Reinicia el servicio Telegraf cuando hayas terminado de aplicar los cambios.

$ sudo systemctl restart telegraf

Paso 5 – Comprueba si las estadísticas de Telegraf se almacenan en InfluxDB

Antes de seguir adelante, tienes que verificar si las estadísticas de Telegraf se recogen correctamente y se introducen en InfluxDB. Abre la IU de InfluxDB en tu navegador, haz clic en el segundo icono de la barra lateral izquierda y selecciona el menú Cubos.

Página de cubos InfluxDB

Haz clic en tigstack y aparecerá la siguiente página.

InfluxDB Data Explorer

Haz clic en el nombre del cubo y, a continuación, en uno de los valores del filtro _measurement, y sigue haciendo clic en otros valores a medida que aparezcan. Cuando hayas terminado, pulsa el botón Enviar. Deberías ver un gráfico en la parte superior. Puede que tengas que esperar algún tiempo hasta que aparezcan los datos. Hemos desplazado el intervalo de tiempo de Pasado 1 h a Pasado 5 m para generar un gráfico sobre un área amplia.

Gráficos de datos InfluxDB

Esto debería confirmar que los datos se están transmitiendo correctamente.

Paso 6 – Instalar Grafana

Utilizaremos el repositorio oficial de Grafana para instalarlo. Importa la clave GPG de Grafana.

$ sudo mkdir -p /etc/apt/keyrings/
$ wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null

Añade el repositorio a tu sistema.

$ echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

Si quieres instalar Grafana beta, añade en su lugar el siguiente repositorio.

$ echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com beta main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

Actualiza la lista de repositorios del sistema.

$ sudo apt update

Instala Grafana.

$ sudo apt install grafana

Inicia y habilita el servicio Grafana.

$ sudo systemctl enable grafana-server --now

Comprueba el estado del servicio.

$ sudo systemctl status grafana-server
? grafana-server.service - Grafana instance
     Loaded: loaded (/lib/systemd/system/grafana-server.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-01-02 03:48:01 UTC; 3s ago
       Docs: http://docs.grafana.org
   Main PID: 8769 (grafana)
      Tasks: 7 (limit: 2299)
     Memory: 42.6M
        CPU: 1.804s
     CGroup: /system.slice/grafana-server.service
             ??8769 /usr/share/grafana/bin/grafana server --config=/etc/grafana/grafana.ini --pidfile=/run/grafana/grafana-server.pid --packaging=deb cfg:default.paths.logs=/var/log/grafana cfg:default.paths...
.......

Paso 7 – Configurar la fuente de datos de Grafana

Inicia la URL http://<serverIP>:3000 en tu navegador y la siguiente página de inicio de sesión de Grafana debería darte la bienvenida.

Página de inicio de sesión de Grafana

Inicia sesión con el nombre de usuario predeterminado admin y la contraseña admin. A continuación, debes configurar una nueva contraseña por defecto.

Grafana Nueva contraseña

Te aparecerá la siguiente página de inicio de Grafana. Haz clic en el botón Añade tu primera fuente de datos.

Panel Grafana

Haz clic en el botón InfluxDB.

Añadir fuente de datos en Grafana

En la página siguiente, selecciona Flux en el menú desplegable como lenguaje de consulta. Puedes utilizar InfluxQL como lenguaje de consulta, pero es más complicado de configurar ya que sólo admite InfluxDB v1.x por defecto. Flux es compatible con InfluxDB v2.x y es más fácil de instalar y configurar.

Selector de lenguaje de consulta de Grafana

Introduce los siguientes valores.

URL: http://localhost:8086 Basic Auth Details Usuario: navjot Contraseña: <yourinfluxdbpassword>

Detalles deInfluxDB Organización: howtoforge Token: <influxdbtoken> Por defecto Bucket: tigstack

Detalles de Grafana InfluxDB

Haz clic en el botón Guardar y probar y deberías ver un mensaje de confirmación verificando que la configuración se ha realizado correctamente.

Grafana Guardar detalles

Paso 8 – Configurar los Cuadros de Mando de Grafana

El siguiente paso es configurar los Cuadros de mando de Grafana. Haz clic en el menú hamburguesa situado a la izquierda de Inicio y haz clic en Cuadros de mando para abrir la pantalla Crear cuadro de mando.

Elemento del menú del panel de control de Grafana

Haz clic en el botón Crear Cuadro de Mando para continuar.

Grafana Crear Página de Panel

En la página siguiente, haz clic en el botón Añadir visualización para lanzar la superposición y haz clic en influxdb-1 para seleccionarla como fuente de datos.

Selecciona la fuente de datos de Grafana

Accederás a la siguiente página Editar Panel.

Nuevo panel de control de Grafana

Pega el siguiente código en el Editor de consultas.

from(bucket: "NAMEOFYOUBUCKET")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "cpu")
  |> filter(fn: (r) => r["_field"] == "usage_idle")
  |> filter(fn: (r) => r["cpu"] == "cpu-total")
  |> filter(fn: (r) => r["host"] == "NAMEOFYOURHOST")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> map(fn: (r) => ({ r with _value: r._value * -1.0 + 100.0 }))
  |> toFloat()
  |> yield(name: "mean")

Utiliza el nombre del cubo que utilizamos anteriormente. Y el nombre del host que puedes recuperar del archivo /etc/hostname.

El código anterior calculará el Uso de la CPU y generará un gráfico para ello. Dale un Título al Panel.

Consulta del panel de edición de Grafana

Haz clic en el botón Inspector de consultas y luego en el botón Actualizar para comprobar si tu consulta funciona correctamente. Haz clic en el icono de la cruz para cerrar el inspector.

Resultado del inspector de consultas de Grafana

También puedes dar un nombre al eje utilizando el campo Etiqueta de la derecha, debajo de la sección Eje.

Campo de etiqueta de eje de Grafana

Pulsa el botón Aplicar para guardar el panel. Pulsa el botón Guardar Cuadro de Mando, una vez hayas terminado.

Panel de control Grafana Save

Dale un nombre al panel de control y haz clic en Guardar para terminar.

Ventana emergente Grafana Save Dashboard

Se abrirá el panel de control y haz clic en el botón Añadir Visualización para crear otro panel.

Página del nuevo panel de visualización de Grafana

Repite el proceso creando otro panel para el Uso de RAM.

from(bucket: "NAMEOFYOUBUCKET")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "mem")
  |> filter(fn: (r) => r["_field"] == "used_percent")
  |> filter(fn: (r) => r["host"] == "NAMEOFYOURHOST")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> yield(name: "mean")

Utiliza el siguiente código para visualizar el Uso del Disco Duro.

from(bucket: "NAMEOFYOURBUCKET")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "disk")
  |> filter(fn: (r) => r["_field"] == "used")
  |> filter(fn: (r) => r["path"] == "/")
  |> filter(fn: (r) => r["host"] == "NAMEOFYOURHOST")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> map(fn: (r) => ({ r with _value: r._value / 1000000.0 }))
  |> toFloat()  
  |> yield(name: "mean")

Puedes crear un número ilimitado de paneles.

El código anterior se basa en el lenguaje Flux Scripting. Afortunadamente, no necesitas aprender el lenguaje para escribir consultas. Puedes generar la consulta a partir de la URL de InfluxDB. Aunque aprender el lenguaje puede beneficiarte en la optimización de las consultas.

Tienes que volver al panel de InfluxDB y abrir la página Explorar para obtener la consulta.

Haz clic en el nombre del cubo y, a continuación, en uno de los valores del filtro _measurement, y sigue haciendo clic en otros valores a medida que aparezcan. Cuando hayas terminado, haz clic en el botón Editor de Script y deberías ver la página siguiente. El gráfico también debería actualizarse.

Página de consulta de Grafana Explore

Editor de scripts InfluxDB

Copia la consulta mostrada y ya podrás utilizarla en el panel de control de Grafana para construir tus gráficos.

Paso 9 – Configurar alertas y notificaciones

El uso principal de configurar monitores es recibir alertas puntuales cuando el valor supera un determinado umbral.

El primer paso es establecer el destino donde quieres recibir las alertas. Puedes recibir notificaciones por correo electrónico, Slack, Kafka, Google Hangouts Chat, Microsoft Teams, Telegram, etc.

Para nuestro tutorial habilitaremos las notificaciones por correo electrónico. Para configurar las notificaciones por correo electrónico, primero tenemos que configurar el servicio SMTP. Abre el archivo /etc/grafana/grafana.ini para configurar SMTP.

$ sudo nano /etc/grafana/grafana.ini

Busca en él la siguiente línea [smtp]. Descomenta las siguientes líneas e introduce los valores para el servidor SMTP personalizado.

[smtp]
enabled = true
host = email-smtp.us-west-2.amazonaws.com:587
user = YOURUSERNAME
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
password = YOURUSERPASSWORD
;cert_file =
;key_file =
;skip_verify = false
from_address = [email protected]
from_name = HowtoForge Grafana
# EHLO identity in SMTP dialog (defaults to instance_name)
;ehlo_identity = dashboard.example.com
# SMTP startTLS policy (defaults to 'OpportunisticStartTLS')
;startTLS_policy = NoStartTLS

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Reinicia el servidor Grafana para aplicar la configuración.

$ sudo systemctl restart grafana-server

Abre la página de Grafana, haz clic en el icono Alerta y en Puntos de contacto.

Popup de puntos de contacto de Grafana

Grafana crea y configura automáticamente un punto de contacto de correo electrónico predeterminado que debe configurarse con la dirección de correo electrónico correcta. Haz clic en el botón de edición del punto de contacto grafana-default-email.

Grafana Editar punto de contacto

Introduce los detalles para configurar el canal de notificación por correo electrónico.

Punto de contacto de notificación por correo electrónico de Grafana

Si quieres enviar un mensaje adicional, haz clic en el enlace Configuración de correo electrónico opcional e introduce el mensaje.

Ajustes opcionales de correo electrónico de Grafana

Haz clic en Probar para abrir la ventana emergente y, a continuación, haz clic en el botón Enviar notificación de prueba para comprobar si la configuración del correo electrónico funciona. Haz clic en Guardar punto de contacto cuando hayas terminado.

Deberías recibir el siguiente correo electrónico confirmando la configuración.

Email de prueba de Grafana

Ahora que hemos configurado los canales de notificación, tenemos que configurar las alertas sobre cuándo recibir estos correos electrónicos. Para configurar las alertas, tienes que volver a los paneles del panel de control.

Vuelve a la pantalla de Paneles de control. Haz clic en el panel de control que acabamos de crear y obtendrás su página de inicio con diferentes paneles. Para editar el panel, haz clic en el nombre del panel y aparecerá un menú desplegable. Haz clic en el enlace Editar para continuar.

Panel de edición del panel de control de Grafana

Haz clic en el Panel de Alertas y en el botón Nueva regla de alerta para configurar una nueva alerta. Estamos creando una alerta para el panel Uso de la CPU.

Botón Crear regla de alerta de Grafana

Ahora puedes configurar las condiciones en las que Grafana enviará la alerta. Haz clic en el menú desplegable del enlace Opciones y selecciona el intervalo de tiempo por defecto (ahora-6h hasta ahora) para cambiar el intervalo de tiempo a Últimos 15 minutos, lo que significa que comprobará desde hace 15 minutos hasta ahora.

Grafana Editar rango de tiempo de alerta

Por defecto, el tipo de alerta seleccionado es Alerta gestionada por Grafana. Hay dos expresiones seleccionadas por defecto. Elimínalas pulsando el botón de la papelera situado junto a ellas. Selecciona el desplegable Añadir expresión y selecciona la Condición clásica como tipo de expresión.

Grafana Añadir tipo de expresión de alerta

Expresión de alertas de Grafana

Haz clic en Establecer como condición de alerta para seleccionar la expresión elegida para enviar las alertas. Al hacerlo, el cuadro de expresión cambiará como se muestra a continuación.

Condición de alerta de expresión de Grafana

Condiciones

Grafana trabaja con una consulta del siguiente formato para determinar cuándo lanzar una alerta.

avg() OF query(A) IS ABOVE 0.8
  • avg() controla cómo debe reducirse el valor de cada serie a un valor comparable con el umbral. Puedes hacer clic en el nombre de la función para seleccionar una función diferente, como avg(), min(), max(), sum(), count(), etc.

Funciones de alerta de Grafana

  • consulta(A ) La letra del paréntesis define qué consulta ejecutar desde la pestaña Métricas.
  • IS BELOW14 Define el tipo de umbral y el valor del umbral. Puedes hacer clic en IS BELOW para seleccionar un tipo de umbral diferente.

    Tipo de umbral de Grafana

Puedes añadir una segunda condición debajo haciendo clic en el botón + situado debajo de la primera condición. Actualmente, sólo puedes utilizar los operadores Y y O entre varias condiciones.

A continuación, estableceremos el comportamiento de evaluación. Haz clic en el botón Nueva carpeta para crear una carpeta donde almacenar tus reglas. Haz clic en el botón Nuevo grupo de evaluación para crear un grupo para agrupar reglas que se evaluarán tras el mismo intervalo de tiempo. Establece el intervalo de tiempo como 5m mientras creas el grupo.

Grupo de Evaulación de Alertas de Grafana

Una vez terminado, la página debería tener el siguiente aspecto. Establece el estado de Alerta si se produce un error de ejecución o se agota el tiempo de espera en Alerta.

Comportamiento de la Evaulación de Alertas de Grafana

Regla

  • Nombre – Introduce un nombre descriptivo para la alerta
  • Carpeta – Crea o selecciona una carpeta preexistente para almacenar tu regla de notificación.
  • Grupo – Introduce un nombre para tu grupo de alertas. Las alertas de un mismo grupo se evalúan tras el mismo intervalo de tiempo.
  • Pendiente – Especifica la frecuencia con la que Grafana debe evaluar la alerta. También se denomina intervalo de evaluación. Aquí puedes establecer cualquier valor que desees.

Sin Datos y Gestión de Errores

Puedes configurar cómo debe gestionar Grafana las consultas que no devuelven datos o sólo valores nulos utilizando las siguientes condiciones:

  1. Sin datos – Establece el estado de la regla en NoData
  2. Alerta – Establece el estado de la regla en Alerting
  3. Ok – Establece el estado de la regla de alerta en Ok, ya que recibirás una alerta aunque las cosas estén bien.

Puedes indicar a Grafana cómo manejar los errores de ejecución o de tiempo de espera.

  1. Alerta – Establece el estado de la regla en Alerting
  2. Ok – Establece el estado de la regla de alerta en Ok, ya que recibirás una alerta incluso si las cosas van bien.
  3. Error – Establece el estado de la regla de alerta en Error para indicar que hay un problema.

Cuando hayas terminado, haz clic en el botón Previsualizar alertas para ver si todo funciona bien. Haz clic en el botón Guardar regla y salir en la parte superior derecha para terminar de añadir la alerta. Ahora deberías empezar a recibir alertas en tu correo electrónico. A continuación se muestra un ejemplo de uno de estos correos.

Graphana Uso de la CPU Correo electrónico

Paso 10 – Instalar Nginx

Debian 12 incluye una versión antigua de Nginx. Necesitas descargar el repositorio oficial de Nginx para instalar la última versión.

Importa la clave de firma de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Añade el repositorio de la versión principal de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Actualiza los repositorios del sistema.

$ sudo apt update

Instala Nginx.

$ sudo apt install nginx

Verifica la instalación. En los sistemas Debian, el siguiente comando sólo funcionará con sudo.

$ sudo nginx -v
nginx version: nginx/1.25.3

Inicia el servidor Nginx.

$ sudo systemctl start nginx

Comprueba el estado del servicio.

$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-01-02 09:21:10 UTC; 5s ago
       Docs: https://nginx.org/en/docs/
    Process: 12964 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
   Main PID: 12965 (nginx)
      Tasks: 3 (limit: 2299)
     Memory: 2.9M
        CPU: 86ms
     CGroup: /system.slice/nginx.service
             ??12965 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
             ??12966 "nginx: worker process"
             ??12967 "nginx: worker process"

Jan 02 09:21:10 grafana systemd[1]: Starting nginx.service - nginx - high performance web server...
Jan 02 09:21:10 grafana systemd[1]: Started nginx.service - nginx - high performance web server.

Paso 11 – Instalar SSL

Necesitamos instalar Certbot para generar el certificado SSL. Puedes instalar Certbot utilizando el repositorio de Debian u obtener la última versión utilizando la herramienta Snapd. Nosotros utilizaremos la versión Snapd.

Debian 12 no viene con Snapd instalado. Instala el paquete Snapd.

$ sudo apt install snapd

Ejecuta los siguientes comandos para asegurarte de que tu versión de Snapd está actualizada.

$ sudo snap install core && sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que se puede ejecutar el comando Certbot creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Comprueba si Certbot funciona correctamente.

$ certbot --version
certbot 2.8.0

Ejecuta el siguiente comando para generar un certificado SSL.

$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d grafana.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/grafana.example.com de tu servidor.

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Comprueba el servicio programador de renovación de Certbot.

$ systemctl list-timers

Encontrarás snap.certbot.renew.service como uno de los servicios programados para ejecutarse.

NEXT                        LEFT        LAST                        PASSED    UNIT                         ACTIVATES
-----------------------------------------------------------------------------------------------------------------------------------------
Tue 2024-01-02 15:24:52 UTC 6h left     Mon 2024-01-01 15:24:52 UTC 17h ago   systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Tue 2024-01-02 20:05:29 UTC 10h left    Tue 2024-01-02 09:02:47 UTC 21min ago apt-daily.timer              apt-daily.service
Tue 2024-01-02 20:35:00 UTC 11h left    -                           -         snap.certbot.renew.timer     snap.certbot.renew.service

Realiza una ejecución en seco del proceso para comprobar si la renovación SSL funciona correctamente.

$ sudo certbot renew --dry-run

Si no ves ningún error, ya está todo listo. Tu certificado se renovará automáticamente.

Paso 12 – Configurar Nginx para Grafana e InfluxDB

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size 64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Crea y abre el archivo /etc/nginx/conf.d/grafana.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/grafana.conf

Pega en él el siguiente código. Sustituye grafana.example.com por el nombre de tu dominio.

map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

server {

    listen 443 ssl reuseport;
    listen [::]:443 ssl reuseport;

    http2 on;

    server_name grafana.example.com;

    access_log  /var/log/nginx/grafana.access.log;
    error_log   /var/log/nginx/grafana.error.log;

    ssl_certificate      /etc/letsencrypt/live/grafana.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/grafana.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/grafana.example.com/chain.pem;

    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] valid=60s;
    resolver_timeout 2s;

    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://localhost:3000;
    }

    location /api/live {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $http_host;
        proxy_pass http://localhost:3000;
	}

    location /influxdb/ {
     	access_log /var/log/nginx/influx.access.log;
        error_log /var/log/nginx/influx.error.log;
        rewrite ^/influxdb$ /influxdb/ permanent;
        rewrite ^/influxdb/(.*)$ /$1 break;
        proxy_cookie_path ~*^/api /influxdb/api;
        proxy_connect_timeout 600s;
        proxy_http_version 1.1;
        proxy_pass http://localhost:8086;
        proxy_read_timeout 600s;
        proxy_send_timeout 600s;
        proxy_set_header Authorization $http_authorization;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        sub_filter '<base href="/">' '<base href="/influxdb/">';
        sub_filter 'src="/' 'src="/influxdb/';
        sub_filter 'href="/' 'href="/influxdb/';
        sub_filter 'data-basepath="' 'data-basepath="/influxdb/';
        sub_filter 'n.p="/"' 'n.p="/influxdb/"';
        sub_filter 'o.p="/"' 'o.p="/influxdb/"';
        sub_filter '/api/' '/influxdb/api/';
        sub_filter 'api/v2/query' 'influxdb/api/v2/query';
        sub_filter '/health`' '/influxdb/health`';
        sub_filter_types text/css text/javascript application/javascript application/json;
        sub_filter_once off;
	}
}
# enforce HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name grafana.example.com;
    return 301 https://$host$request_uri;
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Comprueba la configuración de Nginx.

$ sudo nginx -t

Reinicia el servidor Nginx.

$ sudo systemctl restart nginx

Configurar Telegraf para HTTPS

Abre el archivo /etc/telegraf/telegraf.conf para editarlo.

$ sudo nano /etc/telegraf/telegraf.conf

Busca la sección [[outputs.influxdb_v2]] y cambia el valor de la URL a https://grafana.nspeaks.com/influxdb para que los datos entre InfluxDB y Telegraf sean seguros.

urls = ["https://grafana.example.com/influxdb"]

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Reinicia el servicio Telegraf.

$ sudo systemctl restart telegraf

Configurar Grafana para HTTPS

A continuación, tenemos que configurar Grafana para el acceso HTTPS. Abre el archivo /etc/grafana/grafana.ini para editarlo.

$ sudo nano /etc/grafana/grafana.ini

Busca la sección [server] y cambia la variable domain, y root_url como se indica a continuación.

# The public facing domain name used to access grafana from a browser
;domain = localhost
domain = grafana.example.com

# Redirect to correct domain if host header does not match domain
# Prevents DNS rebinding attacks
;enforce_domain = true

# The full public facing url you use in browser, used for redirects and emails
# If you use reverse proxy and sub path specify full url (with sub path)
;root_url = %(protocol)s://%(domain)s:%(http_port)s/
root_url = %(protocol)s://%(domain)s

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Reinicia el servidor Grafana.

$ sudo systemctl restart grafana-server

Cierra los puertos del cortafuegos para InfluxDB y Grafana

También debes cerrar los puertos de InfluxDB y Grafana.

$ sudo ufw delete allow 8086
$ sudo ufw delete allow 3000

Grafana debería ser accesible en https://grafana.example.com y la interfaz de usuario y la API de InfluxDB deberían ser accesibles en la URL https://grafana.example.com/influxdb.

Conclusión

Con esto concluye el tutorial sobre la instalación y configuración de TIG Stack en un servidor Debian 12. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...