Archivo de la etiqueta: Grafana

Visualización de métricas: Grafana, InfluxDB y collectd

Aprovechando el cambio de hosting para este blog y otras cosas, me ha dado por buscar formas de visualizar estadísticas de rendimiento del servidor, y tener controlados todos sus recursos típicos: CPU, memoria, disco, … Esta búsqueda me ha llevado a descubrir estas tres herramientas:
  • Grafana: Es una herramienta para consultar y visualizar series de datos de forma “bonita”. Es una herramienta muy potente, con un editor de consultas muy elaborado que te permite elegir entre las métricas que tengas registradas y realizar con ellas todo el tratamiento que necesites. Como origen de datos también tiene gran variedad, pudiendo elegir entre CloudWatch, ElasticSearch, Graphite, InfluxDB, OpenTSDB o Prometheus.
  • InfluxDB: Es un servidor de base de datos NOSQL utilizado para gestionar series de tiempo. Es decir, datos cuyo “índice” es una marca de fecha/hora y unos cuantos campos asociados a ese registro. Ideal para almacenar datos de rendimiento, contadores, eventos y cosas similares. Está escrita en Go, desarrollada por Google y promete tiempos de respuesta impresionantes comparados con otras alternativas.
  • collectd: Es una herramienta que se encarga de recolectar diferentes contadores y métricas de rendimiento de sistema y/o aplicación y se encarga de guardar esos valores de diferentes formas, como por ejemplo enviarlo por red (IP:puerto) a distintos sistemas de almacenamiento, como el anterior InfluxDB.
Además, ¿porqué no aprovechar y meter un poquito de docker en el proceso? Bueno, pues aquí están los pasos que hay que seguir para conseguir unas gráficas como estas:
image
Dashboard Grafana
image
Gráfica tipo de Grafana
Tener en cuenta que estos pasos de instalación están basados en una Debian Jessie, en otras distribuciones habrá que ajustar algunas cosas.

Instalación de collectd

Esta parte es sencilla, he utilizado directamente paquetes del repositorio de Debian, así que no tiene misterio:
# apt-get install collectd
Y su configuración también es sencilla, editar el fichero /etc/collectd/collectd.conf, quedando algo como esto en la parte superior del fichero:
Hostname "bilbo"
BaseDir "/var/lib/collectd"
PluginDir "/usr/lib/collectd"
TypesDB "/usr/share/collectd/types.db"
Y después hay que definir qué datos vamos a recoger con esta utilidad, que se basa en los plugins que hay que descomentar para activarlos. Yo de momento he activado estos:
LoadPlugin apache
LoadPlugin cpu
LoadPlugin df
LoadPlugin disk
LoadPlugin interface
LoadPlugin load
LoadPlugin memory
LoadPlugin mysql
LoadPlugin network
LoadPlugin swap
LoadPlugin uptime
LoadPlugin users
Y la configuración básica del plugin “network” que hay que hacer para que envíe los datos recopilados al siguiente IP/puerto (que es donde escuchará la base de datos InfluxDB que instalaremos a continuación):
<Plugin network>
     Server "127.0.0.1" "8096"
</Plugin>
Por último comprobar que la sintaxis del fichero es la correcta:
# collectd -t
Y arrancar el servicio si no lo está:
# systemctl start collectd

Instalación de InfluxDB

Esto lo instalaremos como un contenedor de Docker. Lo primero que haremos será crear un par de directorios en el anfitrión donde alojar datos y configuración de la base de datos, para que estos sean persistentes cuando paremos nuestro contenedor o lo actualicemos con uno nuevo:
# mkdir -p /docker/containers/influxdb/conf/
# mkdir -p /docker/containers/influxdb/db/
Estos directorios tendrán que tener permiso para el usuario con el que ejecutes los contenedores de docker en tu máquina (reemplazando user por tu usuario):
# chown user:user -R /docker
Generar el fichero de configuración por defecto para InfluxDB, en el directorio que creamos anteriormente:
# docker run --rm influxdb influxd config > /docker/containers/influxdb/conf/influxdb.conf
Vamos a editar este fichero de configuración para habilitar la conexión con collectd, buscar esta parte del fichero de configuración y configurar de esta forma, para que escuche en el puerto 8096 donde enviará los datos collectd:
[[collectd]]
  enabled = true
  bind-address = ":8096"
  database = "collectd"
  retention-policy = ""
  batch-size = 5000
  batch-pending = 10
  batch-timeout = "10s"
  read-buffer = 0
  typesdb = "/usr/share/collectd/types.db"
