Be Software Architecture Wise
Be Wise Apps

Read in English · Lire en français · Auf Deutsch lesen

Sección 9.6 de 9.8 · Intermedio · 26 min de lectura

Observabilidad: logs, métricas y trazas

Videolección

5 min · narrado en inglés, con subtítulos
Solo escuchar (audio)
Leer la transcripción

Te damos la bienvenida a la Sección nueve punto seis. Cuando un sistema se comporta mal en producción, necesitas averiguar por qué, y rápido. Esta lección trata de construir sistemas que te permitan hacerlo.

El panel de instrumentos de un automóvil muestra unos pocos indicadores y luces de advertencia: velocidad, combustible, temperatura del motor. Eso es monitorización. Te informa de problemas que alguien previó. Pero cuando el vehículo hace un ruido extraño que ninguna luz explica, el panel de instrumentos no puede ayudar. Un mecánico conecta una computadora de diagnóstico y lee registros detallados de lo que hacía cada pieza, para averiguar una avería que nadie había anticipado. La observabilidad consiste en construir el software para que este tipo de investigación sea siempre posible: cada parte guarda registros claros, y un mismo trayecto puede seguirse de una parte a otra.

La monitorización responde a preguntas que sabías de antemano que había que hacer: ¿está el disco lleno al noventa por ciento? La observabilidad es una propiedad del sistema: ¿puedes explicar un comportamiento que nadie predijo? Un pedido podría ir lento porque una nueva funcionalidad de la carta hace lenta una consulta, pero solo para los restaurantes con más de quinientos platos. Nadie creó un panel para eso. La observabilidad te permite segmentar la telemetría por cualquier atributo hasta que aparece el patrón. Por eso debe incorporarse desde el diseño, mediante una instrumentación coherente e identificadores compartidos. No se puede añadir a posteriori en mitad de un incidente.

Las métricas son números agregados a lo largo del tiempo, como las solicitudes por segundo. Son baratas e ideales para paneles y alertas, pero no pueden decirte nada sobre una solicitud concreta. Los logs registran eventos individuales. Escríbelos como campos estructurados, con nombres acordados, en lugar de texto libre. Y nunca registres secretos ni datos personales innecesarios. Las trazas muestran el recorrido de una solicitud por muchos servicios, y en qué se fue su tiempo. Y los perfiles muestran dónde gasta el propio código tiempo de procesador o memoria.

Un error habitual con las métricas es promediar percentiles. El servicio de la carta se ejecuta en dos instancias. La instancia A está sana, con un percentil noventa y nueve de ciento ochenta milisegundos. La instancia B tiene un vecino ruidoso. Tres mil de sus diez mil solicitudes son lentas, y su percentil noventa y nueve es de mil ochenta milisegundos. Promedia los dos, y el panel muestra seiscientos treinta milisegundos. Pero las doscientas solicitudes más lentas de las veinte mil están en la instancia B. La cifra real es de mil sesenta milisegundos. El panel subestima la cola en cuatrocientos treinta milisegundos. Los percentiles no se pueden promediar. En su lugar, suma los buckets de los histogramas de todos los servidores y lee el percentil del resultado combinado.

Dos listas de comprobación breves cubren la mayor parte de lo que hay que medir. Para todo lo que atiende solicitudes, mide la tasa, los errores y la duración. Ese es el método RED, de Tom Wilkie. Para cada recurso, como un procesador, un disco o un pool de conexiones, mide la utilización, la saturación y los errores. Ese es el método USE, de Brendan Gregg. Las cuatro señales doradas de Google, latencia, tráfico, errores y saturación, son en la práctica RED más saturación. En la práctica, RED describe lo que experimentan los usuarios, y USE explica por qué. El aumento de la latencia de los pagos podría explicarse por un pool de conexiones lleno, con cuarenta solicitudes esperando.

