Logo Grafana e InfluxDB

Monto estos tres servicios en un servidor dedicado en mi casa para poder monitorizar la Domótica. InfluxDB es una base de datos super optimizada para trabajar con series de tiempo. Grafana permite crear cuadros de mando y gráficos a partir de múltiples fuentes y Telegraf es un agente ligero que permite recolectar, procesar y enviar datos a nuestra base de datos.

He decidido instalar los tres en un servidor Ubuntu 20.04 LTS, sobre máquina virtual en KVM, de modo que son consumidos por el resto de elementos de la Domótica: servidor Home Assistant y resto de cacharros que puedan escribir en InfluxDB.


Arquitectura de Monitorización
Nota: Antes tenía Grafana/InfluxDB “dentro” de Home Assistant OS. Una vez que terminé la instalación pasé a migrar los datos de InfluxDB y los dashboards Grafana


Instalación del Servidor Linux

Instalo Ubuntu en una máquina virtual corriendo en KVM. He seguido la documentación oficial, Insalación de Ubuntu y la siguiente imagen ISO:

wget https://releases.ubuntu.com/20.04/ubuntu-20.04.3-live-server-amd64.iso

Desde mi servidor con KVM lanzo virt-manager → Nueva máquina virtual, uso el ISO anterior y llamo al servidor almacenix.parchis.org (el dominio es privado, servido por mi propio DNS Server)


Instalar el Servidor Influxdb OSS

Una vez que tengo el Linux operativo uso la documentación de referencia de InfluxDB 2.1, con las descargas aquí y realizo la instalación.

wget -qO- https://repos.influxdata.com/influxdb.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdb.gpg > /dev/null
export DISTRIB_ID=$(lsb_release -si); export DISTRIB_CODENAME=$(lsb_release -sc)
echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg] https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list > /dev/null
apt update && apt upgrade -y
apt full-upgrade -y
apt autoremove -y
apt clean
journalctl --vacuum-time=2d
journalctl --vacuum-size=500M
systemctl reboot -f
  • Verifico que se va a instalar la versión correcta:
apt-cache policy influxdb2
influxdb2:
  Instalados: (ninguno)
  Candidato:  2.1.1
  Tabla de versión:
     2.1.1 500
        500 https://repos.influxdata.com/ubuntu focal/stable amd64 Packages
apt install influxdb2
  • Para que no reporte nada “ni llame a casa”, edito /usr/lib/influxdb/scripts/influxd-systemd-start.sh
/usr/bin/influxd --reporting-disabled &
  • Modifico /etc/influxdb/config.toml para que escuche en cualquier IP, que pueda ser accesible desde la LAN casera.
bolt-path = "/var/lib/influxdb/influxd.bolt"
engine-path = "/var/lib/influxdb/engine"
http-bind-address = "0.0.0.0:8086"
  • Rearranco el servicio
systemctl restart influxdb


Administración de InfluxDB

  • Conecto con http://almacenix.parchis.org:8086 <– Pon aquí tu nombre/dirección.
  • Creo mi usuario (luis), establezco la contraseña y llamo a la Organización “parchis.org” (puede ser cualquiera)
  • Configuro y me guardo el API Token de mi usuario.

  • Está en Data -> API Tokens -> luis Token - Será del tipo:
    nC912345678901234567890M4MFFj-abcdefghijklmnopqrstu123847987sadkjhfklj9832498324908123==
    
Nota: Cualquier cliente que quiera Leer o Escribir en mi InfluxDB va a necesitar conocer la URL del servidor, el nombre de la Organización, el nombre del “Bucket” (Base de datos) y el API Token !
  • Instalo el cliente CLI de Influx
wget https://dl.influxdata.com/influxdb/releases/influxdb2-client-2.2.0-linux-amd64.tar.gz
tar xvzf influxdb2-client-2.2.0-linux-amd64.tar.gz
mv influxdb2-client-2.2.0-linux-amd64/influx /usr/local/bin
  • Configuro el cliente para que no me pregunte el token cada vez que lo use:

