En este manual explicaremos cómo crear un dashboard de monitorización muy básico para monitorizar aplicaciones Java usando Grafana y Prometheus.
Damos por hecho que el lector tiene unos conocimientos básicos de las 3 tecnologías indicadas y conoce los conceptos básicos de monitorización, para centrarnos en la creación del dashboard.
Construiremos un panel básico donde monitorizaremos: el uso de CPU, la memoria, el estado del Garbage Collector, la disponibilidad y los descriptores de fichero abiertos.
- Alarmas automáticas que te avisen por correo en caso de problemas, algunas ideas:
- Si usas certificados, puedes monitorizar los días que faltan para que expiren.
- Si tu aplicación o una instancia de tu aplicación se cae.
- Si el consumo de CPU o RAM supera ciertos límites.
- Si los tiempos de respuesta de tu aplicación superan un tiempo razonable.
- Métricas personalizadas para medir eventos propios de tu aplicación.
- Número de veces que se llama a tu API.
- Tiempos de respuesta de tu aplicación (endpoints HTTP, consultas a base de datos u otras aplicaciones.)
0 - Entorno
- Hardware: MacBook Pro (13 pulgadas, 2019, cuatro puertos Thunderbolt 3)
- Necesitas Prometheus y Grafana instalado en tu PC.
- Si aún no tienes configuradas estas dos herramientas sigue nuestra guía antes de continuar.
- Damos por hecho que ya tienes creado un DataSource en Grafana, que está conectado a métricas de tu aplicación, por lo que ahora vamos a centrarnos en crear nuestro Dashboard básico.
Decide qué métricas son importantes para ti:
Cada caso es único, pero en nuestro dashboard monitorizaremos cosas básicas que sirve para todas las aplicaciones Java:
- Consumo de CPU.
- Consumo de RAM.
- Comportamiento del Garbage Collector.
- Descriptores de fichero abiertos.
- Disponibilidad.
1 - Gráfica para consumo de CPU
process_cpu_seconds_total
- Panel Options - Title: System CPU Load (%)
- Query - Metrics: rate(process_cpu_seconds_total[10m])
- Standard options - Unit: Percent (0.0 - 1.0)
- Puedes probar con varios valores para el rate: [1m],[5m],[10m] y ver cómo se renderiza mejor la gráfica, si eliges valores muy altos o bajos puede que no se vean correctamente las variaciones.
2 - Gráfica para consumo de RAM
En nuestra instancia de Prometheus, podremos buscar por la keyword 'memory':
jvm_memory_bytes_used
- Panel Options - Title: Memory Total/Heap Used
- Query - Metrics: jvm_memory_bytes_used
- Standard options - Unit: bytes(SI)
- Standard options - Max: 2200000000 (2.2 GB aprox)
Los límites se configuran en la sección "Thresholds":
3 - Comportamiento del Garbage Collector
3.1 - Duración del último GC
java_lang_GarbageCollector_LastGcInfo_duration
- Panel Options - Title: Last GC duration
- Query - Metrics: java_lang_GarbageCollector_LastGcInfo_duration
3.2 - Contador de ejecuciones de GC
En nuestra instancia de Prometheus, podremos buscar por la keyword 'GarbageCollector':
rate(java_lang_GarbageCollector_CollectionCount[10m])
De tal manera que la gráfica tendrá la siguiente configuración:- Panel Options - Title: GC count
- Query - Metrics: rate(java_lang_GarbageCollector_CollectionCount[10m])
rate(java_lang_GarbageCollector_CollectionCount[10m])
- Panel Options - Title: GC count
- Query - Metrics: rate(java_lang_GarbageCollector_CollectionCount[10m])
- Número de Full GCs.
- Memoria antes y después de la recolección.
4 - Gráfica para ver descriptores de fichero
A veces utilizamos librerías que abren descriptores de fichero, es bueno tener una gráfica para asegurarnos de que no tenemos un crecimiento descontrolado de estos descriptores, la siguiente gráfica nos permite ver el número de descriptores abierto en tiempo real:
En nuestra instancia de Prometheus, podremos buscar por la keyword 'fd' (file descriptor):
process_open_fds
- Panel Options - Title: Open File descriptors
- Query - Metrics: process_open_fds
5 - Disponibilidad
Con la siguiente gráfica podremos ver de forma muy rápida si nuestros servicios están ejecutándose o no (color verde o rojo de las barras):
Si nos fijamos, el tipo de Chart que hemos utilizado aquí es un 'State timeline':
Añadiremos una 'Query' por cada instancia de la aplicación que tengamos, con el siguiente valor:
- Panel Options - Title: Availability
- Visualization Type: State timeline
- Query - Metrics: up{instance="<APP_IP:APP_PORT>"}
Comentarios
Publicar un comentario