diff --git a/opentelemetry-sdk/src/testing/trace/span_exporters.rs b/opentelemetry-sdk/src/testing/trace/span_exporters.rs index 6201eb8a68..53ea8c3031 100644 --- a/opentelemetry-sdk/src/testing/trace/span_exporters.rs +++ b/opentelemetry-sdk/src/testing/trace/span_exporters.rs @@ -111,7 +111,6 @@ impl NoopSpanExporter { } } -#[async_trait::async_trait] impl SpanExporter for NoopSpanExporter { fn export(&mut self, _: Vec) -> BoxFuture<'static, OTelSdkResult> { Box::pin(std::future::ready(Ok(()))) diff --git a/opentelemetry-sdk/src/trace/provider.rs b/opentelemetry-sdk/src/trace/provider.rs index ade3b558e5..3cdab8d8f0 100644 --- a/opentelemetry-sdk/src/trace/provider.rs +++ b/opentelemetry-sdk/src/trace/provider.rs @@ -308,10 +308,8 @@ impl TracerProviderBuilder { /// /// Processors are invoked in the order they are added. pub fn with_simple_exporter(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. diff --git a/opentelemetry-zipkin/CHANGELOG.md b/opentelemetry-zipkin/CHANGELOG.md index 3787035b15..c7eaf4c670 100644 --- a/opentelemetry-zipkin/CHANGELOG.md +++ b/opentelemetry-zipkin/CHANGELOG.md @@ -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 @@ -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()); diff --git a/opentelemetry-zipkin/Cargo.toml b/opentelemetry-zipkin/Cargo.toml index 75f7029bc8..a89a0f13e7 100644 --- a/opentelemetry-zipkin/Cargo.toml +++ b/opentelemetry-zipkin/Cargo.toml @@ -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" diff --git a/opentelemetry-zipkin/examples/zipkin.rs b/opentelemetry-zipkin/examples/zipkin.rs index c600264c0a..9d4a114797 100644 --- a/opentelemetry-zipkin/examples/zipkin.rs +++ b/opentelemetry-zipkin/examples/zipkin.rs @@ -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; @@ -16,12 +16,15 @@ fn bar() { } fn init_traces() -> Result { - 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()) } diff --git a/opentelemetry-zipkin/src/exporter/mod.rs b/opentelemetry-zipkin/src/exporter/mod.rs index 1d835aed80..6c4b56c04b 100644 --- a/opentelemetry-zipkin/src/exporter/mod.rs +++ b/opentelemetry-zipkin/src/exporter/mod.rs @@ -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; @@ -40,7 +36,6 @@ impl ZipkinExporter { /// Builder for `ZipkinExporter` struct. #[derive(Debug)] pub struct ZipkinExporterBuilder { - service_name: Option, service_addr: Option, collector_endpoint: String, client: Option>, @@ -71,7 +66,6 @@ impl Default for ZipkinExporterBuilder { ))] client: None, - service_name: None, service_addr: None, collector_endpoint: env::get_endpoint(), } @@ -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 { - 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( @@ -109,12 +93,6 @@ impl ZipkinExporterBuilder { } } - /// Assign the service name under which to group traces. - pub fn with_service_name>(mut self, name: T) -> Self { - self.service_name = Some(name.into()); - self - } - /// Assign client implementation pub fn with_http_client(mut self, client: T) -> Self { self.client = Some(Arc::new(client)); diff --git a/opentelemetry-zipkin/src/exporter/model/endpoint.rs b/opentelemetry-zipkin/src/exporter/model/endpoint.rs index a70e4feb3f..7c85900c25 100644 --- a/opentelemetry-zipkin/src/exporter/model/endpoint.rs +++ b/opentelemetry-zipkin/src/exporter/model/endpoint.rs @@ -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, #[builder(setter(strip_option), default)] #[serde(skip_serializing_if = "Option::is_none")] ipv4: Option, @@ -19,19 +16,11 @@ pub(crate) struct Endpoint { } impl Endpoint { - pub(crate) fn new(service_name: String, socket_addr: Option) -> Self { + pub(crate) fn new(socket_addr: Option) -> 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(), } } } @@ -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}", ); } diff --git a/opentelemetry-zipkin/src/exporter/model/span.rs b/opentelemetry-zipkin/src/exporter/model/span.rs index 86272aa923..a39cf6acc9 100644 --- a/opentelemetry-zipkin/src/exporter/model/span.rs +++ b/opentelemetry-zipkin/src/exporter/model/span.rs @@ -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() @@ -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}", ); } @@ -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); diff --git a/opentelemetry-zipkin/src/lib.rs b/opentelemetry-zipkin/src/lib.rs index a3d09f1021..44f81d6031 100644 --- a/opentelemetry-zipkin/src/lib.rs +++ b/opentelemetry-zipkin/src/lib.rs @@ -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()); //! @@ -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(()) @@ -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; @@ -148,7 +157,7 @@ //! } //! } //! -//! fn init_traces() -> Result { +//! fn init_traces() -> Result { //! let exporter = ZipkinExporter::builder() //! .with_http_client( //! HyperClient( @@ -156,7 +165,6 @@ //! .build_http() //! ) //! ) -//! .with_service_name("my_app") //! .with_service_address( //! "127.0.0.1:8080" //! .parse() @@ -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()) @@ -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() //! )