luis@almacenix:~$ influx version
Influx CLI 2.2.0 (git: c3690d8) build_date: 2021-10-21T15:24:59Z

luis@almacenix:~$ influx config create --config-name influxdb-almacenix  --host-url http://<tu-url>:8086 --org <tu org>  --token <tu token> --active

luis@almacenix:~$ cat .influxdbv2/configs
[influxdb-almacenix]
  url = "http://almacenix.parchis.org:8086"
  token = "nC912345678901234567890M4MFFj-abcdefghijklmnopqrstu123847987sadkjhfklj9832498324908123=="
  org = "parchis.org"
  active = true

Prueba de concepto
luis@almacenix:~$ influx user list
ID			Name
08e1234567892000	luis
  • Configuro el cliente InfluxDB en mi MacOS.
$ brew update
$ brew install influxdb
$ influx config create --config-name influxdb-almacenix  --host-url http://<tu-url>:8086 --org <tu org>  --token <tu token> --active

Prueba de concepto
$ influx user list 
ID			Name
08e1234567892000	luis


Creo mis Bases de datos

Voy a usar este servidor para recibir datos desde clientes Telegraf y desde Home Assistant, así que creo un par de Buckets.

  • telegraf, con retention never o infinita
  • home_assistant, con retention never o infinita
Bases de datos iniciales
Nota: Uso el mismo nombre (home_assistant) que el que se usa en el InfluxDB de Home Assistant para facilitar la migración posterior, documentada en este apunte.


Instalación del cliente Telegraf en Linux Ubuntu/Debian/Raspbian

Repito lo siguiente en varios equipos Linux, empezando por almacenix. Parto de la guía de la versión 2.1

root@almacenix:~# apt-cache policy telegraf
telegraf:
  Instalados: (ninguno)
  Candidato:  1.21.3-1
  Tabla de versión:
     1.21.3-1 500
        500 https://repos.influxdata.com/ubuntu focal/stable amd64 Packages
root@almacenix:~# apt install telegraf

systemctl stop telegraf

  • Desde InfluxDB http://almacenix.parchis.org:8086
  • Data > Buckets > Create Bucket > ‘telegraf’, retention ‘never’
  • Data > Telegraf > Create Configuration > Bucket ‘telegraf’ > System > Continue >
    • Create and verify.
  • Copio el Token y el URL para leer la configuración desde el propio servidor InfluxDB
  • La configuración está en Data>Telegraf>Telegraf Alamcenix>Download

Me creo una versión personalizada del telegraf.service, lo modifico y arranco el servicio

cp /lib/systemd/system/telegraf.service /etc/systemd/system/
nano telegraf.service
   ExecStart=/usr/bin/telegraf --config http://almacenix.parchis.org:8086/api/v2/telegrafs/XXXXXXXX $TELEGRAF_OPTS
systemctl daemon-reload
nano /etc/defaults/telegraf
  INFLUX_TOKEN=XXXXXXXXX==
systemctl daemon-reload
systemctl start telegraf


Instalación del cliente Telegraf en Linux Gentoo

Tengo un par de routers basados en Gentoo, importante que Layman esté montando antes de hacer lo siguiente. Telegraf no está en el tree de portage, emerge desde overlay:

Aquí hay un tipo que lo mantiene… como overlay
    - https://github.com/aexoden/gentoo-overlay

Creo /etc/portage/repos.conf/gentoo-aexoden.conf
[gentoo-extras-overlay]
location = /var/db/repos/gentoo-extras-overlay
sync-type = git
sync-uri = https://github.com/aexoden/gentoo-overlay.git
clone-depth = 0
auto-sync = yes

emerge --sync
cat >> /etc/portage/package.accept_keywords
net-analyzer/telegraf ~amd64

emerge -v telegraf
  • Desde InfluxDB http://almacenix.parchis.org:8086
  • Data > Telegraf > Create Configuration > Bucket ‘telegraf’ > System > Continue >
  • Create and verify.
  • Copio el Token y el URL
  • La configuración está en Data>Telegraf>Telegraf Alamcenix>Download

