diff --git a/eng/versioning/external_dependencies.txt b/eng/versioning/external_dependencies.txt index 08202711f1fc3..65da747bd5835 100644 --- a/eng/versioning/external_dependencies.txt +++ b/eng/versioning/external_dependencies.txt @@ -166,9 +166,9 @@ com.microsoft.azure:azure-storage;8.0.0 com.microsoft.azure:msal4j;1.8.1 com.microsoft.azure:msal4j-persistence-extension;1.0.0 com.sun.activation:jakarta.activation;1.2.2 -io.opentelemetry:opentelemetry-api;0.14.1 -io.opentelemetry:opentelemetry-sdk;0.14.1 -io.opentelemetry:opentelemetry-semconv;0.14.1 +io.opentelemetry:opentelemetry-api;0.17.1 +io.opentelemetry:opentelemetry-sdk;0.17.1 +com.google.errorprone:error_prone_annotations;2.5.1 io.projectreactor:reactor-test;3.3.12.RELEASE junit:junit;4.13.1 commons-cli:commons-cli;1.3 diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index d3e3bd5796e3c..8ef3f921df2d4 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -210,6 +210,7 @@ com.azure.resourcemanager:azure-resourcemanager-digitaltwins;1.0.0-beta.1;1.0.0- unreleased_com.azure:azure-messaging-eventhubs;5.5.0 unreleased_com.azure:azure-messaging-eventhubs-checkpointstore-blob;1.5.0 unreleased_com.azure:azure-core-management;1.2.0-beta.1 +unreleased_com.azure:azure-core-tracing-opentelemetry;1.0.0-beta.8 # Released Beta dependencies: Copy the entry from above, prepend "beta_", remove the current # version and set the version to the released beta. Released beta dependencies are only valid diff --git a/sdk/core/azure-core-tracing-opentelemetry/CHANGELOG.md b/sdk/core/azure-core-tracing-opentelemetry/CHANGELOG.md index 64ec8a245b73f..5e14608fd372a 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/CHANGELOG.md +++ b/sdk/core/azure-core-tracing-opentelemetry/CHANGELOG.md @@ -1,13 +1,14 @@ # Release History ## 1.0.0-beta.8 (Unreleased) - +- Updated versions of `opentelemetry-api` to `0.17.1` version. + More detailed information about the new OpenTelemetry API version can be found in [OpenTelemetry changelog](https://github.com/open-telemetry/opentelemetry-java/blob/main/CHANGELOG.md#version-0171---2021-02-19) ## 1.0.0-beta.7 (2021-02-05) ### Dependency Updates -- Updated versions of `opentelemetry-api` to `0.14.1` version. - More detailed information about the new OpenTelemetry API version can be found in [OpenTelemetry changelog](https://github.com/open-telemetry/opentelemetry-java/blob/master/CHANGELOG.md#version-0141---2021-01-14) +- Updated versions of `opentelemetry-api` to `0.15.0` version. + More detailed information about the new OpenTelemetry API version can be found in [OpenTelemetry changelog](https://github.com/open-telemetry/opentelemetry-java/blob/main/CHANGELOG.md#version-0150---2021-01-29) ## 1.0.0-beta.6 (2020-08-07) - Update `opentelemetry-api` dependency version to `0.6.0` and included `io.grpc:grpc-context[1.30.0]` external diff --git a/sdk/core/azure-core-tracing-opentelemetry/pom.xml b/sdk/core/azure-core-tracing-opentelemetry/pom.xml index 3b0d22d8f7942..4769223075dce 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/pom.xml +++ b/sdk/core/azure-core-tracing-opentelemetry/pom.xml @@ -35,24 +35,25 @@ io.opentelemetry opentelemetry-api - 0.14.1 - - - io.opentelemetry - opentelemetry-semconv - 0.14.1 + 0.17.1 com.azure azure-core 1.14.0-beta.1 + + com.google.errorprone + error_prone_annotations + 2.5.1 + provided + io.opentelemetry opentelemetry-sdk - 0.14.1 + 0.17.1 test @@ -85,8 +86,8 @@ - io.opentelemetry:opentelemetry-api:[0.14.1] - io.opentelemetry:opentelemetry-semconv:[0.14.1] + io.opentelemetry:opentelemetry-api:[0.17.1] + com.google.errorprone:error_prone_annotations:[2.5.1] @@ -103,6 +104,18 @@ + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M3 + + + + false + + + diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryHttpPolicy.java b/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryHttpPolicy.java index e305fff513086..df25cb25a0533 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryHttpPolicy.java +++ b/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryHttpPolicy.java @@ -18,10 +18,11 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; import io.opentelemetry.context.propagation.TextMapPropagator; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import io.opentelemetry.context.propagation.TextMapSetter; import reactor.core.publisher.Mono; import reactor.core.publisher.Signal; import reactor.util.context.Context; @@ -49,6 +50,10 @@ public HttpPipelinePolicy create() { private static final Tracer TRACER = GlobalOpenTelemetry.getTracer("Azure-OpenTelemetry"); // standard attributes with http call information + private static final String HTTP_USER_AGENT = "http.user_agent"; + private static final String HTTP_METHOD = "http.method"; + private static final String HTTP_URL = "http.url"; + private static final String HTTP_STATUS_CODE = "http.status_code"; private static final String REQUEST_ID = "x-ms-request-id"; // This helper class implements W3C distributed tracing protocol and injects SpanContext into the outgoing http @@ -71,7 +76,7 @@ public Mono process(HttpPipelineCallContext context, HttpPipelineN .setParent(io.opentelemetry.context.Context.current().with(parentSpan)); // A span's kind can be SERVER (incoming request) or CLIENT (outgoing request); - spanBuilder.setSpanKind(Span.Kind.CLIENT); + spanBuilder.setSpanKind(SpanKind.CLIENT); // Starting the span makes the sampling decision (nothing is logged at this time) Span span = spanBuilder.startSpan(); @@ -95,21 +100,21 @@ public Mono process(HttpPipelineCallContext context, HttpPipelineN private static void addSpanRequestAttributes(Span span, HttpRequest request, HttpPipelineCallContext context) { - putAttributeIfNotEmptyOrNull(span, SemanticAttributes.HTTP_USER_AGENT, + putAttributeIfNotEmptyOrNull(span, HTTP_USER_AGENT, request.getHeaders().getValue("User-Agent")); - putAttributeIfNotEmptyOrNull(span, SemanticAttributes.HTTP_METHOD, request.getHttpMethod().toString()); - putAttributeIfNotEmptyOrNull(span, SemanticAttributes.HTTP_URL, request.getUrl().toString()); + putAttributeIfNotEmptyOrNull(span, HTTP_METHOD, request.getHttpMethod().toString()); + putAttributeIfNotEmptyOrNull(span, HTTP_URL, request.getUrl().toString()); Optional tracingNamespace = context.getData(AZ_TRACING_NAMESPACE_KEY); if (tracingNamespace.isPresent()) { - putAttributeIfNotEmptyOrNull(span, AttributeKey.stringKey(OpenTelemetryTracer.AZ_NAMESPACE_KEY), + putAttributeIfNotEmptyOrNull(span, OpenTelemetryTracer.AZ_NAMESPACE_KEY, tracingNamespace.get().toString()); } } - private static void putAttributeIfNotEmptyOrNull(Span span, AttributeKey key, String value) { + private static void putAttributeIfNotEmptyOrNull(Span span, String key, String value) { // AttributeValue will throw an error if the value is null. if (!CoreUtils.isNullOrEmpty(value)) { - span.setAttribute(key, value); + span.setAttribute(AttributeKey.stringKey(key), value); } } @@ -163,8 +168,8 @@ private static void spanEnd(Span span, HttpResponse response, Throwable error) { requestId = response.getHeaderValue(REQUEST_ID); } - putAttributeIfNotEmptyOrNull(span, AttributeKey.stringKey(REQUEST_ID), requestId); - span.setAttribute(SemanticAttributes.HTTP_STATUS_CODE, statusCode); + putAttributeIfNotEmptyOrNull(span, REQUEST_ID, requestId); + span.setAttribute(HTTP_STATUS_CODE, statusCode); span = HttpTraceUtil.setSpanStatus(span, statusCode, error); } @@ -173,6 +178,6 @@ private static void spanEnd(Span span, HttpResponse response, Throwable error) { } // lambda that actually injects arbitrary header into the request - private final TextMapPropagator.Setter contextSetter = + private final TextMapSetter contextSetter = (request, key, value) -> request.getHeaders().set(key, value); } diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracer.java b/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracer.java index b4519f134cec7..a98aeb0f442c5 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracer.java +++ b/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracer.java @@ -16,6 +16,7 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.Tracer; import java.time.OffsetDateTime; @@ -23,9 +24,6 @@ import java.util.Objects; import java.util.Optional; -import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.MESSAGING_DESTINATION; -import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.PEER_SERVICE; - /** * Basic tracing implementation class for use with REST and AMQP Service Clients to create {@link Span} and in-process * context propagation. Singleton OpenTelemetry tracer capable of starting and exporting spans. @@ -38,6 +36,8 @@ public class OpenTelemetryTracer implements com.azure.core.util.tracing.Tracer { private static final Tracer TRACER = GlobalOpenTelemetry.getTracer("Azure-OpenTelemetry"); // standard attributes with AMQP request static final String AZ_NAMESPACE_KEY = "az.namespace"; + static final String MESSAGE_BUS_DESTINATION = "message_bus.destination"; + static final String PEER_ENDPOINT = "peer.address"; private final ClientLogger logger = new ClientLogger(OpenTelemetryTracer.class); @@ -79,7 +79,7 @@ public Context start(String spanName, Context context, ProcessKind processKind) if (spanBuilder == null) { return Context.NONE; } - span = spanBuilder.setSpanKind(Span.Kind.CLIENT).startSpan(); + span = spanBuilder.setSpanKind(SpanKind.CLIENT).startSpan(); if (span.isRecording()) { // If span is sampled in, add additional request attributes addSpanRequestAttributes(span, context, spanName); @@ -87,7 +87,7 @@ public Context start(String spanName, Context context, ProcessKind processKind) return context.addData(PARENT_SPAN_KEY, span); case MESSAGE: spanBuilder = getSpanBuilder(spanName, context); - span = spanBuilder.setSpanKind(Span.Kind.PRODUCER).startSpan(); + span = spanBuilder.setSpanKind(SpanKind.PRODUCER).startSpan(); if (span.isRecording()) { // If span is sampled in, add additional request attributes addSpanRequestAttributes(span, context, spanName); @@ -266,7 +266,7 @@ private Context startScopedSpan(String spanName, Context context) { span = startSpanWithRemoteParent(spanName, spanContext); } else { SpanBuilder spanBuilder = getSpanBuilder(spanName, context); - span = spanBuilder.setSpanKind(Span.Kind.CONSUMER).startSpan(); + span = spanBuilder.setSpanKind(SpanKind.CONSUMER).startSpan(); } if (span.isRecording()) { // If span is sampled in, add additional request attributes @@ -287,7 +287,7 @@ private static Span startSpanWithRemoteParent(String spanName, SpanContext spanC SpanBuilder spanBuilder = TRACER.spanBuilder(spanName) .setParent(io.opentelemetry.context.Context.root().with(Span.wrap(spanContext))); - spanBuilder.setSpanKind(Span.Kind.CONSUMER); + spanBuilder.setSpanKind(SpanKind.CONSUMER); return spanBuilder.startSpan(); } @@ -301,6 +301,9 @@ private static Span startSpanWithRemoteParent(String spanName, SpanContext spanC private static Context setContextData(Span span) { SpanContext spanContext = span.getSpanContext(); final String traceparent = AmqpPropagationFormatUtil.getDiagnosticId(spanContext); + if (traceparent == null) { + return Context.NONE; + } return new Context(DIAGNOSTIC_ID_KEY, traceparent).addData(SPAN_CONTEXT_KEY, spanContext); } @@ -315,11 +318,11 @@ private void addSpanRequestAttributes(Span span, Context context, String spanNam Objects.requireNonNull(span, "'span' cannot be null."); String entityPath = getOrDefault(context, ENTITY_PATH_KEY, null, String.class); if (entityPath != null) { - span.setAttribute(MESSAGING_DESTINATION, entityPath); + span.setAttribute(MESSAGE_BUS_DESTINATION, entityPath); } String hostName = getOrDefault(context, HOST_NAME_KEY, null, String.class); if (hostName != null) { - span.setAttribute(PEER_SERVICE, hostName); + span.setAttribute(PEER_ENDPOINT, hostName); } Long messageEnqueuedTime = getOrDefault(context, MESSAGE_ENQUEUED_TIME, null, Long.class); if (messageEnqueuedTime != null) { diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/implementation/AmqpPropagationFormatUtil.java b/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/implementation/AmqpPropagationFormatUtil.java index 8a79a56c6de68..1e96d98981810 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/implementation/AmqpPropagationFormatUtil.java +++ b/sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/implementation/AmqpPropagationFormatUtil.java @@ -15,7 +15,22 @@ public final class AmqpPropagationFormatUtil { - private AmqpPropagationFormatUtil() { } + private static final String VERSION = "00"; + private static final int VERSION_SIZE = 2; + private static final char TRACEPARENT_DELIMITER = '-'; + private static final int TRACEPARENT_DELIMITER_SIZE = 1; + private static final int TRACE_ID_HEX_SIZE = TraceId.getLength(); + private static final int SPAN_ID_HEX_SIZE = SpanId.getLength(); + private static final int TRACE_OPTION_HEX_SIZE = TraceFlags.getLength(); + private static final int TRACE_ID_OFFSET = VERSION_SIZE + TRACEPARENT_DELIMITER_SIZE; + private static final int SPAN_ID_OFFSET = + TRACE_ID_OFFSET + TRACE_ID_HEX_SIZE + TRACEPARENT_DELIMITER_SIZE; + private static final int TRACE_OPTION_OFFSET = + SPAN_ID_OFFSET + SPAN_ID_HEX_SIZE + TRACEPARENT_DELIMITER_SIZE; + private static final int TRACEPARENT_HEADER_SIZE = TRACE_OPTION_OFFSET + TRACE_OPTION_HEX_SIZE; + + private AmqpPropagationFormatUtil() { + } /** * This method is called to extract the Span Context information from the received event's diagnostic Id. @@ -30,46 +45,59 @@ public static Context extractContext(String diagnosticId, Context context) { /** * The trace-parent HTTP header field identifies the incoming request in a tracing system with four fields: * version, trace-id, parent-id, trace-flags. - * + *

