Skip to content

Commit

Permalink
leverage tracer provider to set service name for Zipkin exporter (#2624)
Browse files Browse the repository at this point in the history
Co-authored-by: Cijo Thomas <cijo.thomas@gmail.com>
  • Loading branch information
gruebel and cijothomas authored Feb 7, 2025
1 parent 420416f commit 61e539f
Show file tree
Hide file tree
Showing 9 changed files with 41 additions and 68 deletions.
1 change: 0 additions & 1 deletion opentelemetry-sdk/src/testing/trace/span_exporters.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ impl NoopSpanExporter {
}
}

#[async_trait::async_trait]
impl SpanExporter for NoopSpanExporter {
fn export(&mut self, _: Vec<SpanData>) -> BoxFuture<'static, OTelSdkResult> {
Box::pin(std::future::ready(Ok(())))
Expand Down
6 changes: 2 additions & 4 deletions opentelemetry-sdk/src/trace/provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -308,10 +308,8 @@ impl TracerProviderBuilder {
///
/// Processors are invoked in the order they are added.
pub fn with_simple_exporter<T: SpanExporter + 'static>(self, exporter: T) -> Self {
let mut processors = self.processors;
processors.push(Box::new(SimpleSpanProcessor::new(Box::new(exporter))));

TracerProviderBuilder { processors, ..self }
let simple = SimpleSpanProcessor::new(Box::new(exporter));
self.with_span_processor(simple)
}

/// Adds a [BatchSpanProcessor] with the configured exporter to the pipeline.
Expand Down
5 changes: 3 additions & 2 deletions opentelemetry-zipkin/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

- Bump msrv to 1.75.0.
- **Breaking** The `opentelemetry_zipkin::new_pipeline()` interface is now replaced with `opentelemetry_zipkin::ZipkinExporter::builder()`.
Additionally, the service name needs to be set on the tracer provider.

Previous Signature:
```rust
Expand All @@ -14,10 +15,10 @@
Updated Signature:
```rust
let exporter = ZipkinExporter::builder()
.with_service_name("trace-demo")
.build()?;
let provider = TracerProvider::builder()
let provider = SdkTracerProvider::builder()
.with_simple_exporter(exporter)
.with_service_name("trace-demo")
.build();
global::set_tracer_provider(provider.clone());

Expand Down
1 change: 0 additions & 1 deletion opentelemetry-zipkin/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ once_cell = { workspace = true }
opentelemetry = { version = "0.27", path = "../opentelemetry" }
opentelemetry_sdk = { version = "0.27", path = "../opentelemetry-sdk", features = ["trace"] }
opentelemetry-http = { version = "0.27", path = "../opentelemetry-http" }
opentelemetry-semantic-conventions = { version = "0.27", path = "../opentelemetry-semantic-conventions" }
serde_json = { workspace = true }
serde = { workspace = true, features = ["derive"] }
typed-builder = "0.18"
Expand Down
11 changes: 7 additions & 4 deletions opentelemetry-zipkin/examples/zipkin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use opentelemetry::{
trace::{Span, TraceError, Tracer},
InstrumentationScope, KeyValue,
};
use opentelemetry_sdk::trace::SdkTracerProvider;
use opentelemetry_sdk::{trace::SdkTracerProvider, Resource};
use opentelemetry_zipkin::ZipkinExporter;
use std::thread;
use std::time::Duration;
Expand All @@ -16,12 +16,15 @@ fn bar() {
}

fn init_traces() -> Result<SdkTracerProvider, TraceError> {
let exporter = ZipkinExporter::builder()
.with_service_name("trace-demo")
.build()?;
let exporter = ZipkinExporter::builder().build()?;

Ok(SdkTracerProvider::builder()
.with_simple_exporter(exporter)
.with_resource(
Resource::builder_empty()
.with_service_name("trace-demo")
.build(),
)
.build())
}

Expand Down
26 changes: 2 additions & 24 deletions opentelemetry-zipkin/src/exporter/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,7 @@ use model::endpoint::Endpoint;
use opentelemetry::trace::TraceError;
use opentelemetry_http::HttpClient;
use opentelemetry_sdk::error::OTelSdkResult;
use opentelemetry_sdk::{
resource::{ResourceDetector, SdkProvidedResourceDetector},
trace, ExportError,
};
use opentelemetry_semantic_conventions as semcov;
use opentelemetry_sdk::{trace, ExportError};
use std::net::{AddrParseError, SocketAddr};
use std::sync::Arc;

Expand Down Expand Up @@ -40,7 +36,6 @@ impl ZipkinExporter {
/// Builder for `ZipkinExporter` struct.
#[derive(Debug)]
pub struct ZipkinExporterBuilder {
service_name: Option<String>,
service_addr: Option<SocketAddr>,
collector_endpoint: String,
client: Option<Arc<dyn HttpClient>>,
Expand Down Expand Up @@ -71,7 +66,6 @@ impl Default for ZipkinExporterBuilder {
))]
client: None,

service_name: None,
service_addr: None,
collector_endpoint: env::get_endpoint(),
}
Expand All @@ -83,17 +77,7 @@ impl ZipkinExporterBuilder {
///
/// Returns error if the endpoint is not valid or if no http client is provided.
pub fn build(self) -> Result<ZipkinExporter, TraceError> {
let service_name = if let Some(service_name) = self.service_name {
service_name
} else {
SdkProvidedResourceDetector
.detect()
.get(&semcov::resource::SERVICE_NAME.into())
.unwrap()
.to_string()
};

let endpoint = Endpoint::new(service_name, self.service_addr);
let endpoint = Endpoint::new(self.service_addr);

if let Some(client) = self.client {
let exporter = ZipkinExporter::new(
Expand All @@ -109,12 +93,6 @@ impl ZipkinExporterBuilder {
}
}

/// Assign the service name under which to group traces.
pub fn with_service_name<T: Into<String>>(mut self, name: T) -> Self {
self.service_name = Some(name.into());
self
}

/// Assign client implementation
pub fn with_http_client<T: HttpClient + 'static>(mut self, client: T) -> Self {
self.client = Some(Arc::new(client));
Expand Down
22 changes: 5 additions & 17 deletions opentelemetry-zipkin/src/exporter/model/endpoint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@ use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr};
#[derive(TypedBuilder, Clone, Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct Endpoint {
#[builder(setter(strip_option), default)]
#[serde(skip_serializing_if = "Option::is_none")]
service_name: Option<String>,
#[builder(setter(strip_option), default)]
#[serde(skip_serializing_if = "Option::is_none")]
ipv4: Option<Ipv4Addr>,
Expand All @@ -19,19 +16,11 @@ pub(crate) struct Endpoint {
}

impl Endpoint {
pub(crate) fn new(service_name: String, socket_addr: Option<SocketAddr>) -> Self {
pub(crate) fn new(socket_addr: Option<SocketAddr>) -> Self {
match socket_addr {
Some(SocketAddr::V4(v4)) => Endpoint::builder()
.service_name(service_name)
.ipv4(*v4.ip())
.port(v4.port())
.build(),
Some(SocketAddr::V6(v6)) => Endpoint::builder()
.service_name(service_name)
.ipv6(*v6.ip())
.port(v6.port())
.build(),
None => Endpoint::builder().service_name(service_name).build(),
Some(SocketAddr::V4(v4)) => Endpoint::builder().ipv4(*v4.ip()).port(v4.port()).build(),
Some(SocketAddr::V6(v6)) => Endpoint::builder().ipv6(*v6.ip()).port(v6.port()).build(),
None => Endpoint::builder().build(),
}
}
}
Expand All @@ -50,11 +39,10 @@ mod tests {
fn test_ipv4_empty() {
test_json_serialization(
Endpoint::builder()
.service_name("open-telemetry".to_owned())
.ipv4(Ipv4Addr::new(127, 0, 0, 1))
.port(8080)
.build(),
"{\"serviceName\":\"open-telemetry\",\"ipv4\":\"127.0.0.1\",\"port\":8080}",
"{\"ipv4\":\"127.0.0.1\",\"port\":8080}",
);
}

Expand Down
6 changes: 2 additions & 4 deletions opentelemetry-zipkin/src/exporter/model/span.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,12 @@ mod tests {
.duration(150_000)
.local_endpoint(
Endpoint::builder()
.service_name("remote-service".to_owned())
.ipv4(Ipv4Addr::new(192, 168, 0, 1))
.port(8080)
.build()
)
.remote_endpoint(
Endpoint::builder()
.service_name("open-telemetry".to_owned())
.ipv4(Ipv4Addr::new(127, 0, 0, 1))
.port(8080)
.build()
Expand All @@ -109,7 +107,7 @@ mod tests {
])
.tags(tags)
.build(),
"{\"traceId\":\"4e441824ec2b6a44ffdc9bb9a6453df3\",\"parentId\":\"ffdc9bb9a6453df3\",\"id\":\"efdc9cd9a1849df3\",\"kind\":\"SERVER\",\"name\":\"main\",\"timestamp\":1502787600000000,\"duration\":150000,\"localEndpoint\":{\"serviceName\":\"remote-service\",\"ipv4\":\"192.168.0.1\",\"port\":8080},\"remoteEndpoint\":{\"serviceName\":\"open-telemetry\",\"ipv4\":\"127.0.0.1\",\"port\":8080},\"annotations\":[{\"timestamp\":1502780000000000,\"value\":\"interesting event\"}],\"tags\":{\"a\":\"b\"},\"debug\":false,\"shared\":false}",
"{\"traceId\":\"4e441824ec2b6a44ffdc9bb9a6453df3\",\"parentId\":\"ffdc9bb9a6453df3\",\"id\":\"efdc9cd9a1849df3\",\"kind\":\"SERVER\",\"name\":\"main\",\"timestamp\":1502787600000000,\"duration\":150000,\"localEndpoint\":{\"ipv4\":\"192.168.0.1\",\"port\":8080},\"remoteEndpoint\":{\"ipv4\":\"127.0.0.1\",\"port\":8080},\"annotations\":[{\"timestamp\":1502780000000000,\"value\":\"interesting event\"}],\"tags\":{\"a\":\"b\"},\"debug\":false,\"shared\":false}",
);
}

Expand Down Expand Up @@ -167,7 +165,7 @@ mod tests {
status,
instrumentation_scope: Default::default(),
};
let local_endpoint = Endpoint::new("test".into(), None);
let local_endpoint = Endpoint::new(None);
let span = into_zipkin_span(local_endpoint, span_data);
if let Some(tags) = span.tags.as_ref() {
assert_tag_contains(tags, OTEL_STATUS_CODE, status_tag_val);
Expand Down
31 changes: 20 additions & 11 deletions opentelemetry-zipkin/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,21 @@
//! ```no_run
//! use opentelemetry::global;
//! use opentelemetry::trace::{Tracer, TraceError};
//! use opentelemetry_sdk::trace::SdkTracerProvider;
//! use opentelemetry_sdk::{trace::SdkTracerProvider, Resource};
//! use opentelemetry_zipkin::ZipkinExporter;
//!
//! fn main() -> Result<(), TraceError> {
//! global::set_text_map_propagator(opentelemetry_zipkin::Propagator::new());
//!
//! let exporter = ZipkinExporter::builder()
//! .with_service_name("trace-demo")
//! .build()?;
//! let provider = TracerProvider::builder()
//! let provider = SdkTracerProvider::builder()
//! .with_simple_exporter(exporter)
//! .with_resource(
//! Resource::builder_empty()
//! .with_service_name("trace-demo")
//! .build(),
//! )
//! .build();
//! global::set_tracer_provider(provider.clone());
//!
Expand All @@ -60,22 +64,27 @@
//! trace::{
//! BatchSpanProcessor,
//! BatchConfigBuilder,
//! TracerProvider,
//! }
//! SdkTracerProvider,
//! },
//! Resource,
//! };
//! use opentelemetry_zipkin::ZipkinExporter;
//!
//! fn main() -> Result<(), opentelemetry::trace::TraceError> {
//! let exporter = ZipkinExporter::builder()
//! .with_service_name("runtime-demo")
//! .build()?;
//!
//! let batch = BatchSpanProcessor::builder(exporter)
//! .with_batch_config(BatchConfigBuilder::default().with_max_queue_size(4096).build())
//! .build();
//!
//! let provider = TracerProvider::builder()
//! let provider = SdkTracerProvider::builder()
//! .with_span_processor(batch)
//! .with_resource(
//! Resource::builder_empty()
//! .with_service_name("runtime-demo")
//! .build(),
//! )
//! .build();
//!
//! Ok(())
Expand Down Expand Up @@ -105,7 +114,7 @@
//!
//! ```no_run
//! use opentelemetry::{global, InstrumentationScope, KeyValue, trace::{Tracer, TraceError}};
//! use opentelemetry_sdk::{trace::{self, ExportResult, RandomIdGenerator, Sampler}, Resource};
//! use opentelemetry_sdk::{trace::{self, RandomIdGenerator, Sampler}, Resource};
//! use opentelemetry_http::{HttpClient, HttpError};
//! use opentelemetry_zipkin::{Error as ZipkinError, ZipkinExporter};
//! use async_trait::async_trait;
Expand Down Expand Up @@ -148,15 +157,14 @@
//! }
//! }
//!
//! fn init_traces() -> Result<trace::TracerProvider, TraceError> {
//! fn init_traces() -> Result<trace::SdkTracerProvider, TraceError> {
//! let exporter = ZipkinExporter::builder()
//! .with_http_client(
//! HyperClient(
//! Client::builder(TokioExecutor::new())
//! .build_http()
//! )
//! )
//! .with_service_name("my_app")
//! .with_service_address(
//! "127.0.0.1:8080"
//! .parse()
Expand All @@ -165,7 +173,7 @@
//! .with_collector_endpoint("http://localhost:9411/api/v2/spans")
//! .build()?;
//!
//! Ok(trace::TracerProvider::builder()
//! Ok(trace::SdkTracerProvider::builder()
//! .with_sampler(Sampler::AlwaysOn)
//! .with_batch_exporter(exporter)
//! .with_id_generator(RandomIdGenerator::default())
Expand All @@ -174,6 +182,7 @@
//! .with_max_events_per_span(16)
//! .with_resource(
//! Resource::builder_empty()
//! .with_service_name("my_app")
//! .with_attribute(KeyValue::new("key", "value"))
//! .build()
//! )
Expand Down

0 comments on commit 61e539f

Please sign in to comment.