Skip to content

Soporte parcial

Visión general ​

Observar una aplicación en producción significa poder responder qué está haciendo, qué tan rápido y por qué falla. Corvis no trae una plataforma de observabilidad (SDK de trazas, métricas, panel ni integración con proveedores de APM). Lo que sí ofrece son las piezas básicas sobre las que montar la tuya:

NecesidadQué hay en Corvis
Logs estructuradosConsoleLogger::new().json(true) escribe una línea JSON por entrada; LoggerService permite enviar los logs a donde quieras (ver Logging)
Duración de cada peticióncorvis::LoggingInterceptor registra método, URL, estado y milisegundos; o un interceptor propio que mida y publique la métrica
Errores no controladosUn filtro de excepciones global ve cada error antes de que se responda; exception.is_internal() distingue los errores inesperados
Estado de la instanciaTerminusModule y HealthCheckService (ver Health checks)

Las demás páginas de esta sección describen funciones que todavía no existen en Corvis y, cuando aplica, cómo cubrir la necesidad con estas piezas.

Ejemplo: un interceptor de métricas ​

rust
use std::time::Instant;

#[injectable]
pub struct MetricsInterceptor {
    #[init(Logger::new("Metrics"))]
    logger: Logger,
}

#[async_trait]
impl CorvisInterceptor for MetricsInterceptor {
    async fn intercept(&self, ctx: &ExecutionContext, next: CallHandler) -> HandlerResult {
        let started = Instant::now();
        let route = format!("{}.{}", ctx.get_class().name, ctx.get_handler().name);
        let result = next.handle().await;
        let status = match &result {
            Ok(r) => r.status().map(|s| s.as_u16()).unwrap_or(200),
            Err(e) => e.get_status(),
        };
        self.logger.log(format!("{route} {status} {}us", started.elapsed().as_micros()));
        result
    }
}

Regístralo como global con Provider::app_interceptor::<MetricsInterceptor>() en el módulo raíz. En lugar de escribir un log, puedes publicar el valor en el sistema de métricas que uses.

Publicado bajo la licencia MIT.