Benchmarks de negocio: cómo conectar coste AWS, tokens de IA y latencia
Cómo medir coste AWS, tokens de IA, latencia p95/p98, CPU y capacidad para convertir benchmarks técnicos en decisiones de negocio defendibles ante dirección.
Resumen ejecutivo
Qué debe medir un CTO para saber si una plataforma es rentable y escalable, y por qué las tres cifras que suelen llegar a dirección —coste mensual, CPU media y latencia media— no permiten responder a ninguna de las dos preguntas.
Un CTO necesita cuatro cifras para saber si una plataforma es rentable y escalable: coste por resultado útil, porcentaje de operaciones dentro del objetivo de latencia en el percentil relevante, volumen de resultados útiles sostenible y consumo del presupuesto de error. Con esas cuatro se puede discutir margen, capacidad y riesgo en la misma frase. Sin ellas, la conversación se desplaza a indicadores intermedios —CPU, factura mensual, precio por millón de tokens— que se pueden mejorar sin mejorar nada.
Un benchmark no sirve para demostrar que una tecnología es más rápida. Sirve para decidir cuánto margen, capacidad, riesgo y experiencia de cliente compra cada euro de infraestructura y cada token de IA. Esa es la tesis del artículo y el criterio con el que hay que leer cada tabla que sigue.
La tabla de traducción
Toda métrica técnica tiene una lectura de negocio y un error habitual asociado. La columna que importa es la última: una métrica que no cambia ninguna decisión es un dato, no un indicador.
| Métrica técnica | Error habitual al leerla | Métrica de negocio equivalente | Decisión que permite tomar |
|---|---|---|---|
| Latencia p95 / p98 / p99 | Reportar solo la media o el p50, que describen un sistema idealizado. | Porcentaje de operaciones completadas dentro del umbral que el cliente tolera. | Fijar el objetivo de nivel de servicio y cuánta capacidad ociosa hay que pagar para sostenerlo. |
| CPU | Tratarla como objetivo. Celebrar un 20 % de uso o alarmarse ante un 80 % sin mirar nada más. | Capacidad disponible antes de que el percentil se degrade. | Decidir el disparador de autoescalado y el margen de absorción de picos. |
| Memoria | Vigilar el uso pico e ignorar la presión: frecuencia y duración de las pausas de recolección. | Contribución de las pausas a la cola de latencia y coste de la memoria reservada sin usar. | Dimensionar el heap y elegir recolector según el percentil objetivo, no según el uso medio. |
| Errores y timeouts | Medir la tasa global y no el coste del trabajo desperdiciado antes de fallar. | Coste del tráfico que consume recursos y no produce resultado. | Ajustar timeouts, presupuesto de reintentos y política de descarga de carga. |
| Coste AWS | Seguir el total mensual y el coste por servidor o por pod. | Coste por operación de negocio completada, por cliente y por producto. | Fijar precio, decidir qué clientes son rentables y dónde invertir capacidad. |
| Tokens de entrada | Optimizar la longitud del prompt del sistema e ignorar el contexto recuperado, que suele ser mayor. | Coste de contexto por tarea resuelta. | Decidir cuánto contexto recuperar y con qué estrategia de reordenación y recorte. |
| Tokens de salida | Compararlos entre modelos sin fijar la tarea ni el formato de respuesta. | Coste de producción por respuesta aceptada. | Elegir formato estructurado, límites de longitud y estrategia de validación. |
| Caché de prompts o respuestas | Darla por rentable sin medir la tasa de acierto ni el sobrecoste de escritura. | Ahorro neto por tarea, ya descontado el coste de poblar la caché. | Decidir qué se cachea, con qué ventana de validez y qué prefijo se estabiliza. |
| Throughput | Publicar el máximo de laboratorio, que es el punto donde la cola ya ha explotado. | Volumen de resultados útiles sostenible dentro del objetivo de latencia. | Planificar capacidad para campañas, picos y crecimiento comprometido en contrato. |
| Reintentos | Contarlos en el cliente del proveedor, donde no se sabe cuántos intentos costó una tarea. | Intentos por resultado útil y coste acumulado de los intentos descartados. | Ajustar validación, fallback de modelo y presupuesto de reintentos por operación. |
| Coste de observabilidad | Tratarlo como gasto externo al servicio y recortarlo de forma lineal. | Fracción del coste unitario dedicada a poder decidir con datos. | Elegir muestreo, retención y agregación por análisis, no por porcentaje de recorte. |
Tres frases que sostienen el resto del artículo
| Principio | Consecuencia operativa |
|---|---|
| El promedio describe un sistema idealizado; las colas y los percentiles describen la experiencia real. | Ningún objetivo de nivel de servicio debe expresarse sobre una media. La media es insensible a la cola, y la cola es donde vive el cliente que se va. |
| El coste correcto no es el coste por servidor, sino el coste por resultado útil. | El denominador de toda métrica económica debe contar solo lo que el negocio acepta. Lo que se ejecutó y no sirvió pertenece al numerador. |
| Un modelo de IA barato que obliga a reintentar, escalar o revisar manualmente puede ser el más caro. | El precio por millón de tokens es un precio de insumo. La comparación entre modelos solo es válida con la tarea, el criterio de calidad y todos los costes asociados fijados. |
El recorrido es el siguiente. Los capítulos 1 a 5 construyen la unidad de medida y desmontan las cuatro lecturas erróneas más caras: latencia media, coste por servidor, precio por token y CPU como objetivo. El capítulo 6 reúne coste, calidad, latencia y capacidad en una sola ecuación. Los capítulos 7 y 8 convierten esa ecuación en un ensayo reproducible y en telemetría concreta. El capítulo 9 aplica el modelo a un caso completo, el 10 compara tres decisiones de inversión y los capítulos 11 y 12 cierran con los errores recurrentes y la lista de adopción.
Capítulo —. El benchmark técnico que puede empeorar el negocio
La mayoría de los benchmarks corporativos están bien ejecutados y responden a la pregunta equivocada. El problema no es la medición: es el denominador.
Hay un patrón que se repite en plataformas B2B con microservicios Java y Spring Boot sobre AWS, y que se ha agravado desde que hay funcionalidades de IA generativa en el flujo. Un trimestre de trabajo de optimización termina con dos paneles en verde —coste de infraestructura a la baja, CPU cómoda— y una cuenta de resultados que no mejora. A veces empeora. Nadie ha mentido en ninguna cifra. Todas las mediciones son correctas. Lo que falla es que ninguna de ellas tiene en el denominador el resultado que el negocio vende.
Esa es la definición operativa de optimización local: una mejora real y verificable sobre un indicador intermedio, cuyo efecto sobre el indicador final no se ha comprobado. No es negligencia. Es la consecuencia natural de que los indicadores intermedios sean fáciles de medir —vienen de serie con la plataforma— y el indicador final requiera unir tres fuentes que en la mayoría de las organizaciones no se hablan entre sí: la facturación de la nube, la telemetría de la aplicación y el registro de operaciones de negocio.
| Lo que se celebra en la revisión | Lo que puede estar ocurriendo a la vez |
|---|---|
| «Hemos bajado un 20 % la factura de cómputo» | Se ha eliminado el margen que absorbía los picos. El coste por operación completada sube en cada hora punta, que es cuando ocurre el tráfico que convierte. |
| «La CPU media está en el 25 %» | La carga está dominada por espera. El sistema puede estar saturado en conexiones, hilos o límites de tasa externos sin que la CPU se entere. |
| «Hemos cambiado a un modelo tres veces más barato» | La tasa de validación fallida se ha duplicado. El ahorro por token se lo come el coste de los reintentos y de la revisión humana. |
| «La latencia media ha mejorado» | El p50 ha bajado y el p98 ha subido. Una parte pequeña del tráfico ahora supera el timeout del cliente y no aparece en la media. |
| «Hemos reducido el gasto en observabilidad a la mitad» | Se ha perdido la capacidad de atribuir coste por cliente y de diagnosticar la cola. La siguiente decisión de arquitectura se tomará por intuición. |
| «El benchmark da 12.000 peticiones por segundo» | Ese es el punto de saturación, medido con una sola operación y una carga útil fija. En producción el percentil se degrada mucho antes. |
Qué distingue a un benchmark de negocio
Un benchmark técnico responde a «cuánto rinde este componente en estas condiciones». Es una pregunta legítima y necesaria para elegir entre dos implementaciones. Un benchmark de negocio responde a otra cosa: cuántos resultados aceptables produce el sistema completo, a qué coste unitario, dentro de qué umbral de latencia y con cuánto margen antes de romperse. Son cuatro dimensiones, no una, y la trampa está en que cualquiera de las cuatro se puede mejorar a costa de las otras tres.
Dos ensayos, dos preguntas
Comparación entre Benchmark técnico y Benchmark de negocio
Benchmark técnico
- Aísla un componente y lo lleva a saturación.
- Carga útil fija, operación única, dependencias simuladas o eliminadas.
- Objetivo: comparar dos implementaciones en igualdad de condiciones.
- Resultado: un techo de rendimiento y un punto de comparación.
- Denominador
- Operaciones ejecutadas
- Decisión que soporta
- Elegir componente
Benchmark de negocio
- Mide el flujo completo, incluida la cola y las dependencias reales.
- Mezcla de operaciones y distribución de cargas útiles tomadas de producción.
- Objetivo: cuantificar coste, calidad, latencia y capacidad a la vez.
- Resultado: coste por resultado útil dentro de un objetivo de nivel de servicio.
- Denominador
- Resultados aceptados
- Decisión que soporta
- Invertir, precio, capacidad
El benchmark técnico no está mal hecho: está mal usado cuando se presenta como justificación de una decisión económica. Los dos hacen falta, y solo uno se puede llevar a un comité de dirección.
Por qué la IA generativa ha hecho urgente esta distinción
Durante años el coste variable de una petición fue casi despreciable frente al coste fijo de la plataforma. Una petición más contra un servicio Java ya desplegado consumía milisegundos de CPU y algo de red; el coste marginal existía, pero era tan pequeño que razonar en términos de capacidad reservada resultaba suficiente. Una llamada a un modelo de lenguaje rompe esa aproximación en dos sentidos.
El primero es que el coste marginal deja de ser despreciable: se factura por token consumido y producido, de modo que una petición más tiene un precio directo, medible y sensible al contenido. Un contexto recuperado que crece porque alguien subió el número de fragmentos del recuperador de cinco a quince multiplica el coste variable sin tocar una línea de infraestructura.
El segundo es que el resultado deja de ser binario. Una consulta SQL devuelve o no devuelve. Una respuesta de un modelo puede ser correcta, parcialmente correcta, formalmente válida pero inútil, o directamente inventada. Eso introduce en la ecuación económica una variable que la ingeniería de plataforma no había tenido que modelar antes: la tasa de resultados aceptables. Y esa variable interactúa con todo lo demás, porque cada resultado no aceptable se paga dos veces —una en tokens y otra en el reintento, la revisión humana o el cliente perdido—.
Dónde se rompe la cadena entre métrica y decisión
Diagrama de flujo: Métrica de plataforma → Panel técnico → Informe de dirección → Objetivo de ahorro → Coste por resultado útil
- Métrica de plataforma CPU, memoria, throughput, factura mensual
- Panel técnico Correcto, completo y sin denominador de negocio
- Informe de dirección Tres cifras: gasto, disponibilidad, latencia media
- Objetivo de ahorro «Bajar un 15 % el coste de cómputo»
- Coste por resultado útil Nadie lo mide, así que nadie detecta que ha subido
El resto del artículo construye ese denominador pieza a pieza. Empieza por lo que parece más simple y casi nunca lo es: decidir qué se cuenta como resultado.
Capítulo 01. La unidad de medida correcta: del coste mensual al coste por resultado
La pregunta no es cuánto gastamos. Es cuánto cuesta producir una unidad de lo que vendemos, y qué fracción de ese gasto no produce nada.
La unidad de medida correcta para una decisión de arquitectura es el coste por resultado útil: el coste total de producir algo que el negocio acepta, dividido por el número de resultados aceptados en el mismo intervalo. Todo lo demás —coste mensual, coste por servidor, coste por petición— es un paso intermedio válido para diagnosticar y peligroso para decidir.
Coste por resultado útil
=
( coste de cómputo
+ coste de red y transferencia
+ coste de almacenamiento
+ coste de bases de datos
+ coste de mensajería y colas
+ coste de servicios gestionados
+ coste de inferencia y embeddings
+ coste de observabilidad
+ coste del trabajo fallido o abandonado
+ coste de supervisión humana )
/
resultados aceptados por el negocio
# Todas las partidas del numerador se miden en el MISMO intervalo
# y sobre el MISMO perímetro que el denominador.
# Un numerador mensual con un denominador de hora punta no significa nada. La fórmula no tiene mérito. El trabajo está en dos sitios: decidir qué entra en el numerador —donde casi siempre falta algo— y decidir qué cuenta como resultado aceptado, que es una definición de negocio y no una decisión técnica.
Qué cuenta como resultado
Un resultado útil es el que la organización factura, entrega o reconoce internamente como trabajo hecho. La definición debe cumplir tres condiciones, y las tres se incumplen con frecuencia.
- Debe ser observable en el sistema. Si el resultado se reconoce en una hoja de cálculo tres semanas después, no se puede usar como denominador de un panel operativo. Hay que instrumentar el momento en que el resultado se produce, aunque su aceptación formal llegue más tarde.
- Debe incluir el criterio de calidad. «Documento procesado» no es un resultado útil si el procesado puede ser incorrecto. «Documento procesado y aceptado sin corrección manual» sí lo es, porque el segundo es el que ahorra trabajo y el primero solo lo desplaza.
- Debe ser estable en el tiempo. Un denominador que cambia de definición entre trimestres invalida cualquier serie histórica. Si tiene que cambiar, se recalcula el histórico o se declara el corte, pero no se mezcla.
Ciclo de vida de una petición y su efecto en la ecuación
Máquina de estados con 8 estados: Recibida, Rechazada, En proceso, Reintento, Abandonada, Completada, Revisión humana, Aceptada
Recibida
inicioLa petición entra en el sistema y empieza a consumir capacidad: conexión, hilo, espacio en cola.
- hay capacidad En proceso
- cola llena o descarga de carga Rechazada
Ya suma al numerador aunque todavía no pueda sumar al denominador.
Rechazada
finSe descarta antes de trabajar. Es el fallo más barato posible y por eso la descarga de carga es una decisión económica, no solo de disponibilidad.
Numerador: coste mínimo. Denominador: cero.
En proceso
Consume cómputo, base de datos, red y, si el flujo lo incluye, inferencia y embeddings.
- respuesta válida Completada
- validación fallida Reintento
- se agota el tiempo Abandonada
Reintento
Repite total o parcialmente el trabajo, con el mismo modelo o con uno alternativo.
- presupuesto de intentos disponible En proceso
- presupuesto agotado Abandonada
Multiplica el numerador sin tocar el denominador. Es la partida que más a menudo se pierde.
Abandonada
finSe supera el tiempo máximo o se agota el presupuesto de reintentos. El cliente puede reintentar por su cuenta, duplicando el consumo.
Numerador: coste completo, a veces varias veces. Denominador: cero.
Completada
Éxito técnico. Todavía no es necesariamente un resultado útil.
- supera el criterio de calidad Aceptada
- requiere corrección Revisión humana
Revisión humana
Una persona corrige, valida o rehace el resultado.
- corregida Aceptada
- descartada Abandonada
Suma al numerador un coste que no aparece en ninguna factura de la nube.
Aceptada
finEl único estado que suma al denominador.
Todo lo anterior es numerador.
La jerarquía de denominadores
No hay un único denominador correcto para toda la organización. Hay una jerarquía, y cada nivel responde a una pregunta distinta. El error no es usar el coste por petición: es usarlo para responder a una pregunta que exige el coste por resultado.
| Denominador | Qué mide de verdad | Cuándo es el correcto | Qué esconde |
|---|---|---|---|
| Coste mensual total | El tamaño de la factura. | Solo para tesorería y control presupuestario. | Todo. Sube con el negocio y baja con la crisis; no distingue eficiencia de volumen. |
| Coste por servidor o por pod | El precio de una unidad de capacidad. | Para comparar familias de instancia o modalidades de compra. | Cuántos pods hacen falta por operación. Bajar el precio del pod y necesitar el doble no es un ahorro. |
| Coste por petición recibida | El coste medio de aceptar tráfico. | Para dimensionar el borde y detectar tráfico basura o abusivo. | La diferencia entre tráfico que produce valor y tráfico que solo consume capacidad. |
| Coste por operación completada | El coste de terminar el trabajo técnico. | Para servicios donde completar equivale a acertar: consultas, escrituras, lecturas. | La calidad. Una operación puede completarse con éxito técnico y producir un resultado inservible. |
| Coste por resultado útil | El coste de producir algo que el negocio acepta. | Para cualquier flujo con calidad variable: IA generativa, extracción documental, clasificación, decisión automatizada. | Nada relevante para la decisión económica. Es el denominador que hay que defender. |
| Coste por usuario activo | La intensidad de uso por persona. | Para modelos de precio por asiento y para detectar clientes fuera de patrón. | La dispersión. La media por usuario oculta que un percentil alto de usuarios consume un múltiplo del resto. |
| Coste por cliente o tenant | El margen real de cada contrato. | Para renovaciones, descuentos por volumen y decisiones de cartera. | Nada, si el reparto de coste compartido está documentado. Todo, si el reparto es implícito. |
| Coste por documento o unidad de trabajo | El coste de la unidad que el cliente reconoce. | Cuando el contrato se factura por esa unidad: documentos, expedientes, informes. | Los reprocesos. Un documento reprocesado tres veces se factura una vez y cuesta tres. |
Coste fijo, variable, escalonado y de fallo
Antes de intentar reducir un coste conviene saber a qué responde. Un plan de ahorro que ataca la naturaleza equivocada consume trimestres y produce diferencias que se pierden en el ruido de la factura.
| Naturaleza | Ejemplos habituales | Cómo se reduce | Error frecuente |
|---|---|---|---|
| Variable | Tokens de entrada y salida, invocaciones sin servidor, peticiones a almacenamiento de objetos, transferencia de datos, operaciones de base de datos facturadas por unidad de consumo. | Reduciendo el consumo por operación: contexto más corto, menos llamadas, caché, formatos más compactos. | Atacarlo con capacidad reservada, que no lo toca. |
| Fijo dentro de un rango | Réplicas mínimas, clústeres de base de datos, capacidad reservada, entornos preproductivos, pasarelas, licencias, retención de telemetría. | Cambiando la topología o el compromiso de capacidad: consolidar entornos, ajustar mínimos, revisar el modelo de compra. | Atacarlo optimizando código, que no lo mueve mientras la topología no cambie. |
| Escalonado | Nodos del clúster, particiones de un flujo de eventos, réplicas de lectura, tramos de límite de tasa contratados. | Encajando la carga dentro del escalón actual antes de saltar al siguiente. | Presentarlo como lineal. Un 5 % más de tráfico puede costar un escalón entero. |
| Coste de fallo | Trabajo consumido por peticiones abandonadas, reintentos, colas de mensajes fallidos, reprocesos manuales. | Reduciendo la tasa de fallo o abortando antes: timeouts ajustados, validación temprana, descarga de carga. | No medirlo. Está repartido en todas las partidas y no aparece como línea propia en ninguna factura. |
Del recurso facturado al resultado de negocio
Diagrama por capas: Factura (Cómputo, Datos, Red, Gestionados); Atribución (Por servicio, Por entorno, Por cliente, Compartido); Operación (Operación de negocio, Resultado, Intentos, Consumo IA); Negocio (Resultado útil, Coste unitario, Margen)
Capítulo 02. Latencia: por qué el p50 engaña y el p95, p98 y p99 deciden la experiencia
El promedio describe un sistema idealizado. Las colas y los percentiles describen la experiencia real, y son los únicos que se pueden convertir en un compromiso defendible.
La latencia media no debe usarse para fijar objetivos por una razón estructural: es insensible a la cola. Un sistema puede degradarse de forma severa para el dos por ciento de las peticiones sin que la media se mueva de forma perceptible, porque ese dos por ciento apenas pesa en el cálculo. El cliente, en cambio, no experimenta la media: experimenta su petición. Y si esa petición cae en la cola, la media que aparece en el panel es irrelevante para él.
Los percentiles resuelven ese problema porque responden directamente a la pregunta de negocio: qué fracción de las peticiones quedó por debajo del umbral que el cliente tolera. Esa frase es, literalmente, la definición de un objetivo de nivel de servicio de latencia.
| Percentil | Qué describe | Quién domina esa zona de la distribución | Qué decisión soporta |
|---|---|---|---|
| p50 | La petición típica cuando nada raro ocurre. | El camino feliz: caché caliente, conexión reutilizada, sin contención. | Casi ninguna. Sirve para detectar regresiones de código, no para fijar compromisos. |
| p95 | El comportamiento del sistema bajo su carga habitual. | Contención normal: espera en cola, competencia por conexiones, variabilidad de la base de datos. | Dimensionar capacidad para el día a día y detectar saturación incipiente. |
| p98 | La frontera entre lo normal y lo excepcional. | Mezcla de contención y eventos discretos: primera aparición de pausas de recolección y reintentos. | Compromisos contractuales en procesos de negocio críticos con volumen medio. |
| p99 | La experiencia del uno por ciento peor atendido. | Eventos discretos: recolección mayor, cold start, renovación de conexión, límite de tasa, reintento. | Objetivos de nivel de servicio en APIs de alto volumen y detección de fallos sistémicos. |
| p99.9 | La cola extrema. En alto volumen, miles de peticiones al día. | Fallos de infraestructura, conmutación de nodo, degradación de una zona. | Diseño de redundancia y de timeouts del cliente. |
| máximo | Un único evento, a menudo irrepetible. | Cualquier cosa. Es la métrica menos estable de todas. | Ninguna por sí sola. Útil como disparador de investigación, nunca como objetivo. |
Cómo elegir el percentil: por volumen, no por costumbre
La elección del percentil debe hacerse por el número absoluto de peticiones afectadas, no por convención. La aritmética es trivial y casi nunca se hace: multiplica el volumen diario por uno menos el percentil y comprueba si el número resultante te importa.
| Volumen diario | Peticiones fuera del p95 | Fuera del p98 | Fuera del p99 | Fuera del p99.9 |
|---|---|---|---|---|
| 1.000 | 50 | 20 | 10 | 1 |
| 10.000 | 500 | 200 | 100 | 10 |
| 100.000 | 5.000 | 2.000 | 1.000 | 100 |
| 1.000.000 | 50.000 | 20.000 | 10.000 | 1.000 |
De ahí salen dos reglas prácticas. En alto volumen, el percentil útil es alto —p99 o p99.9— porque los percentiles bajos describen a poblaciones demasiado grandes para ser tolerables. En bajo volumen con alta criticidad —procesos de negocio donde cada operación tiene valor unitario elevado— el p98 suele ser más representativo que el p99, porque el p99 puede corresponder a un puñado de ejecuciones al mes y su valor oscila de forma errática entre periodos.
La tercera regla es la más importante y no aparece en la tabla: mide siempre al menos dos percentiles. El valor absoluto de uno solo dice poco; la distancia entre dos dice mucho. Un p95 estable con un p99 que se aleja indica que la cola está creciendo por eventos discretos, y eso es un diagnóstico, no una alarma genérica.
Latencia de servicio y latencia extremo a extremo
Dos cronómetros distintos
Comparación entre Latencia de servicio y Latencia extremo a extremo
Latencia de servicio
- Empieza cuando el proceso empieza a atender la petición.
- No incluye la espera en cola de aceptación ni el tiempo en el balanceador.
- Es la que publica por defecto la instrumentación del servidor.
- Mejora automáticamente cuando el sistema rechaza tráfico.
- Responde a
- ¿Es rápido mi código?
- Riesgo
- Omisión coordinada
Latencia extremo a extremo
- Empieza cuando el cliente emite la petición.
- Incluye resolución de nombres, conexión, cola, reintentos y respuesta.
- Exige instrumentar el borde o el cliente, no solo el servicio.
- Es la única que se corresponde con lo que el cliente percibe.
- Responde a
- ¿Es rápido mi producto?
- Riesgo
- Requiere trazas distribuidas
Cuando un sistema está saturado, la mayor parte de la espera ocurre antes de que arranque el cronómetro del servicio. Es entonces cuando ambas cifras divergen más, que es justo cuando más importa la diferencia.
Por qué la utilización alta destruye la latencia
Hay una relación que explica la mayoría de los desastres de rendimiento derivados de una optimización de costes: el tiempo de espera crece de forma no lineal con la utilización. Para el modelo de colas más simple —llegadas de Poisson, un servidor, tiempos de servicio exponenciales— el tiempo total en el sistema es el tiempo de servicio dividido por uno menos la utilización.
| Utilización ρ | Tiempo total en el sistema | De ello, espera en cola | Lectura operativa |
|---|---|---|---|
| 50 % | 2,00 × S | 1,00 × S | La mitad del tiempo de respuesta ya es espera, no trabajo. |
| 70 % | 3,33 × S | 2,33 × S | Zona habitual de operación cómoda. |
| 80 % | 5,00 × S | 4,00 × S | Aquí es donde suelen fijarse los disparadores de autoescalado por CPU. |
| 90 % | 10,00 × S | 9,00 × S | Diez veces el tiempo de servicio. El sistema «funciona» y el cliente ya se ha ido. |
| 95 % | 20,00 × S | 19,00 × S | Cualquier micro-pico produce timeouts en cascada. |
| 99 % | 100,00 × S | 99,00 × S | Utilización «óptima» según una hoja de cálculo de costes. Inoperable. |
Dos consecuencias que conviene tener presentes al negociar un objetivo de ahorro. La primera: la capacidad ociosa no es desperdicio, es el precio del percentil. Pasar de un 70 % a un 90 % de utilización parece un ahorro de un tercio de la infraestructura y triplica el tiempo de respuesta. La segunda: en este mismo modelo el tiempo de respuesta se distribuye de forma exponencial, de modo que el p99 está en torno a 4,6 veces la media. Un panel que muestre la media en verde y una alerta de p99 disparada no es una contradicción: es lo que predice la teoría.
El percentil de un flujo no se deduce del percentil de sus partes
Esta es la parte del capítulo que más decisiones equivocadas evita. Si una operación de negocio atraviesa varias dependencias y todas deben completarse para devolver la respuesta, la probabilidad de que la petición evite todas las colas es el producto de las probabilidades individuales. Bajo supuesto de independencia, con cada servicio cumpliendo su p99, la fracción de peticiones que superan algún umbral crece con el número de saltos.
| Dependencias en serie | Probabilidad de evitar todas las colas | Peticiones que superan algún p99 | Efecto |
|---|---|---|---|
| 1 | 99,00 % | 1,00 % | El p99 del flujo coincide con el del servicio. |
| 3 | 97,03 % | 2,97 % | El flujo ya incumple tres veces más que cualquiera de sus partes. |
| 5 | 95,10 % | 4,90 % | El p99 del flujo se parece más al p95 de cada servicio. |
| 10 | 90,44 % | 9,56 % | Casi una de cada diez peticiones toca al menos una cola. |
| 20 | 81,79 % | 18,21 % | El objetivo de nivel de servicio del flujo es inalcanzable sin cambiar el diseño. |
| 50 | 60,50 % | 39,50 % | Todos los servicios cumplen su objetivo y el flujo falla en cuatro de cada diez peticiones. |
Dónde se acumula la cola de una operación de negocio
Diagrama de flujo: Solicitud del cliente → Cola de aceptación → Servicio Java / Spring Boot → Dependencia AWS o LLM → Reintento o fallback → Resultado de negocio
- Solicitud del cliente Arranca el cronómetro que importa
- Cola de aceptación Backlog del socket, cola del servidor, espera de hilo
- Servicio Java / Spring Boot Aquí empieza a contar la métrica del servidor
- Dependencia AWS o LLM Base de datos, cola, servicio de inferencia
- Reintento o fallback Suma un timeout completo a la cola
- Resultado de negocio Aceptado, rechazado o pendiente de revisión
Qué produce la cola
Cuando un percentil alto se degrada, el diagnóstico útil no es «el sistema está lento». Es identificar cuál de los mecanismos discretos ha empezado a dispararse. La tabla siguiente ordena las causas más frecuentes en plataformas Java sobre Kubernetes con dependencias gestionadas.
| Causa de cola | Dónde se origina | Percentil que afecta primero | Señal que la delata |
|---|---|---|---|
| Espera en cola | Antes de que el servicio empiece a medir. | p95 | El percentil del cliente se separa del percentil del servidor. |
| Pausas de recolección de basura | JVM. Recolección mayor o fases no concurrentes. | p99 | Escalones en la latencia correlacionados con eventos de GC y con el uso del heap. |
| Agotamiento del pool de conexiones | HikariCP, cliente HTTP, pool de la base de datos. | p95 → p99 | Tiempo de espera de adquisición de conexión creciente con el pool al máximo. |
| Cold start | Funciones sin servidor, nuevas réplicas, clases no compiladas todavía por el JIT. | p99 | Picos tras cada despliegue o tras cada evento de escalado. |
| Límite de tasa de una dependencia | Proveedor externo, API interna, servicio de inferencia. | p98 → p99 | Respuestas de rechazo por exceso de tasa y latencia en escalones planos. |
| Reintentos | Cliente, malla de servicios o lógica de la aplicación. | p99 | La cola se desplaza en múltiplos del timeout configurado. |
| Latencia variable del modelo | Servicio de inferencia. Depende de la longitud de la salida. | p95 → p99.9 | Correlación entre tokens de salida y duración de la llamada. |
| Vecino ruidoso | Nodo compartido, disco compartido, red compartida. | p99 | Cola concentrada en un subconjunto de réplicas o de nodos. |
Efecto de un reintento sobre la cola, con un timeout de 2 s
Ejemplo ilustrativoValores elegidos para mostrar la forma del efecto, no medidos. Supone un servicio con p50 de 400 ms, un timeout de 2.000 ms y un único reintento permitido.
SLI, SLO, presupuesto de error y coste
Un indicador de nivel de servicio es la medición: la fracción de operaciones que cumplen un criterio. Un objetivo de nivel de servicio es el umbral que esa fracción debe alcanzar en una ventana. El presupuesto de error es lo que queda: si el objetivo es que el 99 % de las operaciones se completen en menos de un segundo, el presupuesto es el 1 % restante, y es una cantidad consumible.
La utilidad económica del presupuesto de error es que convierte la fiabilidad en una negociación explícita. Sin él, la discusión sobre si merece la pena pagar más capacidad se resuelve por intuición o por jerarquía. Con él, se puede formular en términos comparables: cuánta capacidad adicional cuesta el siguiente tramo de fiabilidad y cuánto valor protege ese tramo.
Y la relación con el coste es la que ya muestra la tabla de colas: subir el objetivo no cuesta lo mismo en cada tramo. Pasar del 99 % al 99,9 % exige más capacidad ociosa, más redundancia y menos margen de reintento que pasar del 95 % al 99 %. Un objetivo de nivel de servicio es, en su forma más honesta, una decisión de gasto disfrazada de decisión técnica. Conviene tomarla con esa conciencia y con la persona que aprueba el presupuesto en la sala.
Capítulo 03. Coste AWS: cómo asignar infraestructura a petición, cliente y producto
El cálculo no es difícil. Lo difícil es la atribución, y la mayoría de los intentos se abandonan justo ahí, en el momento en que aparece el primer recurso compartido.
El coste AWS por resultado de negocio se calcula sumando todo lo que el flujo consume —incluido lo que consume sin producir nada— y dividiendo por los resultados aceptados en el mismo intervalo. Este capítulo no contiene ningún precio: los precios de AWS varían por región, por familia de recurso y por modalidad de compra, y deben tomarse de AWS Pricing y de la factura propia en el momento del cálculo. Lo que sí contiene es la hoja completa, con cada variable nombrada y su origen declarado.
# ─────────────────────────────────────────────────────────────
# HOJA DE CÁLCULO · COSTE AWS POR RESULTADO DE NEGOCIO
# Todas las variables se instancian con la factura y la
# telemetría propias. Ninguna lleva valor por defecto: un valor
# por defecto es una invitación a no medir.
# ─────────────────────────────────────────────────────────────
# --- 1. Coste directamente atribuible al servicio ------------
C_computo = horas_computo * precio_hora_computo
C_almacen = GB_mes_almacenados * precio_GB_mes
C_datos = GB_transferidos * precio_GB_transferido
C_bbdd = unidades_consumidas * precio_unidad
C_mensajeria = mensajes_procesados * precio_mensaje
C_gestionados = invocaciones * precio_invocacion
C_inferencia = (ver capítulo 4: tokens, caché, embeddings)
C_directo = C_computo + C_almacen + C_datos
+ C_bbdd + C_mensajeria + C_gestionados + C_inferencia
# --- 2. Coste compartido, con clave de reparto explícita -----
# clave ∈ { peticiones, tokens, segundos_cpu, GB_almacenados }
reparto = clave_del_servicio / clave_total_del_perimetro
C_compartido = (C_plano_control + C_balanceo + C_red_interna
+ C_bbdd_multicliente + C_seguridad) * reparto
# --- 3. Observabilidad: parte del servicio, no gasto externo -
C_observabilidad = C_ingesta_metricas + C_ingesta_trazas
+ C_ingesta_logs + C_retencion
+ C_consultas_y_paneles
# --- 4. Capacidad que se paga y no se usa --------------------
C_ocioso = capacidad_reservada_no_usada * precio_unidad
C_redundancia = replicas_de_seguridad * precio_unidad
C_precalentado = capacidad_para_absorber_picos * precio_unidad
# --- 5. Trabajo que consumió recursos y no produjo nada ------
C_fallido = (peticiones_rechazadas
+ peticiones_abandonadas
+ intentos_descartados) * coste_medio_por_intento
# --- 6. Numerador y denominador ------------------------------
NUMERADOR = C_directo + C_compartido + C_observabilidad
+ C_ocioso + C_redundancia + C_precalentado
+ C_fallido
DENOMINADOR = resultados_aceptados_en_el_mismo_intervalo
coste_por_resultado = NUMERADOR / DENOMINADOR Las variables y de dónde sale cada una
| Variable | Origen del dato | Clasificación | Trampa habitual |
|---|---|---|---|
| precio_hora_computo | AWS Pricing y la modalidad de compra contratada. Varía por región, familia de instancia y compromiso. | Dato oficial | Usar el precio bajo demanda cuando la capacidad está reservada, o al revés. |
| horas_computo | Informe detallado de uso y costes (CUR) o datos de reparto por pod cuando el clúster los publica. | Medido | Contar horas de nodo en lugar de horas de pod: atribuye al servicio la capacidad ociosa del nodo. |
| GB_transferidos | CUR y métricas de red del balanceador o del servicio. | Medido | Olvidar la transferencia entre zonas de disponibilidad, que en arquitecturas replicadas no es marginal. |
| reparto | Decisión de la organización, documentada junto a la cifra. | Modelado | No documentarla. Un reparto implícito no sobrevive a la primera revisión de precios. |
| C_observabilidad | Factura de la plataforma de telemetría más el coste del backend propio si lo hay. | Medido | Dejarlo fuera del numerador y gestionarlo como partida independiente. |
| capacidad_reservada_no_usada | Diferencia entre capacidad aprovisionada y capacidad efectivamente consumida en la ventana. | Medido | Interpretarlo como desperdicio. Parte es el precio del percentil objetivo (capítulo 2). |
| coste_medio_por_intento | Numerador directo dividido por intentos totales, incluidos los descartados. | Modelado | Asumir que un intento fallido cuesta lo mismo que uno con éxito. Suele costar menos si aborta pronto y más si agota el timeout. |
| resultados_aceptados | Telemetría de aplicación con el atributo de resultado de negocio. | Medido | Usar peticiones con código 200 como sustituto. Un 200 con contenido inservible es numerador, no denominador. |
Qué mecanismos de AWS resuelven la atribución y cuáles no
La atribución tiene dos mitades. La primera —recursos dedicados a un servicio— la resuelven las etiquetas de asignación de costes y el informe detallado de uso. La segunda —recursos compartidos— no la resuelve ninguna herramienta, porque no es un problema de datos sino de criterio: hay que decidir cómo se reparte y asumir la decisión.
| Mecanismo | Qué resuelve | Límite que conviene conocer |
|---|---|---|
| Etiquetas de asignación de costes | Atribuir recursos etiquetables a servicio, entorno, equipo o cliente. | Solo funcionan si la etiqueta se aplica en el aprovisionamiento. Etiquetar a posteriori no reescribe el histórico, y hay recursos que no admiten etiqueta. |
| Informe de uso y costes (CUR) | Detalle por línea, por hora y por recurso. Es la fuente de verdad para cualquier cálculo unitario. | Su granularidad y su volumen exigen un almacén y consultas propias. No es un panel: es un conjunto de datos. |
| Categorías de coste | Agrupar líneas de factura en dimensiones de negocio sin tocar las etiquetas de los recursos. | Es una capa de presentación sobre reglas. Si las reglas no se documentan, reproduce el problema del reparto implícito. |
| Reparto de coste por contenedor | Atribuir el coste de un nodo a los pods que se ejecutan en él, según petición y uso de recursos. | Requiere que el clúster publique esos datos. La parte no atribuible del nodo —capacidad libre, sobrecarga del sistema— sigue siendo coste compartido. |
| Herramientas de coste de Kubernetes | Coste por espacio de nombres, despliegue o etiqueta, en tiempo casi real. | Trabajan con precios de lista o con los que se les configure. Si hay descuentos por compromiso, hay que conciliarlos con la factura real. |
| Presupuestos y anomalías | Detección de desviaciones sobre un patrón esperado. | Detectan cambios en el numerador. No ven el denominador, así que no distinguen crecimiento del negocio de pérdida de eficiencia. |
Los cuatro costes que casi nunca están en el cálculo
Cuando una organización calcula por primera vez su coste por operación, el número suele salir bajo. La razón es casi siempre la misma: faltan cuatro partidas que no aparecen como línea propia en ninguna factura.
- El coste de los picos. Una plataforma que atiende un pico diario de tres veces la media no puede dimensionarse a la media. La capacidad que existe para absorber ese pico se paga las veinticuatro horas y solo se usa unas pocas. Esa diferencia no es ineficiencia: es el precio de no fallar en la hora que más factura. Pero debe estar en el numerador y hay que poder cuantificarla, porque es la primera partida que alguien propondrá recortar.
- La capacidad ociosa y la redundancia. Réplicas mínimas en varias zonas, nodos de reserva, réplicas de lectura que solo sirven para conmutar. Es capacidad que existe para un escenario que —con suerte— no ocurre. Sacarla del cálculo hace que el coste unitario parezca mejor de lo que es y facilita que se elimine sin evaluar el riesgo que cubría.
- El coste del trabajo fallido. Peticiones rechazadas, abandonadas por timeout, reintentos descartados y mensajes que acaban en la cola de fallidos. Todas consumieron cómputo, conexiones, consultas y, en flujos con IA, tokens. Ninguna suma al denominador. Una tasa de fallo aparentemente pequeña puede tener un efecto desproporcionado sobre el coste unitario cuando el fallo llega tarde en el flujo, después de haber consumido lo caro.
- La observabilidad. Ingesta de métricas, trazas y registros, retención y consultas. Es la partida que más a menudo se gestiona por separado, y la que peor sobrevive a un recorte lineal, porque cuando se reduce se pierde precisamente la capacidad de justificar el resto de decisiones.
La telemetría que hace posible el cálculo
Todo lo anterior depende de que la telemetría lleve las etiquetas necesarias para agrupar por la dimensión en la que se toma la decisión. La lista siguiente separa de forma deliberada los atributos que provienen de una convención estándar de los que cada organización tiene que definir.
| Atributo | Para qué es imprescindible | Dónde se fija |
|---|---|---|
| cloud.provider | Separar costes en escenarios multinube o híbridos. | Atributos de recurso del SDK de telemetría. |
| cloud.region | Los precios y la latencia varían por región. Sin este atributo no se pueden comparar dos despliegues. | Atributos de recurso. |
| service.name | Unidad mínima de atribución. Debe coincidir con la etiqueta de asignación de costes del recurso. | Atributos de recurso. |
| deployment.environment | Excluir preproducción del cálculo unitario de producción, y medirla aparte como coste fijo. | Atributos de recurso. |
| tenant.id | Coste y margen por cliente. Es el atributo que convierte un panel técnico en una herramienta comercial. | Atributo propio de la organización. No es una convención estándar: hay que definirlo y documentarlo. |
| business.operation | Denominador del coste unitario. Sin él solo hay coste por petición HTTP, que no es una unidad de negocio. | Atributo propio. Debe tener cardinalidad controlada: es una taxonomía de operaciones, no un identificador. |
| request.outcome | Separar numerador de denominador. Distingue aceptado, completado sin aceptar, reintentado y abandonado. | Atributo propio, con un conjunto cerrado de valores. |
| aws.cost.allocation | Puente entre la telemetría y la línea de factura. Debe replicar el valor de la etiqueta de asignación. | Atributo propio. Su valor tiene que ser idéntico al de la etiqueta del recurso o el cruce no une nada. |
| gen_ai.request.model | Coste por modelo y comparación entre modelos sobre la misma operación. | Convenciones semánticas de IA generativa de OpenTelemetry. |
| gen_ai.usage.input_tokens | Coste de contexto por operación. | Convenciones semánticas de IA generativa. |
| gen_ai.usage.output_tokens | Coste de producción por operación. | Convenciones semánticas de IA generativa. |
De la factura a la decisión comercial
Diagrama de flujo: Informe de uso y costes → Telemetría de aplicación → Coste por operación → Coste y margen por cliente → Decisión comercial
- Informe de uso y costes Detalle por hora, recurso y etiqueta
- Telemetría de aplicación Operación, resultado, cliente, tokens, intentos
- Coste por operación Numerador completo / resultados aceptados
- Coste y margen por cliente Contra el precio contratado de cada uno
- Decisión comercial Precio, renovación, límites de uso, inversión
Capítulo 04. Tokens de IA: coste por tarea útil, no coste por millón de tokens
El precio por millón de tokens es un precio de insumo. Comparar modelos con él equivale a comparar dos fábricas por el precio de la materia prima, sin mirar cuánta desperdicia cada una.
El coste de una funcionalidad de IA generativa se mide como coste por tarea completada con la calidad mínima aceptada. No como coste por llamada, ni como coste por token, ni como precio de catálogo del modelo. La diferencia entre esas magnitudes no es un matiz contable: es lo que permite que un cambio de modelo baje el gasto en tokens y suba el coste total.
Coste por tarea útil
=
( tokens_entrada * precio_entrada
+ tokens_salida * precio_salida
+ tokens_razonamiento * precio_razonamiento
+ tokens_cache_escritos * precio_escritura_cache
+ tokens_cache_leidos * precio_lectura_cache
+ tokens_embedding * precio_embedding
+ consultas_vectoriales * coste_consulta_vectorial
+ llamadas_herramienta * coste_herramienta
+ C_orquestacion # cómputo, cola, almacenamiento del flujo
+ C_reintentos # todo lo anterior, por cada intento descartado
+ C_supervision_humana )
/
tareas_completadas_con_la_calidad_minima_aceptada
# Los precios unitarios se toman de la documentación vigente del
# proveedor. Cambian, varían por modalidad de servicio y por región,
# y no se publican aquí a propósito. Por qué el precio por millón de tokens no basta
Para que el precio unitario fuera comparable entre dos modelos tendrían que cumplirse tres condiciones simultáneas: que consumieran los mismos tokens de entrada, que produjeran los mismos tokens de salida y que acertaran con la misma frecuencia. Ninguna se cumple, y las tres se pueden medir.
| Partida | Por qué se escapa del cálculo | Cómo se hace visible |
|---|---|---|
| Contexto recuperado en RAG | El equipo optimiza el prompt del sistema, que se lee en la revisión de código. El contexto recuperado no se lee: lo inyecta el recuperador en tiempo de ejecución y suele ser un múltiplo del prompt. | Registrar tokens de entrada desglosados por origen: instrucciones, contexto recuperado, historial de conversación y entrada del usuario. |
| Historial de conversación | En un copiloto, la conversación crece turno a turno y el coste de entrada crece con ella de forma cuadrática si no se trunca. | Medir tokens de entrada por turno y no solo por conversación. La curva delata el problema en el segundo o tercer turno. |
| Embeddings de indexación | Se pagan una vez al indexar y se contabilizan como proyecto, no como coste operativo. Pero la reindexación es recurrente. | Amortizar el coste de indexación sobre las consultas del periodo, y medir aparte la frecuencia de reindexación completa. |
| Llamadas a herramientas | Cada invocación de herramienta añade una ronda completa: la petición del modelo, la ejecución y una nueva llamada con el resultado en el contexto. | Contar rondas por tarea, no llamadas al modelo. Una tarea con tres herramientas puede costar cuatro veces lo esperado. |
| Tokens de razonamiento | Algunos modelos facturan tokens intermedios que no aparecen en la respuesta y por tanto no se ven al revisar la salida. | Leer el bloque de uso que devuelve la API, no estimar a partir del texto visible. |
| Reintentos por validación | El reintento vive dentro del cliente del proveedor o de la biblioteca de resiliencia, donde el contador de negocio no llega. | Instrumentar la tarea, no la llamada. El span de negocio registra cuántos intentos costó resolverla (capítulo 8). |
| Degradación a otro modelo | El fallback se activa en situaciones raras y su coste se diluye en el total. | Etiquetar cada intento con el modelo usado y contar las tareas resueltas por el modelo alternativo como una serie propia. |
| Moderación y trazabilidad | Filtros de contenido, evaluadores automáticos y registro de conversaciones para auditoría son llamadas adicionales que nadie atribuye a la tarea. | Incluirlas en el numerador como parte del coste de la tarea. Son requisitos, no extras. |
| Supervisión humana | No aparece en ninguna factura de nube. Es coste de personal. | Contar tareas que requirieron revisión y multiplicar por un coste por revisión acordado con negocio. Suele ser la partida dominante. |
La aritmética de los reintentos
Si un modelo resuelve una tarea con probabilidad p en cada intento y se permiten hasta tres intentos, el número esperado de intentos es la suma de la serie geométrica truncada, y la fracción de tareas que quedan sin resolver es (1 − p)³. De ahí sale un resultado que conviene tener presente: el coste por tarea resuelta es exactamente 1/p veces el coste de un intento, con independencia de cuántos reintentos se permitan. Los reintentos cambian cuántas tareas se resuelven, no lo que cuesta resolver cada una.
| Acierto por intento (p) | Intentos esperados (máx. 3) | Coste por tarea resuelta | Sin resolver tras 3 intentos |
|---|---|---|---|
| 95 % | 1,05 | 1,05 × | 0,01 % |
| 90 % | 1,11 | 1,11 × | 0,10 % |
| 80 % | 1,24 | 1,25 × | 0,80 % |
| 70 % | 1,39 | 1,43 × | 2,70 % |
| 60 % | 1,56 | 1,67 × | 6,40 % |
| 50 % | 1,75 | 2,00 × | 12,50 % |
Coste por tarea resuelta, con y sin coste de supervisión
Modelo reproducibleDerivado de los parámetros del bloque anterior: precio relativo 0,40 frente a 1,00; acierto por intento 55 % frente a 92 %; hasta tres intentos; coste de revisión humana H = 10 veces el coste de un intento premium.
Caché: cuándo compensa de verdad
Los mecanismos de caché de contexto suelen facturar la escritura del prefijo cacheado a una tarifa superior a la de entrada normal, y la lectura a una tarifa muy inferior. Llamando w al multiplicador de escritura, r al de lectura y h a la tasa de acierto, la caché compensa cuando h·r + (1 − h)·w < 1, lo que da un umbral de acierto mínimo de h* = (1 − w) / (r − w).
| Sobrecoste de escritura | Descuento de lectura | Acierto mínimo para que compense | Lectura |
|---|---|---|---|
| 1,25 × | 0,10 × | 21,7 % | Umbral bajo: casi cualquier prefijo estable compensa. |
| 1,25 × | 0,25 × | 25,0 % | Un descuento de lectura menor sube poco el umbral. |
| 2,00 × | 0,10 × | 52,6 % | Con escritura al doble hace falta reutilizar más de la mitad de las veces. |
| 2,00 × | 0,50 × | 66,7 % | Escritura cara y lectura poco descontada: la caché rara vez sale a cuenta. |
La consecuencia de diseño es concreta: para que la caché acierte, el prefijo tiene que ser estable y estar al principio. Un prompt que empieza con la fecha y hora actuales, con el identificador de sesión o con el nombre del usuario invalida la caché en cada petición y paga el sobrecoste de escritura siempre. Poner lo variable al final y lo estable al principio es un cambio de una línea con efecto directo sobre la factura.
Tres estrategias, ninguna ganadora universal
La comparación útil no es entre marcas de modelo —eso caduca en semanas— sino entre estrategias de uso. Cada una gana bajo condiciones que se pueden enunciar y medir.
| Estrategia | En qué consiste | Gana cuando… | Pierde cuando… | Métrica que decide |
|---|---|---|---|---|
| Modelo premium, menos reintentos | Un único modelo de alta capacidad, prompt corto, validación estructurada y presupuesto de un solo reintento. | El coste de un error es alto: revisión humana cara, decisión con consecuencia legal o comercial, salida que alimenta otro proceso automático. | El volumen es muy alto, la tarea es tolerante al error y no hay revisión humana detrás. | Coste de supervisión humana por tarea no resuelta. |
| Modelo equilibrado, RAG optimizado | Modelo intermedio con recuperación cuidada: menos fragmentos, mejor reordenación, contexto recortado y prefijo cacheable estable. | El contexto domina el coste de entrada y las consultas se repiten sobre un corpus estable. | El corpus cambia constantemente, la caché no acierta y el trabajo de recuperación no reduce tokens de forma apreciable. | Tokens de entrada por tarea y tasa de acierto de caché. |
| Modelo económico con fallback y validación | Modelo barato como primera opción, validación estricta de la salida y degradación a un modelo superior cuando la validación falla. | Existe una validación automática fiable y barata, y una fracción alta de las tareas es fácil. | La validación no distingue bien una salida mala de una buena, o la fracción de tareas difíciles es alta: entonces se paga dos modelos por tarea. | Tasa de acierto del primer modelo y precisión del validador. |
Dónde se acumula el coste de una tarea con IA generativa
Diagrama de flujo: Entrada del usuario → Recuperación (RAG) → Construcción del contexto → Llamada al modelo → Rondas de herramientas → Validación estructurada → Reintento o fallback → Tarea útil
- Entrada del usuario Casi siempre la parte más pequeña del contexto
- Recuperación (RAG) Embedding de consulta + búsqueda vectorial
- Construcción del contexto Instrucciones + fragmentos + historial
- Llamada al modelo Entrada, salida y posibles tokens de razonamiento
- Rondas de herramientas Cada una repite el contexto completo
- Validación estructurada Esquema, reglas de negocio, moderación
- Reintento o fallback Repite todo lo anterior con otro modelo o prompt
- Tarea útil Aceptada sin corrección humana
Capítulo 05. CPU, memoria y saturación: interpretar señales sin optimizar el indicador equivocado
La CPU no es un objetivo. Es una señal contextual que solo tiene significado junto a la latencia, la profundidad de cola y la ocupación de los recursos que de verdad limitan el sistema.
Una CPU baja no significa que el sistema sea eficiente, y una CPU alta no significa necesariamente que haya un problema. Ambas afirmaciones incomodan porque la CPU es la métrica más visible de cualquier panel y la más fácil de convertir en objetivo. Pero describe un solo recurso, y una petición puede estar esperando por cualquiera de una docena.
Dos tipos de carga, dos lecturas opuestas de la misma cifra
Comparación entre Carga dominada por procesador y Carga dominada por espera
Carga dominada por procesador
- El trabajo es cálculo: serialización, compresión, cifrado, transformación en memoria.
- La CPU sube de forma proporcional al tráfico.
- El autoescalado por CPU funciona razonablemente.
- La saturación se anuncia antes de que la latencia se degrade.
- Señal fiable
- Uso de CPU
- Techo
- Núcleos disponibles
Carga dominada por espera
- El trabajo es esperar: base de datos, servicios externos, colas, inferencia.
- La CPU permanece baja aunque el sistema esté completamente saturado.
- El autoescalado por CPU no reacciona hasta que ya es tarde.
- La saturación aparece primero en pools, hilos y profundidad de cola.
- Señal fiable
- Concurrencia en curso
- Techo
- Conexiones, hilos, cuota externa
Un flujo con IA generativa es el caso extremo de la columna derecha: la llamada al modelo puede dominar el tiempo de permanencia por completo, y durante toda esa espera la CPU del servicio Java está prácticamente ociosa.
Cómo leer la CPU
| Lectura de CPU | Interpretación ingenua | Qué puede estar pasando en realidad |
|---|---|---|
| 20 %, latencia estable | «Vamos sobrados, se puede recortar» | Puede ser cierto. También puede ser una carga dominada por espera donde el recurso escaso es otro y aún no se ha alcanzado. |
| 20 %, latencia degradada | «No es culpa nuestra, la CPU está bien» | Saturación en otro recurso: pool de conexiones, hilos, límite de tasa externo, bloqueo en base de datos, cola de mensajes. |
| 50 %, latencia estable | «Correcto» | Correcto. Es la zona donde la teoría de colas todavía deja margen para absorber variabilidad. |
| 85 %, latencia estable | «Alerta, hay que escalar» | Puede ser un sistema bien aprovechado con carga homogénea. Comprueba antes si hay restricción del planificador y cuánto margen queda para un pico. |
| 85 %, latencia degradada | «Alerta, hay que escalar» | Aquí sí. La utilización alta y la cola creciente coinciden: es el caso que la teoría de colas predice. |
| 40 % medio, con restricción | «La CPU está bien» | El contenedor está siendo restringido por cuota. El promedio diluye los periodos restringidos y la latencia sube en escalones. |
La saturación vive en otros sitios
| Recurso | Señal de saturación | Métrica concreta | Consecuencia si se ignora |
|---|---|---|---|
| CPU con límite | Tiempo restringido por el planificador. | container_cpu_cfs_throttled_seconds_total | Latencia en escalones que ninguna métrica de uso medio explica. |
| Pool de conexiones JDBC | Tiempo de espera para adquirir conexión y conexiones pendientes. | hikaricp.connections.acquire · hikaricp.connections.pending | El servicio parece lento sin que la base de datos lo esté. La cola está en el pool. |
| Cliente HTTP | Conexiones en uso frente a máximo del pool y esperas de adquisición. | Métricas del pool del cliente HTTP | Una dependencia lenta bloquea llamadas a dependencias que están sanas. |
| Hilos de la aplicación | Hilos activos frente a máximo configurado y cola de tareas pendientes. | executor.active · executor.queued | La cola crece antes que la CPU. Es el caso clásico de saturación invisible. |
| Límite de tasa externo | Respuestas de rechazo por exceso de tasa y reintentos derivados. | Contador propio por dependencia y por código de respuesta | Añadir réplicas empeora el problema: más clientes compitiendo por la misma cuota. |
| Memoria y recolección | Fracción de tiempo en pausa y frecuencia de recolecciones mayores. | jvm.gc.pause · jvm.memory.used | Cola de latencia en p99 que se atribuye erróneamente a la red o a la base de datos. |
| Almacenamiento | Profundidad de cola de disco y latencia de operación. | Métricas del volumen o del servicio gestionado | Escrituras que se acumulan y disparan tiempos de espera aguas arriba. |
Memoria: el uso importa menos que la presión
La métrica de memoria que se lleva a los paneles es casi siempre el uso, y es la menos informativa. Una JVM con el heap al 80 % puede estar perfectamente sana, y una con el 50 % puede estar dedicando una fracción significativa del tiempo a recolectar. Lo que importa es la presión: cuántas recolecciones ocurren, cuánto duran y qué proporción del tiempo total consumen.
La conexión con el resto del artículo es directa. Las pausas de recolección son eventos discretos que no afectan a la media y sí a la cola, de modo que aparecen en el p99 y no en el p50. Y como el capítulo 2 ha mostrado que el percentil de un flujo se degrada con cada dependencia, una pausa que en un servicio aislado sería tolerable se multiplica en un flujo con varios saltos.
Hay además un efecto económico que rara vez se atribuye a la memoria. Sobredimensionar el heap reduce la frecuencia de recolección y aumenta la memoria reservada por réplica, lo que reduce cuántas réplicas caben por nodo y sube el coste por operación. Infradimensionarlo hace lo contrario y degrada el percentil. La elección correcta no se deduce del uso medio: se deduce del percentil objetivo y del coste por réplica, que son las dos variables del capítulo 6.
La ley de Little: por qué la latencia encarece la infraestructura
La ley de Little establece que, en un sistema estable, el número medio de elementos en el sistema es igual a la tasa media de llegada multiplicada por el tiempo medio de permanencia. Es una identidad, no un modelo: no supone nada sobre la distribución de llegadas ni sobre la política de servicio. Y su consecuencia práctica es la relación más importante entre rendimiento y coste que existe.
# ─────────────────────────────────────────────────────────────
# LEY DE LITTLE APLICADA A CAPACIDAD
# L = λ × W
# L = peticiones simultáneamente en el sistema
# λ = tasa media de llegada (peticiones por segundo)
# W = tiempo medio de permanencia (segundos)
#
# Válida para cualquier sistema estable, sin supuestos sobre la
# distribución de llegadas ni de servicio. Es una identidad, no
# un modelo: si el sistema es estable, se cumple.
# ─────────────────────────────────────────────────────────────
# Ejemplo (ilustrativo): λ = 200 req/s, W = 0,25 s
L = 200 × 0,25 = 50 peticiones en curso
# Una dependencia añade 250 ms al tiempo de permanencia.
# El tráfico NO cambia.
L = 200 × 0,50 = 100 peticiones en curso # ×2
# Cada réplica sostiene 50 peticiones en curso sin degradar:
replicas = ceil(L / 50) # 1 → 2
# Conclusión: el coste de infraestructura se ha duplicado sin
# atender ni una petición más. La causa está fuera del servicio
# y la factura está dentro. | Tiempo de permanencia W | Peticiones en curso L | Réplicas necesarias | Qué ha cambiado en el negocio |
|---|---|---|---|
| 0,25 s | 50 | 1 | Nada. Es la línea base. |
| 0,50 s | 100 | 2 | Nada. El doble de infraestructura para el mismo tráfico. |
| 1,00 s | 200 | 4 | Nada. Cuádruple coste, cero ingresos adicionales. |
| 2,00 s | 400 | 8 | Nada. Y a esta altura el percentil ya incumple el objetivo. |
Réplicas necesarias para el mismo tráfico, según el tiempo de permanencia
Modelo reproducibleDerivado de L = λ × W con λ = 200 req/s y un supuesto ilustrativo de 50 peticiones en curso sostenibles por réplica. La aritmética es exacta; los dos parámetros son declarados, no medidos.
Cuándo falla el autoescalado por CPU
El autoescalado horizontal basado en CPU es un buen valor por defecto y una mala política universal. Falla de forma predecible en tres escenarios, todos ellos comunes en plataformas con IA generativa.
- Cargas dominadas por espera. La CPU no sube aunque la cola crezca, así que el escalador no reacciona hasta que la latencia ya se ha degradado y el percentil ya ha incumplido. Cuando por fin reacciona, las réplicas nuevas tardan en estar listas y llegan tarde al pico.
- Límites de tasa externos. Si el cuello de botella es la cuota de una dependencia, añadir réplicas no aumenta la capacidad real: multiplica el número de clientes que compiten por la misma cuota y sube la tasa de rechazo. Se paga más infraestructura para obtener más errores.
- Arranques costosos. Una aplicación Java con arranque lento y calentamiento del compilador tarda en ser útil. Un escalador agresivo puede añadir réplicas que degradan el percentil mientras arrancan, en el peor momento posible.
La alternativa no es dejar de escalar: es escalar por una señal que represente la ocupación del recurso escaso. En cargas dominadas por espera, esa señal suele ser la concurrencia en curso o la profundidad de cola, ambas directamente relacionadas con L en la ley de Little. En flujos con límites de tasa, la política correcta puede no ser escalar sino descargar carga de forma controlada, rechazando pronto lo que no se va a poder atender, que es el fallo más barato posible según la máquina de estados del capítulo 1.
Las cuatro preguntas de un diagnóstico de saturación, en orden
Diagrama por capas: 1 · Síntoma (¿Qué percentil se ha degradado?, ¿Desde cuándo?); 2 · Recurso (CPU y restricción, Pools, Memoria, Externo); 3 · Capacidad (L = λ × W, Utilización); 4 · Decisión (Escalar, Reducir W, Descargar carga, No hacer nada)
Capítulo 06. El modelo económico: coste, calidad, latencia y capacidad en una misma ecuación
Las cuatro dimensiones no son independientes. Mejorar cualquiera de ellas mueve las otras tres, y la única forma de saber si el movimiento neto es favorable es escribir la ecuación completa.
Coste, calidad, latencia y capacidad se relacionan en una sola ecuación: el coste por resultado útil es un cociente en el que la infraestructura, la inferencia, la observabilidad y la supervisión humana forman el numerador, y los resultados que el negocio acepta forman el denominador. La latencia y la calidad no aparecen como sumandos: entran por el denominador, porque determinan cuántas operaciones llegan a completarse y cuántas se aceptan.
Los cinco capítulos anteriores han medido esas cuatro dimensiones por separado. Este las junta. La ecuación no es sofisticada —es un cociente— pero permite derivar un resultado que explica por qué la mayoría de los planes de ahorro producen poco efecto: la capacidad de una palanca para mover el coste unitario está acotada por su peso en el numerador, mientras que cualquier palanca del denominador tiene efecto pleno.
# ─────────────────────────────────────────────────────────────
# ECUACIÓN ÚNICA
# ─────────────────────────────────────────────────────────────
margen_unitario = precio_por_resultado − coste_por_resultado_util
coste_por_resultado_util = N / D
N = C_infra + C_ia + C_observabilidad
+ C_ocioso_y_redundancia + C_fallido + C_supervision
D = peticiones_entrantes
× (1 − tasa_de_abandono) # capítulo 2: latencia
× tasa_de_aceptacion # capítulo 4: calidad
# ─────────────────────────────────────────────────────────────
# ELASTICIDADES
# ─────────────────────────────────────────────────────────────
# Si una partida i pesa s_i en N, reducirla un δ reduce el coste
# unitario en s_i · δ. → elasticidad acotada por su peso.
#
# Si D crece un δ, el coste unitario baja en δ/(1+δ).
# → elasticidad ≈ 1, siempre.
#
# Corolario: ninguna palanca del numerador puede superar a la
# mejor palanca del denominador salvo que esa partida domine N. Qué mueve realmente el coste unitario
La tabla siguiente instancia la ecuación con un reparto de pesos ilustrativo. Los pesos concretos varían mucho entre plataformas —una con IA intensiva puede tener el cincuenta por ciento del numerador en inferencia— y hay que calcularlos con la factura propia. Lo que no varía es la estructura: las dos últimas filas superan a todas las anteriores.
| Palanca | Peso en el numerador | Efecto de mejorarla un 10 % | Efecto lateral que hay que comprobar |
|---|---|---|---|
| Palancas del numerador · elasticidad acotada por el peso | |||
| Precio unitario de cómputo | 30 % | −3,0 % | Ninguno si es un cambio de modalidad de compra. Si es reducir réplicas, revisa el percentil. |
| Consumo de tokens | 25 % | −2,5 % | Recortar contexto puede bajar la tasa de aceptación, que está en el denominador. |
| Almacenamiento y datos | 12 % | −1,2 % | Retención más corta puede impedir el cálculo de coste por cliente. |
| Coste compartido repartido | 10 % | −1,0 % | Suele reducirse consolidando entornos, no optimizando código. |
| Capacidad ociosa y redundancia | 9 % | −0,9 % | Es el precio del percentil y del riesgo. Recortarla mueve coste al denominador vía abandono. |
| Observabilidad | 8 % | −0,8 % | Recortarla elimina la capacidad de calcular esta misma tabla. |
| Trabajo fallido | 6 % | −0,6 % | Bueno de por sí: reducirlo suele mejorar también el denominador. |
| Palancas del denominador · elasticidad ≈ 1 | |||
| Tasa de aceptación | — | −9,1 % | Subirla suele exigir más tokens o mejor modelo. Comprueba el efecto neto. |
| Tasa de abandono | — | −9,1 % | Reducirla suele exigir más capacidad. Comprueba el efecto neto. |
Efecto sobre el coste por resultado útil de una mejora del 10 % en cada palanca
Modelo reproducibleDerivado de los pesos ilustrativos de la tabla anterior. Todas las barras representan reducción del coste unitario; se muestran en magnitud absoluta, de modo que más largo es mejor.
Las cuatro dimensiones tiran unas de otras
| Si optimizas… | Lo que suele ceder | Señal temprana | Cómo se controla |
|---|---|---|---|
| Coste | Latencia y capacidad de absorber picos. | El p98 se separa del p50 en las horas punta. | Fijar el objetivo de latencia antes del objetivo de ahorro, no después. |
| Latencia | Coste, y a veces calidad si se recorta contexto o se acortan timeouts. | La factura de cómputo crece más rápido que el volumen. | Expresar la mejora de latencia en coste por resultado, no en milisegundos. |
| Calidad | Coste y latencia: más contexto, modelo mayor, más validación. | Los tokens por tarea crecen sin que crezca el número de tareas. | Definir el umbral de calidad suficiente y no perseguir el máximo. |
| Capacidad | Coste, por capacidad reservada que casi nunca se usa. | La utilización media cae y el coste unitario sube fuera de picos. | Dimensionar por percentil de demanda, no por máximo histórico. |
Optimizar el numerador
Qué es. Reducir lo que cuesta cada intento: precio unitario, tokens, réplicas, retención, transferencia.
Ventajas. Efecto rápido y atribuible. No exige coordinación entre equipos. Se puede planificar y estimar con precisión razonable.
Techo. Conocido de antemano: el peso de la partida. Ninguna mejora puede superar ese límite, por buena que sea la ejecución.
Riesgo principal. Que la mejora se pague en el denominador sin que nadie lo mida: menos capacidad produce más abandono, menos contexto produce menos aceptación, menos observabilidad impide detectar ambas cosas.
Optimizar el denominador
Qué es. Aumentar los resultados aceptados con el mismo consumo: menos abandono, mayor tasa de aceptación, menos reprocesos.
Ventajas. Elasticidad plena. Además suele mejorar simultáneamente el ingreso, porque un resultado aceptado más es también una operación de negocio más.
Techo. El límite de calidad alcanzable con la tecnología disponible y el umbral que el negocio considera suficiente.
Riesgo principal. Que se persiga la calidad máxima en lugar de la suficiente, y que el coste de cada punto adicional de aceptación supere al valor que aporta. También hay rendimientos decrecientes aquí.
Cómo se propaga una decisión de ahorro por el modelo
Máquina de estados con 7 estados: Objetivo de ahorro, Menos capacidad, Ahorro real, Cola creciente, Percentil degradado, Abandono, Coste unitario al alza
Objetivo de ahorro
inicio«Reducir un 15 % el coste de cómputo este trimestre».
- se ejecuta Menos capacidad
Menos capacidad
Menos réplicas, menor margen sobre el pico, utilización objetivo más alta.
- tráfico plano Ahorro real
- tráfico con picos Cola creciente
La bifurcación depende de la forma del tráfico, no de la calidad de la ejecución.
Ahorro real
finEl numerador baja y el denominador no se mueve. Es el resultado buscado y ocurre cuando había capacidad genuinamente sobrante.
Verificable: coste por resultado útil a la baja con percentil estable.
Cola creciente
La utilización sube y el tiempo de espera crece de forma no lineal (capítulo 2).
- dentro del timeout Percentil degradado
- supera el timeout Abandono
Percentil degradado
El p98 empeora. La media apenas se mueve, así que el panel de dirección no lo refleja.
- el cliente reintenta Abandono
Consume presupuesto de error sin que nadie lo registre como consumo.
Abandono
Peticiones que consumieron recursos y no produjeron resultado. El denominador baja.
- se calcula el unitario Coste unitario al alza
Coste unitario al alza
finEl numerador ha bajado un 15 % y el denominador más. El objetivo se ha cumplido y el margen ha empeorado.
Solo se detecta si el coste por resultado útil está instrumentado. Si no, se detecta en la renovación.
Capítulo 07. Cómo diseñar un benchmark que un CTO pueda aprobar
Un benchmark que soporta una decisión de inversión no se distingue de una demostración por la calidad de la ejecución, sino por lo que documenta antes de ejecutarse.
Un benchmark es aprobable cuando cumple tres condiciones: la hipótesis se escribió antes de ver los datos, cualquier persona puede reproducir el ensayo con la ficha publicada, y el informe enumera las razones por las que su conclusión podría ser errónea. Ninguna de las tres tiene que ver con la potencia del generador de carga.
Empieza por una hipótesis que pueda ser falsa
La mayoría de los ensayos corporativos empiezan con un objetivo, no con una hipótesis. La diferencia es que un objetivo se persigue y una hipótesis se pone a prueba. Un ensayo que no puede terminar con «no funciona» no es un ensayo: es una justificación con instrumentación.
| Hipótesis mal formulada | Por qué no sirve | Reformulación |
|---|---|---|
| «Comprobar si los hilos virtuales mejoran el rendimiento» | No define qué es mejorar, ni sobre qué carga, ni qué se rechazaría. | «Con la mezcla de tráfico de producción, los hilos virtuales sostienen el mismo p98 con al menos un 30 % menos de réplicas.» |
| «Evaluar si el modelo B es mejor que el A» | «Mejor» no es medible sin fijar tarea y criterio de calidad. | «Sobre las 500 tareas del conjunto congelado, el modelo B alcanza al menos la misma tasa de aceptación con un coste por tarea resuelta inferior.» |
| «Ver cuánto aguanta el sistema» | Mide el punto de saturación, que ningún cliente experimenta y ninguna decisión usa. | «Determinar el throughput máximo sostenible manteniendo el p98 por debajo de T y la tasa de error por debajo de E.» |
| «Reducir el coste de AWS un 20 %» | Es un objetivo de numerador sin restricción de denominador. Se puede cumplir empeorando el margen. | «Reducir el coste por resultado útil un 20 % sin degradar el p98 ni la tasa de aceptación.» |
La ficha del ensayo
Todo lo que no esté en la ficha no se podrá reproducir, y todo lo que no se pueda reproducir no debería sostener una decisión con consecuencias. La plantilla siguiente cubre los catorce bloques que en la práctica hacen falta.
# ─────────────────────────────────────────────────────────────
# FICHA DEL ENSAYO · plantilla
# Todo lo que no esté aquí escrito no se podrá reproducir.
# ─────────────────────────────────────────────────────────────
hipotesis:
enunciado: "Cambiar X reduce el coste por resultado útil al menos un N %
sin degradar el p98 de la operación Y por encima de T ms."
se_rechaza_si: "El coste por resultado útil no baja, o el p98 supera T."
# Una hipótesis que no puede ser rechazada no es una hipótesis.
trafico:
origen: "Muestra de N días de producción, incluida al menos una hora punta."
mezcla_de_operaciones: { crear: 35%, consultar: 45%, exportar: 12%, resto: 8% }
patron_de_llegada: "Reproducción del perfil real por franja horaria."
generador: "Tasa de llegada fija, independiente del tiempo de respuesta."
# Un generador de bucle cerrado introduce omisión coordinada (cap. 2).
payloads:
distribucion: "p50, p90, p99 del tamaño real. No un tamaño único."
documentos: "Muestra estratificada por tipo, idioma y longitud."
datos: "Anonimizados, con la misma cardinalidad y distribución."
concurrencia:
rampa: "0 → objetivo en M minutos, en escalones."
meseta: "Duración suficiente para observar GC mayor y renovación de conexiones."
pico: "Escalón adicional para medir el comportamiento en saturación."
infraestructura:
region: "La misma que producción. La latencia y el precio varían por región."
computo: "Familia, tamaño, número de réplicas, límites y peticiones de recursos."
red: "Zonas de disponibilidad implicadas y transferencia entre ellas."
limites: "Cuotas de servicio y límites de tasa aplicables, documentados."
plataforma:
java: "Versión exacta de JDK y distribución."
spring_boot: "Versión exacta."
jvm: "Recolector, tamaño de heap, banderas relevantes."
concurrencia: "Modelo de hilos: plataforma o virtuales."
pools: "Tamaño de pool JDBC, cliente HTTP y ejecutores."
modelo_de_ia:
identificador: "Modelo y versión exactos, no la familia."
parametros: "Temperatura, límite de tokens de salida, formato de respuesta."
prompts: "Versionados en el repositorio, con hash en el informe."
cache: "Política, prefijo cacheado y ventana de validez."
fallback: "Modelo alternativo y condición de activación."
presupuesto: "Número máximo de intentos por tarea."
dependencias:
reales: "Cuáles se llaman de verdad."
simuladas: "Cuáles se sustituyen y con qué distribución de latencia y error."
# Un simulador con latencia constante elimina la cola que se quería medir.
ejecucion:
calentamiento: "Descartado del análisis. Debe cubrir compilación JIT y llenado de caches."
repeticiones: "Mínimo tres ejecuciones completas en momentos distintos."
aislamiento: "Sin despliegues, migraciones ni tareas programadas durante la ventana."
metricas:
latencia: "p50, p95, p98, p99 y p99.9, de servicio y extremo a extremo."
errores: "Por tipo, no solo tasa global."
resultados: "Aceptados, completados sin aceptar, reintentados, abandonados."
recursos: "CPU, restricción, memoria, pausas de GC, pools, colas."
ia: "Tokens de entrada y salida, intentos por tarea, aciertos de caché."
coste: "Método de atribución declarado (capítulo 3)."
criterio_de_exito:
primario: "Coste por resultado útil dentro del objetivo de latencia."
secundario: "Ninguna degradación del p98 por encima de T."
# El criterio se escribe ANTES de ejecutar.
amenazas_a_la_validez:
- "Enumeradas de forma explícita en el informe." Cronología de una ejecución
Fases de un ensayo y qué se mide en cada una
Línea temporal: T−3, Congelar hipótesis, criterio de éxito y conjunto de evaluación; T−2, Fijar versiones y tarifas; T−1, Cargar estado de datos representativo; Fase 0, Calentamiento; Fase 1, Rampa; Fase 2, Meseta; Fase 3, Pico; Fase 4, Descenso y drenaje; A−1, Conciliar coste con la factura; A−2, Calcular coste por resultado útil por variante; A−3, Enumerar amenazas a la validez
- T−3 Congelar hipótesis, criterio de éxito y conjunto de evaluación Se publican en el repositorio antes de ejecutar nada. Es lo que impide ajustar el criterio a los resultados.
- T−2 Fijar versiones y tarifas JDK, Spring Boot, modelo de IA, precios vigentes con su fecha.
- T−1 Cargar estado de datos representativo Volumen, cardinalidad y tamaño del índice vectorial equivalentes a producción.
- Fase 0 Calentamiento Compilación adaptativa, llenado de cachés, establecimiento de conexiones. Se descarta del análisis y se publica su duración.
- Fase 1 Rampa Subida escalonada hasta la concurrencia objetivo. Sirve para localizar el punto donde el percentil empieza a moverse.
- Fase 2 Meseta El tramo del que salen los percentiles. Debe durar lo suficiente para que ocurran recolecciones mayores y renovaciones de conexión.
- Fase 3 Pico Escalón por encima del objetivo. Mide el comportamiento en saturación y la eficacia de la descarga de carga.
- Fase 4 Descenso y drenaje Mide cuánto tarda el sistema en recuperarse, que es tan relevante como cuánto aguanta.
- A−1 Conciliar coste con la factura El coste calculado durante la ventana debe cuadrar con el informe de uso del mismo periodo.
- A−2 Calcular coste por resultado útil por variante Con su dispersión entre repeticiones. Un intervalo sin solapamiento es lo que permite afirmar una diferencia.
- A−3 Enumerar amenazas a la validez Antes de escribir la recomendación, no después de que alguien las señale.
Amenazas a la validez
Enumerarlas no debilita el informe: es lo que lo hace defendible. Un informe sin limitaciones declaradas se lee como una promesa, y la primera vez que la realidad se aparte del ensayo, todo el trabajo pierde credibilidad de golpe.
| Amenaza | Cómo se manifiesta | Mitigación realista |
|---|---|---|
| Omisión coordinada | El generador deja de emitir cuando el sistema se ralentiza y la cola medida sale corta. | Generador de tasa de llegada fija o corrección explícita de la omisión. Documentar cuál se ha usado. |
| Calentamiento insuficiente | Las primeras peticiones incluyen compilación adaptativa, cachés frías y conexiones sin establecer. | Descartar la fase de calentamiento del análisis y publicar su duración. Verificar que la compilación se ha estabilizado. |
| Carga útil única | Un tamaño fijo elimina la variabilidad que produce la cola real. | Muestrear tamaños de la distribución de producción y publicar sus percentiles. |
| Dependencias simuladas con latencia constante | La cola desaparece porque no hay variabilidad aguas abajo. | Simular con la distribución medida en producción, incluida su cola y su tasa de error. |
| Estado de datos irreal | Una base de datos vacía o un índice vectorial pequeño responden mucho mejor que los reales. | Reproducir volumen y cardinalidad. Documentar el tamaño del corpus y del índice. |
| Ejecución única | Una sola ejecución no distingue una mejora de la variabilidad entre ejecuciones. | Tres ejecuciones mínimas en momentos distintos, y publicar la dispersión entre ellas. |
| Vecino ruidoso | La infraestructura compartida introduce variabilidad ajena al cambio evaluado. | Ejecutar las variantes de forma entrelazada en el tiempo, no una después de otra. |
| Precios cambiantes | El coste calculado depende de tarifas que pueden haber cambiado desde el ensayo. | Fijar la fecha de las tarifas usadas y recalcular si la decisión se retrasa. |
| Modelo actualizado sin aviso | Un identificador de modelo que apunta a la versión más reciente cambia bajo los pies del ensayo. | Fijar versiones exactas. Si el proveedor no lo permite, registrar la fecha y repetir el ensayo antes de decidir. |
| Conjunto de evaluación contaminado | El criterio de calidad se ajusta después de ver los resultados. | Congelar el conjunto de evaluación y el criterio antes de ejecutar. Publicar ambos. |
Qué debe contener el informe final
El informe es el entregable, no las gráficas. Si un miembro del comité no puede entender qué se midió, con qué condiciones y bajo qué supuestos, la decisión se tomará por confianza en quien presenta, que es precisamente lo que un benchmark debería evitar.
- Hipótesis, criterio de éxito y criterio de rechazo, escritos antes de ejecutar.
- Ficha completa del entorno: región, infraestructura, versiones, parámetros y límites.
- Descripción del tráfico: mezcla de operaciones, distribución de cargas útiles y patrón de llegada.
- Duración del calentamiento, número de repeticiones y dispersión entre ellas.
- Percentiles p50, p95, p98, p99 y p99.9, de servicio y extremo a extremo.
- Desglose de errores por tipo y de resultados por estado, no solo tasas globales.
- Método de atribución de costes, con la clave de reparto declarada.
- Fecha de las tarifas utilizadas y versión exacta de cada modelo de IA.
- Amenazas a la validez identificadas, con su mitigación o su reconocimiento explícito.
- Coste por resultado útil de cada variante, con su intervalo entre repeticiones.
- Recomendación, con las condiciones bajo las cuales dejaría de ser válida.
Capítulo 08. Instrumentación práctica con OpenTelemetry, Micrometer y etiquetas de negocio
Todo lo anterior depende de un dato que la mayoría de las plataformas no emite: qué operación de negocio se ejecutó, con qué resultado y qué consumió.
La instrumentación que hace posible el coste por resultado útil se apoya en una decisión de diseño: emitir un registro por tarea de negocio, no por llamada técnica, y repartirlo después en tres señales con propiedades distintas. Las métricas soportan los paneles y las alertas; las trazas soportan el diagnóstico; un evento por operación soporta el cálculo económico.
Tres señales a partir de un único registro
Diagrama por capas: Origen (OperationReport); Métricas (Duración, Resultados, Intentos, Tokens); Trazas (tenant.id, Causa del fallo, Modelo y fallback, Dependencias); Evento de coste (Una línea por operación, Cruce con la factura)
El registro de la operación
/**
* Registro de una operación de negocio.
*
* Es un objeto de datos deliberadamente plano: se construye durante la
* ejecución y se entrega completo al final. Registrar cada campo por
* separado en el momento en que se conoce es lo que hace que, con el
* tiempo, unos campos se emitan y otros no.
*
* ORIENTATIVO. No es una integración lista para producción: falta el
* tratamiento de errores, la propagación de contexto asíncrono y la
* gestión del ciclo de vida.
*/
public record OperationReport(
// ── Identidad ────────────────────────────────────────────
String businessOperation, // taxonomía cerrada: "clasificar-documento"
String tenantId, // alta cardinalidad: ver advertencia
String environment,
// ── Resultado ────────────────────────────────────────────
Outcome outcome, // ACCEPTED, COMPLETED_NOT_ACCEPTED,
// ABANDONED, REJECTED, NEEDS_REVIEW
Duration duration, // extremo a extremo dentro del servicio
int attempts, // intentos hasta resolver, mínimo 1
String failureReason, // null si outcome == ACCEPTED
// ── Consumo de IA ────────────────────────────────────────
String model, // identificador exacto del modelo usado
String fallbackModel, // null si no hubo degradación
long inputTokens,
long outputTokens,
long cachedInputTokens,
long embeddingTokens,
int toolCalls,
// ── Coste estimado ───────────────────────────────────────
// Se calcula en el borde con las tarifas vigentes inyectadas
// como configuración. Es MODELADO, nunca medido, y por eso
// viaja en un campo con nombre propio.
BigDecimal estimatedAiCostUnits
) {
public boolean isUseful() {
return outcome == Outcome.ACCEPTED;
}
} Emisión de las tres señales
/**
* Emisión de las tres señales a partir de un único registro.
*
* La separación importa:
* · MÉTRICAS → cardinalidad baja, agregables, baratas de retener.
* · TRAZAS → cardinalidad alta, muestreadas, con el detalle.
* · EVENTO → una línea por operación, para el cálculo de coste.
*
* ORIENTATIVO.
*/
@Component
public class BusinessTelemetry {
private final MeterRegistry registry;
private final Tracer tracer;
public BusinessTelemetry(MeterRegistry registry, Tracer tracer) {
this.registry = registry;
this.tracer = tracer;
}
public void emit(OperationReport report) {
// ── 1. MÉTRICAS ──────────────────────────────────────
// Sin tenantId: es la etiqueta que multiplica las series.
Tags tags = Tags.of(
"business.operation", report.businessOperation(),
"request.outcome", report.outcome().name(),
"gen_ai.request.model", nullSafe(report.model())
);
registry.timer("business.operation.duration", tags)
.record(report.duration());
registry.counter("business.operation.attempts", tags)
.increment(report.attempts());
if (report.isUseful()) {
registry.counter("business.operation.useful", tags).increment();
}
// Los tokens como resumen de distribución, no como contador:
// interesa el percentil de tokens por tarea, no solo el total.
registry.summary("gen_ai.usage.input_tokens", tags)
.record(report.inputTokens());
registry.summary("gen_ai.usage.output_tokens", tags)
.record(report.outputTokens());
// ── 2. TRAZA ─────────────────────────────────────────
// Aquí sí va tenantId: las trazas se muestrean y no
// generan una serie temporal por valor distinto.
Span span = tracer.currentSpan();
if (span != null) {
span.tag("business.operation", report.businessOperation());
span.tag("tenant.id", report.tenantId());
span.tag("request.outcome", report.outcome().name());
span.tag("business.attempts", String.valueOf(report.attempts()));
span.tag("gen_ai.request.model", nullSafe(report.model()));
span.tag("gen_ai.usage.input_tokens",
String.valueOf(report.inputTokens()));
span.tag("gen_ai.usage.output_tokens",
String.valueOf(report.outputTokens()));
if (report.fallbackModel() != null) {
span.tag("business.fallback_model", report.fallbackModel());
}
if (report.failureReason() != null) {
span.tag("business.failure_reason", report.failureReason());
}
}
// ── 3. EVENTO DE COSTE ───────────────────────────────
// Una línea por operación hacia el almacén analítico.
// Es lo que se cruza con el informe de uso y costes para
// calcular el coste por resultado útil por cliente.
costEventPublisher.publish(report);
}
} Uso desde el caso de uso
El detalle que decide si toda la instrumentación sirve está en dónde se abre el registro. Si envuelve la llamada al modelo, cada reintento produce un registro independiente y se pierde la noción de cuántos intentos costó la tarea. Si envuelve la tarea, el número de intentos es un atributo y todo lo demás se sigue.
/**
* Uso desde el caso de uso de aplicación.
*
* El registro envuelve la TAREA DE NEGOCIO completa, no la llamada al
* modelo. Es la diferencia que permite contar intentos por tarea
* resuelta en lugar de llamadas totales.
*
* ORIENTATIVO.
*/
public ClassificationResult classify(Document document, TenantId tenant) {
Instant start = clock.instant();
var builder = OperationReport.builder()
.businessOperation("clasificar-documento")
.tenantId(tenant.value())
.environment(environment);
int attempts = 0;
try {
while (attempts < maxAttempts) {
attempts++;
ModelResponse response = modelPort.complete(promptFor(document));
builder.accumulateTokens(
response.inputTokens(),
response.outputTokens(),
response.cachedInputTokens()
);
builder.model(response.modelId());
ValidationResult validation = validator.validate(response);
if (validation.isValid()) {
telemetry.emit(builder
.attempts(attempts)
.outcome(validation.needsHumanReview()
? Outcome.NEEDS_REVIEW
: Outcome.ACCEPTED)
.duration(Duration.between(start, clock.instant()))
.build());
return validation.result();
}
builder.failureReason(validation.reason());
}
// Presupuesto de intentos agotado: la tarea NO suma al
// denominador, pero todo lo consumido sí suma al numerador.
telemetry.emit(builder
.attempts(attempts)
.outcome(Outcome.ABANDONED)
.duration(Duration.between(start, clock.instant()))
.build());
throw new ClassificationFailedException(document.id());
} catch (RateLimitedException e) {
telemetry.emit(builder
.attempts(attempts)
.outcome(Outcome.REJECTED)
.failureReason("rate_limited")
.duration(Duration.between(start, clock.instant()))
.build());
throw e;
}
} Configuración de Spring Boot Actuator
# Histogramas agregables en el servidor, no percentiles calculados
# en cada instancia. Los percentiles precalculados por instancia NO
# se pueden promediar ni sumar entre réplicas: agregarlos produce un
# número que no corresponde a ninguna distribución real.
management.metrics.distribution.percentiles-histogram.http.server.requests=true
management.metrics.distribution.percentiles-histogram.business.operation.duration=true
# Cubos alineados con los umbrales del objetivo de nivel de servicio.
# Un cubo en el umbral exacto permite calcular el cumplimiento sin
# interpolar, que es la fuente habitual de discrepancias entre el
# panel y el informe contractual.
management.metrics.distribution.slo.business.operation.duration=200ms,500ms,1s,2s,5s
# Atributos de recurso comunes a métricas, trazas y registros.
management.opentelemetry.resource-attributes.deployment.environment=production
management.opentelemetry.resource-attributes.service.namespace=plataforma-b2b
# Muestreo: conservar el 100 % de lo que falla y muestrear el resto.
# El detalle de la cola está en las trazas de las peticiones lentas,
# no en las rápidas.
management.tracing.sampling.probability=0.05 Consultas que responden a la pregunta económica
# ── Cumplimiento del objetivo de latencia por operación ──────
# Fracción de operaciones por debajo de 1 s, calculada a partir de
# los cubos del histograma. No usa histogram_quantile: para un
# umbral fijo, contar el cubo es exacto y interpolar no lo es.
sum by (business_operation) (
rate(business_operation_duration_seconds_bucket{le="1.0"}[5m])
)
/
sum by (business_operation) (
rate(business_operation_duration_seconds_count[5m])
)
# ── p98 de la operación de negocio ───────────────────────────
# Agregando primero los cubos de TODAS las réplicas y calculando
# el percentil después. El orden importa: calcular el percentil por
# réplica y promediarlo es un error frecuente y silencioso.
histogram_quantile(
0.98,
sum by (le, business_operation) (
rate(business_operation_duration_seconds_bucket[5m])
)
)
# ── Intentos por tarea resuelta ──────────────────────────────
# El indicador que revela si un cambio de modelo ha desplazado
# coste hacia los reintentos.
sum by (business_operation) (rate(business_operation_attempts_total[15m]))
/
sum by (business_operation) (rate(business_operation_useful_total[15m]))
# ── Tokens de entrada por resultado útil ─────────────────────
# Sube cuando el contexto recuperado crece o cuando la caché deja
# de acertar, y ninguna de las dos cosas se ve en el gasto total
# hasta el cierre del mes.
sum by (business_operation) (rate(gen_ai_usage_input_tokens_sum[15m]))
/
sum by (business_operation) (rate(business_operation_useful_total[15m])) Cómo repartir la información entre señales
| Señal | Qué se guarda en ella | Cardinalidad admisible | Coste de retención |
|---|---|---|---|
| Métricas | Series agregadas: duración, resultados, intentos, tokens, por operación y modelo. | Baja. Producto acotado de valores: decenas de operaciones × decenas de resultados y modelos. | Bajo. Es la señal que se conserva durante meses. |
| Trazas | El detalle de operaciones individuales, incluido el cliente y la causa exacta del fallo. | Alta. Aquí sí caben identificadores de cliente, de documento y de petición. | Medio, y controlable con muestreo dirigido: todo lo que falla, una fracción de lo que funciona. |
| Evento de coste | Una línea por operación con consumo y resultado, hacia un almacén analítico. | Alta por diseño: es la fuente del cálculo por cliente. | Bajo por unidad y alto en volumen. Conviene un almacén columnar, no la plataforma de observabilidad. |
| Registros | Contexto de diagnóstico. No debe ser la fuente de ninguna métrica de negocio. | Alta y difícil de controlar. | El más alto de los cuatro. Calcular métricas de negocio a partir de registros es caro y frágil. |
Errores de instrumentación que se pagan caros
| Error de instrumentación | Consecuencia | Alternativa |
|---|---|---|
| Etiquetar métricas con el identificador de cliente | Multiplica las series por el número de clientes. Es la causa más frecuente de una factura de observabilidad desbocada. | Cliente en trazas y en el evento de coste; en métricas, solo un segmento acotado (plan, tamaño, región) si hace falta. |
| Usar la ruta de la petición como etiqueta sin plantilla | Cada identificador en la URL crea una serie nueva. | Plantilla de ruta, no ruta concreta. Y para el cálculo de negocio, la operación, que no siempre coincide con el punto de entrada HTTP. |
| Publicar percentiles calculados por instancia | No se pueden agregar entre réplicas. El panel del clúster muestra un número que no existe. | Histogramas con cubos, agregados en el servidor de métricas antes de calcular el percentil. |
| Medir la llamada al modelo en lugar de la tarea | Se pierden los intentos por tarea, que es la métrica que delata un cambio de modelo mal evaluado. | Un span y un registro por tarea de negocio, con los intentos como atributo. |
| Confundir código 200 con resultado aceptado | El denominador incluye respuestas técnicamente correctas e inservibles. | Un campo de resultado con conjunto cerrado de valores, decidido por la validación de negocio. |
| Calcular el coste dentro de la aplicación con tarifas incrustadas | Las tarifas cambian y quedan desperdigadas por el código. | Emitir consumo en unidades físicas —tokens, segundos, bytes— y aplicar tarifas en la capa analítica, donde se versionan con su fecha. |
Capítulo 09. Caso práctico modelado: API Java + AWS + LLM
Una plataforma Java y Spring Boot procesa solicitudes B2B y usa un modelo de IA para clasificar y resumir documentos. Tres escenarios con el mismo tráfico y tres resultados económicos distintos.
Un mismo trimestre de trabajo puede reducir la factura de infraestructura y empeorar el margen, o aumentarla y mejorarlo. Este capítulo lo muestra sobre un flujo completo —una API Java y Spring Boot sobre AWS que usa un modelo de IA para clasificar y resumir documentos— comparando tres escenarios con exactamente el mismo tráfico de entrada.
El sistema
Flujo de la operación «clasificar y resumir documento»
Diagrama de flujo: Cliente B2B → API Spring Boot → Índice vectorial → Modelo de IA → Validación → Resultado o cola de revisión
- Cliente B2B Envía un documento por API síncrona
- API Spring Boot Validación, extracción de texto, troceado
- Índice vectorial Embedding de consulta y recuperación de fragmentos
- Modelo de IA Clasificación y resumen con salida estructurada
- Validación Esquema, reglas de negocio, umbral de confianza
- Resultado o cola de revisión Aceptado, pendiente de revisión o abandonado
Los tres escenarios
Base. El sistema tal como está: modelo de calidad alta, contexto generoso, capacidad con margen y una fracción moderada de solicitudes que pasan por revisión humana.
B · optimización local. Un trimestre de trabajo con dos objetivos aprobados en comité: reducir el coste de infraestructura y reducir el coste de IA. Se suben los objetivos de utilización y se recortan réplicas; se cambia a un modelo con un precio unitario del cuarenta por ciento del anterior. Ambos objetivos se cumplen.
C · optimización de negocio. El mismo trimestre dedicado a otra cosa: recortar el contexto recuperado y estabilizar el prefijo cacheable, escalar por concurrencia en curso en lugar de por CPU, fijar un presupuesto explícito de intentos con timeout ajustado, y añadir capacidad para absorber el pico. El coste de infraestructura sube.
Parámetros declarados
| Parámetro de entrada | Base | B · optimización local | C · optimización de negocio | Por qué cambia |
|---|---|---|---|---|
| Solicitudes entrantes / mes | 100.000 | 100.000 | 100.000 | Se mantiene constante a propósito: ninguna variación puede atribuirse al crecimiento. |
| Coste AWS asignado (índice) | 100 | 86 | 104 | B reduce réplicas y sube la utilización objetivo. C añade réplicas para absorber el pico y paga almacenamiento de caché. |
| Precio unitario del modelo | 1,00 × | 0,40 × | 1,00 × | B cambia a un modelo económico. C mantiene el modelo y reduce el consumo. |
| Tokens de entrada por tarea | 1,00 × | 1,15 × | 0,70 × | B añade ejemplos al prompt para estabilizar la salida del modelo económico. C recorta el contexto recuperado, reordena los fragmentos y estabiliza el prefijo cacheable. |
| Tasa de reintento del modelo | 12,0 % | 27,0 % | 9,0 % | El modelo económico falla más la validación estructurada. El contexto mejor construido falla menos. |
| Abandono por timeout | 3,0 % | 9,0 % | 1,2 % | B pierde margen de capacidad y suma reintentos: la cola crece. C escala por concurrencia y no por CPU. |
| Solicitudes que requieren revisión | 8,0 % | 19,0 % | 4,4 % | Es la variable que decide el caso, y la única que no aparece en ninguna factura de nube. |
| Descartadas tras revisión | 1,0 % | 4,0 % | 0,6 % | Fracción de las completadas que ni siquiera es recuperable a mano. |
| p50 / p98 de la operación | 420 / 1.900 ms | 520 / 4.600 ms | 400 / 1.350 ms | En B el p50 apenas se mueve y el p98 se multiplica por 2,4. Es la firma de una saturación de cola. |
Resultados derivados
| Resultado derivado | Base | B · optimización local | C · optimización de negocio | Cómo se calcula |
|---|---|---|---|---|
| Volumen | ||||
| Solicitudes completadas | 97.000 | 91.000 | 98.800 | entrantes × (1 − abandono) |
| Solicitudes revisadas a mano | 7.760 | 17.290 | 4.347 | completadas × tasa de revisión |
| Resultados útiles | 96.030 | 87.360 | 98.207 | completadas − descartadas |
| Coste (índice, Base = 100 en el total) | ||||
| Coste AWS | 100 | 86 | 104 | parámetro declarado |
| Coste de IA | 60 | 31 | 41 | 60 × precio × tokens × intentos relativos |
| Coste de revisión humana | 40 | 89 | 22 | 40 × (revisadas / revisadas base) |
| Coste total | 200 | 206 | 167 | suma de las tres partidas |
| Coste unitario (índice, Base = 100) | ||||
| Coste por solicitud entrante | 100 | 103 | 84 | total / 100.000 |
| Coste por solicitud completada | 100 | 110 | 82 | total / completadas |
| Coste por resultado útil | 100 | 113 | 82 | total / resultados útiles |
| Métricas que se llevan al comité | ||||
| Coste de infraestructura | 100 | 86 | 104 | la cifra que «demuestra» que B funcionó |
| Coste AWS por resultado útil | 100 | 95 | 102 | coste AWS / resultados útiles |
| Coste de IA por resultado útil | 100 | 57 | 67 | coste IA / resultados útiles |
Coste por resultado útil en los tres escenarios
Modelo reproducibleÍndice con Base = 100. Derivado por aritmética exacta de los parámetros declarados en la tabla de entradas. No procede de ninguna ejecución.
Por qué B parecía un éxito
Esta es la parte del caso que conviene leer dos veces. El escenario B no solo mejoró la métrica que se había fijado como objetivo. Mejoró casi todas las métricas que un comité habría pedido.
- El coste de infraestructura bajó un 14 %. Objetivo cumplido, con evidencia en la factura.
- El coste de IA bajó de 60 a 31, un 48 %. Objetivo cumplido con holgura, aunque menos de lo prometido: el precio unitario cayó un 60 % y los ejemplos añadidos al prompt más los reintentos se comieron la diferencia.
- El coste AWS por resultado útil mejoró un 5 % y el coste de IA por resultado útil mejoró un 43 %. Es el dato más incómodo del caso: incluso las métricas unitarias de cada partida —que son las correctas para juzgar esa partida— apuntaban en la dirección buena.
- El p50 apenas se movió: de 420 a 520 ms. Cualquier panel de latencia media habría mostrado una degradación menor y explicable.
Las tres señales que delataban el problema estaban fuera del perímetro habitual: el p98, que se multiplicó por 2,4; la tasa de revisión humana, que no aparece en ninguna factura de nube porque es coste de personal; y el número de resultados útiles, que cayó casi un 10 % sin que el tráfico entrante cambiara. Solo el denominador contaba la historia completa.
- Coste por resultado útil Base 100 Escenario C 82−18 %
- Resultados útiles Base 96.030 Escenario C 98.207+2 %
- p98 de la operación Base 1.900 ms Escenario C 1.350 ms−29 %
- Abandono por timeout Base 3,0 % Escenario C 1,2 %−60 %
- Solicitudes revisadas a mano Base 7.760 Escenario C 4.347−44 %
- Coste de infraestructura Base 100 Escenario C 104+4 %
Capítulo 10. Comparativa de decisiones: ahorrar infraestructura, cambiar de modelo o rediseñar el flujo
Las tres son legítimas y ninguna gana siempre. Lo que sí se puede determinar de antemano es cuál de ellas tiene techo en tu caso, y cuánto tarda cada una en producir efecto.
Ninguna de las tres decisiones gana siempre: gana la que ataca la partida que domina el numerador o la tasa que domina el denominador, y ambas cosas se pueden calcular antes de elegir. Ahorrar infraestructura tiene efecto rápido y techo conocido; cambiar de modelo mueve la partida de inferencia y, de rebote, la tasa de aceptación; rediseñar el flujo es lo más lento y lo único que actúa sobre los dos lados del cociente a la vez.
Ante un coste unitario que hay que bajar, casi todas las organizaciones eligen entre esas mismas tres opciones. La elección suele hacerse por disponibilidad de equipo o por afinidad técnica, y rara vez por la única razón defendible: cuál de las tres tiene el mayor efecto esperado sobre el coste por resultado útil, dados los pesos del numerador y las tasas del denominador que ya se han medido.
| Decisión | Qué se toca | Efecto sobre el modelo | Tiempo hasta ver el efecto | Riesgo principal |
|---|---|---|---|---|
| Ahorrar infraestructura | Réplicas, familia de instancia, modalidad de compra, retención, entornos. | Numerador, partidas de cómputo y datos. Elasticidad acotada por su peso. | Semanas | Recortar capacidad de absorción y trasladar el coste al denominador vía abandono. |
| Cambiar de modelo de IA | Proveedor, modelo, parámetros, política de fallback. | Numerador, partida de inferencia. Y denominador, vía tasa de aceptación. | Semanas | Mover coste hacia reintentos y revisión humana, que no están en ninguna factura de nube. |
| Rediseñar el flujo | Sincronía, número de llamadas en el camino crítico, caché, contexto, validación. | Ambos a la vez: reduce consumo por intento y sube la tasa de resultados útiles. | Meses | Coste de oportunidad y riesgo de ejecución. Es la opción más lenta y la que más suele rendir. |
Bajo qué condiciones gana cada una
| Decisión | Gana cuando… | Señal que lo confirma | Pierde cuando… |
|---|---|---|---|
| Ahorrar infraestructura | Existe capacidad genuinamente sobrante: utilización baja y estable, sin picos, con el percentil holgado respecto al objetivo. | La distancia entre p50 y p98 es pequeña y estable incluso en hora punta. | El tráfico tiene picos marcados o el percentil ya está cerca del umbral. Entonces el ahorro se paga en abandono. |
| Ahorrar infraestructura | Hay desperdicio estructural: entornos duplicados, retención excesiva, recursos huérfanos, transferencia entre zonas evitable. | Una fracción alta del coste no está asociada a ninguna operación de negocio. | Se confunde desperdicio estructural con margen de capacidad. Son partidas distintas y solo una es prescindible. |
| Cambiar de modelo | La partida de inferencia domina el numerador y hay una validación automática fiable que atrapa las salidas malas. | La inferencia supera el 40 % del numerador y el validador tiene precisión medida. | El validador no distingue bien, o hay revisión humana detrás con un coste alto (el H del capítulo 4). |
| Cambiar de modelo | La latencia del modelo domina el tiempo de permanencia y existe una alternativa apreciablemente más rápida con calidad equivalente. | La duración de la llamada al modelo supera la mitad del p98 de la operación. | La ganancia de latencia se pierde en reintentos: un modelo más rápido que acierta menos alarga la tarea, no la acorta. |
| Rediseñar el flujo | El contexto recuperado domina los tokens de entrada, o hay llamadas síncronas en el camino crítico que el cliente no necesita esperar. | Los tokens de entrada por tarea superan varias veces a los de salida, o el flujo tiene más de cinco dependencias en serie. | El equipo no tiene margen para un trabajo de meses, o el flujo va a cambiar por razones de producto antes de amortizarlo. |
| Rediseñar el flujo | La tasa de abandono o la de revisión humana son altas: son palancas del denominador y su elasticidad es plena. | La revisión humana supera al coste de inferencia en el desglose del numerador. | Se aborda sin haber medido antes. Un rediseño sin línea base no se puede evaluar y suele terminar defendiéndose por relato. |
Qué decisión atacar primero
-
¿Tienes calculado el coste por resultado útil y su desglose por partida?
- Sí Pasa a la pregunta 02
- No Instrumenta antes de decidir Sin desglose, cualquier elección entre las tres opciones es una apuesta. El capítulo 8 cubre el montaje mínimo y suele estar en semanas, no en meses.
-
¿Qué partida domina el numerador?
- Revisión humana Pasa a la pregunta 03
- Inferencia Pasa a la pregunta 04
- Infraestructura Pasa a la pregunta 05
-
¿La revisión se debe a calidad o a reglas de negocio que exigen supervisión?
- Calidad Rediseñar el flujo Mejorar la tasa de aceptación es una palanca del denominador, con elasticidad plena. Contexto, validación y enrutado por confianza son las intervenciones habituales.
- Reglas Optimizar la revisión, no eliminarla Si la supervisión es un requisito, la palanca es reducir el tiempo por revisión: priorización, presentación del contexto y automatización parcial.
-
¿Tienes un validador automático con precisión medida?
- Sí Probar un modelo más económico con fallback El validador acota el riesgo: las salidas malas se detectan y se reintentan con un modelo superior. Mide el punto de equilibrio del capítulo 4 antes de decidir.
- No Construir el validador primero Sin validación fiable, un cambio de modelo desplaza coste hacia la revisión humana sin que ninguna métrica de nube lo registre.
-
¿El tráfico tiene picos marcados o el p98 está cerca del objetivo?
- Sí Buscar desperdicio estructural Entornos duplicados, retención excesiva, recursos huérfanos y transferencia entre zonas evitable. Es coste que no protege ningún percentil.
- No Ajustar capacidad con un techo declarado Hay margen real, pero calcula antes el techo: el peso de la partida en el numerador es el máximo que puedes ganar.
Dos formas de presentar la misma decisión al comité
Comparación entre Presentación habitual y Presentación defendible
Presentación habitual
- «Vamos a reducir el gasto en cómputo un 15 %.»
- Objetivo sobre el numerador, sin restricción de denominador.
- Éxito verificable en la factura del mes siguiente.
- Nadie puede saber, con los datos presentados, si el margen mejora.
- Qué se compromete
- Una partida
- Qué se arriesga
- Sin declarar
Presentación defendible
- «Vamos a reducir el coste por resultado útil un 12 %.»
- Restricción explícita: el p98 no empeora y la aceptación no baja.
- Techo declarado: la partida pesa el 30 %, así que el máximo alcanzable por esta vía es del 30 % de su reducción.
- Condición de revisión: si el abandono sube por encima de X, se revierte.
- Qué se compromete
- El coste unitario
- Qué se arriesga
- Acotado y medido
La diferencia no es de ambición sino de honestidad sobre el techo. Una propuesta que declara su límite máximo antes de empezar es más creíble, no menos, y sobrevive mejor a la revisión de resultados.
Capítulo 11. Errores habituales al medir rendimiento y costes
Diecisiete errores que se repiten en organizaciones competentes. Ninguno procede de la ignorancia: todos proceden de medir con rigor la magnitud equivocada.
Lo que sigue no es un catálogo de descuidos. Cada uno de estos errores se comete con datos correctos, herramientas adecuadas y equipos que saben lo que hacen. El fallo está siempre en el mismo sitio: una magnitud intermedia se presenta como si fuera la magnitud final, y nadie tiene a mano la comprobación que lo desmentiría.
| Error | Cómo suena en la reunión | Qué comprobar antes de aceptarlo |
|---|---|---|
| Errores de lectura de métricas | ||
| Celebrar una CPU baja | «Estamos al 20 %, hay margen de sobra para recortar.» | El p98 en hora punta y la ocupación de pools y colas. Una CPU baja con cola creciente es saturación, no holgura. Capítulo 5. |
| Tratar la CPU como objetivo | «El objetivo del trimestre es subir la utilización media al 70 %.» | Si la carga es dominada por espera, la CPU no representa la ocupación del recurso escaso y el objetivo es arbitrario. |
| Optimizar el p50 | «Hemos bajado la latencia mediana un 30 %.» | Qué ha hecho el p98. Una mejora del camino feliz no toca la cola, y es la cola la que produce timeouts. Capítulo 2. |
| Publicar el throughput máximo | «El sistema aguanta doce mil peticiones por segundo.» | Con qué percentil y con qué tasa de error. El máximo es el punto donde la cola ya ha explotado y ningún cliente lo experimenta. |
| Promediar percentiles entre réplicas | «El p99 del clúster es la media de los p99 de los pods.» | Que se agreguen los cubos del histograma antes de calcular el percentil. Un percentil promediado no corresponde a ninguna distribución. Capítulo 8. |
| Errores de denominador | ||
| Reducir el coste por pod | «El coste por pod ha bajado un 20 %.» | Cuántos pods hacen falta ahora por operación completada. Es el mismo error que medir el coste por servidor. Capítulo 1. |
| Usar el código 200 como resultado | «El 99,8 % de las peticiones responden correctamente.» | Cuántas de esas respuestas correctas produjeron un resultado que el negocio aceptó sin corrección. |
| Ignorar el trabajo desperdiciado | «La tasa de error es del 2 %, es despreciable.» | Cuánto consumió ese 2 % antes de fallar, y si falló pronto o después de la parte cara del flujo. |
| Comparar totales mensuales | «Este mes hemos gastado un 8 % menos.» | Si el volumen de resultados útiles bajó más de un 8 %. El total mensual sube con el negocio y baja con la crisis. |
| Errores en IA generativa | ||
| Comparar modelos por precio por millón de tokens | «Este modelo es cuatro veces más barato.» | Tokens reales por tarea, tasa de acierto, reintentos, caché, latencia y coste de revisión. Capítulo 4. |
| Optimizar el prompt del sistema | «Hemos recortado el prompt a la mitad.» | Qué fracción de los tokens de entrada era el prompt. En flujos con recuperación suele ser la parte pequeña. |
| Contar llamadas en vez de tareas | «Hacemos ochenta mil llamadas al modelo al mes.» | Cuántas tareas resolvieron esas llamadas. La diferencia son los intentos descartados. |
| Dar por rentable la caché | «Hemos activado la caché de contexto, esto va a bajar mucho.» | La tasa de acierto medida frente al umbral que resulta de las tarifas de escritura y lectura. |
| Errores de coste | ||
| Recortar redundancia | «La segunda zona de disponibilidad casi no se usa.» | Qué riesgo cubría y cuánto costaría el escenario que evita. La redundancia es un seguro, y un seguro sin siniestros parece caro justo antes de hacer falta. |
| Recortar observabilidad de forma lineal | «Bajamos la ingesta de trazas un 50 %.» | Si se conserva el 100 % de las trazas de operaciones fallidas y si se mantiene la capacidad de atribuir coste por cliente. Capítulo 3. |
| Eliminar capacidad de absorción de picos | «Fuera de la hora punta sobra la mitad de la capacidad.» | Qué fracción del ingreso ocurre en la hora punta. Esa capacidad no es ociosa: es el precio del percentil en el momento que más factura. |
| Confundir ahorro técnico con margen | «Hemos ahorrado, luego el margen mejora.» | Las tres condiciones simultáneas: coste unitario a la baja, percentil estable y capacidad de absorción intacta. Capítulo 6. |
El error que no está en la tabla: confundir correlación con causalidad
Los diecisiete errores anteriores se corrigen midiendo mejor. Este no. Es un error de inferencia, y aparece precisamente cuando la medición es buena: dos series se mueven juntas y se concluye que una causó la otra.
Es especialmente frecuente en la relación entre latencia y negocio, porque es una relación real y bien documentada en la literatura del sector. Que exista en general no implica que el efecto observado en un caso concreto tenga esa magnitud ni esa causa. Un despliegue coincide con un día de la semana, con una campaña, con un cambio de producto y con la estacionalidad. Atribuir la variación al despliegue es una decisión, no una observación.
| Afirmación | Qué la sostiene de verdad | Qué haría falta para afirmarla |
|---|---|---|
| «Bajar 200 ms el p95 subió la conversión un 3 %» | Una correlación temporal entre dos series. El despliegue coincidió con otras cosas: día de la semana, campaña, estacionalidad, cambios de producto. | Un experimento controlado, o al menos una comparación con un grupo no afectado y control de las variables que cambiaron a la vez. |
| «El cambio de modelo redujo el coste un 18 %» | Una comparación entre dos periodos con mezclas de tráfico distintas. | Comparar sobre la misma mezcla de operaciones, o normalizar por composición. Si el mes nuevo tuvo tareas más fáciles, el ahorro es del calendario. |
| «La migración mejoró el p99» | Dos ejecuciones en momentos distintos, con tráfico y vecinos distintos. | Ejecuciones entrelazadas de ambas variantes y dispersión publicada. Si la diferencia no supera la variabilidad entre repeticiones, no hay diferencia. |
| «El nuevo modelo es más preciso» | Una evaluación sobre un conjunto elegido después de ver los fallos del anterior. | Un conjunto de evaluación congelado antes del ensayo, con criterio de aceptación escrito previamente. Capítulo 7. |
| «Los clientes grandes son los más rentables» | El ingreso por cliente, sin el coste por cliente. | Coste por resultado útil desglosado por cliente, con la clave de reparto del coste compartido declarada. |
El efecto de composición
Por qué dos periodos no son comparables sin normalizar
Comparación entre Comparación directa y Comparación normalizada
Comparación directa
- «El coste por operación bajó un 12 % respecto al mes pasado.»
- Se comparan dos totales calculados sobre mezclas de operaciones distintas.
- Si este mes hubo más operaciones baratas, el coste medio baja sin que nada haya mejorado.
- Puede incluso ocurrir lo contrario: que cada tipo de operación se haya encarecido y la media baje.
- Qué mide
- Coste y composición mezclados
- Fiabilidad
- Ninguna sin desglose
Comparación normalizada
- Coste por resultado útil desglosado por operación de negocio.
- Y un agregado calculado con una mezcla de referencia fija.
- Permite separar «hemos mejorado» de «ha cambiado lo que nos piden».
- Es exactamente para lo que sirve el atributo
business.operation.
- Qué mide
- Eficiencia real por operación
- Fiabilidad
- Comparable entre periodos
Es el motivo por el que el desglose por operación no es un lujo del panel: sin él, ninguna comparación entre periodos distingue una mejora de un cambio de demanda.
Capítulo 12. Checklist de adopción para CTOs y arquitectos
Ordenada por dependencia, no por dificultad. Cada bloque necesita el anterior, y saltarse el primero es lo que convierte un proyecto de FinOps en un panel de gasto que nadie usa para decidir.
La adopción tiene cuatro capas y un orden que no se puede alterar: primero se define qué cuenta como resultado útil, después se instrumenta, después se calcula y por último se gobierna. Las decisiones de la primera capa cuestan reuniones, no trimestres, y son las únicas que ninguna herramienta puede tomar por la organización.
Primero: diagnóstico
Diez preguntas. No hace falta ninguna herramienta para responderlas, solo honestidad sobre cuánto trabajo manual costaría obtener cada dato hoy. Si una respuesta requiere varios días de cruces en hojas de cálculo, la respuesta operativa es «no».
| Pregunta de diagnóstico | Si la respuesta es no… | Dónde está en esta guía |
|---|---|---|
| ¿Sabemos cuánto cuesta una operación de negocio completada dentro del objetivo de latencia? | Falta el denominador. Es la carencia raíz: todo lo demás de esta lista sirve para construirlo. | Capítulo 1 |
| ¿Podemos desglosarlo por cliente y por producto? | Falta atribución. Sin ella no hay conversación posible sobre precio ni sobre rentabilidad de cartera. | Capítulo 3 |
| ¿Tenemos objetivo de latencia por operación, en un percentil elegido por volumen? | Los compromisos son implícitos. Cualquier decisión de capacidad se toma sin restricción declarada. | Capítulo 2 |
| ¿Medimos la latencia extremo a extremo, no solo la del servicio? | La cola de aceptación es invisible y el percentil publicado está sesgado a la baja. | Capítulo 2 |
| ¿Sabemos cuántos intentos cuesta resolver una tarea con IA? | Cualquier cambio de modelo se evaluará por precio unitario, que es el error del capítulo 4. | Capítulo 4 |
| ¿Está el coste de revisión humana en el numerador? | La partida que suele decidir el caso está fuera del modelo económico. | Capítulo 9 |
| ¿Escalamos por una señal que represente el recurso escaso? | Si la carga es dominada por espera, el autoescalado reacciona tarde y de forma sistemática. | Capítulo 5 |
| ¿Está la observabilidad dentro del coste unitario? | Se gestionará como partida aislada y se recortará de forma lineal en la primera revisión. | Capítulo 3 |
| ¿Escribimos hipótesis y criterio de éxito antes de cada ensayo? | Los ensayos confirmarán lo que ya se había decidido, que es su función más común y menos útil. | Capítulo 7 |
| ¿Sabemos bajo qué condiciones dejarían de ser válidas nuestras decisiones anteriores? | Las decisiones se revisan cuando algo falla, no cuando cambian sus supuestos. | Capítulo 7 |
Bloque 1 · Fundamentos
Son decisiones de definición, no de ingeniería, y por eso se hacen primero: cuestan reuniones, no trimestres. Ninguna herramienta puede tomarlas por la organización.
- ✓ Definir qué cuenta como resultado útil, por operación de negocio, y dejarlo escrito con su criterio de calidad.
- ✓ Acordar la taxonomía de operaciones de negocio, con conjunto cerrado de valores y cardinalidad controlada.
- ✓ Acordar el conjunto cerrado de valores de resultado: aceptado, completado sin aceptar, en revisión, abandonado, rechazado.
- ✓ Etiquetar todos los recursos etiquetables con la etiqueta de asignación de costes y verificar que su valor coincide con service.name.
- ✓ Activar el informe detallado de uso y costes y llevarlo a un almacén consultable.
- ✓ Documentar la clave de reparto del coste compartido, con su justificación y su fecha.
Bloque 2 · Instrumentación
Es el trabajo técnico y el que suele estar en semanas si los fundamentos están acordados. Si no lo están, la instrumentación se hace dos veces.
- ✓ Emitir un registro por tarea de negocio con duración, resultado, intentos, modelo y tokens.
- ✓ Separar señales por cardinalidad: métricas agregadas, trazas muestreadas y un evento de coste por operación.
- ✓ Publicar histogramas con cubos, no percentiles calculados por instancia, con un cubo en el umbral del objetivo.
- ✓ Instrumentar la latencia extremo a extremo en el borde, además de la latencia de servicio.
- ✓ Registrar el coste de revisión humana como una serie propia, aunque provenga de otro sistema.
- ✓ Cruzar el evento de coste con el informe de uso y conciliar el resultado con la factura del periodo.
Bloque 3 · Decisión
Con las dos capas anteriores, estas seis son cálculos, no proyectos. Es donde el trabajo empieza a devolver.
- ✓ Calcular el coste por resultado útil y su desglose por partida, y publicar los pesos.
- ✓ Fijar el objetivo de latencia por operación, con el percentil elegido por volumen de peticiones afectadas.
- ✓ Declarar el presupuesto de error y tratarlo como cantidad consumible en las revisiones.
- ✓ Calcular el techo de cada palanca del numerador antes de comprometer un objetivo de ahorro.
- ✓ Establecer el punto de equilibrio entre coste de modelo y coste de supervisión para cada tarea con IA.
- ✓ Revisar el coste y el margen por cliente antes de cada renovación contractual.
Bloque 4 · Gobierno
Son reglas de proceso. Existen para que lo anterior no se degrade con la rotación de personas y con la presión de los cierres trimestrales, que es lo que ocurre por defecto.
- ✓ Ningún objetivo de ahorro se aprueba sin una restricción explícita sobre percentil y tasa de aceptación.
- ✓ Ningún ensayo soporta una decisión sin ficha reproducible y sin amenazas a la validez declaradas.
- ✓ Ninguna cifra se publica sin su clasificación: medida, modelada o ilustrativa.
- ✓ Ninguna recomendación se cierra sin declarar bajo qué condiciones dejaría de ser válida.
- ✓ El panel de dirección contiene cuatro cifras; el detalle vive en los paneles de ingeniería.
- ✓ Las condiciones que invalidarían una decisión pasada quedan vigiladas como alerta.
Secuencia de adopción realista
Línea temporal: Sem. 1–2, Acordar resultado útil, taxonomía de operaciones y valores de resultado; Sem. 2–3, Etiquetado de recursos y activación del informe de uso; Mes 1, Registro por tarea de negocio en las dos operaciones de mayor volumen; Mes 2, Primer cálculo de coste por resultado útil, conciliado con la factura; Mes 3, Objetivos de latencia por operación y presupuesto de error; Mes 4, Desglose por partida y cálculo del techo de cada palanca; Mes 5, Primer ensayo con ficha reproducible; Mes 6, Coste y margen por cliente en la revisión comercial
- Sem. 1–2 Acordar resultado útil, taxonomía de operaciones y valores de resultado Reuniones entre arquitectura, producto y negocio. Sin esto, todo lo posterior se reescribe.
- Sem. 2–3 Etiquetado de recursos y activación del informe de uso El etiquetado no reescribe el histórico, así que cuanto antes empiece, antes habrá serie comparable.
- Mes 1 Registro por tarea de negocio en las dos operaciones de mayor volumen No en todas. Dos operaciones bien instrumentadas dan más que veinte a medias.
- Mes 2 Primer cálculo de coste por resultado útil, conciliado con la factura La conciliación es lo que da credibilidad a la cifra dentro de la organización.
- Mes 3 Objetivos de latencia por operación y presupuesto de error Con el percentil elegido por volumen de peticiones afectadas, no por convención.
- Mes 4 Desglose por partida y cálculo del techo de cada palanca Es lo que convierte la planificación de eficiencia en una decisión con números.
- Mes 5 Primer ensayo con ficha reproducible Sobre la decisión que el desglose haya señalado como de mayor efecto esperado.
- Mes 6 Coste y margen por cliente en la revisión comercial El momento en que el trabajo deja de ser un proyecto técnico.
Capítulo 13. Preguntas frecuentes
Veinticuatro preguntas con respuesta autocontenida. Son las que más se repiten en comités de arquitectura y en revisiones de presupuesto, y ninguna respuesta contiene una cifra de precio o de ahorro.
¿Qué percentil de latencia debe medir un CTO?
El percentil que cubre la fracción de tráfico cuyo fallo tiene consecuencia económica. Para una API pública de alto volumen, el p99 y el p99.9 describen a decenas de miles de peticiones al día y son los que se traducen en abandono y en tickets. Para un proceso interno de bajo volumen, el p99 puede corresponder a media docena de ejecuciones al mes y el p95 describe mejor la experiencia habitual. La regla práctica es elegir el percentil por volumen absoluto de peticiones afectadas, no por costumbre: multiplica el tráfico diario por uno menos el percentil y comprueba si el número resultante te importa. Y mide siempre al menos dos percentiles, porque la distancia entre ellos es la que revela si la cola está creciendo.
¿Qué diferencia hay entre p95, p98 y p99?
Son cortes distintos de la misma distribución. El p95 es el valor que no supera el 95 por ciento de las peticiones; el p98 el que no supera el 98 por ciento; el p99 el que no supera el 99 por ciento. La diferencia importante no es aritmética sino de causa: el p95 suele estar dominado por el comportamiento normal del sistema bajo carga, mientras que el p98 y el p99 están dominados por eventos discretos como pausas de recolección de basura, reintentos, agotamiento de un pool, cold starts o limitación de tasa de una dependencia. Por eso optimizar el p95 y optimizar el p99 casi nunca son el mismo trabajo, y por eso la distancia entre p95 y p99 es un indicador de salud por sí misma.
¿Por qué p95 importa más que la media?
Porque la media describe un sistema idealizado y los percentiles describen la experiencia real. La media es sensible al grueso de la distribución y prácticamente insensible a la cola, de modo que un sistema puede empeorar de forma severa para una fracción significativa de usuarios sin que la media se mueva de manera perceptible. Además la media no se puede componer: la media de un flujo con varias dependencias no dice nada sobre cuántos usuarios tuvieron una experiencia inaceptable. El percentil sí responde a la pregunta de negocio, que es cuántas peticiones quedaron fuera del umbral que el cliente tolera.
¿Es lo mismo la latencia de servicio que la latencia extremo a extremo?
No, y confundirlas es uno de los errores más caros al interpretar un panel. La latencia de servicio se mide desde que el proceso empieza a atender la petición hasta que emite la respuesta. La latencia extremo a extremo incluye el tiempo de cola antes de ser atendida, la resolución de nombres, el establecimiento de conexión, el balanceador, los reintentos del cliente y el renderizado. Un servicio puede publicar un percentil excelente mientras el usuario espera varias veces más, porque todo el tiempo perdido ocurre antes de que empiece a contar el cronómetro del servicio. Cuando el sistema está saturado, la mayor parte de la espera es precisamente cola.
¿Cómo se compone el percentil de un flujo con varios servicios?
No se suma. Si un flujo atraviesa varias dependencias y cada una debe completarse para devolver la respuesta, la probabilidad de que la petición evite todas las colas simultáneamente disminuye con el número de dependencias. Bajo el supuesto de independencia entre servicios, la probabilidad de que ninguna supere su propio percentil objetivo es el producto de las probabilidades individuales, lo que significa que un flujo con muchas llamadas encadenadas supera su umbral con más frecuencia que cualquiera de sus partes. En la práctica los servicios no son independientes, porque comparten red, nodos y dependencias, y la correlación empeora el resultado. La consecuencia operativa es que el percentil hay que medirlo en el borde del flujo de negocio, no solo dentro de cada servicio.
¿Cómo calculo el coste AWS por petición?
Sumando todos los componentes que la petición consume y dividiendo por las peticiones completadas correctamente en el mismo intervalo. Los componentes son cómputo, almacenamiento, bases de datos, mensajería, transferencia de datos, servicios gestionados, observabilidad y el coste de las peticiones que fallaron o se abandonaron. La parte difícil no es la división sino la atribución: buena parte de la factura corresponde a recursos compartidos que no se pueden asignar por lectura directa. El método razonable es etiquetar todo lo etiquetable con etiquetas de asignación de costes, activar el informe detallado de uso y costes, usar los datos de reparto de coste por pod cuando el clúster los soporta, y repartir el resto con una clave de reparto explícita y documentada. Una clave discutible y escrita es mejor que un reparto implícito que nadie puede auditar.
¿Qué es el coste por resultado útil?
Es el coste total de producir un resultado que el negocio acepta, dividido por el número de resultados aceptados. El numerador incluye la infraestructura, el modelo de inteligencia artificial, la observabilidad, los reintentos, las peticiones que fallaron sin producir nada y la revisión humana necesaria para que el resultado sea aceptable. El denominador cuenta solo lo que sirve, no lo que se ejecutó. Es la métrica que separa un ahorro real de un desplazamiento de coste, porque cualquier optimización que reduzca el gasto pero aumente los reintentos, los abandonos o la revisión manual sube esta cifra aunque baje la factura.
¿Debe incluirse el coste de observabilidad en el coste por transacción?
Sí. La observabilidad es una parte del coste de operar el servicio, igual que el cómputo, y dejarla fuera produce dos distorsiones. La primera es que el coste por transacción parece menor de lo que es, lo que lleva a decisiones de precio equivocadas. La segunda, más grave, es que convierte la observabilidad en una partida aislada que compite contra sí misma en las revisiones de presupuesto, en lugar de competir contra el valor que aporta. Incluida en el coste por resultado, la pregunta correcta deja de ser cuánto cuestan las trazas y pasa a ser qué fracción del coste unitario representan y qué decisiones permiten tomar. La respuesta a menudo justifica muestreo, retención diferenciada o agregación previa, pero por análisis y no por recorte lineal.
¿Cómo distingo coste fijo de coste variable en la nube?
Por su respuesta al volumen, no por la partida de la factura. Coste variable es el que cambia cuando cambia el número de operaciones: invocaciones, tokens, transferencia de datos, peticiones a almacenamiento de objetos. Coste fijo es el que se paga con independencia del tráfico dentro de un rango: capacidad reservada, réplicas mínimas, clústeres de base de datos, entornos preproductivos, licencias. La distinción importa porque solo el coste variable se reduce optimizando el consumo por operación, mientras que el coste fijo únicamente baja cambiando la topología o el compromiso de capacidad. Un plan de ahorro que ataca la partida equivocada produce mucho trabajo y poco efecto.
¿Cuánto cuesta una petición que falla?
Casi siempre más que una que tiene éxito, y ese es el punto. Una petición que falla ya ha consumido cómputo, conexiones, consultas a base de datos, posiblemente tokens y, si hay reintentos, varias veces cada cosa. Además ocupa capacidad que deja de estar disponible para tráfico que sí habría convertido, y genera trabajo posterior en soporte. En el denominador del coste por resultado no aparece, porque no produjo nada aceptable. Por eso una tasa de error que parece pequeña puede tener un efecto desproporcionado sobre el coste unitario, y por eso conviene medir el coste del tráfico fallido como una línea propia y no diluido en el total.
¿Cómo calculo el coste de una respuesta de inteligencia artificial?
Sumando todo lo que la respuesta consume, no solo la llamada al modelo. Como mínimo hay que contar los tokens de entrada, los tokens de salida, los tokens de razonamiento si el modelo los factura aparte, las lecturas y escrituras de caché con su tarifa propia, los embeddings de indexación y de consulta, las consultas a la base de datos vectorial, las llamadas a herramientas que el modelo dispara, los reintentos por validación fallida o por limitación de tasa, la infraestructura que sostiene la orquestación y el coste de la revisión humana cuando la respuesta no alcanza la calidad mínima. La suma se divide por las tareas completadas con la calidad aceptada. Los precios unitarios de cada componente hay que tomarlos de la documentación vigente del proveedor, porque cambian y varían por región y por modalidad de servicio.
¿Cuál es la métrica más importante para comparar modelos de inteligencia artificial?
El coste por tarea completada con la calidad mínima aceptada, acompañado de la latencia en el percentil relevante. El precio por millón de tokens es un precio unitario de insumo, no un coste de resultado, y solo sería comparable si dos modelos consumieran los mismos tokens y produjeran la misma tasa de acierto, cosa que no ocurre. Un modelo con precio unitario más bajo puede necesitar prompts más largos, producir salidas más extensas, fallar más a menudo la validación estructurada, disparar más reintentos y exigir más revisión humana. Cualquiera de esos efectos puede invertir la comparación. La comparación honesta exige fijar la tarea, fijar el criterio de calidad, medir ambos modelos sobre el mismo conjunto y sumar todos los costes asociados.
¿Cómo mido los reintentos y los fallbacks de un modelo?
Instrumentando la operación de negocio, no la llamada al modelo. Si el contador vive en el cliente del proveedor, cada reintento aparece como una llamada más y se pierde la noción de cuántos intentos hicieron falta para resolver una tarea. La forma útil es abrir un span por tarea de negocio, registrar dentro de él cuántos intentos hubo, con qué modelo se resolvió finalmente, por qué falló cada intento previo, cuántos tokens consumió cada uno y si hubo degradación a un modelo alternativo. Con eso se pueden calcular tres cifras que ningún panel del proveedor da: intentos por tarea resuelta, coste acumulado de los intentos descartados y tasa de resolución en el primer intento por tipo de tarea.
¿La caché de prompts siempre reduce el coste?
No siempre, y depende de la relación entre la tasa de acierto y el sobrecoste de escritura. Los mecanismos de caché de contexto suelen facturar la escritura de la entrada cacheada a una tarifa distinta de la lectura, de modo que la caché solo compensa a partir de cierta tasa de reutilización. Si el prefijo cacheado cambia con frecuencia, si la ventana de validez es corta o si el tráfico está muy disperso entre contextos distintos, se paga la escritura sin llegar a amortizarla. La decisión es un cálculo con dos parámetros que se pueden medir: la fracción de peticiones que aciertan en caché y el ratio entre la tarifa de escritura y la de lectura. Ambos hay que tomarlos de la documentación del proveedor y de la telemetría propia, no de una regla general.
¿Cómo se mide el retorno de una funcionalidad de inteligencia artificial generativa?
Comparando el coste por resultado útil de la funcionalidad con el coste por resultado del proceso al que sustituye o complementa, sobre el mismo perímetro de tareas y el mismo criterio de calidad. Eso exige tres cosas que a menudo faltan. Primera, una definición operativa de calidad aceptada que se pueda evaluar de forma repetible. Segunda, una medición del proceso anterior, porque sin línea base no hay comparación posible. Tercera, contabilizar la supervisión humana que la funcionalidad sigue necesitando, que suele ser la partida que decide el resultado. Sin esos tres elementos, lo que se publica como retorno es una estimación de ahorro sin denominador.
¿Por qué una CPU baja no significa que el sistema sea eficiente?
Porque la CPU solo describe uno de los recursos que una petición puede estar esperando. En una carga dominada por entrada y salida, los hilos pasan la mayor parte del tiempo bloqueados esperando a una base de datos, a una llamada externa o a un modelo, y durante esa espera la CPU está ociosa aunque el sistema esté completamente saturado por otro recurso: conexiones del pool, hilos disponibles, límites de tasa de una dependencia o memoria. En esa situación una CPU baja convive con una cola creciente y con percentiles altos. La CPU es una señal contextual de saturación, útil junto a la latencia, la profundidad de cola y la ocupación de los pools, y engañosa cuando se lee sola.
Si la CPU está alta en Kubernetes, ¿qué significa exactamente?
Depende de si está alta respecto a la petición de recursos o respecto al límite, y de si el contenedor está sufriendo limitación por el planificador. Un contenedor con límite de CPU puede quedar restringido aunque el nodo tenga capacidad libre, porque el control de cuota le retira tiempo de procesador al agotar su porción dentro de cada periodo. Cuando eso ocurre, la latencia sube en forma de escalones y el uso medio de CPU puede seguir pareciendo moderado, porque el promedio diluye los periodos restringidos. La métrica que hay que mirar es el tiempo acumulado de restricción del contenedor, no solo el porcentaje de uso. Una CPU alta sin restricción y con percentiles estables es simplemente un sistema aprovechado.
¿Cómo se relaciona la latencia con la capacidad y el coste de infraestructura?
A través de la ley de Little, que establece que el número medio de peticiones en curso en un sistema estable es igual a la tasa media de llegada multiplicada por el tiempo medio de permanencia. La consecuencia práctica es directa: si el tiempo de permanencia aumenta y las llegadas no cambian, el número de peticiones simultáneas en el sistema crece en la misma proporción, y con él la demanda de hilos, conexiones, memoria y réplicas. Es decir, un servicio puede necesitar más infraestructura sin atender ni una petición más, solo porque cada una tarda más. Esta es la relación que explica por qué una dependencia lenta encarece la factura aunque el negocio no haya crecido.
¿Se puede autoescalar solo por CPU?
Se puede, y funciona razonablemente en cargas homogéneas dominadas por procesador. Falla en tres situaciones frecuentes. En cargas dominadas por espera, porque la CPU no sube aunque la cola crezca, y el autoescalado no reacciona hasta que la latencia ya se ha degradado. En cargas con límites de tasa externos, porque añadir réplicas no aumenta la capacidad real y solo multiplica los rechazos. Y en flujos con inteligencia artificial generativa, donde la duración de la llamada domina el tiempo de permanencia y la señal útil es la concurrencia en curso o la profundidad de cola, no el uso de procesador. En esos casos conviene escalar por una métrica que represente la ocupación real del recurso escaso.
¿Cuándo un benchmark es representativo de producción?
Cuando reproduce la forma del tráfico y no solo su volumen. Eso significa distribución realista de tamaños de carga útil, mezcla realista de tipos de operación, patrón de llegada con la variabilidad del tráfico real en lugar de un caudal constante, estado de datos comparable, dependencias con la latencia y los límites de tasa que tienen en producción, y ejecución suficientemente larga tras el calentamiento para que se hayan producido eventos raros como recolecciones mayores o renovaciones de conexión. Un ensayo que dispara la máxima concurrencia posible contra una única operación con una carga útil fija mide el techo del laboratorio, que es una cifra que ningún cliente va a experimentar nunca.
¿Cómo evito optimizar una métrica local?
Definiendo antes de empezar cuál es el resultado de negocio, y exigiendo que toda mejora se exprese en coste por resultado útil dentro del objetivo de nivel de servicio. Una optimización local es cualquier mejora que se declara sobre un indicador intermedio sin comprobar su efecto sobre esa cifra: coste por pod, uso de procesador, precio por millón de tokens, throughput máximo o latencia media. La comprobación práctica consiste en preguntar, para cada mejora propuesta, qué tendría que ocurrir para que la cifra global empeorase pese a que el indicador local mejora, y medir precisamente eso. Casi siempre hay respuesta: más reintentos, más abandonos, más revisión manual o menos capacidad para absorber un pico.
¿Qué relación hay entre objetivos de nivel de servicio y coste en la nube?
Un objetivo de nivel de servicio es una decisión de gasto disfrazada de decisión técnica. Fijar un umbral de latencia y una fracción de peticiones que debe cumplirlo determina cuánta capacidad ociosa hay que sostener, cuánta redundancia hay que pagar y cuánto margen de reintento se puede permitir. Subir el objetivo tiene un coste creciente y no lineal, porque acercarse a la utilización máxima dispara el tiempo de espera en cola. El presupuesto de error es la herramienta que hace explícita esa negociación: convierte la fiabilidad en una cantidad consumible y permite decidir si el siguiente tramo de fiabilidad vale lo que cuesta. Sin presupuesto de error, la conversación sobre coste y fiabilidad se resuelve por intuición.
¿Qué etiquetas debe llevar la telemetría para poder calcular coste por operación?
Las que permitan agrupar por la dimensión en la que se toma la decisión. En la práctica hacen falta cuatro familias: identidad del servicio y del entorno, para separar producción de lo demás; identidad del cliente o del ámbito de facturación, para poder repartir; identidad de la operación de negocio, que es la unidad sobre la que se calcula el coste unitario; y resultado de la operación, para poder distinguir lo completado de lo fallido en el denominador. Cuando hay inteligencia artificial, se añaden el modelo, los tokens de entrada y de salida y el número de intentos. Los nombres concretos de los atributos deben validarse contra la versión de las convenciones semánticas de OpenTelemetry que use la organización, porque las de inteligencia artificial generativa siguen en desarrollo y han cambiado entre versiones.
¿Cuántas métricas de negocio necesita un panel de dirección?
Pocas y estables. Un panel que responde a dirección necesita el coste por resultado útil, el cumplimiento del objetivo de latencia en el percentil elegido, el volumen de resultados útiles y el consumo del presupuesto de error. Con esas cuatro se puede sostener una conversación sobre margen, capacidad y riesgo. Todo lo demás es diagnóstico y pertenece a los paneles de ingeniería, donde sí hacen falta la profundidad de cola, la ocupación de pools, la restricción de procesador, las pausas de recolección de basura y el desglose de tokens. Mezclar ambos niveles produce paneles que nadie usa: demasiado detalle para decidir y demasiado poco contexto para diagnosticar.
Conclusión
Un benchmark no sirve para demostrar que una tecnología es más rápida. Sirve para decidir cuánto margen, capacidad, riesgo y experiencia de cliente compra cada euro de infraestructura y cada token de IA.
A lo largo de trece capítulos, la misma idea ha aparecido con distinto disfraz. La CPU baja que oculta una cola. El coste por pod que baja mientras sube el coste por transacción. El modelo barato que se paga en revisión humana. El throughput de laboratorio que ningún cliente experimenta. El p50 que mejora mientras el p98 destruye la conversión. La redundancia que se recorta justo antes de necesitarla. En todos los casos, la medición era correcta y el denominador estaba equivocado.
La corrección no es sofisticada. Es exigir que toda cifra que sostenga una decisión económica tenga en el denominador el resultado que la organización vende, y que toda propuesta de ahorro declare su techo antes de empezar. Lo primero es un trabajo de instrumentación que suele estar en semanas. Lo segundo es aritmética elemental que casi nadie hace, porque revela que la mayoría de los planes de ahorro tienen un límite máximo mucho menor de lo que se prometió.
Las cuatro cifras
Si de este artículo solo sobrevivieran cuatro números en el panel de dirección, deberían ser estos: coste por resultado útil, porcentaje de operaciones dentro del objetivo de latencia en el percentil elegido, volumen de resultados útiles y consumo del presupuesto de error. Con esas cuatro se puede discutir margen, capacidad y riesgo en la misma frase, y se puede rechazar una propuesta sin recurrir a la jerarquía. Todo lo demás es diagnóstico y pertenece a los paneles de ingeniería.
Cómo puedo ayudar
Si esa pregunta no tiene respuesta en tu organización, una auditoría técnica orientada a coste, capacidad y calidad la produce en pocas semanas. No es un informe de recomendaciones genéricas: es el modelo instanciado con tus datos y la instrumentación que lo mantiene vivo cuando la auditoría termina.
| Frente | Qué se entrega | Con qué queda el equipo |
|---|---|---|
| Modelo de costes por servicio y operación | Hoja de cálculo instanciada con la factura y la telemetría propias, con la clave de reparto del coste compartido documentada. | El coste por resultado útil, desglosado por partida, operación y cliente. |
| Telemetría de negocio | Diseño del registro por tarea, reparto por señales según cardinalidad y esquema de atributos propios con su conjunto de valores. | La capacidad de responder al desglose sin trabajo manual, y sin multiplicar la factura de observabilidad. |
| SLO y percentiles | Percentil elegido por volumen de peticiones afectadas, objetivos por operación y presupuesto de error operativo. | Compromisos explícitos que se pueden negociar con datos en lugar de con intuición. |
| Capacidad y cuellos de botella | Análisis de saturación por recurso, revisión de la política de autoescalado y del margen de absorción de picos. | Una relación medida entre latencia, concurrencia y coste, aplicando la ley de Little a su caso. |
| Consumo y calidad de IA | Desglose de tokens por origen, intentos por tarea resuelta, análisis de caché y punto de equilibrio frente al coste de supervisión. | Un criterio reproducible para elegir modelo y estrategia, con la condición que lo haría cambiar. |
| Plan de optimización priorizado | Intervenciones ordenadas por efecto esperado sobre el coste por resultado útil, con el techo de cada palanca declarado. | Un plan que se puede aprobar sabiendo de antemano cuánto puede rendir como máximo. |
El entregable que más suele cambiar la conversación interna no es el plan de optimización, sino la primera tabla de coste y margen por cliente. Es el momento en que un trabajo que empezó como técnico pasa a formar parte de la revisión comercial, y en que arquitectura deja de defender presupuesto para pasar a explicar margen.
Si prefieres empezar por el material y no por una conversación, los tres artículos vinculados en las referencias cubren la base sobre la que se apoya esta guía: el montaje de la plataforma de señales, el modelo de concurrencia que determina cuánta infraestructura hace falta para un tiempo de permanencia dado, y la separación de capas que permite instrumentar el dominio sin contaminarlo.
Referencias
Solo fuentes primarias: documentación oficial, especificaciones y material académico con identificador permanente. Cada una indica qué afirmación concreta de esta guía respalda.
Qué respalda cada fuente
| Afirmación o método de la guía | Fuente que lo respalda | Capítulo |
|---|---|---|
| El tiempo de espera crece de forma no lineal con la utilización y explota cerca de la saturación. | Teoría de colas elemental (modelo M/M/1). Ver también la formulación de la ley de Little. | 2 |
| El número de peticiones en curso es el producto de la tasa de llegada por el tiempo de permanencia. | Little, A Proof for the Queuing Formula: L = λW (1961), y el capítulo de Little y Graves sobre la ley. | 2, 5 |
| La cola de latencia de un flujo se degrada con el número de dependencias, y la correlación entre servicios la empeora. | Dean y Barroso, The Tail at Scale (CACM, 2013). | 2 |
| Un generador de carga de bucle cerrado sesga los percentiles a la baja (omisión coordinada). | Gil Tene, How NOT to Measure Latency, y la documentación de HdrHistogram. | 2, 7 |
| Un objetivo de nivel de servicio es una decisión de gasto; el presupuesto de error la hace explícita. | Google SRE Book, capítulo sobre objetivos de nivel de servicio, y SRE Workbook. | 2 |
| Un contenedor con límite de CPU puede ser restringido por cuota aunque el nodo tenga capacidad libre. | Documentación de Kubernetes sobre gestión de recursos de contenedores. | 5 |
| El autoescalado horizontal admite señales distintas de la CPU. | Documentación de Kubernetes sobre autoescalado horizontal de pods. | 5 |
| Los percentiles calculados por instancia no son agregables; los histogramas con cubos sí. | Guía de Prometheus sobre histogramas y resúmenes, y documentación de histogram_quantile. | 8 |
| El coste de AWS se puede atribuir a servicio, entorno y cliente mediante etiquetas de asignación y el informe detallado de uso. | Documentación de facturación de AWS: etiquetas de asignación de costes, CUR y categorías de coste. | 3 |
| El coste de un nodo puede repartirse entre los pods que se ejecutan en él. | Datos de reparto de coste de AWS y proyecto OpenCost. | 3 |
| La eficiencia de coste es una disciplina con marco propio y no un ejercicio puntual de recorte. | FinOps Framework y pilar de optimización de costes del AWS Well-Architected Framework. | 1, 3 |
| Los reintentos deben tener presupuesto y retroceso, y descargar carga es preferible a saturarse. | Amazon Builders' Library: timeouts, retries and backoff with jitter y using load shedding to avoid overload. | 1, 5 |
| Los atributos de telemetría deben seguir una convención, y los de IA generativa siguen en desarrollo. | Convenciones semánticas de OpenTelemetry, incluidas las de recursos y las de IA generativa. | 3, 8 |
| La caché de contexto factura escritura y lectura a tarifas distintas, con una ventana de validez. | Documentación oficial del proveedor de modelos. Los multiplicadores del capítulo 4 son ilustrativos. | 4 |
| Las pausas de recolección afectan a la cola de latencia y no a la media. | HotSpot Virtual Machine Garbage Collection Tuning Guide. | 2, 5 |
AWS, coste y FinOps
- AWS Pricing Fuente de cualquier precio unitario del capítulo 3. Deliberadamente no se reproduce ninguna cifra aquí: varían por región, familia y modalidad de compra.
- AWS Pricing Calculator Herramienta para instanciar la hoja de cálculo del capítulo 3 antes de tener consumo real.
- AWS Cost and Usage Report La fuente de verdad para el cálculo de coste unitario. Detalle por hora, recurso y etiqueta.
- AWS — Split Cost Allocation Data Reparto del coste de un nodo entre los pods que se ejecutan en él. Respalda la fila correspondiente del capítulo 3.
- AWS — Etiquetas de asignación de costes Mecanismo de atribución de recursos etiquetables. Su límite —no reescribe el histórico— está citado en el capítulo 3.
- AWS — Cost Categories Agrupación de líneas de factura en dimensiones de negocio mediante reglas.
- AWS Well-Architected — Pilar de optimización de costes Marco de referencia para la disciplina de coste. Respalda el enfoque de coste unitario del capítulo 1.
- AWS Well-Architected — Pilar de eficiencia del rendimiento Relación entre dimensionamiento, latencia y coste, base conceptual de los capítulos 5 y 6.
- Amazon Builders' Library — Timeouts, retries and backoff with jitter Respalda el tratamiento de reintentos como presupuesto acotado y su efecto sobre la cola (capítulos 1 y 2).
- Amazon Builders' Library — Using load shedding to avoid overload Respalda la afirmación de que rechazar pronto es el fallo más barato posible (capítulos 1 y 5).
- FinOps Framework Marco de la disciplina. Respalda la separación entre informar, optimizar y operar que estructura el capítulo 12.
- FOCUS — FinOps Open Cost and Usage Specification Especificación abierta de datos de coste. Relevante para organizaciones multinube que necesitan un esquema común.
Telemetría, métricas y observabilidad
- OpenTelemetry — Semantic Conventions Referencia de todos los nombres de atributo del capítulo 3 y del capítulo 8.
- OpenTelemetry — Resource Semantic Conventions Origen de service.name, deployment.environment, cloud.provider y cloud.region. Son los atributos estables del esquema.
- OpenTelemetry — Semantic Conventions for Generative AI Origen de gen_ai.request.model y de los atributos de uso de tokens. Área en desarrollo: verificar contra la versión en uso.
- OpenTelemetry — Sampling Respalda la recomendación de muestreo dirigido del capítulo 3: conservar el 100 % de lo que falla.
- Micrometer — Documentación de referencia Medidores, etiquetas y distribución. Base del código del capítulo 8.
- Spring Boot Actuator — Metrics Propiedades de distribución, histogramas y objetivos de nivel de servicio usadas en el capítulo 8.
- Spring Boot Actuator — Tracing Configuración de muestreo y exportación de trazas.
- Prometheus — Histograms and summaries Respalda la afirmación central del capítulo 8: los percentiles por instancia no son agregables.
- Prometheus — histogram_quantile Semántica exacta de la función usada en las consultas del capítulo 8, incluida la interpolación entre cubos.
- Prometheus — Metric and label naming Convenciones de nombrado y advertencias sobre cardinalidad de etiquetas.
- The RED Method Tasa, errores y duración por servicio. El capítulo 8 añade a este esquema el resultado de negocio.
- Brendan Gregg — The USE Method Utilización, saturación y errores por recurso. Estructura del diagnóstico del capítulo 5.
- OpenCost Atribución de coste por espacio de nombres y despliegue en Kubernetes. Citado en el capítulo 3 con su límite: trabaja con los precios que se le configuren.
Plataforma, JVM y fiabilidad
- Kubernetes — Managing resources for containers Peticiones y límites de recursos. Respalda la explicación de la restricción de CPU por cuota del capítulo 5.
- Kubernetes — Horizontal Pod Autoscaling Métricas admitidas para el autoescalado, incluidas las que no son CPU. Base de la alternativa propuesta en el capítulo 5.
- HotSpot Virtual Machine Garbage Collection Tuning Guide Comportamiento de los recolectores y sus pausas. Respalda la relación entre memoria y cola de latencia.
- JEP 444 — Virtual Threads Modelo de concurrencia que cambia cuánta infraestructura hace falta para un tiempo de permanencia dado (capítulo 5).
- Google SRE Book — Service Level Objectives Definición de indicador, objetivo y presupuesto de error usada en el capítulo 2.
- Google SRE Workbook — Implementing SLOs Elección de percentil y de ventana. Respalda la regla de elegir el percentil por volumen de peticiones afectadas.
Teoría de colas y medición de latencia
- J. D. C. Little — A Proof for the Queuing Formula: L = λW (Operations Research, 1961) Fuente original de la ley de Little, base del capítulo 5 y de la relación entre latencia y capacidad.
- J. D. C. Little y S. C. Graves — Little's Law (Building Intuition, INFORMS, 2008) Exposición moderna y condiciones de aplicabilidad. Respalda que la identidad no supone distribución alguna.
- J. Dean y L. A. Barroso — The Tail at Scale (Communications of the ACM, 2013) Fuente de referencia sobre por qué la cola de latencia domina la experiencia en sistemas distribuidos. Capítulo 2.
- Gil Tene — How NOT to Measure Latency Descripción de la omisión coordinada y de sus consecuencias sobre los percentiles publicados. Capítulos 2 y 7.
- HdrHistogram Herramienta para registrar distribuciones de latencia con precisión en la cola y corregir la omisión coordinada.
IA generativa
- Spring AI — Documentación de referencia Integración de modelos y recuperación en aplicaciones Spring Boot, contexto del caso práctico del capítulo 9.
- Spring AI — Observabilidad Métricas y trazas que emite el propio marco, incluidas las de uso de tokens. Complementa el capítulo 8.
- Anthropic — Prompt caching Ejemplo de documentación oficial donde se especifican las tarifas diferenciadas de escritura y lectura de caché y su ventana de validez, que son los parámetros w, r y h del capítulo 4.
Continúa en este sitio
- Observabilidad en Microservicios El montaje de la plataforma de señales —Micrometer, OpenTelemetry, Prometheus y Grafana— que esta guía da por supuesto en el capítulo 8.
- Virtual Threads en Java 21 El modelo de concurrencia que determina cuántas peticiones en curso sostiene una réplica, que es el parámetro que convierte la ley de Little en número de réplicas.
- Arquitectura Hexagonal desde cero Cómo aislar el dominio tras puertos para poder instrumentar la operación de negocio sin contaminar el modelo.
- Arquitectura Java Decisiones estructurales en plataformas Java enterprise, donde se toman las que fijan el techo de coste unitario.
- Spring Boot Arquitectura, rendimiento y configuración, incluidas las propiedades de Actuator usadas en el capítulo 8.
- Inteligencia Artificial Empresarial Adopción de IA en plataformas enterprise: es el contexto donde el coste por tarea útil del capítulo 4 se convierte en decisión de producto.
- Auditoría técnica El servicio que instancia esta guía con los datos de una plataforma concreta: modelo de costes, telemetría de negocio y plan priorizado.
- Servicios de consultoría Arquitectura, modernización, cloud e IA para plataformas Java.
- Hablemos de tu plataforma Para evaluar si el coste por resultado útil se puede calcular hoy en tu organización y qué haría falta.
¿Cuánto cuesta una operación completada dentro del SLO en tu plataforma?
Si la respuesta exige cruzar a mano exportaciones de facturación con capturas de paneles, el problema es de arquitectura y observabilidad, no de reporting. Una auditoría técnica deja el modelo de costes por servicio y operación instanciado con tus datos, la telemetría de negocio funcionando, los SLO fijados por percentil y un plan de optimización ordenado por impacto sobre el coste por resultado útil.