Saltar al contenido principal
Version: 0.51.0-rc.18

Trazabilidad y Observabilidad

Este documento describe la infraestructura de observabilidad de Lana, incluyendo el rastreo distribuido con OpenTelemetry.

Descripción General

Lana implementa observabilidad integral mediante:

  • Rastreo Distribuido: Integración con OpenTelemetry
  • Registro Estructurado: Entradas de registro contextuales
  • Métricas: Métricas de rendimiento y negocio
  • Correlación: Rastreo de solicitudes entre servicios

Arquitectura

Integración con OpenTelemetry

Configuración

use opentelemetry::global;
use opentelemetry_otlp::WithExportConfig;
use tracing_subscriber::prelude::*;

pub fn init_telemetry() -> Result<()> {
let tracer = opentelemetry_otlp::new_pipeline()
.tracing()
.with_exporter(
opentelemetry_otlp::new_exporter()
.tonic()
.with_endpoint("http://localhost:4317")
)
.install_batch(opentelemetry::runtime::Tokio)?;

let telemetry = tracing_opentelemetry::layer()
.with_tracer(tracer);

tracing_subscriber::registry()
.with(telemetry)
.with(tracing_subscriber::fmt::layer())
.init();

Ok(())
}

Instrumentación

use tracing::{instrument, info, span, Level};

#[instrument(skip(self), fields(facility_id = %facility_id))]
pub async fn process_disbursal(
&self,
facility_id: CreditFacilityId,
) -> Result<Disbursal> {
info!("Processing disbursal");

let facility = self.repo.find_by_id(facility_id).await?;

// Nested span for ledger operation
let ledger_span = span!(Level::INFO, "ledger_transfer");
let _guard = ledger_span.enter();

self.ledger.transfer(facility.amount).await?;

info!("Disbursal completed");
Ok(disbursal)
}

Propagación de Contexto

Cabeceras HTTP

El contexto de rastreo se propaga a través de cabeceras HTTP:

traceparent: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
tracestate: lana=value

Contexto de GraphQL

pub struct GraphQLContext {
trace_id: TraceId,
span_id: SpanId,
subject: SubjectId,
}

impl GraphQLContext {
pub fn from_request(req: &Request) -> Self {
let trace_context = extract_trace_context(req);
Self {
trace_id: trace_context.trace_id,
span_id: trace_context.span_id,
subject: extract_subject(req),
}
}
}

Registro Estructurado

Formato de Registro

use tracing::{info, warn, error};

// Structured log with context
info!(
customer_id = %customer.id,
email = %customer.email,
"Customer created"
);

// Error with context
error!(
error = %e,
facility_id = %facility_id,
"Failed to process disbursal"
);

Niveles de Registro

NivelUso
ERRORFallos del sistema, requiere atención
WARNCondiciones inesperadas pero recuperables
INFOOperaciones de negocio, eventos de auditoría
DEBUGInformación detallada de depuración
TRACERastreo muy detallado

Métricas

Métricas de Negocio

use metrics::{counter, gauge, histogram};

// Count operations
counter!("disbursals_processed_total").increment(1);

// Track current values
gauge!("active_facilities").set(count as f64);

// Measure durations
histogram!("disbursal_processing_seconds").record(duration);

Métricas del Sistema

  • Latencia de solicitudes
  • Tasas de error
  • Pool de conexiones a la base de datos
  • Uso de memoria

IDs de Correlación

Todas las solicitudes llevan contexto de correlación:

#[derive(Debug, Clone)]
pub struct CorrelationContext {
pub trace_id: String,
pub span_id: String,
pub request_id: Uuid,
pub subject_id: Option<SubjectId>,
}

impl CorrelationContext {
pub fn new() -> Self {
Self {
trace_id: Span::current().context().trace_id().to_string(),
span_id: Span::current().context().span_id().to_string(),
request_id: Uuid::new_v4(),
subject_id: None,
}
}
}

Paneles

Panel de Operaciones

  • Volumen y latencia de solicitudes
  • Tasas de error por endpoint
  • Usuarios activos
  • Estado del sistema

Panel de Negocio

  • Creaciones de instalaciones por día
  • Volumen de desembolsos
  • Procesamiento de pagos
  • Incorporación de clientes

Alertas

Alertas Críticas

  • Servicio no disponible
  • Tasa de error alta (>5%)
  • Fallas de conexión a la base de datos
  • Tiempos de espera agotados en servicios externos

Alertas de Advertencia

  • Latencia elevada
  • Profundidad de cola alta
  • Presión de memoria
  • Espacio en disco bajo