Skip to content

Commit 34f5e97

Browse files
committed
initial commit
1 parent 106ce5d commit 34f5e97

File tree

11 files changed

+72
-26
lines changed

11 files changed

+72
-26
lines changed

opentelemetry-otlp/src/exporter/http/mod.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -307,12 +307,16 @@ impl OtlpHttpClient {
307307
fn build_trace_export_body(
308308
&self,
309309
spans: Vec<SpanData>,
310+
resource: &opentelemetry_proto::transform::common::tonic::ResourceAttributesWithSchema,
310311
) -> opentelemetry::trace::TraceResult<(Vec<u8>, &'static str)> {
311312
use opentelemetry_proto::tonic::collector::trace::v1::ExportTraceServiceRequest;
312313

313-
let req = ExportTraceServiceRequest {
314-
resource_spans: spans.into_iter().map(Into::into).collect(),
315-
};
314+
let resource_spans = spans
315+
.into_iter()
316+
.map(|log_event| (log_event, resource).into())
317+
.collect::<Vec<_>>();
318+
319+
let req = ExportTraceServiceRequest { resource_spans };
316320
match self.protocol {
317321
#[cfg(feature = "http-json")]
318322
Protocol::HttpJson => match serde_json::to_string_pretty(&req) {

opentelemetry-otlp/src/exporter/http/trace.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ impl SpanExporter for OtlpHttpClient {
2121
Err(err) => return Box::pin(std::future::ready(Err(err))),
2222
};
2323

24-
let (body, content_type) = match self.build_trace_export_body(batch) {
24+
let (body, content_type) = match self.build_trace_export_body(batch, &self.resource) {
2525
Ok(body) => body,
2626
Err(e) => return Box::pin(std::future::ready(Err(e))),
2727
};
@@ -66,4 +66,8 @@ impl SpanExporter for OtlpHttpClient {
6666
fn shutdown(&mut self) {
6767
let _ = self.client.lock().map(|mut c| c.take());
6868
}
69+
70+
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {
71+
self.resource = resource.into();
72+
}
6973
}

opentelemetry-otlp/src/exporter/tonic/logs.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use super::BoxInterceptor;
1212
pub(crate) struct TonicLogsClient {
1313
inner: Option<ClientInner>,
1414
#[allow(dead_code)]
15-
// <allow dead> would be removed once we support set_resource for metrics and traces.
15+
// <allow dead> would be removed once we support set_resource for metrics.
1616
resource: opentelemetry_proto::transform::common::tonic::ResourceAttributesWithSchema,
1717
}
1818

opentelemetry-otlp/src/exporter/tonic/trace.rs

+18-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ use super::BoxInterceptor;
1212

1313
pub(crate) struct TonicTracesClient {
1414
inner: Option<ClientInner>,
15+
#[allow(dead_code)]
16+
// <allow dead> would be removed once we support set_resource for metrics.
17+
resource: opentelemetry_proto::transform::common::tonic::ResourceAttributesWithSchema,
1518
}
1619

1720
struct ClientInner {
@@ -43,6 +46,7 @@ impl TonicTracesClient {
4346
client,
4447
interceptor,
4548
}),
49+
resource: Default::default(),
4650
}
4751
}
4852
}
@@ -66,14 +70,21 @@ impl SpanExporter for TonicTracesClient {
6670
}
6771
};
6872

73+
// TODO: Avoid cloning here.
74+
let resource_spans = {
75+
batch
76+
.into_iter()
77+
.map(|log_data| (log_data, &self.resource))
78+
.map(Into::into)
79+
.collect()
80+
};
81+
6982
Box::pin(async move {
7083
client
7184
.export(Request::from_parts(
7285
metadata,
7386
extensions,
74-
ExportTraceServiceRequest {
75-
resource_spans: batch.into_iter().map(Into::into).collect(),
76-
},
87+
ExportTraceServiceRequest { resource_spans },
7788
))
7889
.await
7990
.map_err(crate::Error::from)?;
@@ -85,4 +96,8 @@ impl SpanExporter for TonicTracesClient {
8596
fn shutdown(&mut self) {
8697
let _ = self.inner.take();
8798
}
99+
100+
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {
101+
self.resource = resource.into();
102+
}
88103
}

opentelemetry-otlp/src/span.rs

+4
Original file line numberDiff line numberDiff line change
@@ -227,4 +227,8 @@ impl opentelemetry_sdk::export::trace::SpanExporter for SpanExporter {
227227
fn export(&mut self, batch: Vec<SpanData>) -> BoxFuture<'static, ExportResult> {
228228
self.0.export(batch)
229229
}
230+
231+
fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) {
232+
self.0.set_resource(resource);
233+
}
230234
}

opentelemetry-proto/src/transform/trace.rs

+5-9
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pub mod tonic {
44
use crate::proto::tonic::trace::v1::{span, status, ResourceSpans, ScopeSpans, Span, Status};
55
use crate::transform::common::{
66
to_nanos,
7-
tonic::{resource_attributes, Attributes},
7+
tonic::{Attributes, ResourceAttributesWithSchema},
88
};
99
use opentelemetry::trace;
1010
use opentelemetry::trace::{Link, SpanId, SpanKind};
@@ -45,19 +45,15 @@ pub mod tonic {
4545
}
4646
}
4747

48-
impl From<SpanData> for ResourceSpans {
49-
fn from(source_span: SpanData) -> Self {
48+
impl From<(SpanData, &ResourceAttributesWithSchema)> for ResourceSpans {
49+
fn from((source_span, resource): (SpanData, &ResourceAttributesWithSchema)) -> Self {
5050
let span_kind: span::SpanKind = source_span.span_kind.into();
5151
ResourceSpans {
5252
resource: Some(Resource {
53-
attributes: resource_attributes(&source_span.resource).0,
53+
attributes: resource.attributes.0.clone(),
5454
dropped_attributes_count: 0,
5555
}),
56-
schema_url: source_span
57-
.resource
58-
.schema_url()
59-
.map(|url| url.to_string())
60-
.unwrap_or_default(),
56+
schema_url: resource.schema_url.clone().unwrap_or_default(),
6157
scope_spans: vec![ScopeSpans {
6258
schema_url: source_span
6359
.instrumentation_lib

opentelemetry-stdout/src/trace/exporter.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ use opentelemetry_sdk::export::{self, trace::ExportResult};
55
use std::io::{stdout, Write};
66

77
use crate::trace::transform::SpanData;
8+
use opentelemetry_sdk::resource::Resource;
89

910
type Encoder = Box<dyn Fn(&mut dyn Write, SpanData) -> TraceResult<()> + Send + Sync>;
1011

1112
/// An OpenTelemetry exporter that writes to stdout on export.
1213
pub struct SpanExporter {
1314
writer: Option<Box<dyn Write + Send + Sync>>,
1415
encoder: Encoder,
16+
resource: Resource,
1517
}
1618

1719
impl fmt::Debug for SpanExporter {
@@ -36,7 +38,11 @@ impl Default for SpanExporter {
3638
impl opentelemetry_sdk::export::trace::SpanExporter for SpanExporter {
3739
fn export(&mut self, batch: Vec<export::trace::SpanData>) -> BoxFuture<'static, ExportResult> {
3840
let res = if let Some(writer) = &mut self.writer {
39-
(self.encoder)(writer, crate::trace::SpanData::from(batch)).and_then(|_| {
41+
(self.encoder)(
42+
writer,
43+
crate::trace::SpanData::from((batch, &self.resource)),
44+
)
45+
.and_then(|_| {
4046
writer
4147
.write_all(b"\n")
4248
.map_err(|err| TraceError::Other(Box::new(err)))
@@ -51,6 +57,10 @@ impl opentelemetry_sdk::export::trace::SpanExporter for SpanExporter {
5157
fn shutdown(&mut self) {
5258
self.writer.take();
5359
}
60+
61+
fn set_resource(&mut self, res: &opentelemetry_sdk::Resource) {
62+
self.resource = res.clone();
63+
}
5464
}
5565

5666
/// Configuration for the stdout trace exporter
@@ -107,6 +117,7 @@ impl SpanExporterBuilder {
107117
pub fn build(self) -> SpanExporter {
108118
SpanExporter {
109119
writer: Some(self.writer.unwrap_or_else(|| Box::new(stdout()))),
120+
resource: Resource::default(),
110121
encoder: self.encoder.unwrap_or_else(|| {
111122
Box::new(|writer, spans| {
112123
serde_json::to_writer(writer, &spans)

opentelemetry-stdout/src/trace/transform.rs

+15-5
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,27 @@ pub struct SpanData {
99
resource_spans: Vec<ResourceSpans>,
1010
}
1111

12-
impl From<Vec<opentelemetry_sdk::export::trace::SpanData>> for SpanData {
13-
fn from(sdk_spans: Vec<opentelemetry_sdk::export::trace::SpanData>) -> Self {
12+
impl
13+
From<(
14+
Vec<opentelemetry_sdk::export::trace::SpanData>,
15+
&opentelemetry_sdk::Resource,
16+
)> for SpanData
17+
{
18+
fn from(
19+
(sdk_spans, sdk_resource): (
20+
Vec<opentelemetry_sdk::export::trace::SpanData>,
21+
&opentelemetry_sdk::Resource,
22+
),
23+
) -> Self {
1424
let mut resource_spans = HashMap::<AttributeSet, ResourceSpans>::new();
1525
for sdk_span in sdk_spans {
16-
let resource_schema_url = sdk_span.resource.schema_url().map(|s| s.to_string().into());
26+
let resource_schema_url = sdk_resource.schema_url().map(|s| s.to_string().into());
1727
let schema_url = sdk_span.instrumentation_lib.schema_url.clone();
1828
let scope = sdk_span.instrumentation_lib.clone().into();
19-
let resource = sdk_span.resource.as_ref().into();
29+
let resource: Resource = sdk_resource.into();
2030

2131
let rs = resource_spans
22-
.entry(sdk_span.resource.as_ref().into())
32+
.entry(sdk_resource.into())
2333
.or_insert_with(move || ResourceSpans {
2434
resource,
2535
scope_spans: Vec::with_capacity(1),

opentelemetry-zipkin/src/exporter/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,8 @@ impl trace::SpanExporter for Exporter {
231231
self.local_endpoint.clone(),
232232
))
233233
}
234+
235+
fn set_resource(&mut self, _resource: &Resource) {}
234236
}
235237

236238
/// Wrap type for errors from opentelemetry zipkin

opentelemetry-zipkin/src/exporter/model/span.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,8 @@ mod tests {
6060
use crate::exporter::model::span::{Kind, Span};
6161
use crate::exporter::model::{into_zipkin_span, OTEL_ERROR_DESCRIPTION, OTEL_STATUS_CODE};
6262
use opentelemetry::trace::{SpanContext, SpanId, SpanKind, Status, TraceFlags, TraceId};
63+
use opentelemetry_sdk::export::trace::SpanData;
6364
use opentelemetry_sdk::trace::{SpanEvents, SpanLinks};
64-
use opentelemetry_sdk::{export::trace::SpanData, Resource};
65-
use std::borrow::Cow;
6665
use std::collections::HashMap;
6766
use std::net::Ipv4Addr;
6867
use std::time::SystemTime;
@@ -166,7 +165,6 @@ mod tests {
166165
events: SpanEvents::default(),
167166
links: SpanLinks::default(),
168167
status,
169-
resource: Cow::Owned(Resource::default()),
170168
instrumentation_lib: Default::default(),
171169
};
172170
let local_endpoint = Endpoint::new("test".into(), None);

stress/src/traces.rs

+2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ impl SpanProcessor for NoOpSpanProcessor {
4545
fn shutdown(&mut self) -> TraceResult<()> {
4646
Ok(())
4747
}
48+
49+
fn set_resource(&mut self, _resource: &opentelemetry_sdk::Resource) {}
4850
}
4951

5052
fn main() {

0 commit comments

Comments
 (0)