Entre servicios no hay una única traza de pila, así que el trazado distribuido reconstruye una. Cada solicitud recibe un identificador de traza en el borde, y cada unidad de trabajo se convierte en un span. Esta traza muestra una solicitud de hacer pedido, que tardó novecientos cuarenta milisegundos. Precios tardó solo setenta y cinco milisegundos. El servicio de pagos tardó setecientos sesenta, y dentro de él, el proveedor externo de tarjetas tardó setecientos veinte. Ahí es donde se fue el tiempo: no en los servicios propios de la plataforma. El trazado depende de que cada servicio transmita el contexto de traza, usando la cabecera estándar traceparent. Un solo servicio que lo pierda rompe todas las trazas que pasan por él. OpenTelemetry es hoy el estándar neutral respecto al proveedor para producir trazas, métricas y logs.

La telemetría puede costar más que el sistema que observa. Cada combinación distinta de etiquetas de métrica es una serie temporal separada. Un solo histograma de duración de solicitudes en el servicio de pedidos ya genera ciento veintiséis mil series. Añade una etiqueta para cada uno de cuarenta mil restaurantes, y eso se convierte en unos cinco mil millones. Las preguntas por restaurante corresponden a las trazas y los logs. Por último, avisa a las personas por síntomas que notan los usuarios, como un consumo rápido del SLO, no por causas como una CPU alta. Cada aviso debe ser urgente, accionable y real.

La sección completa trata el Collector de OpenTelemetry, el muestreo de trazas y los paneles que responden preguntas. A continuación, en la Sección nueve punto siete, veremos la planificación de capacidad y las pruebas de rendimiento. Nos vemos allí.

Lo que necesitas saber

Monitorización y observabilidad

La monitorización consiste en recoger mediciones y comprobaciones predefinidas y dar la alarma cuando cruzan un umbral: disco lleno al 90%, tasa de errores por encima del 1%, comprobación de estado que falla. Responde a preguntas que sabías de antemano que había que hacer. La observabilidad es una propiedad del sistema: lo bien que puedes entender su estado interno, incluidos estados que nadie predijo, a partir de la telemetría que ya emite, sin desplegar código nuevo para averiguarlo. La palabra viene de la teoría de control, donde Rudolf Kálmán la definió en 1960 como la capacidad de inferir el estado interno de un sistema a partir de sus salidas.

La distinción importa porque los sistemas distribuidos fallan sobre todo de formas nuevas. Un pedido de reparto de comida puede ir lento porque la app de tableta de un restaurante reintenta de forma agresiva, porque el endpoint de un proveedor de pagos en una región está degradado, o porque una nueva funcionalidad de la carta hace que una consulta sea lenta solo para los restaurantes con más de 500 platos. Nadie creó un panel para ninguno de estos casos. La monitorización te dice que el proceso de pago va lento; la observabilidad te permite preguntar para quién, dónde y por qué, segmentando la telemetría por cualquier atributo hasta que aparece el patrón.

