Este post es continuación de Monitoreo y Observabilidad: Instalando Prometheus - Parte 1
¿Qué es Grafana?
Grafana es una herramienta open-source de análisis, almacenamiento y visualización de series de datos, ofreciendo una interfaz de usuario amigable y muy poderosa.
En el ejemplo que estoy usando Prometheus como nuestra fuente de información (Datasource).
Básicamente Prometheus es el que se encarga de recabar los datos, mientras que Grafana es el que se encarga de mostrar la información.
Nota: Debido a que yo lo estoy ejecutando desde un cluster de Kubernetes onpremise, he tenido que definir un PV, por lo que si tu intentas ejecutarlo en tu proveedor de nube no debería ser necesario ya que dicho almacenamiento te lo debe facilitar tu proveedor en la nube.
Aqui te dejo el video para que vayas realizándolo conmigo:
Instalación
Crear un namespace:
01-namespace.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: grafana
---
Crear de PV:
Nota: el path: lo puedes cambiar por cualquier directorio que exista (o lo puedes crear) en tus nodos y que tengas espacio mayor o igual a 1G.
02-grafana-pv.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: grafana-pv
labels:
type: local
namespace: grafana
spec:
storageClassName: manual
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/grafana"
---
Crear de PVC:
03-grafana-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana-pvc
namespace: grafana
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
Creación del deployment:
04-grafana-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
labels:
app: grafana
namespace: grafana
spec:
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
securityContext:
fsGroup: 472
supplementalGroups:
- 0
containers:
- name: grafana
image: grafana/grafana:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
name: http-grafana
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /robots.txt
port: 3000
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 2
livenessProbe:
failureThreshold: 3
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 3000
timeoutSeconds: 1
resources:
requests:
cpu: 250m
memory: 750Mi
volumeMounts:
- mountPath: /etc/grafana/provisioning
name: grafana-pv
volumes:
- name: grafana-pv
persistentVolumeClaim:
claimName: grafana-pvc
---
Creación del service:
05-grafana-service.yaml
Nota: Recuerda que en mi caso estoy usando metallb para crear un load balancer.
---
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: grafana
spec:
ports:
- port: 80
protocol: TCP
targetPort: http-grafana
selector:
app: grafana
sessionAffinity: None
type: LoadBalancer
---
Después de unos segudos podemos ver todo lo que se ha creado en el namespace grafana. Ahora podemos entrar (en mi caso) a grafana con la dirección que nos da el load balancer.
Yo he agredo la IP en mi /etc/hosts para poder entrar:
Vamos al navegador y ponemos la URL si usaste un port-forward adelante.
Las credenciales por default son:
username: admin
password: admin
Una vez presiones Log in , te pedirá introducir y confirmar un nuevo password.
Primero Pasos con Grafana
Vamos a agregar una nueva fuente de datos (Datasource):
1. En el panel de la izquierda vamos **Connections -> Data sources**.
2. Buscamos o escribimos Prometheus y damos click.
3. En la sección **Connection** debes ingresar la URL donde estás ejecutando Prometheus. por ejemplo en mi caso es esta:
4. Vamos hasta la parte de abajo y le damos click en **Save & test**
5. Listo ya tienes la fuente de datos configurada.
Dashboards con Grafana
Una de las grandes ventajas que tiene Grafana es su comunidad (como en todo proyecto de software libre/open-source) y es que no tenemos que reinventar la rueda, es decir, no hay necesidad de crear desde cero los dashboard, la comunidad ya comparte unos y muy buenos, los cuales después de importarlos los puedes modificar/editar a tus necesidades.
Para importar un dashboard hay que realizar los siguientes pasos:
1. En el panel de la izquierda vamos a **Dashboards**.
2. Damos click en el botón arriba a la derecha que dice **New -> Import**. También lo puedes hacer en el botón del centro de la pantalla que dice **+ Create dashboard** y en la siguiente pantalla le das click en import (es un poco más largo este camino).
3. Abre una pestaña nueva y ve al sitio donde se comparten los dashboards:
http://grafana.com/dashboards
4. Busca el dashboard que quieres importar y le das click, por ejemplo yo elegí este:
5. Ahora debes buscar en esa página donde dice ID, copia ese número.
- Regresa a la ventana de Grafana y pega el ID, después le das click en el botón Load. En esta ventana le puedes cambiar el nombre al dashboard (aunque lo puedes hacer después), mira que arriba del botón import dice Prometheus, dale click para que se desplieguen los datasources, en nuestro caso solo tenemos uno que es Prometheus, lo seleccionas y después le das click en Import.
- Listo ya tienes el dashboard importado.
Grafana más que dashboards
Con Grafana también puedes crear tus alertas de una forma más sencilla que usando prometheus, dependiendo del dashboard, así puedes crear una alerta para cuando detecte problemas a partir del dashboard de "hardware" para que le lleguen al equipo de infraestructura y crear una alerta para cuando detecte problemas a partir del dashboard de la aplicación y que le llegue la notificación al equipo de desarrollo por mencionar un ejemplo.
De igual forma puedes incluir los yaml de Grafana dentro de un repositorio para que sean leídos por Argo CD y automatices la creación de un cluster de Kubernetes o el despliegue de una nueva versión.
Te dejo de tarea (enseño a pescar, no regalo un pez) como implementar Thanos para que guardes los datos y que puedas consultarlos en el futuro.
Conclusión
Hasta aquí he cubierto todo el esquema de CI/CD, de una manera sencilla usando Microsoft Azure DevOps. Estoy meditando si mostrar como usar Github Actions es otro estandar usado por las empresas. También tengo pensado implementar un poco de DevSecOps.
Espero que te sirvan esta serie de post, si tienes dudas déjalas abajo en los comentarios.
Aquí está el repositorio de Azure DevOps.