Me creo una versión personalizada del telegraf.service, lo modifico y arranco el servicio

cp /lib/systemd/system/telegraf.service /etc/systemd/system/
nano telegraf.service
	EnvironmentFile=-/etc/conf.d/telegraf
	ExecStart=/usr/bin/telegraf --config http://almacenix.parchis.org:8086/api/v2/telegrafs/XXXXXXXXX $TELEGRAF_OPTS
systemctl daemon-reload
nano /etc/conf.d/telegraf
	INFLUX_TOKEN=XXXXXXX==
systemctl daemon-reload
systemctl start telegraf


Instalar el Servidor Grafana OSS

apt install -y apt-transport-https software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
apt update
apt install grafana
systemctl daemon-reload
systemctl start grafana-server
systemctl status grafana-server
systemctl enable grafana-server


Configurar Grafana

Desde un navegador conecto con el nuevo servidor grafana y realizo la primera configuración.

  • Conecto con http://almacenix.parchis.org:3000 —> admin, admin (cambio la contraseña)

  • Conecto con mis dos Bucket’s en InfluxDB (telegraf y home_assistant)

Data Sources -> Add data source

Name: Flux telegraf
 Query Language: Flux
 URL: http://127.0.0.1:8086
 Access: Server
 Auth: Todo desactivado
 InfluxDB Details: 
    Organization: parchis.org (la tuya)
    Token: <El que pusiste con tu usuario principal>
    Default Bucket: telegraf
 SAVE & TEST -> Ok 

Data Sources -> Add data source

Name: Flux home_assistant
 Query Language: Flux
 URL: http://127.0.0.1:8086
 Access: Server
 Auth: Todo desactivado
 InfluxDB Details: 
    Organization: parchis.org (la tuya)
    Token: <El que pusiste con tu usuario principal>
    Default Bucket: home_assistant
 SAVE & TEST -> Ok 
  • El lenguaje recomendado para interrogar a InfluxDB 2.x es Flux a diferencia de InfluxQL (versiones 1.x). Es un lenguaje de script que permite hacer consultas mucho más complejas, programación avanzada, etc. Se aleja bastante del conocido SQL, así que cuesta al princpio, mira un ejemplo (tienes más en el apunte de la migración)

  • Panel para medir el tráfico de red de un cliente Telegraf (uno de mis equipos Linux):

    from(bucket: "telegraf")
    |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
    |> filter(fn: (r) => r["host"] == "cortafuegix")
    |> filter(fn: (r) => r._measurement == "net")
    |> filter(fn: (r) => r["interface"] == "ppp0")
    |> filter(fn: (r) => r._field == "bytes_recv" or r._field == "bytes_sent")
    |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)
    |> derivative(unit: 1s, nonNegative: false)
    |> yield(name: "derivative")
    
Ejemplo de configuración con Flux.


Tips para Grafana

Mostrar una imagen en un panel de Grafana

  • Copia la imagen en root@tu_servidor:/usr/share/grafana/public/img/
  • Referencia el fichero desde un Panel de tipo Text con contenido HTML/MD, en mi caso uso HTML para centrarlo:
<center>
<img src="/public/img/logo-linux-router.svg" alt="logo-linux-router.svg" width="64"/>
cortafuegix
</center>
Ejemplo de imagen en un panel de texto.


Compartir Dashboard con un Home Assistant remoto

Me gusta ver los dashboards de Grafana desde Home Assistant lo más integrado posible:

En el equipo donde tengo Grafana aActivo la autenticación anónima y el poder trabajar desde iFrames en /etc/grafana/grafana.ini

[auth.anonymous]
enabled = true
org_name = parchis.org
org_role = Viewer
hide_version = true

[security]
cookie_samesite = none
allow_embedding = true

Rearranco el servidor

root@almacenix:~# systemctl restart grafana-server.service
  • Copiar el link directo al Dashboard.
    • Desde Grafana->Dasboard->Abre el dashboard->Click en el icono de Compartir !!
    • Copiar la URL
