Cómo instalar y configurar el sistema de monitorización Graphite en Ubuntu 22.04

Graphite es una herramienta de código abierto que se utiliza para seguir y representar gráficamente el rendimiento de los sistemas informáticos. Puedes utilizarla para hacer un seguimiento del rendimiento de sitios web, aplicaciones, servicios empresariales y servidores en red. Es muy flexible y puede configurarse para que te beneficies tanto de una representación detallada como de una visión general del rendimiento y la salud de las métricas que estás siguiendo.

Graphite está formado por varios componentes: la aplicación web, un backend de almacenamiento llamado Carbon, y la biblioteca de base de datos llamada whisper. En este tutorial, aprenderás a instalar y configurar Graphite en un servidor Ubuntu 22.04.

Requisitos previos

  • Un servidor con Ubuntu 22.04.
  • Un nombre de dominio completo (FQDN) que apunte al servidor. Para nuestro tutorial, utilizaremos el dominio graphite.example.com.
  • Un usuario no root con privilegios sudo.
  • El cortafuegos sin complicaciones (UFW) está activado y en ejecución.
  • Asegúrate de que todo está actualizado.
    $ sudo apt update && sudo apt upgrade
    
  • Instala los paquetes de utilidades básicas. Puede que algunos ya estén instalados.
    $ sudo apt install wget curl nano unzip -y
    

Paso 1 – Configurar el Cortafuegos

Antes de instalar ningún paquete, el primer paso es configurar el cortafuegos para que permita conexiones HTTP y HTTPS.

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)

Permitir 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
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Paso 2 – Instala los paquetes necesarios

Instalaremos Graphite utilizando el gestor de paquetes PIP Python. El primer paso es instalar los paquetes necesarios para la instalación.

$ sudo apt install vim python3-dev python3-pip libcairo2-dev libffi-dev build-essential

Paso 3 – Instalar Graphite y Graphite Web

Instalaremos Graphite en el directorio /opt/graphite.

$ export PYTHONPATH="/opt/graphite/lib/:/opt/graphite/webapp/"
$ sudo pip install --no-binary=:all: https://github.com/graphite-project/whisper/tarball/master
$ sudo pip install --no-binary=:all: https://github.com/graphite-project/carbon/tarball/master
$ sudo pip install --no-binary=:all: https://github.com/graphite-project/graphite-web/tarball/master

Paso 4 – Instalar y configurar PostgreSQL

Utilizaremos el repositorio oficial APT de PostgreSQL para realizar la instalación. Ejecuta el siguiente comando para añadir la clave GPG de PostgreSQL.

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null

Añade el repositorio APT a tu lista de fuentes.

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

Actualiza el repositorio del sistema.

$ sudo apt update

Ahora, puedes instalar PostgreSQL y los paquetes de ayuda utilizando el siguiente comando.

$ sudo apt install postgresql postgresql-contrib libpq-dev

Comprueba el estado del servicio PostgreSQL.

$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Tue 2022-09-27 10:09:35 UTC; 4s ago
    Process: 4456 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 4456 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Sep 27 10:09:35 matrix systemd[1]: Starting PostgreSQL RDBMS...
Sep 27 10:09:35 matrix systemd[1]: Finished PostgreSQL RDBMS.

Verás que el servicio está activado y en ejecución por defecto.

Accede al shell de PostgreSQL.

$ sudo -su postgres psql

Crea un usuario de base de datos para Graphite.

postgres=# CREATE USER graphite WITH PASSWORD 'your_password';

Crea una base de datos para Graphite y dale la propiedad al usuario graphite.

postgres=# CREATE DATABASE graphitedb WITH OWNER graphite;

Sal del intérprete de comandos PostgreSQL.

postgres=# \q

Paso 5 – Configurar Graphite Carbon y Web

El siguiente paso es configurar Graphite Carbon y Graphite web.

Configurar Carbon

