Documentación de Métricas - OpenObserve Floutic
Este documento describe todas las métricas que se envían a OpenObserve, cómo interpretarlas y ejemplos de queries útiles.
📋 Resumen Rápido: ¿Qué se Envía Automáticamente?
Sin errores:
- ✅ Frontend: SÍ envía datos (page views, clicks, performance, interacciones, errores de red)
- ❌ Backend: NO envía logs normales (solo errores, a menos que
LOG_TO_OPENOBSERVE=true)
Con errores:
- ✅ Frontend: Errores JavaScript + datos RUM
- ✅ Backend: Errores no controlados (4xx →
client-errors-stream, 5xx →server-errors-stream)
Métricas automáticas:
- ✅ API: Cada request HTTP genera una métrica en
api-metrics-stream - ✅ Infraestructura: Métricas de PostgreSQL, Redis y sistema cada 5 minutos
- ✅ Negocio: Eventos como registro, creación de proyectos, reseñas, mensajes
- ✅ Seguridad: Eventos de seguridad (accesos no autorizados, rate limiting)
📌 Nota Importante: Todas las métricas mencionadas aquí se almacenan como logs estructurados (JSON) en OpenObserve, no como el tipo "metrics". Esto es normal e intencional. Si no ves nada en la sección "Métricas" de OpenObserve pero sí en "Logs", no es un problema. Consulta la sección ¿Por qué no hay nada en "Métricas"? para más detalles.
Índice
- Métricas de API
- Métricas de Negocio
- Métricas de Rendimiento
- Métricas de Infraestructura
- Métricas de Seguridad
- Métricas de Frontend (RUM)
- Métricas del Sistema de Logging
- Errores
- Queries Útiles
- Dashboards Recomendados
Métricas de API
Stream: api-metrics-stream
Descripción
Métricas de rendimiento y uso de los endpoints de la API. Se envían automáticamente para cada request HTTP.
Campos
type:"api_metric"endpoint: Ruta del endpoint (ej:/api/v1/projects)method: Método HTTP (GET, POST, PUT, DELETE, etc.)status_code: Código de estado HTTP (200, 404, 500, etc.)response_time_ms: Tiempo de respuesta en milisegundossuccess:truesi200 <= status_code < 400,falseen caso contrariouser_id: ID del usuario (si está autenticado)timestamp: Fecha/hora en ISO 8601- Campos adicionales:
project_id,payment_id, etc. (dependiendo del endpoint)
Ejemplo
{
"type": "api_metric",
"endpoint": "/api/v1/projects",
"method": "GET",
"status_code": 200,
"response_time_ms": 145.3,
"success": true,
"user_id": 123,
"timestamp": "2025-01-15T10:30:00Z"
}
Cómo Interpretar
- Tiempo de respuesta alto: Indica endpoints lentos que pueden necesitar optimización
- Tasa de errores alta: Indica problemas de estabilidad
- Picos de tráfico: Ayuda a identificar patrones de uso
Queries Útiles
-- Tiempo promedio de respuesta por endpoint
SELECT endpoint, AVG(response_time_ms) as avg_time
FROM api-metrics-stream
WHERE timestamp > NOW() - INTERVAL 1 HOUR
GROUP BY endpoint
ORDER BY avg_time DESC;
-- Tasa de errores por endpoint
SELECT endpoint,
COUNT(*) as total,
SUM(CASE WHEN success = false THEN 1 ELSE 0 END) as errors,
(SUM(CASE WHEN success = false THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) as error_rate
FROM api-metrics-stream
WHERE timestamp > NOW() - INTERVAL 1 HOUR
GROUP BY endpoint
ORDER BY error_rate DESC;
-- Percentiles de tiempo de respuesta (p50, p95, p99)
SELECT endpoint,
PERCENTILE(response_time_ms, 50) as p50,
PERCENTILE(response_time_ms, 95) as p95,
PERCENTILE(response_time_ms, 99) as p99
FROM api-metrics-stream
WHERE timestamp > NOW() - INTERVAL 1 HOUR
GROUP BY endpoint;
Métricas de Negocio
Stream: business-metrics-stream
Descripción
Métricas relacionadas con eventos de negocio: registros de usuarios, creación de proyectos, reseñas, mensajes, etc.
Campos
type:"business_metric"metric_name: Nombre de la métrica (ej:"user_registered","project_created","review_created")value: Valor de la métrica (generalmente 1 para contadores)metric_type: Tipo de métrica ("counter","gauge","histogram")tags: Tags adicionales (ej:{"role": "empresa", "status": "verified"})user_id: ID del usuario relacionadoproject_id: ID del proyecto (si aplica)timestamp: Fecha/hora en ISO 8601- Campos adicionales según el evento
Métricas Disponibles
user_registered: Usuario registradoproject_created: Proyecto creadoproject_updated: Proyecto actualizadoreview_created: Reseña creadareview_updated: Reseña actualizadareview_responded: Respuesta a reseñamessage_sent: Mensaje enviado en chat
Ejemplo
{
"type": "business_metric",
"metric_name": "review_created",
"value": 1,
"metric_type": "counter",
"user_id": 123,
"project_id": 456,
"metadata": {
"reviewed_id": 789,
"rating": 5,
"status": "published"
},
"timestamp": "2025-01-15T10:30:00Z"
}
Queries Útiles
-- Resumen de eventos de negocio por tipo
SELECT metric_name, COUNT(*) as count
FROM business-metrics-stream
WHERE timestamp > NOW() - INTERVAL 24 HOUR
GROUP BY metric_name
ORDER BY count DESC;
-- Proyectos creados por día
SELECT DATE(timestamp) as date, COUNT(*) as projects_created
FROM business-metrics-stream
WHERE metric_name = 'project_created'
AND timestamp > NOW() - INTERVAL 30 DAY
GROUP BY date
ORDER BY date;
-- Reseñas creadas con distribución de ratings
SELECT metadata.rating, COUNT(*) as count
FROM business-metrics-stream
WHERE metric_name = 'review_created'
AND timestamp > NOW() - INTERVAL 7 DAY
GROUP BY metadata.rating
ORDER BY metadata.rating;
Métricas de Rendimiento
Stream: performance-stream
Descripción
Métricas de rendimiento del sistema: tiempos de consulta, hit rate de caché, etc.
Campos
type:"performance_metric"metric_name: Nombre de la métrica (ej:"query_duration","cache_hit_rate")value: Valor de la métricaunit: Unidad de medida ("ms","bytes","count","percent")url: URL relacionada (opcional)user_id: ID del usuario (opcional)timestamp: Fecha/hora en ISO 8601
Queries Útiles
-- Tiempo promedio de consultas
SELECT AVG(value) as avg_duration
FROM performance-stream
WHERE metric_name = 'query_duration'
AND timestamp > NOW() - INTERVAL 1 HOUR;
-- Hit rate de caché
SELECT AVG(value) as avg_hit_rate
FROM performance-stream
WHERE metric_name = 'cache_hit_rate'
AND timestamp > NOW() - INTERVAL 1 HOUR;
Métricas de Infraestructura
Stream: infrastructure-stream
Descripción
Métricas de PostgreSQL, Redis y sistema (CPU, memoria, disco). Se envían automáticamente cada 5 minutos.
PostgreSQL
Campos
type:"infrastructure_metric"service:"postgres"connections: Información de conexionestotal: Total de conexionesactive: Conexiones activasidle: Conexiones idlemax: Máximo de conexiones permitidasusage_percent: Porcentaje de uso
database_size: Tamaño de la base de datossize_mb: Tamaño en MBsize_pretty: Tamaño formateado
slow_queries: Cantidad de queries > 1 segundotop_tables: Top 10 tablas más grandesactive_locks: Bloqueos activoslong_transactions: Transacciones > 1 minutounused_indexes: Índices sin usartimestamp: Fecha/hora en ISO 8601
Ejemplo
{
"type": "infrastructure_metric",
"service": "postgres",
"connections": {
"total": 15,
"active": 3,
"idle": 12,
"max": 100,
"usage_percent": 15.0
},
"database_size": {
"size_mb": 125.5,
"size_pretty": "126 MB"
},
"timestamp": "2025-01-15T10:30:00Z"
}
Redis
Campos
type:"infrastructure_metric"service:"redis"memory: Información de memoriaused_mb: Memoria usada en MBusage_percent: Porcentaje de usofragmentation_ratio: Ratio de fragmentación
cache_stats: Estadísticas de cachéhit_rate_percent: Porcentaje de hits (> 90% es óptimo)keyspace_hits: Total de hitskeyspace_misses: Total de misses
commands: Estadísticas de comandosinstantaneous_ops_per_sec: Ops/seg instantáneos
keys: Información de keystotal: Total de keysin_db0: Keys en db0
clients: Información de clientesconnected: Clientes conectadosblocked: Clientes bloqueados
latency: Tiempo de respuesta de PINGtimestamp: Fecha/hora en ISO 8601
Ejemplo
{
"type": "infrastructure_metric",
"service": "redis",
"memory": {
"used_mb": 50.2,
"usage_percent": 45.5,
"fragmentation_ratio": 1.1
},
"cache_stats": {
"hit_rate_percent": 95.5,
"keyspace_hits": 10000,
"keyspace_misses": 450
},
"timestamp": "2025-01-15T10:30:00Z"
}
Sistema (CPU, Memoria, Disco)
Campos
type:"infrastructure_metric"service:"system"cpu: Información de CPUpercent: Porcentaje de uso totalper_core: Lista de porcentajes por corecount: Número de coresfrequency_mhz: Frecuencia en MHz
memory: Información de memoriatotal_bytes,total_mb: Memoria totalavailable_bytes,available_mb: Memoria disponibleused_bytes,used_mb: Memoria usadapercent: Porcentaje de uso
swap: Información de swaptotal_bytes,total_mb: Swap totalused_bytes,used_mb: Swap usadopercent: Porcentaje de uso
disk: Información de discototal_bytes,total_gb: Disco totalused_bytes,used_gb: Disco usadofree_bytes,free_gb: Disco librepercent: Porcentaje de uso
disk_io: Estadísticas de I/O de discoread_bytes,write_bytes: Bytes leídos/escritosread_count,write_count: Número de operaciones
network: Estadísticas de redbytes_sent,bytes_recv: Bytes enviados/recibidospackets_sent,packets_recv: Paquetes enviados/recibidoserrin,errout: Errores de entrada/salida
processes: Información de procesoscount: Número de procesos
timestamp: Fecha/hora en ISO 8601
Queries Útiles
-- Uso de conexiones PostgreSQL
SELECT timestamp, connections.usage_percent
FROM infrastructure-stream
WHERE service = 'postgres'
AND timestamp > NOW() - INTERVAL 24 HOUR
ORDER BY timestamp;
-- Hit rate de Redis
SELECT timestamp, cache_stats.hit_rate_percent
FROM infrastructure-stream
WHERE service = 'redis'
AND timestamp > NOW() - INTERVAL 24 HOUR
ORDER BY timestamp;
-- Uso de CPU
SELECT timestamp, cpu.percent
FROM infrastructure-stream
WHERE service = 'system'
AND timestamp > NOW() - INTERVAL 24 HOUR
ORDER BY timestamp;
-- Uso de memoria
SELECT timestamp, memory.percent
FROM infrastructure-stream
WHERE service = 'system'
AND timestamp > NOW() - INTERVAL 24 HOUR
ORDER BY timestamp;
Métricas de Seguridad
Stream: security-stream
Descripción
Eventos de seguridad: intentos de acceso no autorizado, rate limiting, autenticaciones fallidas, etc.
Campos
type:"security_event"operation_type: Tipo de operación (ej:"unauthorized_access","rate_limit_exceeded","login_failed")operation_name: Nombre descriptivo de la operaciónsuccess:trueofalseuser_id: ID del usuario (si aplica)ip_address: Dirección IPuser_agent: User agent del clientemetadata: Información adicionaltimestamp: Fecha/hora en ISO 8601
Queries Útiles
-- Intentos de acceso no autorizado
SELECT COUNT(*) as count, ip_address
FROM security-stream
WHERE operation_type = 'unauthorized_access'
AND timestamp > NOW() - INTERVAL 24 HOUR
GROUP BY ip_address
ORDER BY count DESC;
-- Rate limits excedidos
SELECT COUNT(*) as count, ip_address
FROM security-stream
WHERE operation_type = 'rate_limit_exceeded'
AND timestamp > NOW() - INTERVAL 1 HOUR
GROUP BY ip_address
ORDER BY count DESC;
Métricas de Frontend (RUM)
Stream: frontend-stream
Descripción
Real User Monitoring: page views, clicks, métricas de rendimiento web, errores de red, interacciones.
Tipos de Eventos
Page View
type:"page_view"url: URL completapath: Rutauser_id: ID del usuario (si está autenticado)timestamp: Fecha/hora en ISO 8601
Click
type:"click"target: Elemento clickeadourl: URL donde ocurrió el clickuser_id: ID del usuariotimestamp: Fecha/hora en ISO 8601
Performance (Web Vitals)
type:"performance"metric: Nombre de la métrica ("LCP","CLS","FID","FCP","TTFB")value: Valor de la métricaurl: URL donde se midiótimestamp: Fecha/hora en ISO 8601
Network Error
type:"network_error"url: URL de la peticiónmethod: Método HTTPstatus: Código de estado (si es error HTTP)error_type: Tipo de error ("http_error","network_failure")error_message: Mensaje del errorduration: Duración de la petición en mstimestamp: Fecha/hora en ISO 8601
Interaction
type:"interaction"metric: Nombre de la métrica ("time_to_first_click","time_to_first_input")value: Valor en milisegundostimestamp: Fecha/hora en ISO 8601
Queries Útiles
-- Page views por ruta
SELECT path, COUNT(*) as views
FROM frontend-stream
WHERE type = 'page_view'
AND timestamp > NOW() - INTERVAL 24 HOUR
GROUP BY path
ORDER BY views DESC;
-- Web Vitals promedio
SELECT metric, AVG(value) as avg_value
FROM frontend-stream
WHERE type = 'performance'
AND timestamp > NOW() - INTERVAL 24 HOUR
GROUP BY metric;
-- Errores de red
SELECT url, COUNT(*) as error_count
FROM frontend-stream
WHERE type = 'network_error'
AND timestamp > NOW() - INTERVAL 24 HOUR
GROUP BY url
ORDER BY error_count DESC;
Métricas del Sistema de Logging
Stream: logging-system-metrics
Descripción
Métricas sobre el rendimiento del propio sistema de logging: logs enviados, fallos, rate limiting, etc.
Campos
type:"logging_system_metric"logs_sent_total: Total de logs enviados exitosamentelogs_failed_total: Total de logs que fallaronlogs_rejected_rate_limit: Logs rechazados por rate limitavg_send_time_ms: Tiempo promedio de envío en mssuccess_rate: Tasa de éxito (0-1)batches_sent: Número de batches enviadostimestamp: Fecha/hora en ISO 8601
Queries Útiles
-- Tasa de éxito del sistema de logging
SELECT timestamp, success_rate
FROM logging-system-metrics
WHERE timestamp > NOW() - INTERVAL 24 HOUR
ORDER BY timestamp;
-- Logs rechazados por rate limit
SELECT SUM(logs_rejected_rate_limit) as total_rejected
FROM logging-system-metrics
WHERE timestamp > NOW() - INTERVAL 24 HOUR;
Errores
Errores de Cliente (4xx)
Stream: client-errors-stream
Errores HTTP 4xx (Bad Request, Unauthorized, Forbidden, Not Found, etc.).
Errores de Servidor (5xx)
Stream: server-errors-stream
Errores HTTP 5xx (Internal Server Error, Bad Gateway, etc.).
Errores JavaScript (Frontend)
Stream: frontend-stream
type:"javascript_error"o"unhandled_rejection"message: Mensaje del errorstack: Stack tracefilename: Archivo donde ocurriólineno: Número de líneacolno: Número de columnaurl: URL donde ocurrióuser_id: ID del usuariotimestamp: Fecha/hora en ISO 8601
Errores Agrupados (Frontend)
type:"javascript_error_grouped"message: Mensaje del errorcount: Número de ocurrenciasfirst_occurrence: Primera ocurrencialast_occurrence: Última ocurrenciasample_stack: Stack trace de ejemplo- Otros campos similares a errores individuales
Queries Útiles
-- Errores más comunes (frontend)
SELECT message, COUNT(*) as count
FROM frontend-stream
WHERE type = 'javascript_error'
AND timestamp > NOW() - INTERVAL 24 HOUR
GROUP BY message
ORDER BY count DESC
LIMIT 10;
-- Errores de servidor por endpoint
SELECT endpoint, COUNT(*) as error_count
FROM server-errors-stream
WHERE timestamp > NOW() - INTERVAL 24 HOUR
GROUP BY endpoint
ORDER BY error_count DESC;
Dashboards Recomendados
Dashboard 1: Visión General
- Gráfico 1: Tasa de errores (4xx + 5xx) por hora
- Gráfico 2: Tiempo de respuesta promedio por endpoint (p50, p95, p99)
- Gráfico 3: Requests por segundo
- Gráfico 4: Uso de CPU y memoria
Dashboard 2: Infraestructura
- Gráfico 1: Uso de conexiones PostgreSQL
- Gráfico 2: Hit rate de Redis
- Gráfico 3: Uso de CPU, memoria y disco
- Gráfico 4: I/O de disco y red
Dashboard 3: Frontend
- Gráfico 1: Web Vitals (LCP, CLS, FID)
- Gráfico 2: Page views por ruta
- Gráfico 3: Errores JavaScript más comunes
- Gráfico 4: Errores de red
Dashboard 4: Negocio
- Gráfico 1: Eventos de negocio por tipo
- Gráfico 2: Proyectos creados por día
- Gráfico 3: Reseñas creadas con distribución de ratings
- Gráfico 4: Mensajes enviados por día
Dashboard 5: Seguridad
- Gráfico 1: Intentos de acceso no autorizado por IP
- Gráfico 2: Rate limits excedidos
- Gráfico 3: Autenticaciones fallidas
- Gráfico 4: Actividad sospechosa
Notas Importantes
-
Sampling: El frontend puede usar sampling para reducir el volumen de datos. Verificar
PUBLIC_OPENOBSERVE_SAMPLING_RATE. -
Batching: Los logs se envían en batches para mejorar el rendimiento. Verificar
OPENOBSERVE_BATCH_SIZEyOPENOBSERVE_BATCH_INTERVAL_SECONDS. -
Rate Limiting: El sistema tiene rate limiting interno para evitar sobrecargar OpenObserve. Verificar
OPENOBSERVE_RATE_LIMIT_PER_SECOND. -
Retention: Los logs se almacenan según la configuración de OpenObserve. Considerar configurar políticas de retención.
-
Agrupación de Errores: Los errores similares del frontend se agrupan automáticamente para reducir el volumen.