Copia la URL para acceder remotamente al Dashboard
  • En el Home Assistant
    • En un Dashboard existente o creando uno desde Configuración->Dashboards.
    • Edit Dashboard
    • Add view, poner nombre, Save y Add Card, tipo iFrame (Web page Card)
    • Entrar en Code Editor y poner lo siguiente, editando a gusto (cambiar la URL por la tuya
type: iframe
url: >-
  http://almacenix.parchis.org:3000/d/123456-nk/servidores?orgId=1&from=now/d&to=now&kiosk=tv&refresh=5s
aspect_ratio: 70%
  • Save
  • Editar el View de nuevo (no la Card) y en View Type pon “Panel (1 card)
Dashboard Grafana externo integrado en Home Assistant


Recuerda aquí tienes un apunte sobre como migrar los datos de InfluxDB y los dashboards Grafana desde Home Assistant a un servidor nuevo como el que acabamos de configurar.


Tips para InfluxDB


Exportar todos los datos de un bucket

Quería ver cómo se estaban guardando los datos de Telegraf así que los saqué de influx para verlos 🤗

luis@almacenix:~$ influx bucket list
ID			Name		Retention	Shard group duration	Organization ID		Schema Type
:
1234584375938475	telegraf	infinite	168h0m0s		8975ef952db592e6	implicit
:
luis@almacenix:~$ sudo influxd inspect export-lp --bucket-id 1234584375938475 --engine-path /var/lib/influxdb/engine --output-path /home/luis/telegraf.lp
:
luis@almacenix:~$ more telegraf.lp
cpu,cpu=cpu-total,host=almacenix usage_guest=0 1644238720000000000
cpu,cpu=cpu-total,host=almacenix usage_guest=0 1644238730000000000
cpu,cpu=cpu-total,host=almacenix usage_guest=0 1644238740000000000
cpu,cpu=cpu-total,host=almacenix usage_guest=0 1644238750000000000
:


Borrar datos específicos

Durante pruebas con Plugins de Telegraf generé muchos datos que más tarde quise borrar, aquí dejo algunos ejemplos:

  • Borrar todo lo que he guardado con el _measurement="temporal_size" entre dos timestamps concretos
luis@almacenix:~$ influx delete --bucket telegraf --start '2022-02-15T17:00:00Z' --stop '2022-02-15T23:00:00Z' --predicate '_measurement="temporal_size"'


  • Repito pero pongo “ahora mismo” como fecha de fin.
luis@almacenix:~$ influx delete --bucket telegraf --start '2022-02-16T14:00:00Z' --stop $(date +"%Y-%m-%dT%H:%M:%SZ") --predicate '_measurement="temporal_size"'


  • Borra el _measurement="temporal_size" por completo, algunas pruebas se guardaron con fechas en el pasado así que establezco que lo borre entero, desde el inicio de los tiempos (digitales) hasta ahora mismo…
luis@almacenix:~$ influx delete --bucket telegraf --start '1970-01-01T00:00:00Z' --stop $(date +"%Y-%m-%dT%H:%M:%SZ") --predicate '_measurement="temporal_size"'


  • El último ejemplo, hice pruebas con el plugin inputs.influxdb que me llenó el bucket de Telegraf de un montón de _measurement's (decenas) que luego no me servían para nada. Aprovheché que todos los data points venían con un tag llamado url.
luis@almacenix:~$ influx delete --bucket telegraf --start '2022-02-15T01:00:00Z' --stop '2022-02-16T23:00:00Z' --predicate 'url="http://localhost:8086/metrics"'


Tips para Telegraf

Monitorizar el tamaño de los buckets de un Servidor InfluxDB

  • El objetivo es averiguar el tamaño de los buckets de un servidor InfluxDB, por ejemplo para observar si crecen mucho y nos quedamos sin espacio. Como siempre se puede observar todo desde Grafana

  • Gist: Script compatible con formato influx para el Plugin input.exec para averiguar el tamaño de los buckets de un servidor InfluxDB.


Monitorizar el tamaño de los discos QCOW2 de un Host QEMU/KVM