Carbon se compone de tres servicios:

  • carbon-cache: acepta las métricas y las escribe en el disco.
  • carbon-relay: replica los datos.
  • carbon-aggregator: se ejecuta delante del servicio carbon-cache para almacenar las métricas a lo largo del tiempo antes de enviarlas a Whisper.

Configurar carbon-cache es necesario, pero carbon-relay y carbon-aggregator son opcionales.

Crea el archivo carbon.conf utilizando el archivo de ejemplo dado.

$ sudo cp /opt/graphite/conf/carbon.conf.example /opt/graphite/conf/carbon.conf

A continuación, crea la configuración de los esquemas de almacenamiento.

$ sudo cp /opt/graphite/conf/storage-schemas.conf.example /opt/graphite/conf/storage-schemas.conf

Abre el archivo de configuración de esquemas de almacenamiento.

$ sudo nano /opt/graphite/conf/storage-schemas.conf

Dentro, encontrarás entradas como

[carbon]
pattern = ^carbon\.
retentions = 60:90d

Esto implica que un patrón que coincida con una expresión regular ^carbon\. debe conservar los datos con la política de retención 60:90d, que significa

  • frecuencia con la que se registra una métrica: 60 segundos
  • duración del almacenamiento de esos valores: 90 días

Puedes añadir tu propia entrada. Tomemos un ejemplo test es decir, puntos de datos de monitorización y nuestras entradas de puntos de datos comenzarán con la cadena test. Esta entrada debe añadirse antes de la entrada por defecto mencionada al final del archivo.

[test]
pattern = ^test\.
retentions = 10s:10m,1m:1h

Coincidirá con cualquier métrica que empiece por test. Almacenará los datos que recoja dos veces, con mayor o menor detalle. La primera definición (1s:10m) creará un punto de datos cada diez segundos. Almacenará los datos sólo durante diez minutos. La segunda definición creará un punto de datos cada minuto. Recogerá todos los datos del último minuto (seis puntos, ya que la definición anterior crea un punto cada diez segundos) y los agregará para crear el punto. Guarda los datos con este nivel de detalle durante una hora.

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

Inicia el servicio carbon-cache.

$ sudo /opt/graphite/bin/carbon-cache.py start

Configurar la Web de Grafeno

El siguiente paso es configurar la aplicación web Graphite.

Genera una clave secreta para la aplicación Graphite. Copia la clave mostrada para utilizarla más adelante.

