Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[SpainLabsIoT2018] InfluxDB + Telegraf
#1
resim

Continuamos con una nueva entrega! En la pasada vimos la teoría sobre el protocolo MQTT y los primeros pasos en la instalación de las diferentes aplicaciones y/o configuraciones que vamos a usar. Ademas vimos esquemáticamente como vamos a implementar la solución. La dividimos en varios bloques, esta vez tocaremos la parte de base de datos y una pasarela entre nuestro broker MQTT (Mosquitto) y la base de datos InfluxDB. De esta pasarela se encarga Telegraf (https://www.influxdata.com/time-series-p.../telegraf/). Telegraf es una aplicación que pertenece al grupo InfluxData, al igual que InfluxDB y Grafana. Telegraf es un agente que recopila datos y métricas de diferentes sitios, recopila los datos para meterlos en nuestra base de datos, entre otras opciones. Hablaremos mas detenidamente de Telegraf después de tratar InfluxDB. Vamos a entrar en materia un poco.

InfluxDB - Base de datos para series de datos temporales.

InfluxDB pertenece a un ecosistema del grupo InfluxData. A continuación os muestro una imagen del lugar que ocuparía InfluxDB. En ella podemos ver el lugar que ocupa también Telegraf y en el lugar donde esta Chronograf iría nuestro Grafana. Cabe decir, que Grafana es muy similar a Chronograf y que ambos son del mismo grupo, InfluxData.


resim

Que es InfluxDB?

Influxdb es un servidor OpenSource de base de datos de series de tiempo (timeseries), ideal para logs o datos para gráficas que se generen en vivo (dashboards, …). Programado en go permite la interacción via API HTTP(S) (JSON) e interficie web y los datos de gestionan con un lenguaje similar a SQL. En las tablas no hay que tener una previsión de las columnas que tendrá, se pueden añadir al vuelo. Su lanzamiento data en Septiembre de 2013, es una plataforma bastante joven.

InfluxDB se ha convertido en la mejor opción para las series de datos, destacando su capacidad frente a su mas inmediato perseguidor MongoDB.

Veamos una serie de características de este tipo de base de datos:
  • Se asume que si se envía el mismo dato varias veces, es el mismo dato por lo que se aplica la política de resolución de conflictos (de forma resumida, si son exactamente los mismos datos de tags set, field set, timestamp, se sobrescriben los valores en field set con los datos del último Point) por lo que en ciertos casos, se pueden perder datos.
  • El borrado de datos es una situación extraña. Normalmente se borran datos antiguos. Se limita la funcionalidad de borrado para incrementar las de escritura y lectura
  • La actualización de datos también es una situación poco común, por lo que su funcionalidad está restringida.
  • La mayoría de los datos tienen timestamps recientes y se guardan en orden ascendente para mejorar el rendimiento.
  • La base de datos puede gestionar un gran volumen de lecturas y escrituras, priorizandolas sobre la vista de los datos.
  • No está soportado el uso de joins entre tablas
Una serie de conceptos característicos de esta base de datos serían los siguientes:

  • Database: es el contenedor lógico que contiene series temporales, usuarios, políticas de retención…
  • Measurement: es la estructura en la que se almacenan los datos. En el ejemplo anterior sería la tabla “host_performance”
  • Timestamp: todo dato almacenado en InfluxDB tiene asociado la fecha y hora. InfluxDB almacena la fecha en formato UTC siguiendo el RFC3339. En el ejemplo anterior, el timestamp se indica en la columna “time”
  • Field: es el par clave-valor que almacena los valores de datos en InfluxDB y siempre están asociados a un timestamp. Son campos no indexados, y que pueden tener datos de tipo strings, floats, integers o booleans. Es obligatorio contar con Fields en nuestra infraestructura de datos. En el ejemplo anterior, “cpu_usage” y “mem_usage” son fields. Tenemos Field-keys (cpu_usage y mem_usage) y Field-values (10, 30, 50, 40 …)
  • Tags: es el par-clave-valor que almacena valores de metadatos.. Son campos indexados y almacenados como strings. Son opcionales en la infraestructura de datos. En el ejemplo anterior,  “host” y “cluster” son Tags. Tenemos Tags-keys (host y cluster) y Tags-values (esxi01.localdomain.local, esxi02.localdomain.local, cluster01…)
  • Point: es el conjunto de valores de fields y tags asociados a un timestamp. Podríamos asociarlo a un registro de la tabla.
  • Retention policy: describe durante cuanto tiempo mantiene InfluxDB los datos en su infraestructura, cuantas copias de los datos se guardan (en el caso de tener un cluster de InfluxDB) y el tiempo asociado a los shard groups. De forma automática, cuando se crea una base de datos, se crea la política “autogen” cuyos datos se guardan por tiempo infinito y con un factor de réplica de 1 y con 7 días como duración de los shard group.
  • Shard: contiene los datos comprimidos y codificados que se guardan en un archivo del disco del servidor. Cada shard pertenece a un solo group shard. Cada shard contiene un grupo específico de series y todos los datos de una serie se almacenan en el mismo shard (archivo) según la duración establecida en la “retention policy”.
Podemos profundizar un poco en el uso de la linea de comandos de InfluxDB en el siguiente enlace: https://robertoorayen.eu/2016/11/21/conc...-influxdb/

Podemos consultar mas información sobre InfluxDB en https://www.influxdata.com/time-series-p.../influxdb/

Repositorio en GitHub: https://github.com/influxdata/influxdb

Os pongo un video donde se presentan ambos bloques, aunque en ingles, de InfluxData sobre InfluxDB y Telegraf.



Visto unos aspectos básicos de InfluxDB, vamos a ver los pasos necesarios para instalarlo en nuestra Raspberry.

Instalación en la Raspberry Pi 3

En unos sencillos pasos vamos a realizar la instalación del software en nuestra Raspberry, nuestro "centro de datos".

Primero añadiremos el repositorio de InfluxDB a nuestro gestor de paquetes:

Código:
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
echo "deb https://repos.influxdata.com/debian stretch stable" | sudo tee /etc/apt/sources.list.d/influxdb.list

Posteriormente actualizamos e instalamos de esta sencilla forma:

Código:
sudo apt update

sudo apt -y install influxdb

Un ultimo paso, es gestionar los accesos desde las diferentes aplicaciones (Telegraf y Grafana) a nuestra base de datos. Para ello, usaremos estos comandos:

Código:
sudo service influxdb start
influx -execute "CREATE USER "telegraf" WITH PASSWORD 'inserthardtoreadpasswordhere' WITH ALL PRIVILEGES;"
influx -execute "CREATE USER "grafana" WITH PASSWORD 'forgrafanaaccess' WITH ALL PRIVILEGES;"

Instalaciones manuales, desde este enlace podéis acceder a los archivos: https://portal.influxdata.com/downloads#influxdb

Con esto ya tendríamos lista la parte de InfluxDB. Vamos a pasar a ver Telegraf.

Que es Telegraf?

Telegraf es una pasarela o servicio que unicamente tiene la función de recopilar y enviar métricas a otro sitio. Existen multitud de scripts, en varios lenguajes, que podrían hacer esta tarea, pero Telegraf lo reúne todo y de una forma mas o menos sencilla de configurar, se ocupa de ello. Telegraf nos permite captar datos del sistema donde se esta ejecutando para luego enviarlos a APIs de terceras partes (u otros programas pertenecientes al grupo IbluxData). Por tanto, tenemos multitud de opciones para la captura de datos (INPUTS) y otras tantas para el envío de estos (OUTPUTS). Por ejemplo, bases de datos, servicios, etc. (InfluxDB, Graphite, OpenTSDB, Datadog, Librato, Kafka, MQTT, NSQ, etc).

Características:
  • Escrito enteramente en Go. Se compila en un único binario sin dependencias externas.
  • Consumo mínimo de memoria.
  • Sistema de plugin que permite una fácil inserción de nuevos inputs y outputs
  • Gran numero de plgugins para la mayoría de los servicios mas populares y APIs.

Podemos encontrar mas información en la documentación de Telegraf: https://docs.influxdata.com/telegraf/v1.5/

Instalación de Telegraf en Raspberry Pi 3

Vamos a proceder a la instalación del software y configuración para nuestra aplicación real. La instalación vale para cualquier caso que se os ocurra, mientras que la configuración, ya sera mas propia del enfoque que necesitamos, aunque también es reutilizable en otros supuestos. Remarco que algún detalle de la configuración no sera definitivo, pues aun me queda algún aspecto del despliegue real de la aplicación que puede hacer que varié o se tenga que añadir algún parámetro mas. No obstante, en rasgos generales, lo que se comentará a continuación es válido.

Instalamos desde el gestor de paquetes el software Telegraf, podemos usar el siguiente comando:

Código:
sudo apt -y install telegraf

Tras la instalación, procedemos a configurar nuestra pasarela. Desde el mismo archivo que vamos a proceder a editar, realizaremos los cambios necesarios para el input (que en nuestro caso sera configurar MQTT), como el output (que en nuestro caso sera InfluxDB). Ejecutaremos el siguiente comando para proceder a la edición (el archivo que se abre es bastante extenso):

Código:
sudo nano /etc/telegraf/telegraf.conf

Tendremos que ir bajando hasta encontrarnos con la sección [[inputs.mqtt_consumer]], la cual descomentaremos. Ese bloque de texto nos quedara algo así:

Nota: Cuidado de no equivocarse de sección. Hay un bloque de inputs y de outputs. Ambos tienen los mismos o muy parecidos subapartados, pero con matices distintos. Puede despistar y ponernos a editar donde no toca.

Código:
[..]
# Read metrics from MQTT topic(s)
[[inputs.mqtt_consumer]]
  servers = ["localhost:1883"]
  ## MQTT QoS, must be 0, 1, or 2
  qos = 0

  ## Topics to subscribe to
  topics = [
    "telegraf/host01/cpu",
    "telegraf/+/mem",
    "sensors/#",
  ]

# if true, messages that can't be delivered while the subscriber is offline
# will be delivered when it comes back (such as on service restart).
# NOTE: if true, client_id MUST be set
persistent_session = true
# If empty, a random client ID will be generated.
client_id = "telegraf"

## username and password to connect MQTT server.
#username = "telegraf"
#password = "contraseña"

## Optional SSL Config
# ssl_ca = "/etc/telegraf/ca.pem"
# ssl_cert = "/etc/telegraf/cert.pem"
# ssl_key = "/etc/telegraf/key.pem"
## Use SSL but skip chain & host verification
# insecure_skip_verify = false

## Data format to consume.
## Each data format has its own unique set of configuration options, read
## more about them here:
## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
data_format = "influx"
[..]


Tras editar la parte de INPUTS, vamos a pasar a los OUTPUTS. Buscamos este fragmento de texto y lo editamos así:

Código:
# Configuration for influxdb server to send metrics to                          
[[outputs.influxdb]]                                                            
 ## The HTTP or UDP URL for your InfluxDB instance.  Each item should be      
## of the form:                                                              
 ##   scheme "://" host [ ":" port]                                            
 ##                                                                            
 ## Multiple urls can be specified as part of the same cluster,                
 ## this means that only ONE of the urls will be written to each interval.    
 # urls = ["udp://localhost:8089"] # UDP endpoint example                      
 urls = ["http://localhost:8086"] # required                                  
 ## The target database for metrics (telegraf will create it if not exists).  
 database = "arduinosensors" # required                                          
                                                                             
 ## Name of existing retention policy to write to.  Empty string writes to    
 ## the default retention policy.                                          
retention_policy = ""                                                        
 ## Write consistency (clusters only), can be: "any", "one", "quorum", "all"  
 write_consistency = "any"                                                  
                                                                       
 ## Write timeout (for the InfluxDB client), formatted as a string.            
 ## If not provided, will default to 5s. 0s means no timeout (not recommended).
 timeout = "5s"                                                            
 username = "telegraf"                                                    
 password = "inserthardtoreadpasswordhere"                                  
 ## Set the user agent for HTTP POSTs (can be useful for log differentiation)
 # user_agent = "telegraf"                                                
 ## Set UDP payload size, defaults to InfluxDB UDP Client default (512 bytes)  
# udp_payload = 512                                                          
                                                                             
## Optional SSL Config                                                      
 # ssl_ca = "/etc/telegraf/ca.pem"                                          
 # ssl_cert = "/etc/telegraf/cert.pem"                                      
 # ssl_key = "/etc/telegraf/key.pem"                                        
 ## Use SSL but skip chain & host verification                              
 # insecure_skip_verify = false                                              
                                                                             
 ## HTTP Proxy Config                                                        
 # http_proxy = "http://corporate.proxy:3128"                                
                                                                             
 ## Compress each HTTP request payload using GZIP.                          
 # content_encoding = "gzip"

Con esto ya tendríamos configurado Telegraf. Podéis editarlo tantas veces como queráis. Destaco que en la parte de INPUTS, lo correspondiente a la configuración de MQTT, la parte donde dice "Topics to subscribe to", es donde indicamos los hilos a los que nos subscribimos del broker MQTT, para que luego esos datos sean indexados en la base de datos. Puede que conforme avance el curso, volvamos a este punto y hagamos algún cambio.

Con esto queda completo esta entrega. En ella hemos comentado en rasgos generales la base de datos InfluxDB y la pasarela Telegraf, con multitud de opciones para poder adaptarla a las diferentes necesidades que puedan aparecer al implementar una solución. Ademas, hemos realizado las instalaciones y configuraciones oportunas en nuestra Raspberry, de forma que seguimos construyendo la estructura que estamos implementado.

Os propongo profundizar un poco con InfluxDB. Con los comandos que vimos en la pasada entrega, los que nos permiten enviar datos vía MQTT, os propongo que probéis a ir mandando algún dato a nuestra base de datos. Posteriormente, os adentréis un poco en la base de datos, familiarizándoos ligeramente con sus comandos y buscando los datos que habéis enviado. Os encontrareis con tablas que contienen datos de la Raspberry como por ejemplo consumo de procesador, Ram, Hd, etc. Son datos en tiempo real de los parámetros de la Raspberry. Los usaremos mas adelante para monitorizar nuestro hardware, en el capitulo de Grafana donde los representaremos.

Nuevamente, si veis que algún aspecto de lo tratado no esta explicado con claridad o veis que es necesario profundizar mas, os animo a que lo comentéis para poder abordarlo y dejaros todo el contenido necesario. Repito lo mismo sobre si tenéis alguna idea o queráis que se trate algún tema en especial, comentadlo. Gracias.

Las siguientes entregas serán la introducción al hardware que hará de nodo con el ESP8266 y el apartado de representación de datos usando Grafana ( es muy probable que este se divida en 2 partes). En la correspondiente al hardware, trataremos desde la creación de la PCB, hasta la programación de esta. Como es un punto que puede dar mucho de si, se dividirá en varias entregas. En el caso de Grafana, serán mínimo dos partes; una tratara sobre la instalación y primeros pasos. Mientras que la siguiente estará ya totalmente enfocada a nuestra aplicación.

Podeis ir al Indice general del curso con el siguiente enlace: https://www.spainlabs.com/foros/tema-Spa...para-tod-s

Y hasta aquí esta entrega. Gracias por la lectura Sonrisa

Saludos
Citar
#2
Hola grafisoft. Tras instalar en la raspberry influxdb y telegraf, para ver la base de datos he instalado Chronograf. En teoría deberían de verse los datos de la raspberry (cpu, % disco, memoria,...), pero no se ven.
En el apartado Host list, el estado del host raspberry aparece en rojo, lo cual creo que quiere decir que no se está recibiendo datos en la base de datos. Si entro en el host raspberry, todos las tablas están vacías.
No se si esto es normal o es que he hecho algo mal.
resim

resim
Citar
#3
No debe estar cogiendo datos telegraf, es raro que tengas las tablas pero no datod
Citar
#4
No he probado aun chronograf.
Citar
#5
He estado intentando meter en influxdb datos que envío por mqtt y no conseguía verlos desde grafana. He tenido que cambiar el data format en el telegraf.conf, y en vez de "influx" poner:

Código:
data_format = "value"
data_type = "string"

Así, desde Grafana, en la edición de un panel me aparece un nuevo measurement "mqtt_consumer", y en el where puedo poner el topic que quiero mostrar en el gráfico. Me pregunto si esta es una manera correcta de consultar los valores de los topics, o cómo tenías pensado hacerlo con el data_type "influx"

resim
Citar
#6
Pues la verdad es que hay varias formas. A mi tal y como lo puse en la guía me funciono, y me aparecían ya los datos. Igual hay alguna versión nueva del Telegraf con cambios que afectan a lo que comentas.

Puedes seleccionar los datos o bien especificando el topic, y luego olvidarte del campo select, o sin especificar nada después del where y eligiendo el parámetro en el campo field( value ).

Yo lo tengo así:

resim

Que es redundante, ya que en ese topic solo esta el valor de un parámetro.
Citar
#7
Creo que ya lo entendí. La diferencia está en cómo se está publicando a través de mqtt. Yo estoy haciendo pruebas desde el terminal con mosquitto_pub y pensaba que cada dispositivo publicaría la información de esta manera:
Código:
mosquitto_pub -t 'casa/sala/temperatura' -m 23

Es decir, el topic se corresponde con el sensor en si, y el mensaje con el valor de ese sensor. Pero si nos subscribimos al topic 'casa/#' desde telegraf.conf, con data_format = "influx", el telegraf no entiende el mensaje (que es '23') y lo descarta. Así que si tenemos dispositivos que publican la información de ese modo para que funcione hay que poner el data_format="value", y el data_type="string"

Si usamos el data_format="influx" tendremos que enviar los mensajes mqtt de esta manera:
Código:
mosquitto_pub -t "casa" -m "casa,tag=sala/temperatura value=23"

Aquí el mensaje está en el formato "influx", y el telegraf creara (si no existe) un measurement "casa", le pone el tag "sala/temperatura" y le inserta un value de 23
Citar
#8
Y a mi me funciona porque estoy usando la opcion 2, en el mensaje hay texto y el valor.

Ya tenemos mas info Sonrisa

Gracias por postearlo.
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
  [SpainLabsIoT2018] Caso real: Nodos ESP8266 grafisoft 38 4,343 03-08-2018, 11:45 PM
Último mensaje: grafisoft
  [SpainLabsIoT2018] Nodo ESP8266 - Smart Sensors Shield grafisoft 16 1,844 02-07-2018, 08:55 PM
Último mensaje: grafisoft
  APORTE [SpainLabsIoT2018] ESP8266 NodeMCU - Ajustando su consumo (hack) grafisoft 4 936 15-06-2018, 06:47 AM
Último mensaje: grafisoft
  [SpainLabsIoT2018] Grafana - Actualizar a la ultima version grafisoft 0 442 02-04-2018, 07:46 PM
Último mensaje: grafisoft
  [SpainLabsIoT2018] Grafana - Dashboard Open Source grafisoft 0 1,075 19-02-2018, 10:44 PM
Último mensaje: grafisoft