Crear el contenedor correspondiente. Como podéis ver, se exponen los puertos 8083  y 8086 TCP, que son los correspondientes a InfluxDB en el interfaz web de cliente (8083) y el del API de la propia base de datos (8086). Además, también se hace lo propio con el puerto 8096 UDP, que es donde enviará los datos el servicio collectd que hemos configurado previamente. También configuramos los directorios de configuración y datos que creamos previamente para que puedan ser accedidos desde el contenedor:
# docker create \
--name influxdb \
-e PUID=1000 -e PGID=1000 \
-p 8083:8083 -p 8086:8086 -p 8096:8096/udp \
-v /docker/containers/influxdb/conf/influxdb.conf:/etc/influxdb/influxdb.conf:ro \
-v /docker/containers/influxdb/db:/var/lib/influxdb \
-v /usr/share/collectd:/usr/share/collectd \
influxdb -config /etc/influxdb/influxdb.conf
 Y después, arrancar este contenedor:
# docker start influxdb
Si todo va bien, podrás conectarte a la IP de la máquina al puerto 8083 con un navegador para acceder al cliente web que proporciona la base de datos, y que tiene esta pinta:
image
InfluxDB web Interface
Desde ahí, también podéis crear la base de datos que vais a utilizar para recoger los datos, o revisar si ya está creada, porque si collectd ya ha empezado a reportar datos se habrá creado una con este mismo nombre. Podéis seleccionar la base de datos con este nombre y ejecutar alguna consulta para comprobar que se están registrando correctamente, por ejemplo:
image
Si véis algo similar a esto, es que todo va bien hasta ahora. Lo recomendable después es crear un usuario admin:
create user "admin" WITH PASSWORD 'XXXXXXX' WITH ALL PRIVILEGES
Y habilitar la autenticación editando el fichero de configuración /docker/containers/influxdb/conf/influxdb.conf, en el apartado [http] habilitando la siguiente directiva:
  log-enabled = true
Después habría que reiniciar el contenedor y comprobar que sigues teniendo acceso utilizando las credenciales anteriores.

Instalación de Grafana

Al igual que con la base de datos, esto también lo vamos a instalar como contenedor Docker.
Lo primero, es crear un volumen de almacenamiento temporal para grafana, para mantener persistencia cuando paremos el contenedor, y cuando lo eliminemos para actualizarlo:
# docker run -d -v /var/lib/grafana --name grafana-storage busybox:latest
Y después, creamos el contenedor, como ves con el puerto TCP 3000 expuesto en la máquina anfitrión para acceder al interfaz web.
# docker create \
--name=grafana \
-p 3000:3000 \
--volumes-from grafana-storage \
-e "GF_SECURITY_ADMIN_PASSWORD=XXXXXXXX" \
grafana\grafana
Ten en cuenta que debes reemplazar el texto XXXXXXX con la contraseña que quieras establecer para acceder al interfaz web de Grafana, el usuario es admin. Después, arrancamos el contenedor:
# docker start grafana
Ahora, abre un navegador apuntando a la IP del servidor y puerto 3000, verás el interfaz de Grafana donde podrás comenzar a trabajar. Lo primero, es crear un DataSource para acceder a los datos de InfluxDB, por ejemplo:
image
Grafana Datasource Configuration
Reemplaza la IP que aparece en la URL por la que tenga tu contenedor de InfluxDB (lo puedes ver con “docker inspect”), y a partir de aquí ya podrás comenzar a crearte tus propios Dashboards, gráficos, …
Enlaces de Interés: