Saltar al contenido principal

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

  1. Métricas de API
  2. Métricas de Negocio
  3. Métricas de Rendimiento
  4. Métricas de Infraestructura
  5. Métricas de Seguridad
  6. Métricas de Frontend (RUM)
  7. Métricas del Sistema de Logging
  8. Errores
  9. Queries Útiles
  10. 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 milisegundos
  • success: true si 200 <= status_code < 400, false en caso contrario
  • user_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 relacionado
  • project_id: ID del proyecto (si aplica)
  • timestamp: Fecha/hora en ISO 8601
  • Campos adicionales según el evento

Métricas Disponibles

  • user_registered: Usuario registrado
  • project_created: Proyecto creado
  • project_updated: Proyecto actualizado
  • review_created: Reseña creada
  • review_updated: Reseña actualizada
  • review_responded: Respuesta a reseña
  • message_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étrica
  • unit: 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 conexiones
    • total: Total de conexiones
    • active: Conexiones activas
    • idle: Conexiones idle
    • max: Máximo de conexiones permitidas
    • usage_percent: Porcentaje de uso
  • database_size: Tamaño de la base de datos
    • size_mb: Tamaño en MB
    • size_pretty: Tamaño formateado
  • slow_queries: Cantidad de queries > 1 segundo
  • top_tables: Top 10 tablas más grandes
  • active_locks: Bloqueos activos
  • long_transactions: Transacciones > 1 minuto
  • unused_indexes: Índices sin usar
  • timestamp: 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 memoria
    • used_mb: Memoria usada en MB
    • usage_percent: Porcentaje de uso
    • fragmentation_ratio: Ratio de fragmentación
  • cache_stats: Estadísticas de caché
    • hit_rate_percent: Porcentaje de hits (> 90% es óptimo)
    • keyspace_hits: Total de hits
    • keyspace_misses: Total de misses
  • commands: Estadísticas de comandos
    • instantaneous_ops_per_sec: Ops/seg instantáneos
  • keys: Información de keys
    • total: Total de keys
    • in_db0: Keys en db0
  • clients: Información de clientes
    • connected: Clientes conectados
    • blocked: Clientes bloqueados
  • latency: Tiempo de respuesta de PING
  • timestamp: 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 CPU
    • percent: Porcentaje de uso total
    • per_core: Lista de porcentajes por core
    • count: Número de cores
    • frequency_mhz: Frecuencia en MHz
  • memory: Información de memoria
    • total_bytes, total_mb: Memoria total
    • available_bytes, available_mb: Memoria disponible
    • used_bytes, used_mb: Memoria usada
    • percent: Porcentaje de uso
  • swap: Información de swap
    • total_bytes, total_mb: Swap total
    • used_bytes, used_mb: Swap usado
    • percent: Porcentaje de uso
  • disk: Información de disco
    • total_bytes, total_gb: Disco total
    • used_bytes, used_gb: Disco usado
    • free_bytes, free_gb: Disco libre
    • percent: Porcentaje de uso
  • disk_io: Estadísticas de I/O de disco
    • read_bytes, write_bytes: Bytes leídos/escritos
    • read_count, write_count: Número de operaciones
  • network: Estadísticas de red
    • bytes_sent, bytes_recv: Bytes enviados/recibidos
    • packets_sent, packets_recv: Paquetes enviados/recibidos
    • errin, errout: Errores de entrada/salida
  • processes: Información de procesos
    • count: 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ón
  • success: true o false
  • user_id: ID del usuario (si aplica)
  • ip_address: Dirección IP
  • user_agent: User agent del cliente
  • metadata: Información adicional
  • timestamp: 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 completa
  • path: Ruta
  • user_id: ID del usuario (si está autenticado)
  • timestamp: Fecha/hora en ISO 8601

Click

  • type: "click"
  • target: Elemento clickeado
  • url: URL donde ocurrió el click
  • user_id: ID del usuario
  • timestamp: 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étrica
  • url: URL donde se midió
  • timestamp: Fecha/hora en ISO 8601

Network Error

  • type: "network_error"
  • url: URL de la petición
  • method: Método HTTP
  • status: Código de estado (si es error HTTP)
  • error_type: Tipo de error ("http_error", "network_failure")
  • error_message: Mensaje del error
  • duration: Duración de la petición en ms
  • timestamp: 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 milisegundos
  • timestamp: 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 exitosamente
  • logs_failed_total: Total de logs que fallaron
  • logs_rejected_rate_limit: Logs rechazados por rate limit
  • avg_send_time_ms: Tiempo promedio de envío en ms
  • success_rate: Tasa de éxito (0-1)
  • batches_sent: Número de batches enviados
  • timestamp: 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 error
  • stack: Stack trace
  • filename: Archivo donde ocurrió
  • lineno: Número de línea
  • colno: Número de columna
  • url: URL donde ocurrió
  • user_id: ID del usuario
  • timestamp: Fecha/hora en ISO 8601

Errores Agrupados (Frontend)

  • type: "javascript_error_grouped"
  • message: Mensaje del error
  • count: Número de ocurrencias
  • first_occurrence: Primera ocurrencia
  • last_occurrence: Última ocurrencia
  • sample_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

  1. Sampling: El frontend puede usar sampling para reducir el volumen de datos. Verificar PUBLIC_OPENOBSERVE_SAMPLING_RATE.

  2. Batching: Los logs se envían en batches para mejorar el rendimiento. Verificar OPENOBSERVE_BATCH_SIZE y OPENOBSERVE_BATCH_INTERVAL_SECONDS.

  3. Rate Limiting: El sistema tiene rate limiting interno para evitar sobrecargar OpenObserve. Verificar OPENOBSERVE_RATE_LIMIT_PER_SECOND.

  4. Retention: Los logs se almacenan según la configuración de OpenObserve. Considerar configurar políticas de retención.

  5. Agrupación de Errores: Los errores similares del frontend se agrupan automáticamente para reducir el volumen.


Referencias