From 31290968977c380c702beb6f214ce6e1b16f678c Mon Sep 17 00:00:00 2001 From: lcian Date: Thu, 8 May 2025 13:16:49 +0200 Subject: [PATCH] feat(otel): capture span events --- sentry-opentelemetry/src/converters.rs | 27 ++++++++++++++++++++++++++ sentry-opentelemetry/src/processor.rs | 10 +++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/sentry-opentelemetry/src/converters.rs b/sentry-opentelemetry/src/converters.rs index 0f664514..e07cf786 100644 --- a/sentry-opentelemetry/src/converters.rs +++ b/sentry-opentelemetry/src/converters.rs @@ -1,4 +1,7 @@ +use std::collections::BTreeMap; + use sentry_core::protocol::{value::Number, SpanId, SpanStatus, TraceId, Value}; +use sentry_core::protocol::{Context, Event}; pub(crate) fn convert_span_id(span_id: &opentelemetry::SpanId) -> SpanId { span_id.to_bytes().into() @@ -54,3 +57,27 @@ pub(crate) fn convert_value(value: opentelemetry::Value) -> Value { _ => Value::Null, // non-exhaustive } } + +pub(crate) fn convert_event(event: &opentelemetry::trace::Event) -> Event<'static> { + let otel_context = sentry_core::protocol::OtelContext { + attributes: event + .attributes + .iter() + .map(|key_value| { + ( + key_value.key.as_str().into(), + convert_value(key_value.value.clone()), + ) + }) + .collect(), + ..Default::default() + }; + let mut contexts = BTreeMap::::new(); + contexts.insert("otel".to_owned(), otel_context.into()); + Event { + level: sentry_core::Level::Error, + message: Some(event.name.to_string()), + contexts, + ..Default::default() + } +} diff --git a/sentry-opentelemetry/src/processor.rs b/sentry-opentelemetry/src/processor.rs index d1a27338..d04a9860 100644 --- a/sentry-opentelemetry/src/processor.rs +++ b/sentry-opentelemetry/src/processor.rs @@ -23,7 +23,8 @@ use sentry_core::SentryTrace; use sentry_core::{TransactionContext, TransactionOrSpan}; use crate::converters::{ - convert_span_id, convert_span_kind, convert_span_status, convert_trace_id, convert_value, + convert_event, convert_span_id, convert_span_kind, convert_span_status, convert_trace_id, + convert_value, }; /// A mapping from Sentry span IDs to Sentry spans/transactions. @@ -152,14 +153,17 @@ impl SpanProcessor for SentrySpanProcessor { return; }; - // TODO: read OTEL span events and convert them to Sentry breadcrumbs/events - sentry_span.set_data("otel.kind", convert_span_kind(data.span_kind)); for attribute in data.attributes { sentry_span.set_data(attribute.key.as_str(), convert_value(attribute.value)); } // TODO: read OTEL semantic convention span attributes and map them to the appropriate // Sentry span attributes/context values + + for event in data.events { + sentry_core::capture_event(convert_event(&event)); + } + sentry_span.set_status(convert_span_status(&data.status)); sentry_span.finish_with_timestamp(data.end_time); }