From c8a93bec0460def1032d35a7edea80471473e6ce Mon Sep 17 00:00:00 2001 From: Artur Ciocanu Date: Thu, 5 Jun 2025 09:15:37 -0700 Subject: [PATCH] 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 1732769b8..463b36b84 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 84909e291..a9cd028b3 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.Tracer; 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 class OpenTelemetryConfig { * 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 class OpenTelemetryConfig { */ 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 b2da80a40..740fee826 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 @@ package io.dapr.examples; 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 4864a1d2a..1affcb1d4 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.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; 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 class BulkPublisher { // 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 fd79b076b..e5a15b27e 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.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; 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 class PublisherWithTracing { 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 3ddfa1d38..510a71030 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.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; 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 class InvokeClient { } } 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(); }