ADR 0014 — OpenTelemetry y Prometheus
- Estado: aceptada
- Fecha: 2026-09-25
Decisiones
- Puerto
Telemetryen el núcleo, con todo opcional:span()envuelve cadaobserver.trace(las operaciones internas quedan como hijas), yrecordOperation,recordRequestyrecordErrorreciben muestras ya medidas.logFields()agrega campos a los logs del observer. El núcleo no depende de OpenTelemetry ni de prom-client. - Correlación log ↔ traza ↔ error. Con
@tenancy-node/otel, cada log de operación y cada log de error llevantraceIdyspanId. El span registra la excepción y un eventotenancy.errorcon elerrorIddel registro de errores: de una traza se llega al error del tenant, y del log a la traza. tenant.idva siempre en las trazas, en el span de cada operación y en el span HTTP activo (el deinstrumentation-http) cuando se identifica el tenant.- En las métricas, el tenant es opcional (
perTenant). Cada tenant multiplica las series y miles de tenants tumban a Prometheus. ConperTenant: truehay un tope (maxTenants, 100) y el resto va comoother. También se puede dar una lista o una función de tenants permitidos. Las rutas HTTP usan la plantilla (/pedidos/:id), nunca la ruta real; sin plantilla van comounmatched. - La telemetría nunca rompe la app: un error dentro de una implementación se ignora.
@tenancy-node/otelsolo usa@opentelemetry/api. El SDK y el exportador los configura la app. Sin SDK, la API es no-op y no cuesta nada.
Métricas
| Prometheus | OpenTelemetry | Etiquetas |
|---|---|---|
tenancy_operation_duration_seconds | tenancy.operation.duration | operación, resultado (+ tenant) |
tenancy_http_request_duration_seconds | tenancy.http.server.duration | método, ruta (plantilla), clase de estado (+ tenant) |
tenancy_errors_total | tenancy.errors | operación, código TENANCY_* (+ tenant) |