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