From c8a93bec0460def1032d35a7edea80471473e6ce Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Thu, 5 Jun 2025 09:15:37 -0700 Subject: [PATCH 1/5] Ensure OTEL from examples aligns with SDK and ITs Signed-off-by: Artur Ciocanu --- examples/pom.xml | 2 +- .../io/dapr/examples/OpenTelemetryConfig.java | 14 ++++++++++---- .../dapr/examples/OpenTelemetryInterceptor.java | 5 +++-- .../io/dapr/examples/pubsub/BulkPublisher.java | 16 +++++++++++----- .../examples/pubsub/PublisherWithTracing.java | 9 +++++---- .../io/dapr/examples/tracing/InvokeClient.java | 14 ++++++++------ 6 files changed, 38 insertions(+), 22 deletions(-) diff --git a/examples/pom.xml b/examples/pom.xml index 1732769b81..463b36b84f 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -22,7 +22,7 @@ ${java.version} ${java.version} false - 0.14.0 + 1.14.0 1.41.0 2.16.3 diff --git a/examples/src/main/java/io/dapr/examples/OpenTelemetryConfig.java b/examples/src/main/java/io/dapr/examples/OpenTelemetryConfig.java index 84909e2911..a9cd028b3f 100644 --- a/examples/src/main/java/io/dapr/examples/OpenTelemetryConfig.java +++ b/examples/src/main/java/io/dapr/examples/OpenTelemetryConfig.java @@ -20,9 +20,10 @@ import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.Context; import io.opentelemetry.context.propagation.ContextPropagators; -import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.context.propagation.TextMapSetter; import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter; import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; import org.springframework.beans.factory.annotation.Autowired; @@ -59,18 +60,23 @@ public Tracer initTracer(@Autowired OpenTelemetry openTelemetry) { * Creates an opentelemetry instance. * @return OpenTelemetry. */ - public static OpenTelemetry createOpenTelemetry() { + public static OpenTelemetrySdk createOpenTelemetry() { // Only exports to Zipkin if it is up. Otherwise, ignore it. // This is helpful to avoid exceptions for examples that do not require Zipkin. if (isZipkinUp()) { + Resource serviceResource = Resource.getDefault() + .toBuilder() + .put("service.name", InvokeClient.class.getName()) // Use ResourceAttributes constant + .build(); String httpUrl = String.format("http://localhost:%d", ZIPKIN_PORT); + ZipkinSpanExporter zipkinExporter = ZipkinSpanExporter.builder() .setEndpoint(httpUrl + ENDPOINT_V2_SPANS) - .setServiceName(InvokeClient.class.getName()) .build(); SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() + .setResource(serviceResource) .addSpanProcessor(SimpleSpanProcessor.create(zipkinExporter)) .build(); @@ -100,7 +106,7 @@ public static reactor.util.context.ContextView getReactorContext() { */ public static reactor.util.context.Context getReactorContext(Context context) { Map map = new HashMap<>(); - TextMapPropagator.Setter> setter = + TextMapSetter> setter = (carrier, key, value) -> map.put(key, value); GlobalOpenTelemetry.getPropagators().getTextMapPropagator().inject(context, map, setter); diff --git a/examples/src/main/java/io/dapr/examples/OpenTelemetryInterceptor.java b/examples/src/main/java/io/dapr/examples/OpenTelemetryInterceptor.java index b2da80a409..740fee826d 100644 --- a/examples/src/main/java/io/dapr/examples/OpenTelemetryInterceptor.java +++ b/examples/src/main/java/io/dapr/examples/OpenTelemetryInterceptor.java @@ -15,6 +15,7 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.context.Context; +import io.opentelemetry.context.propagation.TextMapGetter; import io.opentelemetry.context.propagation.TextMapPropagator; import jakarta.servlet.DispatcherType; import jakarta.servlet.http.HttpServletRequest; @@ -34,8 +35,8 @@ public class OpenTelemetryInterceptor implements HandlerInterceptor { @Autowired private OpenTelemetry openTelemetry; - private static final TextMapPropagator.Getter HTTP_SERVLET_REQUEST_GETTER = - new TextMapPropagator.Getter<>() { + private static final TextMapGetter HTTP_SERVLET_REQUEST_GETTER = + new TextMapGetter<>() { @Override public Iterable keys(HttpServletRequest carrier) { return Collections.list(carrier.getHeaderNames()); diff --git a/examples/src/main/java/io/dapr/examples/pubsub/BulkPublisher.java b/examples/src/main/java/io/dapr/examples/pubsub/BulkPublisher.java index 4864a1d2a8..1affcb1d42 100644 --- a/examples/src/main/java/io/dapr/examples/pubsub/BulkPublisher.java +++ b/examples/src/main/java/io/dapr/examples/pubsub/BulkPublisher.java @@ -21,6 +21,7 @@ import io.dapr.examples.OpenTelemetryConfig; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Scope; import io.opentelemetry.sdk.OpenTelemetrySdk; @@ -55,28 +56,34 @@ public class BulkPublisher { * @throws Exception any exception */ public static void main(String[] args) throws Exception { - OpenTelemetry openTelemetry = OpenTelemetryConfig.createOpenTelemetry(); - Tracer tracer = openTelemetry.getTracer(BulkPublisher.class.getCanonicalName()); - Span span = tracer.spanBuilder("Bulk Publisher's Main").setSpanKind(Span.Kind.CLIENT).startSpan(); + OpenTelemetrySdk openTelemetrySdk = OpenTelemetryConfig.createOpenTelemetry(); + Tracer tracer = openTelemetrySdk.getTracer(BulkPublisher.class.getCanonicalName()); + Span span = tracer.spanBuilder("Bulk Publisher's Main").setSpanKind(SpanKind.CLIENT).startSpan(); + try (DaprPreviewClient client = (new DaprClientBuilder()).buildPreviewClient()) { DaprClient c = (DaprClient) client; c.waitForSidecar(10000); + try (Scope scope = span.makeCurrent()) { System.out.println("Using preview client..."); List messages = new ArrayList<>(); System.out.println("Constructing the list of messages to publish"); + for (int i = 0; i < NUM_MESSAGES; i++) { String message = String.format("This is message #%d", i); messages.add(message); System.out.println("Going to publish message : " + message); } + BulkPublishResponse res = client.publishEvents(PUBSUB_NAME, TOPIC_NAME, "text/plain", messages) .contextWrite(getReactorContext()).block(); System.out.println("Published the set of messages in a single call to Dapr"); + if (res != null) { if (res.getFailedEntries().size() > 0) { // Ideally this condition will not happen in examples System.out.println("Some events failed to be published"); + for (BulkPublishResponseFailedEntry entry : res.getFailedEntries()) { System.out.println("EntryId : " + entry.getEntry().getEntryId() + " Error message : " + entry.getErrorMessage()); @@ -92,10 +99,9 @@ public static void main(String[] args) throws Exception { // Allow plenty of time for Dapr to export all relevant spans to the tracing infra. Thread.sleep(10000); // Shutdown the OpenTelemetry tracer. - OpenTelemetrySdk.getGlobalTracerManagement().shutdown(); + openTelemetrySdk.getSdkTracerProvider().shutdown(); System.out.println("Done"); } } } - diff --git a/examples/src/main/java/io/dapr/examples/pubsub/PublisherWithTracing.java b/examples/src/main/java/io/dapr/examples/pubsub/PublisherWithTracing.java index fd79b076b3..e5a15b27e6 100644 --- a/examples/src/main/java/io/dapr/examples/pubsub/PublisherWithTracing.java +++ b/examples/src/main/java/io/dapr/examples/pubsub/PublisherWithTracing.java @@ -18,6 +18,7 @@ import io.dapr.examples.OpenTelemetryConfig; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Scope; import io.opentelemetry.sdk.OpenTelemetrySdk; @@ -51,9 +52,9 @@ public class PublisherWithTracing { * @throws Exception A startup Exception. */ public static void main(String[] args) throws Exception { - OpenTelemetry openTelemetry = OpenTelemetryConfig.createOpenTelemetry(); - Tracer tracer = openTelemetry.getTracer(PublisherWithTracing.class.getCanonicalName()); - Span span = tracer.spanBuilder("Publisher's Main").setSpanKind(Span.Kind.CLIENT).startSpan(); + OpenTelemetrySdk openTelemetrySdk = OpenTelemetryConfig.createOpenTelemetry(); + Tracer tracer = openTelemetrySdk.getTracer(PublisherWithTracing.class.getCanonicalName()); + Span span = tracer.spanBuilder("Publisher's Main").setSpanKind(SpanKind.CLIENT).startSpan(); try (DaprClient client = new DaprClientBuilder().build()) { try (Scope scope = span.makeCurrent()) { @@ -80,7 +81,7 @@ public static void main(String[] args) throws Exception { span.end(); // Shutdown the OpenTelemetry tracer. - OpenTelemetrySdk.getGlobalTracerManagement().shutdown(); + openTelemetrySdk.getSdkTracerProvider().shutdown(); // This is an example, so for simplicity we are just exiting here. // Normally a dapr app would be a web service and not exit main. diff --git a/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java b/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java index 3ddfa1d38c..510a710304 100644 --- a/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java +++ b/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java @@ -21,6 +21,7 @@ import io.dapr.utils.TypeRef; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Scope; import io.opentelemetry.sdk.OpenTelemetrySdk; @@ -48,10 +49,10 @@ public class InvokeClient { * @param args Messages to be sent as request for the invoke API. */ public static void main(String[] args) throws Exception { - final OpenTelemetry openTelemetry = OpenTelemetryConfig.createOpenTelemetry(); - final Tracer tracer = openTelemetry.getTracer(InvokeClient.class.getCanonicalName()); + final OpenTelemetrySdk openTelemetrySdk = OpenTelemetryConfig.createOpenTelemetry(); + final Tracer tracer = openTelemetrySdk.getTracer(InvokeClient.class.getCanonicalName()); - Span span = tracer.spanBuilder("Example's Main").setSpanKind(Span.Kind.CLIENT).startSpan(); + Span span = tracer.spanBuilder("Example's Main").setSpanKind(SpanKind.CLIENT).startSpan(); try (DaprClient client = (new DaprClientBuilder()).build()) { for (String message : args) { try (Scope scope = span.makeCurrent()) { @@ -72,12 +73,13 @@ public static void main(String[] args) throws Exception { } } span.end(); - shutdown(); + shutdown(openTelemetrySdk); System.out.println("Done"); } - private static void shutdown() throws Exception { - OpenTelemetrySdk.getGlobalTracerManagement().shutdown(); + private static void shutdown(OpenTelemetrySdk openTelemetrySdk) throws Exception { + openTelemetrySdk.getSdkTracerProvider().shutdown(); + Validation.validate(); } From e5e0a4bd00114f8a1f93ff14bca02f9c1e874937 Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Thu, 5 Jun 2025 09:41:10 -0700 Subject: [PATCH 2/5] Some minor styling cleanup Signed-off-by: Artur Ciocanu --- .../io/dapr/examples/pubsub/BulkPublisher.java | 14 ++++++++------ .../dapr/examples/pubsub/PublisherWithTracing.java | 10 +++------- .../io/dapr/examples/tracing/InvokeClient.java | 10 +++++----- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/examples/src/main/java/io/dapr/examples/pubsub/BulkPublisher.java b/examples/src/main/java/io/dapr/examples/pubsub/BulkPublisher.java index 1affcb1d42..91b19f9ce9 100644 --- a/examples/src/main/java/io/dapr/examples/pubsub/BulkPublisher.java +++ b/examples/src/main/java/io/dapr/examples/pubsub/BulkPublisher.java @@ -19,7 +19,6 @@ import io.dapr.client.domain.BulkPublishResponse; import io.dapr.client.domain.BulkPublishResponseFailedEntry; import io.dapr.examples.OpenTelemetryConfig; -import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.Tracer; @@ -62,21 +61,28 @@ public static void main(String[] args) throws Exception { try (DaprPreviewClient client = (new DaprClientBuilder()).buildPreviewClient()) { DaprClient c = (DaprClient) client; + c.waitForSidecar(10000); try (Scope scope = span.makeCurrent()) { System.out.println("Using preview client..."); + List messages = new ArrayList<>(); + System.out.println("Constructing the list of messages to publish"); for (int i = 0; i < NUM_MESSAGES; i++) { String message = String.format("This is message #%d", i); + messages.add(message); + System.out.println("Going to publish message : " + message); } - BulkPublishResponse res = client.publishEvents(PUBSUB_NAME, TOPIC_NAME, "text/plain", messages) + BulkPublishResponse res = client + .publishEvents(PUBSUB_NAME, TOPIC_NAME, "text/plain", messages) .contextWrite(getReactorContext()).block(); + System.out.println("Published the set of messages in a single call to Dapr"); if (res != null) { @@ -93,14 +99,10 @@ public static void main(String[] args) throws Exception { throw new Exception("null response from dapr"); } } - // Close the span. span.end(); - // Allow plenty of time for Dapr to export all relevant spans to the tracing infra. Thread.sleep(10000); - // Shutdown the OpenTelemetry tracer. openTelemetrySdk.getSdkTracerProvider().shutdown(); - System.out.println("Done"); } } diff --git a/examples/src/main/java/io/dapr/examples/pubsub/PublisherWithTracing.java b/examples/src/main/java/io/dapr/examples/pubsub/PublisherWithTracing.java index e5a15b27e6..601382408e 100644 --- a/examples/src/main/java/io/dapr/examples/pubsub/PublisherWithTracing.java +++ b/examples/src/main/java/io/dapr/examples/pubsub/PublisherWithTracing.java @@ -16,7 +16,6 @@ import io.dapr.client.DaprClient; import io.dapr.client.DaprClientBuilder; import io.dapr.examples.OpenTelemetryConfig; -import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.Tracer; @@ -60,11 +59,13 @@ public static void main(String[] args) throws Exception { try (Scope scope = span.makeCurrent()) { for (int i = 0; i < NUM_MESSAGES; i++) { String message = String.format("This is message #%d", i); + // Publishing messages, notice the use of subscriberContext() for tracing. client.publishEvent( PUBSUB_NAME, TOPIC_NAME, message).contextWrite(getReactorContext()).block(); + System.out.println("Published message: " + message); try { @@ -72,19 +73,14 @@ public static void main(String[] args) throws Exception { } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); + return; } } } - // Close the span. span.end(); - - // Shutdown the OpenTelemetry tracer. openTelemetrySdk.getSdkTracerProvider().shutdown(); - - // This is an example, so for simplicity we are just exiting here. - // Normally a dapr app would be a web service and not exit main. System.out.println("Done."); } } diff --git a/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java b/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java index 510a710304..c5b52899b1 100644 --- a/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java +++ b/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java @@ -19,7 +19,6 @@ import io.dapr.client.domain.InvokeMethodRequest; import io.dapr.examples.OpenTelemetryConfig; import io.dapr.utils.TypeRef; -import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.Tracer; @@ -49,10 +48,10 @@ public class InvokeClient { * @param args Messages to be sent as request for the invoke API. */ public static void main(String[] args) throws Exception { - final OpenTelemetrySdk openTelemetrySdk = OpenTelemetryConfig.createOpenTelemetry(); - final Tracer tracer = openTelemetrySdk.getTracer(InvokeClient.class.getCanonicalName()); - + OpenTelemetrySdk openTelemetrySdk = OpenTelemetryConfig.createOpenTelemetry(); + Tracer tracer = openTelemetrySdk.getTracer(InvokeClient.class.getCanonicalName()); Span span = tracer.spanBuilder("Example's Main").setSpanKind(SpanKind.CLIENT).startSpan(); + try (DaprClient client = (new DaprClientBuilder()).build()) { for (String message : args) { try (Scope scope = span.makeCurrent()) { @@ -72,12 +71,13 @@ public static void main(String[] args) throws Exception { } } } + span.end(); shutdown(openTelemetrySdk); System.out.println("Done"); } - private static void shutdown(OpenTelemetrySdk openTelemetrySdk) throws Exception { + private static void shutdown(OpenTelemetrySdk openTelemetrySdk) { openTelemetrySdk.getSdkTracerProvider().shutdown(); Validation.validate(); From ca42deb8ad6333e2bca4eae7961e0f62d650d3db Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Thu, 5 Jun 2025 09:44:53 -0700 Subject: [PATCH 3/5] Move cleanup code into auto-closable block Signed-off-by: Artur Ciocanu --- .../io/dapr/examples/tracing/InvokeClient.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java b/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java index c5b52899b1..ead7c25a01 100644 --- a/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java +++ b/examples/src/main/java/io/dapr/examples/tracing/InvokeClient.java @@ -70,17 +70,11 @@ public static void main(String[] args) throws Exception { }).contextWrite(getReactorContext()).block(); } } - } - - span.end(); - shutdown(openTelemetrySdk); - System.out.println("Done"); - } - private static void shutdown(OpenTelemetrySdk openTelemetrySdk) { - openTelemetrySdk.getSdkTracerProvider().shutdown(); - - Validation.validate(); + span.end(); + openTelemetrySdk.getSdkTracerProvider().shutdown(); + Validation.validate(); + System.out.println("Done"); + } } - } From 9296fe7fc7da99b0dd41732270efb7fb100df4ee Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Thu, 5 Jun 2025 11:25:28 -0700 Subject: [PATCH 4/5] Simplifying the OTEl versioning Signed-off-by: Artur Ciocanu --- examples/pom.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/pom.xml b/examples/pom.xml index 463b36b84f..3bb4e69810 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -22,8 +22,7 @@ ${java.version} ${java.version} false - 1.14.0 - 1.41.0 + 1.41.0 2.16.3 @@ -87,7 +86,7 @@ io.opentelemetry opentelemetry-sdk-metrics - ${opentelemetry-sdk-metrics.version} + ${opentelemetry.version} io.zipkin.reporter2 From 8959473fc7617031bb58dac41c1e137139c3569c Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Thu, 5 Jun 2025 12:16:56 -0700 Subject: [PATCH 5/5] Ensure the right version on Zipkin Signed-off-by: Artur Ciocanu --- examples/pom.xml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/pom.xml b/examples/pom.xml index 3bb4e69810..8e59654711 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -23,7 +23,7 @@ ${java.version} false 1.41.0 - 2.16.3 + 3.4.0 @@ -80,12 +80,12 @@ io.opentelemetry - opentelemetry-exporter-zipkin + opentelemetry-sdk-metrics ${opentelemetry.version} io.opentelemetry - opentelemetry-sdk-metrics + opentelemetry-exporter-zipkin ${opentelemetry.version} @@ -93,6 +93,11 @@ zipkin-reporter ${zipkin.version} + + io.zipkin.reporter2 + zipkin-sender-urlconnection + ${zipkin.version} + org.junit.jupiter junit-jupiter