Skip to content

Commit 27b6c5d

Browse files
authored
Merge pull request #7 from Validus-Risk-Management/fix-missing-traces-in-logs
Retrieve the trace ID and span ID from the otel context
2 parents 6abd036 + 24114ed commit 27b6c5d

File tree

2 files changed

+15
-66
lines changed

2 files changed

+15
-66
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ddtrace"
3-
version = "0.2.0"
3+
version = "0.2.1"
44
authors = ["David Steiner <david_j_steiner@yahoo.co.nz", "Fergus Strangways-Dixon <fergusdixon101@gmail.com>"]
55
edition = "2021"
66
license = "MIT"

src/formatter.rs

Lines changed: 14 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -8,47 +8,15 @@
88
use std::io;
99

1010
use chrono::Utc;
11-
use opentelemetry::trace::{SpanId, TraceId};
11+
use opentelemetry::trace::TraceContextExt;
1212
use serde::ser::{SerializeMap, Serializer as _};
13-
use serde::Serialize;
14-
use tracing::{Event, Subscriber};
15-
use tracing_opentelemetry::OtelData;
13+
use tracing::{Event, Span, Subscriber};
14+
use tracing_opentelemetry::OpenTelemetrySpanExt;
1615
use tracing_serde::fields::AsMap;
1716
use tracing_serde::AsSerde;
1817
use tracing_subscriber::fmt::format::Writer;
1918
use tracing_subscriber::fmt::{FmtContext, FormatEvent, FormatFields};
20-
use tracing_subscriber::registry::{LookupSpan, SpanRef};
21-
22-
#[derive(Serialize)]
23-
struct DatadogId(u64);
24-
25-
struct TraceInfo {
26-
trace_id: DatadogId,
27-
span_id: DatadogId,
28-
}
29-
30-
impl From<TraceId> for DatadogId {
31-
fn from(value: TraceId) -> Self {
32-
let bytes = &value.to_bytes()[size_of::<u64>()..size_of::<u128>()];
33-
Self(u64::from_be_bytes(bytes.try_into().unwrap()))
34-
}
35-
}
36-
37-
impl From<SpanId> for DatadogId {
38-
fn from(value: SpanId) -> Self {
39-
Self(u64::from_be_bytes(value.to_bytes()))
40-
}
41-
}
42-
43-
fn lookup_trace_info<S>(span_ref: &SpanRef<S>) -> Option<TraceInfo>
44-
where
45-
S: Subscriber + for<'a> LookupSpan<'a>,
46-
{
47-
span_ref.extensions().get::<OtelData>().map(|o| TraceInfo {
48-
trace_id: o.builder.trace_id.unwrap_or(TraceId::INVALID).into(),
49-
span_id: o.builder.span_id.unwrap_or(SpanId::INVALID).into(),
50-
})
51-
}
19+
use tracing_subscriber::registry::LookupSpan;
5220

5321
// mostly stolen from here: https://github.com/tokio-rs/tracing/issues/1531
5422
pub struct DatadogFormatter;
@@ -60,7 +28,7 @@ where
6028
{
6129
fn format_event(
6230
&self,
63-
ctx: &FmtContext<'_, S, N>,
31+
_ctx: &FmtContext<'_, S, N>,
6432
mut writer: Writer<'_>,
6533
event: &Event<'_>,
6634
) -> std::fmt::Result
@@ -77,12 +45,15 @@ where
7745
serializer.serialize_entry("fields", &event.field_map())?;
7846
serializer.serialize_entry("target", meta.target())?;
7947

80-
if let Some(ref span_ref) = ctx.lookup_current() {
81-
if let Some(trace_info) = lookup_trace_info(span_ref) {
82-
serializer.serialize_entry("dd.span_id", &trace_info.span_id)?;
83-
serializer.serialize_entry("dd.trace_id", &trace_info.trace_id)?;
84-
}
85-
}
48+
let otel_context = Span::current().context();
49+
let span = otel_context.span();
50+
let span_context = span.span_context();
51+
52+
let span_id = span_context.span_id();
53+
let trace_id = span_context.trace_id();
54+
55+
serializer.serialize_entry("dd.span_id", &format!("{span_id}"))?;
56+
serializer.serialize_entry("dd.trace_id", &format!("{trace_id}"))?;
8657

8758
serializer.end()
8859
};
@@ -115,25 +86,3 @@ impl<'a> io::Write for WriteAdaptor<'a> {
11586
Ok(())
11687
}
11788
}
118-
119-
#[cfg(test)]
120-
mod tests {
121-
use crate::formatter::DatadogId;
122-
use opentelemetry::trace::{SpanId, TraceId};
123-
124-
#[test]
125-
fn test_trace_id_converted_to_datadog_id() {
126-
let trace_id = TraceId::from_hex("2de7888d8f42abc9c7ba048b78f7a9fb").unwrap();
127-
let datadog_id: DatadogId = trace_id.into();
128-
129-
assert_eq!(datadog_id.0, 14391820556292303355);
130-
}
131-
132-
#[test]
133-
fn test_span_id_converted_to_datadog_id() {
134-
let span_id = SpanId::from_hex("58406520a0066491").unwrap();
135-
let datadog_id: DatadogId = span_id.into();
136-
137-
assert_eq!(datadog_id.0, 6359193864645272721);
138-
}
139-
}

0 commit comments

Comments
 (0)