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.
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.
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.