Try fixing span context for db call tracing
This commit is contained in:
23
src/otel.rs
23
src/otel.rs
@@ -3,7 +3,7 @@ use actix_web::HttpRequest;
|
|||||||
use opentelemetry::global::BoxedTracer;
|
use opentelemetry::global::BoxedTracer;
|
||||||
use opentelemetry::{global, Context, KeyValue};
|
use opentelemetry::{global, Context, KeyValue};
|
||||||
use opentelemetry::propagation::TextMapPropagator;
|
use opentelemetry::propagation::TextMapPropagator;
|
||||||
use opentelemetry::trace::Tracer;
|
use opentelemetry::trace::{Status, TraceContextExt, Tracer};
|
||||||
use opentelemetry_appender_log::OpenTelemetryLogBridge;
|
use opentelemetry_appender_log::OpenTelemetryLogBridge;
|
||||||
use opentelemetry_otlp::WithExportConfig;
|
use opentelemetry_otlp::WithExportConfig;
|
||||||
use opentelemetry_sdk::logs::{BatchLogProcessor, SdkLoggerProvider};
|
use opentelemetry_sdk::logs::{BatchLogProcessor, SdkLoggerProvider};
|
||||||
@@ -82,15 +82,26 @@ pub fn extract_context_from_request(req: &HttpRequest) -> Context {
|
|||||||
propagator.extract(&HeaderExtractor(req.headers()))
|
propagator.extract(&HeaderExtractor(req.headers()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn trace_db_call<F, O>(operation: &str, query_type: &str, func: F) -> anyhow::Result<O>
|
pub fn trace_db_call<F, O>(query_type: &str, operation: &str, func: F) -> anyhow::Result<O>
|
||||||
where F: FnOnce() -> anyhow::Result<O> {
|
where F: FnOnce() -> anyhow::Result<O> {
|
||||||
let tracer = global::tracer("db");
|
let tracer = global::tracer("db");
|
||||||
let _span = tracer
|
let span = tracer
|
||||||
.span_builder(format!("db.{}.{}", operation, query_type))
|
.span_builder(format!("db.{}.{}", query_type, operation))
|
||||||
.with_attributes(vec![
|
.with_attributes(vec![
|
||||||
KeyValue::new("db.operation", operation.to_string().clone()),
|
|
||||||
KeyValue::new("db.query_type", query_type.to_string().clone()),
|
KeyValue::new("db.query_type", query_type.to_string().clone()),
|
||||||
|
KeyValue::new("db.operation", operation.to_string().clone()),
|
||||||
]).start(&tracer);
|
]).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
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user