$ python3 -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
sp%71)6b$%^bc(7xpz1d!)x3(azog01&k^8l02*!y0#)72p07y

Crea el archivo de configuración de la aplicación web.

$ sudo cp /opt/graphite/webapp/graphite/local_settings.py.example /opt/graphite/webapp/graphite/local_settings.py

Tienes que configurar la aplicación web Graphite con los ajustes de la base de datos. Abre el archivo local_settings.py para editarlo.

$ sudo nano /opt/graphite/webapp/graphite/local_settings.py

Descomenta la variable SECRET_KEY e introduce un valor aleatorio para ella.

SECRET_KEY = 'your-secret-key'

Descomenta la variable ALLOWED_HOSTS.

ALLOWED_HOSTS = [ '*' ]

Descomenta la variable TIME_ZONE y ponle el valor adecuado.

TIME_ZONE = 'Asia/Kolkata'

Descomenta la variable USE_REMOTE_USER_AUTHENTICATION y ajústala a TRUE para que el usuario remoto se autentique antes de realizar cualquier cambio en la base de datos.

USE_REMOTE_USER_AUTHENTICATION = True

Cambia la configuración de la base de datos.

DATABASES = {
    'default': {
        'NAME': 'graphitedb',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'graphite',
        'PASSWORD': 'your_password',
        'HOST': '127.0.0.1',
        'PORT': ''
    }
}

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

Instala algunos requisitos previos para la envoltura PostgreSQL de Python.

$ sudo pip install psycopg2-binary

Ejecuta el siguiente comando para importar el esquema de la base de datos.

$ sudo PYTHONPATH=/opt/graphite/webapp/ django-admin.py migrate --settings=graphite.settings

Obtendrás la siguiente salida.

Operations to perform:
  Apply all migrations: account, admin, auth, contenttypes, dashboard, events, sessions, tagging, tags, url_shortener
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying account.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying dashboard.0001_initial... OK
  Applying events.0001_initial... OK
  Applying sessions.0001_initial... OK
  Applying tagging.0001_initial... OK
  Applying tagging.0002_on_delete... OK
  Applying tags.0001_initial... OK
  Applying url_shortener.0001_initial... OK

A continuación, recoge los archivos estáticos.

$ sudo PYTHONPATH=/opt/graphite/webapp/ django-admin.py collectstatic --settings=graphite.settings

Establece la configuración de propiedad correcta.

$ sudo chown -R www-data:www-data /opt/graphite/storage/
$ sudo chown -R www-data:www-data /opt/graphite/static/
$ sudo chown -R www-data:www-data /opt/graphite/webapp/

Crea un usuario root para iniciar sesión.

$ sudo PYTHONPATH=/opt/graphite/webapp/ django-admin.py createsuperuser --settings=graphite.settings
Username (leave blank to use 'root'): navjot
Email address: [email protected]
Password: 
Password (again): 
Superuser created successfully.

Te pedirá que crees un superusuario. Este usuario se utilizará más adelante para conectarse a la aplicación Graphite.

Paso 6 – Configurar Apache

Graphite incluye archivos de configuración de Apache por defecto. Instala el servidor Apache.

$ sudo apt install apache2 libapache2-mod-wsgi-py3

Crea el archivo mod_wsgi.

$ sudo cp /opt/graphite/conf/graphite.wsgi.example /opt/graphite/conf/graphite.wsgi

Copia el archivo de configuración de ejemplo de Graphite en la ubicación de Apache.

$ sudo cp /opt/graphite/examples/example-graphite-vhost.conf /etc/apache2/sites-available/graphite.conf

Abre el archivo de configuración de Graphite para editarlo.

$ sudo nano /etc/apache2/sites-available/graphite.conf

Cambia el número de puerto de la primera línea de 80 a 127.0.0.1:8080. Poner 127.0.0.1 delante restringe que sea accesible a través de la web.

<VirtualHost 127.0.0.1:8080>

Añade tu nombre de dominio.

ServerName graphite.example.com #Replace with your domain

Añade las siguientes líneas debajo de la línea Alias /static/ /opt/graphite/static/.

#Add below lines
<Directory /opt/graphite/static/>
     Require all granted
</Directory>

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

Desactiva el host virtual por defecto y activa el archivo de host virtual de Graphite.

$ sudo a2dissite 000-default
$ sudo a2ensite graphite

También tendremos que decirle a Apache que escuche el puerto 8080 y deje de escuchar el puerto 80 porque utilizaremos Nginx como servidor proxy.

Abre el archivo /etc/apache2/ports.conf para editarlo.

$ sudo nano /etc/apache2/ports.conf

Busca la línea Listen 80 y sustitúyela por lo siguiente.

Listen 127.0.0.1:8080

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

Reinicia el servidor Apache.

$ sudo systemctl restart apache2

Para comprobar que Graphite funciona correctamente y es accesible, ejecuta el siguiente comando.

$ curl 127.0.0.1:8080

Obtendrás la siguiente salida.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<!-- Copyright 2008 Orbitz WorldWide

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. -->

<html>
  <head>
    <title>Graphite Browser</title>
  </head>


<frameset rows="80,*" frameborder="1" border="1">
  <frame src="/browser/header" name="Header" id='header' scrolling="no" noresize="true" />

    <frame src="/composer?" name="content" id="composerFrame"/>

</frameset>
</html>

Esto confirma que funciona correctamente.

Paso 7 – Instalar Nginx

Utilizaremos Nginx como servidor proxy para Apache. De esta forma conseguiremos cosechar los beneficios de la seguridad y la oscuridad a la vez que utilizamos la configuración existente proporcionada por Graphite.

Ubuntu 22.04 incluye una versión antigua de Nginx. Para instalar la última versión, tienes que descargar el repositorio oficial de Nginx.

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ñadir el repositorio de la versión estable de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `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.

$ nginx -v
nginx version: nginx/1.22.0

Iniciar el servidor Nginx.

$ sudo systemctl start nginx

Paso 8 – Instalar SSL

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

Ubuntu 22.04 viene con Snapd instalado por defecto. 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

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 graphite.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/graphite.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 renovaciones de Certbot.

$ sudo systemctl list-timers

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

NEXT                        LEFT          LAST                        PASSED   UNIT                           ACTIVATES             

.................................................................................................................................
Wed 2022-09-28 00:00:00 UTC 7h left       Tue 2022-09-27 00:00:01 UTC 16h ago  logrotate.timer                logrotate.service
Wed 2022-09-28 02:39:09 UTC 10h left      Tue 2022-09-27 09:42:42 UTC 6h ago   apt-daily.timer                apt-daily.service
Wed 2022-09-28 06:02:00 UTC 13h left      n/a                         n/a      snap.certbot.renew.timer       snap.certbot.renew.service

Para comprobar si la renovación SSL funciona correctamente, realiza una ejecución en seco del proceso.

$ sudo certbot renew --dry-run

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

Paso 9 – Configurar Nginx

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/uvdesk.conf para editarlo.

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

Pega en él el siguiente código.

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  graphite.example.com;

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

	# SSL
    ssl_certificate      /etc/letsencrypt/live/graphite.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/graphite.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/graphite.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 8.8.8.8;

    location / {
       proxy_set_header Connection "upgrade";
       proxy_set_header Upgrade $http_upgrade;
       proxy_http_version 1.1;

       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-NginX-Proxy true;

       proxy_pass http://127.0.0.1:8080;
       proxy_redirect off;
    }
}

# enforce HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  graphite.example.com;
    return 301   https://$host$request_uri;
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite una vez hayas terminado.

Comprueba la sintaxis del archivo de configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reinicia el servicio Nginx.

$ sudo systemctl restart nginx

Paso 10 – Acceder y utilizar Graphite

Visita la URL https://graphite.example.com en tu navegador y obtendrás la siguiente pantalla.

Panel de control de grafito

Haz clic en el enlace Iniciar sesión situado en la parte superior derecha para abrir la página de inicio de sesión. Introduce tus credenciales de superusuario creadas en el paso 5 y pulsa el botón de inicio de sesión para continuar.

Existen varios métodos para introducir datos en Graphite. Hemos añadido un comparador de patrones en el esquema de Almacenamiento, según el cual cualquier patrón que empiece por la prueba, se registrará como nuestro patrón. Vamos a añadir algunos datos aleatorios utilizando el siguiente comando.

$ echo "test.count 9 `date +%s`" | nc -q0 127.0.0.1 2003;

Esto añadirá una métrica de datos de valor 9 al sistema. Vamos a añadir más datos haciendo un bucle a través de los valores.

$ for i in 4 6 8 16 2; do echo "test.count $i `date +%s`" | nc -q0 127.0.0.1 2003; sleep 6; done

Vuelve al panel de Graphite y abre Métricas >> prueba >> recuento en la barra lateral izquierda. Deberías ver algo como lo siguiente.

Grafito Mostrar datos en el Panel

Ahora puedes empezar a utilizarlo para la monitorización. También puedes combinarlo con Grafana para obtener un alto nivel de personalización.

Conclusión

Con esto concluye nuestro tutorial sobre la instalación y configuración de Graphite en un servidor Ubuntu 22.04 junto con Nginx como servidor proxy. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...