* Please refer to the Trace-parent Header * for more information on the conversion of these fields to Span Context format. * * @param spanContext is a specification defines an agreed-upon format for the exchange of trace context propagation * data. - * @return The diagnostic Id providing an unique identifier for individual traces and requests, + * @return The diagnostic Id providing an unique identifier for individual traces and requests, * allowing trace data of multiple providers to be linked together. * @throws NullPointerException if {@code spanContext} is {@code null}. */ public static String getDiagnosticId(SpanContext spanContext) { Objects.requireNonNull(spanContext, "'spanContext' cannot be null."); - final char[] chars = new char[55]; - chars[0] = '0'; - chars[1] = '0'; - chars[2] = '-'; - TraceId.copyHexInto(spanContext.getTraceIdBytes(), chars, 3); - chars[35] = '-'; - String spanId = spanContext.getSpanIdAsHexString(); + if (!spanContext.isValid()) { + return null; + } + + char[] chars = new char[TRACEPARENT_HEADER_SIZE]; + chars[0] = VERSION.charAt(0); + chars[1] = VERSION.charAt(1); + chars[2] = TRACEPARENT_DELIMITER; + + String traceId = spanContext.getTraceId(); + for (int i = 0; i < traceId.length(); i++) { + chars[TRACE_ID_OFFSET + i] = traceId.charAt(i); + } + + chars[SPAN_ID_OFFSET - 1] = TRACEPARENT_DELIMITER; + + String spanId = spanContext.getSpanId(); for (int i = 0; i < spanId.length(); i++) { - chars[36 + i] = spanId.charAt(i); + chars[SPAN_ID_OFFSET + i] = spanId.charAt(i); } - chars[52] = '-'; - spanContext.copyTraceFlagsHexTo(chars, 53); - return new String(chars); + + chars[TRACE_OPTION_OFFSET - 1] = TRACEPARENT_DELIMITER; + String traceFlagsHex = spanContext.getTraceFlags().asHex(); + chars[TRACE_OPTION_OFFSET] = traceFlagsHex.charAt(0); + chars[TRACE_OPTION_OFFSET + 1] = traceFlagsHex.charAt(1); + return new String(chars, 0, TRACEPARENT_HEADER_SIZE); } /** * The trace-parent HTTP header field identifies the incoming request in a tracing system with four fields: * version, trace-id, parent-id, trace-flags. - * + *

* Please refer to the Trace-parent Header * for more information on the conversion of these fields to Span Context format. * - * @param diagnosticId provides a unique identifier for individual traces and requests, + * @param traceparent provides a unique identifier for individual traces and requests, * @return SpanContext is a specification defines an agreed-upon format for the exchange of trace context * propagation data */ - private static SpanContext fromDiagnosticId(String diagnosticId) { - if (diagnosticId == null || diagnosticId.length() < 55 || !diagnosticId.startsWith("00")) { + private static SpanContext fromDiagnosticId(String traceparent) { + if (traceparent == null || traceparent.length() < 55 || !traceparent.startsWith(VERSION)) { return SpanContext.create( TraceId.getInvalid(), SpanId.getInvalid(), @@ -77,10 +105,17 @@ private static SpanContext fromDiagnosticId(String diagnosticId) { TraceState.getDefault() ); } + + String traceId = + traceparent.substring(TRACE_ID_OFFSET, TRACE_ID_OFFSET + TraceId.getLength()); + String spanId = traceparent.substring(SPAN_ID_OFFSET, SPAN_ID_OFFSET + SpanId.getLength()); + + TraceFlags traceFlags = TraceFlags.fromHex(traceparent, TRACE_OPTION_OFFSET); + return SpanContext.create( - TraceId.bytesToHex(TraceId.bytesFromHex(diagnosticId, 3)), - SpanId.bytesToHex(SpanId.bytesFromHex(diagnosticId, 36)), - TraceFlags.byteFromHex(diagnosticId, 53), + traceId, + spanId, + traceFlags, TraceState.builder().build()); } } diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/main/java/module-info.java b/sdk/core/azure-core-tracing-opentelemetry/src/main/java/module-info.java index 7c2aeb5b5ee15..daea49726995c 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/main/java/module-info.java +++ b/sdk/core/azure-core-tracing-opentelemetry/src/main/java/module-info.java @@ -7,8 +7,6 @@ requires io.opentelemetry.api; requires io.opentelemetry.context; - requires transitive io.opentelemetry.semconv; - opens com.azure.core.tracing.opentelemetry to com.fasterxml.jackson.databind; exports com.azure.core.tracing.opentelemetry; diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/samples/AsyncListKeyVaultSecretsSample.md b/sdk/core/azure-core-tracing-opentelemetry/src/samples/AsyncListKeyVaultSecretsSample.md index 0aab66c5a99af..0239cfbe3c684 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/samples/AsyncListKeyVaultSecretsSample.md +++ b/sdk/core/azure-core-tracing-opentelemetry/src/samples/AsyncListKeyVaultSecretsSample.md @@ -9,12 +9,12 @@ Sample uses **[opentelemetry-sdk][opentelemetry_sdk]** as implementation package io.opentelemetry opentelemetry-sdk - 0.14.1 + 0.17.1 io.opentelemetry - opentelemetry-exporters-logging - 0.14.1 + opentelemetry-exporter-logging + 0.17.1 ``` @@ -33,7 +33,7 @@ Sample uses **[opentelemetry-sdk][opentelemetry_sdk]** as implementation package com.azure azure-core-tracing-opentelemetry - 1.0.0-beta.7 + 1.0.0-beta.8 ``` @@ -48,6 +48,7 @@ import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Scope; import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; import reactor.util.context.Context; @@ -71,11 +72,16 @@ public class Sample { private static Tracer configureOpenTelemetryAndLoggingExporter() { LoggingSpanExporter exporter = new LoggingSpanExporter(); - OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder().build(); - openTelemetry - .getTracerManagement() - .addSpanProcessor(SimpleSpanProcessor.builder(exporter).build()); - return openTelemetry.getTracer("Sample"); + // Tracer provider configured to export spans with SimpleSpanProcessor using + // the logging exporter. + SdkTracerProvider tracerProvider = + SdkTracerProvider.builder() + .addSpanProcessor(SimpleSpanProcessor.create(new LoggingSpanExporter())) + .build(); + return OpenTelemetrySdk.builder() + .setTracerProvider(tracerProvider) + .buildAndRegisterGlobal() + .getTracer("Sample"); } public static void doClientWork() { diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/samples/CreateConfigurationSettingTracingSample.md b/sdk/core/azure-core-tracing-opentelemetry/src/samples/CreateConfigurationSettingTracingSample.md index 8afcb64c4fa4d..90aaf461bcaf0 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/samples/CreateConfigurationSettingTracingSample.md +++ b/sdk/core/azure-core-tracing-opentelemetry/src/samples/CreateConfigurationSettingTracingSample.md @@ -9,12 +9,12 @@ Sample uses **[opentelemetry-sdk][opentelemetry_sdk]** as implementation package io.opentelemetry opentelemetry-sdk - 0.14.1 + 0.17.1 io.opentelemetry - opentelemetry-exporters-logging - 0.14.1 + opentelemetry-exporter-logging + 0.17.1 ``` @@ -28,7 +28,7 @@ Sample uses **[opentelemetry-sdk][opentelemetry_sdk]** as implementation package com.azure azure-core-tracing-opentelemetry - 1.0.0-beta.7 + 1.0.0-beta.8 ``` @@ -41,6 +41,7 @@ import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Scope; import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; public class Sample { @@ -53,11 +54,16 @@ public class Sample { private static Tracer configureOpenTelemetryAndLoggingExporter() { LoggingSpanExporter exporter = new LoggingSpanExporter(); - OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder().build(); - openTelemetry - .getTracerManagement() - .addSpanProcessor(SimpleSpanProcessor.builder(exporter).build()); - return openTelemetry.getTracer("Sample"); + // Tracer provider configured to export spans with SimpleSpanProcessor using + // the logging exporter. + SdkTracerProvider tracerProvider = + SdkTracerProvider.builder() + .addSpanProcessor(SimpleSpanProcessor.create(new LoggingSpanExporter())) + .build(); + return OpenTelemetrySdk.builder() + .setTracerProvider(tracerProvider) + .buildAndRegisterGlobal() + .getTracer("Sample"); } public static void doClientWork() { diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/samples/ListKeyVaultSecretsTracingSample.md b/sdk/core/azure-core-tracing-opentelemetry/src/samples/ListKeyVaultSecretsTracingSample.md index d75dc23de633c..90517b1b38155 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/samples/ListKeyVaultSecretsTracingSample.md +++ b/sdk/core/azure-core-tracing-opentelemetry/src/samples/ListKeyVaultSecretsTracingSample.md @@ -9,12 +9,12 @@ Sample uses **[opentelemetry-sdk][opentelemetry_sdk]** as implementation package io.opentelemetry opentelemetry-sdk - 0.14.1 + 0.17.1 io.opentelemetry - opentelemetry-exporters-logging - 0.14.1 + opentelemetry-exporter-logging + 0.17.1 ``` @@ -33,7 +33,7 @@ Sample uses **[opentelemetry-sdk][opentelemetry_sdk]** as implementation package com.azure azure-core-tracing-opentelemetry - 1.0.0-beta.7 + 1.0.0-beta.8 ``` @@ -48,6 +48,7 @@ import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Scope; import io.opentelemetry.exporter.logging.LoggingSpanExporter; import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; public class Sample { @@ -60,11 +61,16 @@ public class Sample { private static Tracer configureOpenTelemetryAndLoggingExporter() { LoggingSpanExporter exporter = new LoggingSpanExporter(); - OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder().build(); - openTelemetry - .getTracerManagement() - .addSpanProcessor(SimpleSpanProcessor.builder(exporter).build()); - return openTelemetry.getTracer("Sample"); + // Tracer provider configured to export spans with SimpleSpanProcessor using + // the logging exporter. + SdkTracerProvider tracerProvider = + SdkTracerProvider.builder() + .addSpanProcessor(SimpleSpanProcessor.create(new LoggingSpanExporter())) + .build(); + return OpenTelemetrySdk.builder() + .setTracerProvider(tracerProvider) + .buildAndRegisterGlobal() + .getTracer("Sample"); } private static void doClientWork() { diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/samples/PublishEventsTracingSample.md b/sdk/core/azure-core-tracing-opentelemetry/src/samples/PublishEventsTracingSample.md index e61adfd69916c..76e5ad6eef520 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/samples/PublishEventsTracingSample.md +++ b/sdk/core/azure-core-tracing-opentelemetry/src/samples/PublishEventsTracingSample.md @@ -9,12 +9,12 @@ Sample uses **[opentelemetry-sdk][opentelemetry_sdk]** for implementation and ** io.opentelemetry opentelemetry-sdk - 0.14.1 + 0.17.1 io.opentelemetry - opentelemetry-exporters-logging - 0.14.1 + opentelemetry-exporter-logging + 0.17.1 ``` @@ -29,7 +29,7 @@ Sample uses **[opentelemetry-sdk][opentelemetry_sdk]** for implementation and ** com.azure azure-core-tracing-opentelemetry - 1.0.0-beta.7 + 1.0.0-beta.8 ``` [//]: # ({x-version-update-end}) @@ -45,6 +45,7 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Scope; import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; import reactor.core.Exceptions; import reactor.core.publisher.Flux; @@ -68,9 +69,16 @@ public class Sample { private static Tracer configureOpenTelemetryAndLoggingExporter() { LoggingSpanExporter exporter = new LoggingSpanExporter(); - TracerSdkProvider tracerSdkProvider = OpenTelemetrySdk.getTracerProvider(); - tracerSdkProvider.addSpanProcessor(SimpleSpanProcessor.newBuilder(exporter).build()); - return tracerSdkProvider.get("Sample"); + // Tracer provider configured to export spans with SimpleSpanProcessor using + // the logging exporter. + SdkTracerProvider tracerProvider = + SdkTracerProvider.builder() + .addSpanProcessor(SimpleSpanProcessor.create(new LoggingSpanExporter())) + .build(); + return OpenTelemetrySdk.builder() + .setTracerProvider(tracerProvider) + .buildAndRegisterGlobal() + .getTracer("Sample"); } private static void doClientWork() { diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryHttpPolicyTests.java b/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryHttpPolicyTests.java index 499398e809afa..af392bb89c665 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryHttpPolicyTests.java +++ b/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryHttpPolicyTests.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Scope; import io.opentelemetry.sdk.OpenTelemetrySdk; @@ -70,7 +71,7 @@ public void openTelemetryHttpPolicyTest() { Span expectedSpan = tracer .spanBuilder("/anything") .setParent(io.opentelemetry.context.Context.current().with(parentSpan)) - .setSpanKind(Span.Kind.CLIENT) + .setSpanKind(SpanKind.CLIENT) .startSpan(); // Act @@ -99,8 +100,8 @@ private static HttpPipeline createHttpPipeline() { } private static void verifySpanContextAttributes(SpanContext expectedSpanContext, SpanContext actualSpanContext) { - assertEquals(expectedSpanContext.getTraceIdAsHexString(), actualSpanContext.getTraceIdAsHexString()); - assertNotEquals(expectedSpanContext.getSpanIdAsHexString(), actualSpanContext.getSpanIdAsHexString()); + assertEquals(expectedSpanContext.getTraceId(), actualSpanContext.getTraceId()); + assertNotEquals(expectedSpanContext.getSpanId(), actualSpanContext.getSpanId()); assertEquals(expectedSpanContext.getTraceFlags(), actualSpanContext.getTraceFlags()); assertEquals(expectedSpanContext.getTraceState(), actualSpanContext.getTraceState()); assertEquals(expectedSpanContext.isValid(), actualSpanContext.isValid()); diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracerTest.java b/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracerTest.java index c2cc203a9cbf5..55051afb9a3fd 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracerTest.java +++ b/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracerTest.java @@ -5,12 +5,15 @@ import com.azure.core.util.Context; import com.azure.core.util.tracing.ProcessKind; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanId; +import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceId; @@ -21,8 +24,9 @@ import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.sdk.trace.data.EventData; import io.opentelemetry.sdk.trace.data.LinkData; -import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -46,8 +50,6 @@ import static com.azure.core.util.tracing.Tracer.SPAN_CONTEXT_KEY; import static com.azure.core.util.tracing.Tracer.USER_SPAN_NAME_KEY; import static io.opentelemetry.api.trace.StatusCode.UNSET; -import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.MESSAGING_DESTINATION; -import static io.opentelemetry.semconv.trace.attributes.SemanticAttributes.PEER_SERVICE; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -59,11 +61,20 @@ * Tests Azure-OpenTelemetry tracing package using openTelemetry-sdk */ public class OpenTelemetryTracerTest { + private static final String METHOD_NAME = "EventHubs.send"; private static final String HOSTNAME_VALUE = "testEventDataNameSpace.servicebus.windows.net"; private static final String ENTITY_PATH_VALUE = "test"; private static final String AZ_NAMESPACE_VALUE = "Microsoft.Eventhub"; private static final Long MESSAGE_ENQUEUED_VALUE = Instant.ofEpochSecond(561639205).getEpochSecond(); + private static final int TRACEPARENT_DELIMITER_SIZE = 1; + private static final int TRACE_ID_HEX_SIZE = TraceId.getLength(); + private static final int SPAN_ID_HEX_SIZE = SpanId.getLength(); + private static final int TRACE_ID_OFFSET = 2 + TRACEPARENT_DELIMITER_SIZE; + private static final int SPAN_ID_OFFSET = + TRACE_ID_OFFSET + TRACE_ID_HEX_SIZE + TRACEPARENT_DELIMITER_SIZE; + private static final int TRACE_OPTION_OFFSET = + SPAN_ID_OFFSET + SPAN_ID_HEX_SIZE + TRACEPARENT_DELIMITER_SIZE; private OpenTelemetryTracer openTelemetryTracer; private Tracer tracer; @@ -72,22 +83,29 @@ public class OpenTelemetryTracerTest { private Scope scope; private HashMap expectedAttributeMap = new HashMap() { { - put(MESSAGING_DESTINATION.getKey(), ENTITY_PATH_VALUE); - put(PEER_SERVICE.getKey(), HOSTNAME_VALUE); + put(OpenTelemetryTracer.MESSAGE_BUS_DESTINATION, ENTITY_PATH_VALUE); + put(OpenTelemetryTracer.PEER_ENDPOINT, HOSTNAME_VALUE); put(AZ_NAMESPACE_KEY, AZ_NAMESPACE_VALUE); } }; @BeforeEach public void setUp() { - openTelemetryTracer = new OpenTelemetryTracer(); // Get the global singleton Tracer object. - tracer = OpenTelemetrySdk.builder().build().getTracer("TracerSdkTest"); + tracer = GlobalOpenTelemetry.getTracer("TracerSdkTest"); // Start user parent span. parentSpan = tracer.spanBuilder(PARENT_SPAN_KEY).startSpan(); scope = parentSpan.makeCurrent(); // Add parent span to tracingContext tracingContext = new Context(PARENT_SPAN_KEY, parentSpan); + OpenTelemetry openTelemetry = OpenTelemetrySdk.builder().build(); + openTelemetryTracer = new OpenTelemetryTracer(); + } + + @BeforeAll + public static void setUpAll() { + // Register the global tracer. + OpenTelemetrySdk.builder().buildAndRegisterGlobal(); } @AfterEach @@ -100,6 +118,11 @@ public void tearDown() { assertNull(tracingContext); } + @AfterAll + public static void tearDownAll() { + GlobalOpenTelemetry.resetForTest(); + } + @Test public void startSpanNullPointerException() { // Act @@ -109,7 +132,7 @@ public void startSpanNullPointerException() { @Test public void startSpanParentContextFlowTest() { // Arrange - final String parentSpanId = parentSpan.getSpanContext().getSpanIdAsHexString(); + final String parentSpanId = parentSpan.getSpanContext().getSpanId(); // Act final Context updatedContext = openTelemetryTracer.start(METHOD_NAME, @@ -119,7 +142,7 @@ public void startSpanParentContextFlowTest() { assertSpanWithExplicitParent(updatedContext, parentSpanId); final ReadableSpan recordEventsSpan = (ReadableSpan) updatedContext.getData(PARENT_SPAN_KEY).get(); - assertEquals(Span.Kind.INTERNAL, recordEventsSpan.toSpanData().getKind()); + assertEquals(SpanKind.INTERNAL, recordEventsSpan.toSpanData().getKind()); final Attributes attributeMap = recordEventsSpan.toSpanData().getAttributes(); assertEquals(attributeMap.get(AttributeKey.stringKey(AZ_NAMESPACE_KEY)), AZ_NAMESPACE_VALUE); } @@ -145,7 +168,7 @@ public void startSpanTestNoUserParent() { @Test public void startSpanProcessKindSend() { // Arrange - final String parentSpanId = parentSpan.getSpanContext().getSpanIdAsHexString(); + final String parentSpanId = parentSpan.getSpanContext().getSpanId(); // Start user parent span. final SpanBuilder spanBuilder = tracer.spanBuilder(METHOD_NAME); @@ -164,7 +187,7 @@ public void startSpanProcessKindSend() { assertSpanWithExplicitParent(updatedContext, parentSpanId); final ReadableSpan recordEventsSpan = (ReadableSpan) updatedContext.getData(PARENT_SPAN_KEY).get(); - assertEquals(Span.Kind.CLIENT, recordEventsSpan.toSpanData().getKind()); + assertEquals(SpanKind.CLIENT, recordEventsSpan.toSpanData().getKind()); // verify span attributes final Attributes attributeMap = recordEventsSpan.toSpanData().getAttributes(); @@ -175,7 +198,7 @@ public void startSpanProcessKindSend() { @Test public void startSpanProcessKindMessage() { // Arrange - final String parentSpanId = parentSpan.getSpanContext().getSpanIdAsHexString(); + final String parentSpanId = parentSpan.getSpanContext().getSpanId(); // Act final Context updatedContext = openTelemetryTracer.start(METHOD_NAME, tracingContext, ProcessKind.MESSAGE); @@ -186,7 +209,7 @@ public void startSpanProcessKindMessage() { // verify no kind set on Span for message final ReadableSpan recordEventsSpan = (ReadableSpan) updatedContext.getData(PARENT_SPAN_KEY).get(); - assertEquals(Span.Kind.PRODUCER, recordEventsSpan.toSpanData().getKind()); + assertEquals(SpanKind.PRODUCER, recordEventsSpan.toSpanData().getKind()); // verify diagnostic id and span context returned assertNotNull(updatedContext.getData(SPAN_CONTEXT_KEY).get()); assertNotNull(updatedContext.getData(DIAGNOSTIC_ID_KEY).get()); @@ -198,7 +221,7 @@ public void startSpanProcessKindMessage() { @Test public void startSpanProcessKindProcess() { // Arrange - final String parentSpanId = parentSpan.getSpanContext().getSpanIdAsHexString(); + final String parentSpanId = parentSpan.getSpanContext().getSpanId(); // Add additional metadata to spans for PROCESS final Context traceContext = tracingContext .addData(ENTITY_PATH_KEY, ENTITY_PATH_VALUE) @@ -218,7 +241,7 @@ public void startSpanProcessKindProcess() { assertNotNull(updatedContext.getData(SCOPE_KEY).get()); final ReadableSpan recordEventsSpan = (ReadableSpan) updatedContext.getData(PARENT_SPAN_KEY).get(); - assertEquals(Span.Kind.CONSUMER, recordEventsSpan.toSpanData().getKind()); + assertEquals(SpanKind.CONSUMER, recordEventsSpan.toSpanData().getKind()); // verify span attributes final Attributes attributeMap = recordEventsSpan.toSpanData().getAttributes(); @@ -242,10 +265,10 @@ public void getSpanBuilderTest() { public void startProcessSpanWithRemoteParent() { // Arrange final Span testSpan = tracer.spanBuilder("child-span").startSpan(); - final String testSpanId = testSpan.getSpanContext().getSpanIdAsHexString(); + final String testSpanId = testSpan.getSpanContext().getSpanId(); final SpanContext spanContext = SpanContext.createFromRemoteParent( - testSpan.getSpanContext().getTraceIdAsHexString(), - testSpan.getSpanContext().getSpanIdAsHexString(), + testSpan.getSpanContext().getTraceId(), + testSpan.getSpanContext().getSpanId(), testSpan.getSpanContext().getTraceFlags(), testSpan.getSpanContext().getTraceState()); final Context traceContext = tracingContext.addData(SPAN_CONTEXT_KEY, spanContext); @@ -285,10 +308,10 @@ public void addLinkTest() { // verify parent span has the expected Link LinkData createdLink = span1.toSpanData().getLinks().get(0); assertEquals(1, span1.toSpanData().getLinks().size()); - assertEquals(expectedLink.getSpanContext().getTraceIdAsHexString(), - createdLink.getSpanContext().getTraceIdAsHexString()); - assertEquals(expectedLink.getSpanContext().getSpanIdAsHexString(), - createdLink.getSpanContext().getSpanIdAsHexString()); + assertEquals(expectedLink.getSpanContext().getTraceId(), + createdLink.getSpanContext().getTraceId()); + assertEquals(expectedLink.getSpanContext().getSpanId(), + createdLink.getSpanContext().getSpanId()); } @Test @@ -346,7 +369,7 @@ public void endSpanErrorMessageTest() { assertEquals(1, events.size()); EventData event = events.get(0); assertEquals("exception", event.getName()); - assertEquals("custom error message", event.getAttributes().get(SemanticAttributes.EXCEPTION_MESSAGE)); + assertEquals("custom error message", event.getAttributes().get(AttributeKey.stringKey("exception.message"))); } @Test @@ -415,15 +438,21 @@ public void setSpanNameTest() { @Test public void extractContextValidDiagnosticId() { // Arrange - String diagnosticId = "00-bc7293302f5dc6de8a2372491092df95-dfd6fee494751d3f-01"; + String traceparent = "00-bc7293302f5dc6de8a2372491092df95-dfd6fee494751d3f-01"; + String traceId = + traceparent.substring(TRACE_ID_OFFSET, TRACE_ID_OFFSET + TraceId.getLength()); + String spanId = traceparent.substring(SPAN_ID_OFFSET, SPAN_ID_OFFSET + SpanId.getLength()); + + TraceFlags traceFlags = TraceFlags.fromHex(traceparent, TRACE_OPTION_OFFSET); + SpanContext validSpanContext = SpanContext.create( - TraceId.bytesToHex(TraceId.bytesFromHex(diagnosticId, 3)), - SpanId.bytesToHex(SpanId.bytesFromHex(diagnosticId, 36)), - TraceFlags.byteFromHex(diagnosticId, 53), + traceId, + spanId, + traceFlags, TraceState.builder().build()); // Act - Context updatedContext = openTelemetryTracer.extractContext(diagnosticId, Context.NONE); + Context updatedContext = openTelemetryTracer.extractContext(traceparent, Context.NONE); // Assert Optional spanContextOptional = updatedContext.getData(SPAN_CONTEXT_KEY); @@ -566,7 +595,7 @@ private static void assertSpanWithRemoteParent(Context updatedContext, String pa final ReadableSpan recordEventsSpan = (ReadableSpan) updatedContext.getData(PARENT_SPAN_KEY).get(); assertEquals(METHOD_NAME, recordEventsSpan.getName()); - assertEquals(Span.Kind.CONSUMER, recordEventsSpan.toSpanData().getKind()); + assertEquals(SpanKind.CONSUMER, recordEventsSpan.toSpanData().getKind()); // verify span started with remote parent assertTrue(recordEventsSpan.toSpanData().getParentSpanContext().isRemote()); diff --git a/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/implementation/HttpTraceUtilTest.java b/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/implementation/HttpTraceUtilTest.java index b953acd1cf153..0cebaf66ed2ec 100644 --- a/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/implementation/HttpTraceUtilTest.java +++ b/sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/implementation/HttpTraceUtilTest.java @@ -2,7 +2,6 @@ // Licensed under the MIT License. package com.azure.core.tracing.opentelemetry.implementation; -import com.azure.core.tracing.opentelemetry.OpenTelemetryTracer; import com.azure.core.util.Context; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.StatusCode; @@ -22,7 +21,6 @@ public class HttpTraceUtilTest { - private OpenTelemetryTracer openTelemetryTracer; private Tracer tracer; private Context tracingContext; private Span parentSpan; @@ -30,7 +28,6 @@ public class HttpTraceUtilTest { @BeforeEach public void setUp() { - openTelemetryTracer = new OpenTelemetryTracer(); // Get the global singleton Tracer object. tracer = OpenTelemetrySdk.builder().build().getTracer("TracerSdkTest"); // Start user parent span. diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md index 9e0f695071601..0a0c0ea1d284e 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md @@ -1,7 +1,7 @@ # Release History ## 1.0.0-beta.4 (Unreleased) - +- Updated versions of `opentelemetry-api` and `opentelemetry-sdk` to `0.16.0` version. ## 1.0.0-beta.3 (2021-02-09) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/pom.xml b/sdk/monitor/azure-monitor-opentelemetry-exporter/pom.xml index 052cc25f24acb..55ff9905d96d7 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/pom.xml +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/pom.xml @@ -44,12 +44,12 @@ io.opentelemetry opentelemetry-api - 0.14.1 + 0.17.1 io.opentelemetry opentelemetry-sdk - 0.14.1 + 0.17.1 @@ -101,7 +101,7 @@ com.azure azure-core-tracing-opentelemetry - 1.0.0-beta.7 + 1.0.0-beta.8 test @@ -137,8 +137,8 @@ - io.opentelemetry:opentelemetry-api:[0.14.1] - io.opentelemetry:opentelemetry-sdk:[0.14.1] + io.opentelemetry:opentelemetry-api:[0.17.1] + io.opentelemetry:opentelemetry-sdk:[0.17.1] @@ -165,6 +165,18 @@ + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M3 + + + + false + + + diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/AzureMonitorTraceExporter.java b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/AzureMonitorTraceExporter.java index 6db2b1c9d81bf..76e21a1bede43 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/AzureMonitorTraceExporter.java +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/AzureMonitorTraceExporter.java @@ -6,17 +6,18 @@ import com.azure.core.util.CoreUtils; import com.azure.core.util.logging.ClientLogger; import com.azure.core.util.tracing.Tracer; -import com.azure.monitor.opentelemetry.exporter.implementation.models.TelemetryEventData; -import com.azure.monitor.opentelemetry.exporter.implementation.models.TelemetryExceptionData; -import com.azure.monitor.opentelemetry.exporter.implementation.models.TelemetryExceptionDetails; -import com.azure.monitor.opentelemetry.exporter.implementation.models.TelemetryItem; import com.azure.monitor.opentelemetry.exporter.implementation.models.ContextTagKeys; import com.azure.monitor.opentelemetry.exporter.implementation.models.MonitorBase; import com.azure.monitor.opentelemetry.exporter.implementation.models.RemoteDependencyData; import com.azure.monitor.opentelemetry.exporter.implementation.models.RequestData; +import com.azure.monitor.opentelemetry.exporter.implementation.models.TelemetryEventData; +import com.azure.monitor.opentelemetry.exporter.implementation.models.TelemetryExceptionData; +import com.azure.monitor.opentelemetry.exporter.implementation.models.TelemetryExceptionDetails; +import com.azure.monitor.opentelemetry.exporter.implementation.models.TelemetryItem; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.trace.data.EventData; import io.opentelemetry.sdk.trace.data.LinkData; @@ -130,17 +131,17 @@ public CompletableResultCode shutdown() { } private void export(SpanData span, List telemetryItems) { - Span.Kind kind = span.getKind(); + SpanKind kind = span.getKind(); String instrumentationName = span.getInstrumentationLibraryInfo().getName(); Matcher matcher = COMPONENT_PATTERN.matcher(instrumentationName); String stdComponent = matcher.matches() ? matcher.group(1) : null; - if ("jms".equals(stdComponent) && !span.getParentSpanContext().isValid() && kind == Span.Kind.CLIENT) { + if ("jms".equals(stdComponent) && !span.getParentSpanContext().isValid() && kind == SpanKind.CLIENT) { // no need to capture these, at least is consistent with prior behavior // these tend to be frameworks pulling messages which are then pushed to consumers // where we capture them return; } - if (kind == Span.Kind.INTERNAL) { + if (kind == SpanKind.INTERNAL) { if (!span.getParentSpanContext().isValid()) { // TODO (srnagar): revisit this decision // maybe user-generated telemetry? @@ -152,9 +153,9 @@ private void export(SpanData span, List telemetryItems) { } else { exportRemoteDependency(stdComponent, span, true, telemetryItems); } - } else if (kind == Span.Kind.CLIENT || kind == Span.Kind.PRODUCER) { + } else if (kind == SpanKind.CLIENT || kind == SpanKind.PRODUCER) { exportRemoteDependency(stdComponent, span, false, telemetryItems); - } else if (kind == Span.Kind.SERVER || kind == Span.Kind.CONSUMER) { + } else if (kind == SpanKind.SERVER || kind == SpanKind.CONSUMER) { exportRequest(stdComponent, span, telemetryItems); } else { throw logger.logExceptionAsError(new UnsupportedOperationException(kind.name())); @@ -247,7 +248,7 @@ private void exportRemoteDependency(String stdComponent, SpanData span, boolean remoteDependencyData .setDuration(getFormattedDuration(Duration.ofNanos(span.getEndEpochNanos() - span.getStartEpochNanos()))); - remoteDependencyData.setSuccess(span.getStatus().isOk()); + remoteDependencyData.setSuccess(StatusCode.OK.equals(span.getStatus().getStatusCode())); String description = span.getStatus().getDescription(); if (description != null) { remoteDependencyData.getProperties().put("statusDescription", description); @@ -381,12 +382,12 @@ private void exportRequest(String stdComponent, SpanData span, List properties, List link sb.append(","); } sb.append("{\"operation_Id\":\""); - sb.append(link.getSpanContext().getTraceIdAsHexString()); + sb.append(link.getSpanContext().getTraceId()); sb.append("\",\"id\":\""); - sb.append(link.getSpanContext().getSpanIdAsHexString()); + sb.append(link.getSpanContext().getSpanId()); sb.append("\"}"); first = false; } diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/test/java/com/azure/monitor/opentelemetry/exporter/AzureMonitorTraceExporterTest.java b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/test/java/com/azure/monitor/opentelemetry/exporter/AzureMonitorTraceExporterTest.java index 2c6850bd6d0cc..80be5742d3f29 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/src/test/java/com/azure/monitor/opentelemetry/exporter/AzureMonitorTraceExporterTest.java +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/src/test/java/com/azure/monitor/opentelemetry/exporter/AzureMonitorTraceExporterTest.java @@ -4,13 +4,12 @@ package com.azure.monitor.opentelemetry.exporter; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanId; +import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.TraceState; -import io.opentelemetry.api.trace.attributes.SemanticAttributes; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.common.InstrumentationLibraryInfo; import io.opentelemetry.sdk.resources.Resource; @@ -48,24 +47,20 @@ public void testExportRequestData() { } static class RequestSpanData implements SpanData { - @Override - public String getTraceId() { - return TRACE_ID; - } @Override - public String getSpanId() { - return SPAN_ID; + public SpanContext getSpanContext() { + return SpanContext.create(TRACE_ID, SPAN_ID, TraceFlags.getDefault(), TRACE_STATE); } @Override - public boolean isSampled() { - return false; + public String getTraceId() { + return TRACE_ID; } @Override - public TraceState getTraceState() { - return TRACE_STATE; + public String getSpanId() { + return SPAN_ID; } @Override @@ -94,8 +89,8 @@ public String getName() { } @Override - public Span.Kind getKind() { - return Span.Kind.INTERNAL; + public SpanKind getKind() { + return SpanKind.INTERNAL; } @Override @@ -106,9 +101,9 @@ public long getStartEpochNanos() { @Override public Attributes getAttributes() { return Attributes.builder() - .put(SemanticAttributes.HTTP_STATUS_CODE.getKey(), 200L) - .put(SemanticAttributes.HTTP_URL.getKey(), "http://localhost") - .put(SemanticAttributes.HTTP_METHOD.getKey(), "GET") + .put("http.status_code", 200L) + .put("http.url", "http://localhost") + .put("http.method", "GET") .put("ai.sampling.percentage", 100.0) .build(); }