diff --git a/src/otel.rs b/src/otel.rs index e3e70e9..b464e9c 100644 --- a/src/otel.rs +++ b/src/otel.rs @@ -3,7 +3,7 @@ use actix_web::HttpRequest; use opentelemetry::global::BoxedTracer; use opentelemetry::{global, Context, KeyValue}; use opentelemetry::propagation::TextMapPropagator; -use opentelemetry::trace::Tracer; +use opentelemetry::trace::{Status, TraceContextExt, Tracer}; use opentelemetry_appender_log::OpenTelemetryLogBridge; use opentelemetry_otlp::WithExportConfig; use opentelemetry_sdk::logs::{BatchLogProcessor, SdkLoggerProvider}; @@ -82,15 +82,26 @@ pub fn extract_context_from_request(req: &HttpRequest) -> Context { propagator.extract(&HeaderExtractor(req.headers())) } -pub fn trace_db_call(operation: &str, query_type: &str, func: F) -> anyhow::Result +pub fn trace_db_call(query_type: &str, operation: &str, func: F) -> anyhow::Result where F: FnOnce() -> anyhow::Result { let tracer = global::tracer("db"); - let _span = tracer - .span_builder(format!("db.{}.{}", operation, query_type)) + let span = tracer + .span_builder(format!("db.{}.{}", query_type, operation)) .with_attributes(vec![ - KeyValue::new("db.operation", operation.to_string().clone()), KeyValue::new("db.query_type", query_type.to_string().clone()), + KeyValue::new("db.operation", operation.to_string().clone()), ]).start(&tracer); - func() + let context = Context::current_with_span(span); + let result = func(); + match &result { + Ok(_) => { + context.span().set_status(Status::Ok); + } + Err(e) => { + context.span().set_status(Status::error(e.to_string())) + } + } + + result } \ No newline at end of file