Los profesionales no se ponen de acuerdo sobre hasta dónde llega la distinción. Una visión, común entre los proveedores de herramientas, trata la observabilidad como un paraguas sobre tres pilares: logs, métricas y trazas. Charity Majors, Liz Fong-Jones y George Miranda (Observability Engineering, O'Reilly, 2022) sostienen que el enfoque de los pilares pierde de vista lo esencial, y que la observabilidad requiere eventos estructurados, ricos y de alta cardinalidad que puedan consultarse en combinaciones arbitrarias. Ambos bandos coinciden en la consecuencia arquitectónica: la observabilidad es un atributo de calidad que debe incorporarse desde el diseño, mediante una instrumentación coherente, identificadores compartidos y propagación de contexto, porque no se puede añadir a posteriori en mitad de un incidente.

Tipos de telemetría

SeñalQué esLo que mejor hacePrincipal costo o límite
MétricasSeries temporales numéricas, agregadas por intervalo y etiquetadas con unas pocas dimensionesTendencias a largo plazo baratas, paneles, alertas sobre SLIPreagregadas: no pueden responder preguntas sobre solicitudes individuales; las etiquetas deben ser de baja cardinalidad
LogsRegistros con marca de tiempo de eventos discretos, idealmente estructuradosDetalle sobre un evento: un error, una decisión, una entrada de auditoríaEl volumen y el costo crecen con el tráfico; el texto libre es difícil de consultar
TrazasÁrboles de spans cronometrados que muestran el recorrido de una solicitud por los serviciosEncontrar en qué se va el tiempo y qué salto falló en una llamada distribuidaDeben muestrearse a escala; son inútiles si cualquier salto pierde el contexto
PerfilesMuestras de dónde gasta el código tiempo de CPU o asigna memoriaExplicar por qué un servicio es lento o caro a nivel de códigoHerramientas más recientes; el profiling continuo añade una pequeña sobrecarga
Eventos amplios (wide events)Un registro con muchos atributos por solicitud y por servicioSegmentación ad hoc por cualquier atributo (cliente, versión, región)Necesitan un almacén diseñado para consultas de alta cardinalidad

Logging estructurado (structured logging)

Una línea de log como Payment failed for order 81F3 after 3001ms es fácil de escribir y difícil de usar: cada consulta necesita una expresión regular frágil, y cada desarrollador redacta las cosas de forma distinta. El logging estructurado escribe cada entrada como campos clave-valor, normalmente en JSON, con nombres acordados: marca de tiempo, nivel, servicio, nombre del evento, identificadores de negocio (pedido, restaurante, repartidor), resultado, duración y los identificadores de traza y de span que enlazan la línea con su traza. Las consultas se vuelven precisas (todos los eventos card_authorisation_failed del proveedor cardco en la última hora, agrupados por http_status), y los logs de distintos servicios pueden combinarse.

Unas pocas reglas mantienen los logs útiles y asequibles. Registra eventos, no prosa; usa un nombre de evento fijo para cada tipo de evento. Usa los niveles de forma coherente, y no registres con nivel de error condiciones sobre las que nadie necesita actuar. Nunca registres secretos, tokens, números de tarjeta completos ni datos personales innecesarios; los pipelines de telemetría se copian, se envían a terceros y se conservan durante meses, así que son una fuente habitual de fugas de datos, y los datos personales en los logs están sujetos al RGPD (GDPR) como cualquier otra copia (Sección 8.7). El logging y la detección de seguridad, un propósito relacionado pero distinto, con sus propias necesidades de retención e integridad, se tratan en la Sección 8.8.

traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
             version-trace id (16 bytes)-parent span id (8 bytes)-flags (01 = sampled)

{"ts": "2026-10-22T12:31:07.412Z", "level": "error",
 "service": "payment-service", "event": "card_authorisation_failed",
 "order_id": "ord_81F3", "provider": "cardco", "http_status": 504,
 "duration_ms": 3001, "attempt": 2,
 "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736", "span_id": "00f067aa0ba902b7"}
Una cabecera traceparent del W3C y una entrada de log estructurado del servicio de pagos. El trace_id compartido permite que una consulta salte de esta línea de log a la traza completa.

Las métricas y por qué los percentiles no pueden promediarse

La mayoría de los sistemas de métricas, como Prometheus (un proyecto graduado de la CNCF) y el modelo de métricas de OpenTelemetry, ofrecen los mismos pocos tipos. Un contador (counter) solo aumenta, como el total de solicitudes atendidas; se lee como una tasa (solicitudes por segundo durante los últimos cinco minutos), lo que además sobrevive a los reinicios. Un gauge (indicador) es un valor actual que sube y baja: longitud de la cola, conexiones en uso, memoria. Un histograma cuenta las observaciones en buckets (por ejemplo, solicitudes de menos de 50 ms, de menos de 100 ms, de menos de 250 ms, etc.) más un recuento total y una suma, a partir de los cuales se estiman los percentiles. Prometheus también tiene un tipo summary (resumen) que calcula cuantiles dentro de cada proceso.

La distinción entre histogramas y summaries no es un detalle. Como señaló la Sección 2.4, un percentil es una propiedad de toda una distribución, y el percentil de una distribución combinada no puede calcularse a partir de los percentiles de sus partes. Promediar valores p99 entre servidores, o entre minutos, produce un número que no es el percentil de nada. Los recuentos de los buckets, en cambio, pueden simplemente sumarse: se suma cada bucket en todos los servidores y luego se estima el percentil a partir del histograma combinado. Por eso los SLI de latencia de toda la flota deben construirse sobre histogramas (o sobre recuentos de solicitudes por debajo de un umbral, como en la Sección 9.5), nunca sobre summaries por instancia.

Ejemplo práctico

Ejemplo práctico: promediar dos p99

El servicio de la carta se ejecuta en dos instancias, cada una de las cuales gestiona 10 000 solicitudes en un intervalo de cinco minutos. La instancia A está sana: todas sus solicitudes tardan entre 20 y 300 ms, y su p99 es de 180 ms. La instancia B tiene un vecino ruidoso (noisy neighbour): 7000 solicitudes tardan entre 20 y 300 ms, pero 3000 se reparten de manera uniforme entre 500 y 1100 ms.

p99 de B (sus 100 más lentas de 10 000)1100 - 600 × (100 / 3000) = 1080 ms
Promedio de los dos p99(180 + 1080) / 2 = 630 ms
p99 real de las 20 000 solicitudesLas 200 más lentas están todas en B: 1100 - 600 × (200 / 3000) = 1060 ms
Error por promediarSe informan 630 ms frente a 1060 ms experimentados: el panel subestima la cola en 430 ms
Con histogramasSumar los recuentos de los buckets de A y B y leer el percentil 99 de los buckets combinados: unos 1060 ms, limitado solo por la anchura de los buckets

Los percentiles promediados pueden equivocarse en cualquier dirección, y el error crece cuando las instancias soportan tráfico distinto.

Lo mismo se aplica en el tiempo: el p99 de una hora no es el promedio de doce p99 de cinco minutos.

Qué medir: RED, USE y las señales doradas

Tres listas de comprobación breves cubren la mayor parte de lo que un servicio debe exponer. El método RED, propuesto por Tom Wilkie en 2015, se aplica a todo lo que atiende solicitudes: Rate (tasa: solicitudes por segundo), Errors (errores: solicitudes fallidas por segundo) y Duration (duración: la distribución de los tiempos de respuesta). El método USE, de Brendan Gregg, se aplica a los recursos: para cada CPU, disco, enlace de red, pool de conexiones y cola, comprueba la Utilisation (utilización: lo ocupado que está), la Saturation (saturación: cuánto trabajo espera) y los Errors (errores). Las cuatro señales doradas del capítulo del libro de SRE de Google sobre la monitorización de sistemas distribuidos son la latencia, el tráfico, los errores y la saturación: en la práctica, RED más saturación.

En la práctica, RED describe lo que experimentan los usuarios y USE explica por qué. Si sube la duración del servicio de pagos (RED), USE aplicado a sus recursos podría mostrar un pool de conexiones al 100% de utilización con 40 solicitudes esperando (saturación), lo que a su vez apunta al lento proveedor de tarjetas que mantiene las conexiones abiertas. Mide la latencia por separado para los éxitos y los fallos: un error rápido no es buena latencia, y un timeout es a la vez un error y una respuesta lenta.

Tres listas de comprobación comparadas

Lista de comprobaciónSe aplica aSeñalesPregunta típica que responde
RED (Wilkie)Servicios basados en solicitudesTasa, errores, duración¿Está el servicio de pedidos atendiendo bien a los usuarios ahora mismo?
USE (Gregg)Recursos: CPU, memoria, discos, pools, colasUtilización, saturación, errores¿Qué recurso es el cuello de botella?
Cuatro señales doradas (libro de SRE)Sistemas orientados al usuarioLatencia, tráfico, errores, saturación¿Está sano el sistema y cuánto le falta para llegar a sus límites?

Trazado distribuido

En un monolito, una traza de pila (stack trace) muestra dónde pasó su tiempo una solicitud lenta. Entre servicios no hay una única pila. El trazado distribuido reconstruye una: cada solicitud recibe un identificador de traza en el borde, cada unidad de trabajo se convierte en un span (con un nombre, una hora de inicio, una duración, un estado, atributos y el identificador de su span padre), y un backend de trazado ensambla los spans en un árbol. El artículo de Google sobre Dapper (Sigelman y colaboradores, 2010) describió el enfoque a escala: baja sobrecarga, instrumentación en bibliotecas compartidas en lugar de en el código de la aplicación, y muestreo para que solo se registre una fracción de las solicitudes.

El trazado depende por completo de la propagación de contexto: cada servicio debe pasar el contexto de traza al siguiente. La especificación W3C Trace Context (Recomendación del W3C desde 2020) lo estandariza para HTTP con una cabecera traceparent que contiene una versión, un ID de traza de 16 bytes, el ID de 8 bytes del span que llama y flags como si la traza está muestreada, más una cabecera opcional tracestate para datos del proveedor. En la mensajería, los mismos valores viajan en las cabeceras de los mensajes, y el span del consumidor hace referencia al del productor. Un solo servicio que pierda la cabecera (una biblioteca antigua, un cliente HTTP escrito a mano, un trabajo por lotes) rompe todas las trazas que pasan por él, y por eso la propagación corresponde a las bibliotecas compartidas de la plataforma, no al código de cada equipo.

Registrar cada span de cada solicitud es caro a escala, así que las trazas se muestrean. El muestreo al inicio (head-based sampling) decide al comienzo de la solicitud (conservar 1 de cada 100) y es barato, pero descarta la mayoría de las solicitudes lentas y fallidas, poco frecuentes, que te interesan. El muestreo al final (tail-based sampling) guarda los spans en un búfer hasta que la solicitud termina y luego conserva todos los errores, todas las solicitudes más lentas que un umbral y una pequeña fracción del resto; necesita más memoria en el collector, pero conserva las trazas interesantes.

Una traza a través de los servicios de reparto de comida

Cascada de una traza para una solicitud Hacer pedido: el span del gateway contiene el de order-service, cuyo span de pago está dominado por una llamada de 720 ms al proveedor externo de tarjetasTraza 4bf92f35...: una solicitud Hacer pedido (cada barra es un span)0 ms250 ms500 ms750 ms1000 msapi-gatewayPOST /orders940 msorder-serviceplace_order918 mspricing-serviceGET /quote75 mspayment-serviceautorizar760 msprov. tarjetasPOST /auth (externo)720 msBD de pedidosINSERT order32 msbrokerpublica OrderPlaced20 msTiempo desde que el gateway recibió la solicitud
La cascada muestra de inmediato que 720 de los 940 ms se pasan esperando al proveedor externo de tarjetas, no en los servicios propios de la plataforma.

OpenTelemetry: un estándar para la instrumentación

Hasta aproximadamente 2019, cada proveedor de trazado y monitorización tenía sus propios agentes y bibliotecas, así que cambiar de proveedor significaba volver a instrumentar todos los servicios. OpenTelemetry (OTel) se formó en 2019 al fusionar dos proyectos de código abierto anteriores, OpenTracing y OpenCensus, bajo la Cloud Native Computing Foundation (CNCF), y se graduó como proyecto de la CNCF en mayo de 2026. Proporciona API y SDK para los distintos lenguajes, instrumentación automática para frameworks y clientes habituales, el protocolo de transmisión OTLP, el Collector y unas convenciones semánticas que fijan nombres de atributos como http.request.method y http.response.status_code para que la telemetría de distintos equipos y lenguajes encaje. Las trazas, las métricas y los logs son estables; los perfiles se añadieron como cuarta señal y entraron en alfa pública en 2026.

El valor arquitectónico está en separar la instrumentación del backend. Los servicios emiten OTLP a un Collector, que normalmente se ejecuta junto a cada nodo o como gateway central; el Collector agrupa en lotes, muestrea, elimina atributos sensibles, añade metadatos como la versión desplegada y exporta a los almacenes que use la organización. Cambiar de proveedor, o enviar los mismos datos a dos backends durante una migración, pasa a ser un cambio de configuración del Collector en lugar de un cambio de código en doscientos servicios. Un equipo de plataforma suele proporcionar la configuración del SDK, la propagación y el Collector como un camino pavimentado (paved road), para que los equipos de producto solo añadan atributos de negocio.

Pipeline de telemetría

Los servicios instrumentados con OpenTelemetry se pasan el contexto de traza y exportan la telemetría a un collector, que la procesa y la envía a almacenes de métricas, trazas y logs que usan los paneles, las alertas y las consultasSERVICIOS (SDK OTel)order-servicetrazas, métricas, logspayment-servicetrazas, métricas, logsdispatch-servicetrazas, métricas, logsHTTP + traceparentevento + contexto trazaOTLPCollectorrecibeagrupa, muestr.oculta, enriq.exportaBD de métricasseries temp.BD de trazasspans por ID trazaBD de logseventos estructur.Alimenta paneles, alertas, consultas
La instrumentación vive en los servicios, el procesamiento en el Collector y el almacenamiento en backends sustituibles.
from opentelemetry import trace
import structlog

tracer = trace.get_tracer("order-service")
log = structlog.get_logger()

def place_order(order):
    with tracer.start_as_current_span("place_order") as span:
        span.set_attribute("restaurant.id", order.restaurant_id)
        span.set_attribute("order.item_count", len(order.items))
        quote = pricing.quote(order)       # instrumented HTTP client adds
        payment.authorise(order, quote)    # the traceparent header itself
        log.info("order_placed", order_id=order.id,
                 total_pence=quote.total_pence)
        return order.id
Instrumentación manual con la API de Python de OpenTelemetry y un logger estructurado. Los clientes HTTP con instrumentación automática crean spans hijos y propagan el contexto sin código adicional.

Cardinalidad y costo

La telemetría puede costar fácilmente más que el sistema que observa. En las métricas, el factor principal es la cardinalidad: cada combinación distinta de valores de etiqueta es una serie temporal separada que hay que almacenar e indexar. Las etiquetas con pocos valores (método HTTP, clase de estado, región) no son problema. Las etiquetas con valores no acotados (ID de usuario, ID de pedido, URL completa con identificadores, texto del mensaje de error) multiplican las series sin límite y pueden tumbar un sistema de métricas.

Ejemplo práctico

Ejemplo práctico: contar series temporales

El servicio de pedidos exporta un histograma de duración de solicitudes con 12 buckets. Prometheus almacena cada bucket como una serie, más una suma y un recuento, así que son 14 series por combinación de etiquetas.

Pares de ruta y método60
Clases de estado (1xx a 5xx)5
Instancias30
Series de esta sola métrica60 × 5 × 30 × 14 = 126,000
Añadir una etiqueta de región (5 regiones)126 000 × 5 = 630 000 series
Añadir restaurant_id (40 000 restaurantes)126 000 × 40 000 = unos 5000 millones de series potenciales: inviable

Las preguntas por restaurante o por cliente corresponden a las trazas, los logs o los eventos amplios, donde se espera una alta cardinalidad, no a las etiquetas de las métricas.

Los exemplars, que adjuntan un ID de traza de muestra a un bucket del histograma, enlazan un pico de latencia en una métrica barata con una traza detallada y cara.

Otras palancas de costo son muestrear las trazas (el muestreo al final conserva las útiles), una retención más corta para los datos detallados y más larga para los agregados, descartar por defecto los logs de depuración en producción, e imputar el costo de la telemetría a los equipos que la generan para que sea visible. Trata el volumen de telemetría como un parámetro de diseño con un presupuesto, como cualquier otro recurso.

Alertar sobre síntomas, no sobre causas

La pauta del libro de SRE es que los avisos a la persona de guardia deben referirse a síntomas que notan los usuarios, no a las muchas causas posibles. Una CPU alta, un disco lleno en una réplica o un contenedor reiniciado son causas: a menudo inofensivas, a veces ya resueltas por la automatización, y nunca una lista completa de lo que puede fallar. Un SLO que se consume, procesos de pago que fallan o un pipeline de posiciones de repartidores detenido son síntomas: importan sea cual sea su causa. Las alertas basadas en síntomas son menos, rara vez son falsas y cubren fallos que nadie predijo; las señales basadas en causas corresponden a paneles que ayudan a diagnosticar un síntoma una vez que se ha avisado de él.

Cada aviso debe ser urgente, accionable y real. La fatiga de alertas es en sí misma un riesgo para la fiabilidad: los ingenieros de guardia a los que despiertan alertas sin sentido aprenden a descartarlas y pasan por alto la que importa. Una regla práctica es avisar por las tasas de consumo del SLO (Sección 9.5), enviar los consumos más lentos y las advertencias sobre recursos a una cola de tickets, y enlazar cada aviso con un runbook (manual de operaciones) y un panel.

Guía de decisión

Guía de decisión: ¿debe esta alerta avisar a una persona?

Aplica estas preguntas a cada regla de alerta antes de permitir que despierte a alguien, y de nuevo cada vez que se dispare sin que nadie necesite actuar.

  1. ¿Significa la condición que los usuarios se ven perjudicados ahora, o lo serán pronto (un SLO que se consume rápido, un recorrido que falla)?
    SíContinúa con la siguiente pregunta.
    NoNo avises. Ponla en un panel para el diagnóstico, o abre un ticket si alguien debe revisarla en horario laboral.
  2. ¿Necesita que actúe una persona, en lugar de una respuesta automática como un reinicio o un escalado horizontal?
    SíContinúa con la siguiente pregunta.
    NoAutomatiza la respuesta y alerta solo si la automatización falla.
  3. ¿Debe producirse la acción antes del siguiente día laborable?
    SíAvisa, y enlaza la alerta con un runbook y el panel correspondiente.
    NoEnvíala a la cola de tickets del equipo en lugar de al sistema de avisos.
  4. ¿Ha avisado esta alerta en el último mes sin que nadie necesitara hacer nada?
    SíCorrige el umbral o la señal, o elimina la alerta: un aviso sobre el que nadie actúa enseña a la gente a ignorar los avisos.
    NoMantenla, y revísala en el siguiente traspaso de guardia.

Paneles que responden preguntas

Un muro de cincuenta gráficos no responde rápido a ninguna pregunta. Los buenos paneles se diseñan como cualquier interfaz de usuario: para un público concreto y una pregunta específica. Una vista general del servicio responde a ¿está sano este servicio? con sus SLO, el presupuesto de errores restante y las métricas RED arriba, y las métricas USE de sus recursos clave debajo. Un panel de recorrido para la puesta a la venta responde a ¿están consiguiendo entradas los fans? con las admisiones, las reservas de asientos, los pagos y los fallos por minuto de extremo a extremo. A los paneles de diagnóstico se llega profundizando; no se muestran primero.

Guarda los paneles en el control de versiones como código, asigna a cada uno un propietario, muestra los despliegues y los cambios de feature flags como anotaciones en los gráficos (la mayoría de los incidentes siguen a un cambio) y elimina los paneles que nadie ha abierto en meses. Durante un incidente, la primera vista útil suele ser el recorrido orientado al usuario, la segunda la traza de una solicitud que falla, y solo después las métricas de recursos.

Comprueba lo que has entendido

¿Por qué el p99 de toda una flota debe calcularse a partir de histogramas combinados y no a partir del p99 de cada instancia?

Porque el percentil de unos datos combinados no es función de los percentiles de las partes; los recuentos de los buckets se suman con exactitud, así que el histograma combinado da una estimación fiel (limitada por los buckets), mientras que los p99 promediados pueden estar muy equivocados.

¿Qué se rompe si un servicio de una cadena de llamadas no reenvía la cabecera traceparent?

Se divide cada traza que pasa por él: los spans posteriores a ese salto inician una traza nueva, así que se pierden la visión de extremo a extremo y el vínculo entre causa y síntoma.

¿Por qué order_id es una mala etiqueta de métrica pero un buen atributo de span?

Como etiqueta, crea una serie temporal nueva por pedido, lo que dispara la cardinalidad y el costo; como atributo de span o de log, se almacena una vez por evento, donde se espera una alta cardinalidad y es útil para las consultas.

¿Cuál de estas situaciones debería avisar a alguien: la CPU al 95% en una instancia, o el SLO del proceso de pago consumiéndose a una tasa de 20?

El consumo del SLO, porque es un síntoma que notan los usuarios; la lectura de CPU es una causa posible que corresponde a un panel de diagnóstico.

Siguiente · 9.7Capacidad y pruebasCómo planificar la capacidad antes de que llegue la demanda y comprobar que realmente está ahí: previsión, margen de capacidad (headroom) y plazos de entrega, pruebas de carga, de estrés, de resistencia (soak), de picos y de punto de ruptura, cargas de trabajo abiertas y cerradas, omisión coordinada y presupuestos de rendimiento.Continuar →

Fuentes y lecturas recomendadas

¿Tienes una pregunta sobre esta sección? ArchitectBot, el asistente de estudio con IA del curso, responde primero a partir del curso.

Pregunta: “Tenemos logs de veinte servicios, pero no sabemos por qué algunos pedidos van lentos. ¿Qué deberíamos añadir primero: trazado, mejores logs o más métricas?”