NutriFlow — Service Mesh Observability

Istio 1.20 · GKE · 9 microservicios · Generado 2026-06-16 09:42 UTC

INCIDENTE ACTIVO 3 Alertas Istio 1.20
Tres Pilares de Observabilidad — Estado Actual
📊
Métricas
Prometheus Operator + Grafana · istio-system
Prometheus ● Activo
Grafana ● Activo
ServiceMonitor istio-mesh ● Configurado
Alerting Rules ⚠ Parcial (2/5)
Scrape interval 15s
Retención 30d
🔍
Trazado Distribuido
Jaeger · OpenTelemetry Collector (pendiente)
Jaeger all-in-one ✗ Sin configurar
Istio tracing ✗ Deshabilitado
OTel Collector ○ Planificado
Propagación W3C ○ Pendiente
Sampling target 10% producción
Prioridad BLOQUEANTE
📋
Logs Estructurados
Envoy Access Logs · Cloud Logging (GKE)
Envoy access logs ● Activo
Formato JSON ● Configurado
Correlación trace_id ✗ Sin Jaeger activo
Retención GCS 14d hot / 90d cold
Volumen diario ~2.3 GB/día
Audit trail ● GKE Audit
Señales Doradas por Servicio — Últimas 24h
Servicio RPS actual Error rate (5xx) Latencia P50 Latencia P99 Saturación CPU Tendencia 24h Estado
api-gateway
Entrada tráfico externo
583 rps 0.12% 28ms 95ms 42%
OK
auth-service
Autenticación JWT/OIDC
579 rps 0.08% 12ms 38ms 31%
OK
patient-service
CRUD pacientes
324 rps 0.31% 45ms 142ms 55%
OK
nutrition-engine
⚠ Motor IA recomendaciones — INCIDENTE
181 rps 4.87% 312ms 890ms 89%
CRÍTICO
meal-planner
Planificador semanal
93 rps 1.24% 88ms 423ms 68%
AVISO
lab-connector
Integración análisis clínicos
41 rps 0.0% 190ms 380ms 28%
OK
notification-service
Email + push
27 rps 0.5% 22ms 67ms 18%
OK
billing-service
Facturación clínicas
8 rps 0.0% 35ms 110ms 15%
OK
Topología de Servicios — Dependencias Istio
api-gateway 583 rps P99: 95ms ✓ auth-service 579 rps P99: 38ms ✓ patient-service 324 rps P99: 142ms ✓ nutrition-engine 181 rps · 4.87% err P99: 890ms ✗ CRÍTICO meal-planner 93 rps · 1.24% err P99: 423ms ⚠ notification 27 rps P99: 67ms ✓ report-generator 15 rps P99: 220ms ✓ lab-connector 41 rps · P99: 380ms ✓ Leyenda: Flujo con incidente Flujo con aviso Flujo OK
SLOs — Objective vs. Real (últimos 30d)
Disponibilidad global 99.31%
Target: 99.5% Error budget: consumido 81%
Latencia P99 global 532ms
Target: 500ms Estado: VIOLADO (+32ms)
Error rate 5xx 1.48%
Target: <0.5% Causa: nutrition-engine
Reglas de Alerta Prometheus — Propuestas + Activas
HighErrorRate DISPARADA
sum(rate(istio_requests_total {response_code=~"5.."}[5m])) by (destination_service_name) / sum(rate(istio_requests_total [5m])) by (destination_service_name) > 0.05
For: 5m Afecta: nutrition-engine Desde: 47h ago
HighLatencyP99 DISPARADA
histogram_quantile(0.99, sum(rate( istio_request_duration_ms_bucket [5m])) by (le, destination_service_name)) > 1000
For: 5m Actual: 890ms Umbral: 500ms
HighSaturation PENDIENTE
sum(rate( container_cpu_usage_seconds_total [5m])) by (pod, namespace) / sum(kube_pod_container_resource _limits{resource="cpu"}) by (pod, namespace) > 0.80
For: 10m CPU actual: 89% Umbral: 80%
MealPlannerErrorBudget PROPUESTA
sum(rate(istio_requests_total {response_code=~"5..", destination_service_name= "meal-planner"}[30m])) / sum(rate(istio_requests_total {destination_service_name= "meal-planner"}[30m])) > 0.01
For: 15m Actual: 1.24% Umbral: 1%
MeshCertExpiring PROPUESTA
(certmanager_certificate_ expiration_timestamp_seconds - time()) / 86400 < 7
For: 1h Cert expira: cert-prod-tls Días restantes: 34d
IstioProxyNotReady PROPUESTA
kube_pod_container_status_ready {container="istio-proxy"} == 0
For: 5m Estado: OK (0 pods) Namespace: nutriflow-*
Consultas PromQL Clave — Investigación del Incidente
Tasa de peticiones por servicio destino rate
sum(rate(istio_requests_total{ reporter="destination" }[5m])) by (destination_service_name)
Top: nutrition-engine 181 rps
Error rate 5xx por servicio error-rate
sum(rate(istio_requests_total{ reporter="destination", response_code=~"5.."}[5m])) / sum(rate(istio_requests_total{ reporter="destination"}[5m])) * 100
nutrition-engine 4.87%
Latencia P99 por servicio p99-latency
histogram_quantile(0.99, sum(rate( istio_request_duration_ms_bucket{ reporter="destination" }[5m])) by (le, destination_service_name))
nutrition-engine P99 890ms ✗
Conexiones TCP abiertas saturation
sum(istio_tcp_connections_opened_total{ reporter="destination" }) by (destination_service_name)
nutrition-engine 1.847 conn
Plan de Implementación — 4 Fases
1
Jaeger + Tracing
Esta semana · URGENTE
  • Deploy jaeger all-in-one v1.50
  • Habilitar Istio tracing (100% dev)
  • Configurar zipkin endpoint en IstioOperator
  • Propagar headers W3C trace-context
  • Instrumentar nutrition-engine SDK
2
Alertas + SLOs
Semana 2
  • Desplegar PrometheusRule mesh-alerts
  • Configurar Alertmanager → PagerDuty
  • Definir SLOs formales (SLO CRDs)
  • Dashboard Grafana golden signals
  • Runbooks por tipo de alerta
3
OTel Collector
Semana 3–4
  • Deploy OpenTelemetry Collector
  • Pipeline OTLP → Jaeger + Prometheus
  • Telemetry v2 con OTel provider
  • Reducir sampling a 10% en prod
  • Correlación métricas/trazas (exemplars)
4
Kiali + Topología
Mes 2
  • Install Kiali operator
  • Integrar Prometheus + Jaeger + Grafana
  • Visualización dependencias en tiempo real
  • Circuit breaker policies (outlier detection)
  • DestinationRule retry + timeout globales