Convert opencode transcripts to otel (or agent) traces
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Fix timestamp support for OpenTelemetry spans

rektide b8defa52 870da1cd

+41 -9
+41 -9
src/exporter.rs
··· 5 5 use opentelemetry_sdk::trace::Tracer as SdkTracer; 6 6 use opentelemetry_sdk::trace::TracerProvider; 7 7 use opentelemetry_sdk::Resource; 8 + use std::time::{Duration, SystemTime}; 9 + 10 + fn convert_to_system_time(timestamp_ms: u64) -> SystemTime { 11 + SystemTime::UNIX_EPOCH + Duration::from_millis(timestamp_ms as i64) 12 + } 13 + 14 + fn convert_duration_ms(duration_ms: Option<u64>) -> Option<Duration> { 15 + duration_ms.map(|ms| Duration::from_millis(ms)) 16 + } 8 17 9 18 use crate::config::{OtlpConfig, OtlpProtocol}; 10 19 use crate::parser::{GenAiSpan, SpanType}; ··· 152 161 let span_name = format!("tools/call {}", span.attributes.get("gen_ai.tool.name").unwrap().as_str().unwrap()); 153 162 154 163 let attr_count = attributes.len(); 155 - let span_name_clone = span_name.clone(); 156 164 157 - let mut builder = SpanBuilder::from_name(span_name); 165 + let mut builder = SpanBuilder::from_name(span_name.clone()); 158 166 builder.span_kind = Some(SpanKind::Client); 159 167 builder.attributes = Some(attributes); 160 168 161 - let mut span = self.tracer.build(builder); 162 - span.end(); 169 + let start_time = convert_to_system_time(span.timestamp_ms); 170 + builder.start_time = Some(start_time); 171 + 172 + if let Some(duration_ms) = span.duration_ms { 173 + let end_timestamp = span.timestamp.checked_add(jiff::Span::new().try_milliseconds(duration_ms as i64).unwrap()).unwrap(); 174 + let start_time = convert_to_system_time(span.timestamp_ms); 175 + builder.end_time = Some(end_time); 176 + } 177 + 178 + let _span = self.tracer.build(builder); 163 179 164 180 tracing::debug!( 165 181 "Created span: {} with {} attributes", 166 - span_name_clone, 182 + span_name, 167 183 attr_count 168 184 ); 169 185 } ··· 213 229 builder.span_kind = Some(SpanKind::Client); 214 230 builder.attributes = Some(attributes); 215 231 216 - let mut span = self.tracer.build(builder); 217 - span.end(); 232 + let start_time = convert_to_system_time(span.timestamp_ms); 233 + builder.start_time = Some(start_time); 234 + 235 + if let Some(duration_ms) = span.duration_ms { 236 + let end_timestamp = span.timestamp.checked_add(jiff::Span::new().try_milliseconds(duration_ms as i64).unwrap()).unwrap(); 237 + let start_time = convert_to_system_time(span.timestamp_ms); 238 + builder.end_time = Some(end_time); 239 + } 240 + 241 + let _span = self.tracer.build(builder); 218 242 219 243 tracing::debug!( 220 244 "Created span: {} with {} attributes", ··· 257 281 builder.span_kind = Some(SpanKind::Internal); 258 282 builder.attributes = Some(attributes); 259 283 260 - let mut span = self.tracer.build(builder); 261 - span.end(); 284 + let start_time = convert_to_system_time(span.timestamp_ms); 285 + builder.start_time = Some(start_time); 286 + 287 + if let Some(duration_ms) = span.duration_ms { 288 + let end_timestamp = span.timestamp.checked_add(jiff::Span::new().try_milliseconds(duration_ms as i64).unwrap()).unwrap(); 289 + let start_time = convert_to_system_time(span.timestamp_ms); 290 + builder.end_time = Some(end_time); 291 + } 292 + 293 + let _span = self.tracer.build(builder); 262 294 263 295 tracing::debug!( 264 296 "Created span: {} with {} attributes",