Monitorizando el sistema con Cacti (parte 2): monitorizar la temperatura
En esta entrada vamos a ampliar un poco más los conceptos básicos de Cacti que vimos en la entrada anterior para que podamos ir monitorizando fácilmente cualquier cosa que se pueda obtener mediante un script. No voy a entrar al detalle fino de todos los conceptos porque sé que eso no es lo que queréis: queréis pintar una gráfica con algún valor que os interesa, y lo queréis ya, ¿me equivoco? Pues ahí vamos.
Para Cacti cuando hablamos de una forma de obtener los datos, ya sea SNMP, un script PHP, un comando, o lo que sea, estamos hablando de un Data Input Method. Mediante un Data Input Method podemos obtener uno o varios datos que nos interesará guardar a lo largo del tiempo.
Y ¿dónde se guardan esos datos? En los Data Sources, que son archivos en formato RRD que la utilidad rrdtool puede usar como base de datos para hacer las gráficas.
Y… lo habéis adivinado: la representaciones gráficas de la información almacenada en los Data Sources, y que conseguimos a través de los Data Input Methods, se llaman Graphs.
Vale, bastante teoría por ahora, vamos con el ejemplo: Queremos monitorizar la temperatura de la CPU de nuestra flamante Odroid U3.
Creando el Data Input Method
El dato que necesitamos sabemos que se puede obtener leyendo el archivo /sys/class/thermal/thermal_zone0/temp del sistema de archivos (en el caso de la Raspberry Pi, el valor lo tenemos en el mismo fichero). Como somos administradores ordenados vamos a crear un repositorio para todos los scripts que hagamos en /etc/JDOMO, y a este primer script lo llamaremos dim_temp.sh:
mkdir /etc/JDOMO cd /etc/JDOMO touch dim_temp.sh chmod a+x dim_temp.sh
y su contenido será el siguiente:
#!/bin/bash awk '{print "temp:" $1/1000}' /sys/class/thermal/thermal_zone0/temp
Ahora vamos a la consola web de Cacti y creamos el Data Input Method:
Introducimos los datos que nos pide, y hacemos clic en Create:
Cuando hacemos clic en Create, nos aparecerá una ventana ampliada para que le digamos que parámetros de entrada tiene el script, en nuestro caso ninguno, y qué valores nos devolverá. El script nos devolverá una serie de parejas clave:valor separadas por espacios. En nuestro caso nos devolverá un único par del tipo temp:entero. Es extremadamente importante que NO haya espacios entre el nombre de la clave y el valor, solo el símbolo de dos puntos. Si la salida del script no está formateada como espera Cacti, se producirán errores y no se generarán las gráficas.
Para decirle a Cacti que el script nos devolverá un valor, hacemos clic en Add en Output Fields.
Introducimos el nombre de la variable que nos devuelve el script, un nombre descriptivo (yo suelo poner siempre el mismo que arriba), y el check de abajo debe estar marcado para que nos guarde el valor que lea en la base de datos RRD.
Guardamos la información haciendo clic en Save, y ya tendremos el Data Input Method creado
Creando el Data Source
De forma similar al punto anterior, vamos a Data Sources, y hacemos clic en Add:
Los datos que nos pide Cacti para crear el Data Source son: la plantilla base (en este caso ninguna) y el host al que pertenece:
Cuando hacemos clic en Create, nos aparece la ventana de datos ampliada en la que deberemos completar la información. En Name suelo poner lo mismo que en el Data Input Method, y en el Data Source Item, en esta base de datos RRD solo vamos a tener la temperatura del procesador, ponemos temp en Internal Data Source Item:
Al pulsar en Create, nos aparece una ventana aun mas ampliada para añadir más Data Source Items y comprobar que todo está bien. Pulsamos en Save y salimos.
Podéis comprobar que el Data Source Path nos lo ha generado automáticamente y que el Output Field está correcto también.
Creando la gráfica
Ya casi lo tenemos, nos falta ir a Graph Management, y hacer clic en Add para crear nuestra nueva gráfica:
En la siguiente pantalla le decimos que la gráfica pertenece al host jdomo (o Localhost si no le habéis cambiado el nombre como hice yo):
Ahora nos aparece la ventana de información ampliada, en la que tendremos que especificar el título (Title) y la etiqueta del eje Y (Vertical Label). El resto lo dejamos en los valores por defecto por ahora:
Al pulsar en Create, nos aparece la ventana más ampliada, en la que podemos especificar los Graph Items, o lo que es lo mismo, los valores que queremos que nos pinte. Hacemos clic en Add para añadir la temperatura:
Cuando queremos que nos dibuje un volor como en este caso, se suele usar el Type LINE1 (línea de un píxel de grosor), LINE2, LINE3, o AREA (línea vertical de 0 al valor). Si queremos una línea horizontal en algún valor concreto, usaremos HRULE y en Value le diremos el valor en el que nos pintara la línea. De forma similar tenemos el Type VRULE para líneas verticales.
Además del valor de la variable temp, vamos a pintar una leyenda, con los valores máximo, mínimo y actual de la temperatura. Es tan fácil como añadir tres Graph Items cambiando el Type a GPRINT, la Consolidation Function a MIN, MAX, y LAST respectivamente, y poniendo en el Text Format una Descripción para el valor. El color lo podemos dejar a None. Si marcamos Insert Hard Return, nos hará un salto de línea tras imprimir el valor, y los siguientes los mostrará en otra línea:
Con la leyenda ya creada, pulsamos en Save, para guardar la gráfica, y que empiece a dibujarla:
Ya lo tenemos hecho. Es bastante mecánico, y no tiene mucha dificultad.
NOTA: En la imagen anterior se puede ver que la gráfica ya tiene valores. Esto es debido a que anoche acabé de crear el Data Source y el Data Input Method, y se puso a guardar la información en la base de datos RRD. Por eso hoy cuando le hemos pedido que nos genere la gráfica, ya tenía datos para pintar. Es posible que la gráfica os salga vacía si hay algún error o si no habéis esperado suficiente tiempo y en la base de datos no hay valores suficientes para generarlaa. Tened paciencia (unos 10 o 15 minutos deberían ser suficientes para ver algo en las gráficas).
Hola,
Ya tengo montado el cacti y el arduino con un sensor de temperatura. Ahora es donde viene mi problema xD
¿Como tengo que guardar el dado en Arduino para poder luego cogerlo con el cacti?
Esta parte de la explicación no la encuentro en tus post y ahora mismo no se me ocurre nada …
Claro, esta entrada esta pensada para monitorizar la temperatura del equipo que está ejecutando Cacti, del mismo servidor. Si lo que quieres es un sensor remoto la cosa cambia bastante. ¿Como tienes conectado el arduino al equipo con cacti (radiofrecuencia, serie, usb, ethernet…)?
Hola,
Mi intención es ponerlo por ethernet para poder acceder tanto a la temperatura en tiempo real como luego a las gráficas.
Entiendo que lo que tengo que hacer es publicar el dato en web y luego configurar el cacti para que recoja ese dato en la pagina. Pero no se cual sería la manera mas sencilla ya que veo que el cacti tiene varios tipos de entrada …
La forma de capturar los datos del arduino es a través del Data Input Method (un script que se conecta al sensor, al Arduino y lee los datos). ¿Como se puede conectar a Arduino? yo lo suelo hacer por Ethernet, le programo una web donde se muestran los datos de los sensores, y con el script que le creo para el Data Input Method (en el ejemplo lo llamo dim_temp.sh) llamo a la web de Arduino y leo los datos.
Si lo tienes conectado por USB, puedes hacer lo mismo pero vía puerto serie, haciendo que el script le envíe por serie la orden para leer la informacion y que el Arduino cuando la reciba, escriba con Serial.print, el valor de la temperatura…
Tengo pendiente una entrada para explicar como capturar la información de un Arduino, vía radiofrecuencia (sin cables)…
Vale entonces mi problema es el script que guarda los datos de la web, porque na vez guardados siguiendo este tutorial los puedo graficar sin problemas.
Vale leyendo de nuevo tu comentario he entendido otra cosa, no tengo que crear un script que recoja los datos de la web, si no que tengo que ponerle la ruta de la web directamente en el Data Input Method. ¿Es correcto mi planteamiento?
Gracias por tu ayuda.
No me había explicado bien, mejor con un ejemplo, en la entrada ‘Electroválvula Rain Bird 075-DV controlada por Internet con Arduino’ tienes algo parecido a lo que comentaba: un arduino que muestra una web con unos datos en formato ‘clave:valor’.
En ese caso, el script que creamos para que cacti recoja los datos debería contener algo parecido a lo siguiente:
wget -qO- http://192.168.2.201 | egrep -i «tempDS» | tr ‘\n’ ‘ ‘ | tr -d ‘\r’ && echo «»
que básicamente lo que hace es buscar la linea de la web que contiene la palabra ‘tempDS’ e imprimirla por la salida estándar, que es justo lo que espera cacti, algo como tempDS:40.38
Para facilitar el procesamiento de la web por parte del script conviene que imprimas tags html en la misma linea donde imprimes el dato que necesita leer cacti, mejor procesar ‘tempDS:40.38’ que ‘(b)(i)tempDS:(a href…. )(/i)(/b)’ (cambiar paréntesis por mayor y menor que… aun no me aclaro para meter código html dentro de un comentario… jajajaja)
No se si ahora me he explicado mejor 😉
Gracias!!! ahora lo entiendo, no es porque estaba empeñado en pensar que primero tendría que guardar las temperaturas en un archivo y luego leer el archivo :S
Muchas gracias por tu ayuda, voy a probarlo todo ahora mismo 🙂
Hola JM
A ver si podemos hacer la «fusión» de dos de tus posts.
Tengo ya funcionando cacti para monitorización de temperaturas, velocidad del viento y otros valores que pueden subir o bajar dentro de un rango, y que el dato de la media a lo largo del tiempo es relevante.
Pero ahora imaginate que quiero usarlo para el consumo eléctrico (ahí entramos en tu otro post) , de agua o de las páginas impresas de una impresora. De ese modo lo que leemos es el contador TOTAL de la luz/agua/impresora. Un valor que sólo se va incrementado.
Y lo que queremos ver es los valores (por diferencia de totales) por unidades de teimpo.
Cuanta electricidad/agua consumí la pasada hora/día/semana/mes
Alguna idea de por dónde disparar?
Lo que buscas son los CDEF, que es la forma que tiene Cacti de hacer operaciones sobre los datasources, y generar valores nuevos. Yo por ejemplo tengo definidos unos para dividir por 1000 (cdef=CURRENT_DATA_SOURCE,1000,/).
Justo ese de dividir por 1000, lo explican paso a paso en este blog:
https://www.mad-hacking.net/documentation/linux/management/cacti/cdef-functions.xml
Hay mucha informacion sobre CDEFs en la red, y se puede complicar el tema todo lo que quieras, haciendo operaciones sobre distintos datasources, combinar CDEFs… espero que sea de ayuda…
Seguro que sí. muchas gracias.
estaba un poco despistado y empezando a mirar emoncms como alternativa pero me daba pereza montar otra máquina.
Le echo un ojo despacio y cuando esté rulando -será algún mes- posteo la repuesta.
Lo dicho, muchas gracias!!!