From 7b95368ea6209cc0831782d28c1e508b9a6ab636 Mon Sep 17 00:00:00 2001
From: Sameeksha Vaity
Date: Fri, 22 Nov 2019 11:01:11 -0800
Subject: [PATCH 1/9] Revert "update samples and package versions"
This reverts commit 9e9951bc406cc0152e6b8ed0c46664b42b144c55.
---
.../azure-core-tracing-opencensus/README.md | 15 +++-----
.../src/samples/AsyncListKeyVaultSecrets.md | 2 +-
.../AsyncQueueClientEnqueueMessages.md | 2 +-
.../src/samples/ListeKeyVaultSecrets.md | 2 +-
.../src/samples/PublishEvents.md | 38 ++++++++-----------
.../src/samples/QueueClientEnqueueMessages.md | 2 +-
.../CHANGELOG.md | 9 -----
.../README.md | 12 ++----
.../src/samples/PublishEventsTracingSample.md | 33 ++++++----------
9 files changed, 39 insertions(+), 76 deletions(-)
diff --git a/sdk/core/azure-core-tracing-opencensus/README.md b/sdk/core/azure-core-tracing-opencensus/README.md
index 00a7c834c67e..8497caa53333 100644
--- a/sdk/core/azure-core-tracing-opencensus/README.md
+++ b/sdk/core/azure-core-tracing-opencensus/README.md
@@ -19,7 +19,7 @@ documentation][api_documentation] | [Samples][samples]
com.azure
azure-core-tracing-opencensus
- 1.0.0-beta.5
+ 1.0.0-beta.4
```
[//]: # ({x-version-update-end})
@@ -90,15 +90,10 @@ private static final Tracer TRACER;
.buildProducerClient();
try (Scope scope = TRACER.spanBuilder("tracing-user-span").startScopedSpan()) {
- EventData event1 = new EventData("1".getBytes(UTF_8));
- event1.addContext(PARENT_SPAN_KEY, span);
-
- EventDataBatch eventDataBatch = producer.createBatch();
-
- if (!eventDataBatch.tryAdd(eventData)) {
- producer.send(eventDataBatch);
- eventDataBatch = producer.createBatch();
- }
+ Context tracingContext = new Context(PARENT_SPAN_KEY, TRACER.getCurrentSpan());
+ // Create an event to send
+ final EventData eventData = new EventData("Hello world!".getBytes(UTF_8), traceContext);
+ producer.send(eventData);
} finally {
Tracing.getExportComponent().shutdown();
}
diff --git a/sdk/core/azure-core-tracing-opencensus/src/samples/AsyncListKeyVaultSecrets.md b/sdk/core/azure-core-tracing-opencensus/src/samples/AsyncListKeyVaultSecrets.md
index 1e29612b229d..d1714b8b2b57 100644
--- a/sdk/core/azure-core-tracing-opencensus/src/samples/AsyncListKeyVaultSecrets.md
+++ b/sdk/core/azure-core-tracing-opencensus/src/samples/AsyncListKeyVaultSecrets.md
@@ -22,7 +22,7 @@ Sample uses **[opencensus-impl][opencensus_impl]** as implementation package and
com.azure
azure-core-tracing-opencensus
- 1.0.0-beta.5
+ 1.0.0-beta.4
```
[//]: # ({x-version-update-end})
diff --git a/sdk/core/azure-core-tracing-opencensus/src/samples/AsyncQueueClientEnqueueMessages.md b/sdk/core/azure-core-tracing-opencensus/src/samples/AsyncQueueClientEnqueueMessages.md
index 27e2066b6f39..eb2997a65e13 100644
--- a/sdk/core/azure-core-tracing-opencensus/src/samples/AsyncQueueClientEnqueueMessages.md
+++ b/sdk/core/azure-core-tracing-opencensus/src/samples/AsyncQueueClientEnqueueMessages.md
@@ -24,7 +24,7 @@ Sample uses **[opencensus-impl][opencensus_impl]** as implementation package and
com.azure
azure-core-tracing-opencensus
- 1.0.0-beta.5
+ 1.0.0-beta.4
```
[//]: # ({x-version-update-end})
diff --git a/sdk/core/azure-core-tracing-opencensus/src/samples/ListeKeyVaultSecrets.md b/sdk/core/azure-core-tracing-opencensus/src/samples/ListeKeyVaultSecrets.md
index 4ed8864983f8..43e63e44b96e 100644
--- a/sdk/core/azure-core-tracing-opencensus/src/samples/ListeKeyVaultSecrets.md
+++ b/sdk/core/azure-core-tracing-opencensus/src/samples/ListeKeyVaultSecrets.md
@@ -23,7 +23,7 @@ Sample uses **[opencensus-impl][opencensus_impl]** as implementation package and
com.azure
azure-core-tracing-opencensus
- 1.0.0-beta.5
+ 1.0.0-beta.4
```
[//]: # ({x-version-update-end})
diff --git a/sdk/core/azure-core-tracing-opencensus/src/samples/PublishEvents.md b/sdk/core/azure-core-tracing-opencensus/src/samples/PublishEvents.md
index 29674153f9b8..afb0878bc0d3 100644
--- a/sdk/core/azure-core-tracing-opencensus/src/samples/PublishEvents.md
+++ b/sdk/core/azure-core-tracing-opencensus/src/samples/PublishEvents.md
@@ -14,7 +14,7 @@ Sample uses **[opencensus-impl][opencensus_impl]** as implementation package and
com.azure
azure-messaging-eventhubs
- 5.0.0-beta.6
+ 5.0.0-beta.5
```
[//]: # ({x-version-update-end})
@@ -68,31 +68,25 @@ public class PublishEvents {
}
public static void main(String[] args) {
- EventHubProducerClient producer = new EventHubClientBuilder()
- .connectionString(connectionString)
- .buildProducerClient();
+ final int count = 2;
+ final byte[] body = "Hello World!".getBytes(UTF_8);
try(Scope scope = TRACER.spanBuilder("user-parent-span").startScopedSpan()) {
- final EventData event1 = new EventData("1".getBytes(UTF_8));
- event1.addContext(PARENT_SPAN_KEY, TRACER.getCurrentSpan());
-
- final EventData event2 = new EventData("2".getBytes(UTF_8));
- event2.addContext(PARENT_SPAN_KEY, TRACER.getCurrentSpan());
- final List telemetryEvents = Arrays.asList(event1, event2);
- final CreateBatchOptions options = new CreateBatchOptions()
- .setPartitionKey("telemetry")
- .setMaximumSizeInBytes(256);
-
- EventDataBatch currentBatch = producer.createBatch(options);
+ Context traceContext = new Context(PARENT_SPAN_KEY, TRACER.getCurrentSpan());
+
+ EventHubProducerClient producer = new EventHubClientBuilder()
+ .connectionString(CONNECTION_STRING)
+ .buildProducer();
- // For each telemetry event, we try to add it to the current batch.
- for (EventData event : telemetryEvents) {
- if (!currentBatch.tryAdd(event)) {
- producer.send(currentBatch);
- currentBatch = producer.createBatch(options);
- }
- }
+ final Context traceContext = new Context(PARENT_SPAN_KEY, TRACER.getCurrentSpan());
+ final Flux testData = Flux.range(0, count)
+ .flatMap(number -> {
+ final EventData data = new EventData(body, traceContext);
+ return Flux.just(data);
+ });
+
+ producer.send(testData.toIterable(1));
} finally {
producer.close();
Tracing.getExportComponent().shutdown();
diff --git a/sdk/core/azure-core-tracing-opencensus/src/samples/QueueClientEnqueueMessages.md b/sdk/core/azure-core-tracing-opencensus/src/samples/QueueClientEnqueueMessages.md
index 8ce90a2ff790..f910c9758d3c 100644
--- a/sdk/core/azure-core-tracing-opencensus/src/samples/QueueClientEnqueueMessages.md
+++ b/sdk/core/azure-core-tracing-opencensus/src/samples/QueueClientEnqueueMessages.md
@@ -24,7 +24,7 @@ Sample uses **[opencensus-impl][opencensus_impl]** as implementation package and
com.azure
azure-core-tracing-opencensus
- 1.0.0-beta.5
+ 1.0.0-beta.4
```
[//]: # ({x-version-update-end})
diff --git a/sdk/core/azure-core-tracing-opentelemetry/CHANGELOG.md b/sdk/core/azure-core-tracing-opentelemetry/CHANGELOG.md
index 780d77ac2ad6..7180efe5049e 100644
--- a/sdk/core/azure-core-tracing-opentelemetry/CHANGELOG.md
+++ b/sdk/core/azure-core-tracing-opentelemetry/CHANGELOG.md
@@ -11,12 +11,3 @@ and
## Version 1.0.0-beta.1 (2019-11-26)
For details on the Azure SDK for Java (Decemeber 2019 Preview) release refer to the [release announcement](https://aka.ms/azure-sdk-preview5-java).
-Version 1.0.0-beta.1 is the first preview of our efforts to provide low level interfaces and helper methods to support tracing for Java client libraries.
-This library includes [OpenTelemetry](https://opentelemetry.io/) implementation of the interface.
-This library added tracing instrumentation for AMQP and HTTP Java SDK client libraries across different languages and platforms.
-
-This package's
-[documentation](https://github.com/Azure/azure-sdk-for-java/blob/azure-core-tracing-opentelemetry_1.0.0-beta.1/sdk/core/azure-core-tracing-opentelemetry/README.md)
-and
-[samples](https://github.com/Azure/azure-sdk-for-java/blob/azure-core-tracing-opentelemetry_1.0.0-beta.1/sdk/core/azure-core-tracing-opentelemetry/src/samples).
-
diff --git a/sdk/core/azure-core-tracing-opentelemetry/README.md b/sdk/core/azure-core-tracing-opentelemetry/README.md
index 772a8b26ac5a..8e6c8854b24c 100644
--- a/sdk/core/azure-core-tracing-opentelemetry/README.md
+++ b/sdk/core/azure-core-tracing-opentelemetry/README.md
@@ -94,15 +94,9 @@ private static final TracerSdkFactory TRACER_SDK_FACTORY;
Span span = TRACER.spanBuilder("user-parent-span").startSpan();
try (Scope scope = TRACER.withSpan(span)) {
- EventData event1 = new EventData("1".getBytes(UTF_8));
- event1.addContext(PARENT_SPAN_KEY, span);
-
- EventDataBatch eventDataBatch = producer.createBatch();
-
- if (!eventDataBatch.tryAdd(eventData)) {
- producer.send(eventDataBatch);
- eventDataBatch = producer.createBatch();
- }
+ Context traceContext = new Context(PARENT_SPAN_KEY, span);
+ EventData eventData = new EventData("Hello world!".getBytes(UTF_8), traceContext);
+ producer.send(eventData);
} finally {
span.end();
}
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 2bd9d1bd6ab7..ec3cb269e6fe 100644
--- a/sdk/core/azure-core-tracing-opentelemetry/src/samples/PublishEventsTracingSample.md
+++ b/sdk/core/azure-core-tracing-opentelemetry/src/samples/PublishEventsTracingSample.md
@@ -81,31 +81,20 @@ public class Sample {
private static void doClientWork() {
EventHubProducerClient producer = new EventHubClientBuilder()
- .connectionString(connectionString)
- .buildProducerClient();
+ .connectionString(CONNECTION_STRING)
+ .buildProducer();
+
+ final int count = 2;
+ final byte[] body = "Hello World!".getBytes(UTF_8);
Span span = TRACER.spanBuilder("user-parent-span").startSpan();
try (final Scope scope = TRACER.withSpan(span)) {
- final EventData event1 = new EventData("1".getBytes(UTF_8));
- event1.addContext(PARENT_SPAN_KEY, span);
-
- final EventData event2 = new EventData("2".getBytes(UTF_8));
- event2.addContext(PARENT_SPAN_KEY, span);
-
- final List telemetryEvents = Arrays.asList(event1, event2);
- final CreateBatchOptions options = new CreateBatchOptions()
- .setPartitionKey("telemetry")
- .setMaximumSizeInBytes(256);
-
- EventDataBatch currentBatch = producer.createBatch(options);
-
- // For each telemetry event, we try to add it to the current batch.
- for (EventData event : telemetryEvents) {
- if (!currentBatch.tryAdd(event)) {
- producer.send(currentBatch);
- currentBatch = producer.createBatch(options);
- }
- }
+ final Context traceContext = new Context(PARENT_SPAN_KEY, span);
+ final Flux testData = Flux.range(0, count).flatMap(number -> {
+ final EventData data = new EventData(body, traceContext);
+ return Flux.just(data);
+ });
+ producer.send(testData.toIterable(1));
} finally {
span.end();
producer.close();
From 22d1c99ff4498d24d839c38a7b2874c12d6fc878 Mon Sep 17 00:00:00 2001
From: Sameeksha Vaity
Date: Wed, 11 Dec 2019 16:10:25 -0800
Subject: [PATCH 2/9] add links on batch send
---
.../amqp/implementation/TracerProvider.java | 1 +
.../opentelemetry/OpenTelemetryTracer.java | 8 +++++++-
.../opentelemetry/OpenTelemetryTracerTest.java | 17 +++++++++++++----
.../azure/core/util/tracing/ProcessKind.java | 6 +++++-
.../eventhubs/EventHubProducerAsyncClient.java | 9 +++++++--
.../EventHubProducerAsyncClientTest.java | 14 ++++++++++++++
.../eventhubs/EventHubProducerClientTest.java | 15 +++++++++++++++
7 files changed, 62 insertions(+), 8 deletions(-)
diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java
index f39076bf10e7..143fa83d748c 100644
--- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java
+++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java
@@ -118,6 +118,7 @@ private String getSpanName(ProcessKind processKind) {
String spanName = "EventHubs.";
switch (processKind) {
case SEND:
+ case LINK:
spanName += "send";
break;
case MESSAGE:
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 d0040fcf23fc..57faba6e86ba 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
@@ -66,7 +66,11 @@ public Context start(String spanName, Context context, ProcessKind processKind)
switch (processKind) {
case SEND:
- spanBuilder = getSpanBuilder(spanName, context);
+ // use previosuly created span builder from the LINK process.
+ spanBuilder = getOrDefault(context, SPAN_BUILDER_KEY, null, Builder.class);
+ if (spanBuilder == null) {
+ return Context.NONE;
+ }
span = spanBuilder.setSpanKind(Span.Kind.PRODUCER).startSpan();
if (span.isRecording()) {
// If span is sampled in, add additional request attributes
@@ -81,6 +85,8 @@ public Context start(String spanName, Context context, ProcessKind processKind)
return context.addData(PARENT_SPAN_KEY, span);
case PROCESS:
return startScopedSpan(spanName, context);
+ case LINK:
+ return context.addData(SPAN_BUILDER_KEY, getSpanBuilder(spanName, context));
default:
return Context.NONE;
}
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 dfb362de9756..d687bde4647d 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
@@ -92,7 +92,6 @@ public void startSpanParentContextFlowTest() {
final ReadableSpan recordEventsSpan =
(ReadableSpan) updatedContext.getData(PARENT_SPAN_KEY).get();
assertEquals(Span.Kind.INTERNAL, recordEventsSpan.toSpanData().getKind());
- assertEquals(true, true);
}
@Test
@@ -117,9 +116,11 @@ public void startSpanTestNoUserParent() {
public void startSpanProcessKindSend() {
// Arrange
final SpanId parentSpanId = parentSpan.getContext().getSpanId();
+ // Start user parent span.
+ final Span.Builder spanBuilder = tracer.spanBuilder(METHOD_NAME);
// Add additional metadata to spans for SEND
final Context traceContext = tracingContext.addData(ENTITY_PATH_KEY, ENTITY_PATH_VALUE)
- .addData(HOST_NAME_KEY, HOSTNAME_VALUE);
+ .addData(HOST_NAME_KEY, HOSTNAME_VALUE).addData(SPAN_BUILDER_KEY, spanBuilder);
// Act
final Context updatedContext = openTelemetryTracer.start(METHOD_NAME, traceContext, ProcessKind.SEND);
@@ -181,6 +182,14 @@ public void startSpanProcessKindProcess() {
verifySpanAttributes(attributeMap);
}
+ @Test
+ public void startSpanProcessKindLink() {
+ // Act
+ final Context updatedContext = openTelemetryTracer.start(METHOD_NAME, Context.NONE, ProcessKind.LINK);
+
+ assertTrue(updatedContext.getData(SPAN_BUILDER_KEY).isPresent());
+ }
+
@Test
public void startProcessSpanWithRemoteParent() {
// Arrange
@@ -277,7 +286,7 @@ public void endSpanTestThrowableResponseCode() {
}
private static void assertSpanWithExplicitParent(Context updatedContext, SpanId parentSpanId) {
- assertNotNull(updatedContext.getData(PARENT_SPAN_KEY));
+ assertNotNull(updatedContext.getData(PARENT_SPAN_KEY).get());
// verify instance created of opentelemetry-sdk (test impl), span implementation
assertTrue(updatedContext.getData(PARENT_SPAN_KEY).get() instanceof ReadableSpan);
@@ -292,7 +301,7 @@ private static void assertSpanWithExplicitParent(Context updatedContext, SpanId
}
private static void assertSpanWithRemoteParent(Context updatedContext, SpanId parentSpanId) {
- assertNotNull(updatedContext.getData(PARENT_SPAN_KEY));
+ assertNotNull(updatedContext.getData(PARENT_SPAN_KEY).get());
// verify instance created of opentelemetry-sdk (test impl), span implementation
assertTrue(updatedContext.getData(PARENT_SPAN_KEY).get() instanceof ReadableSpan);
diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/ProcessKind.java b/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/ProcessKind.java
index d0410d8e5007..96239adc2924 100644
--- a/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/ProcessKind.java
+++ b/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/ProcessKind.java
@@ -18,5 +18,9 @@ public enum ProcessKind {
/**
* Custom process call to process received messages.
*/
- PROCESS
+ PROCESS,
+ /**
+ * Custom process call to link messages to Send.
+ */
+ LINK
}
diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java
index 1b68062096f2..48e23d755469 100644
--- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java
+++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java
@@ -47,6 +47,7 @@
import static com.azure.core.util.FluxUtil.monoError;
import static com.azure.core.util.tracing.Tracer.ENTITY_PATH_KEY;
import static com.azure.core.util.tracing.Tracer.HOST_NAME_KEY;
+import static com.azure.core.util.tracing.Tracer.SPAN_CONTEXT_KEY;
import static com.azure.messaging.eventhubs.implementation.ClientConstants.MAX_MESSAGE_LENGTH_BYTES;
/**
@@ -397,10 +398,13 @@ public Mono send(EventDataBatch batch) {
? new AtomicReference<>(Context.NONE)
: null;
+ // initiate addLink on send span, get shared span builder for all links
+ Context sharedContext = isTracingEnabled ? tracerProvider.startSpan(parentContext.get(), ProcessKind.LINK) :
+ null;
final List messages = batch.getEvents().stream().map(event -> {
final Message message = messageSerializer.serialize(event);
if (isTracingEnabled) {
- parentContext.set(event.getContext());
+ tracerProvider.addSpanLinks(sharedContext.addData(SPAN_CONTEXT_KEY, event.getContext()));
}
if (!CoreUtils.isNullOrEmpty(partitionKey)) {
final MessageAnnotations messageAnnotations = message.getMessageAnnotations() == null
@@ -408,6 +412,7 @@ public Mono send(EventDataBatch batch) {
: message.getMessageAnnotations();
messageAnnotations.getValue().put(AmqpConstants.PARTITION_KEY, partitionKey);
message.setMessageAnnotations(messageAnnotations);
+
}
return message;
@@ -416,7 +421,7 @@ public Mono send(EventDataBatch batch) {
return getSendLink(batch.getPartitionId())
.flatMap(link -> {
if (isTracingEnabled) {
- Context userSpanContext = parentContext.get();
+ Context userSpanContext = sharedContext;
Context entityContext = userSpanContext.addData(ENTITY_PATH_KEY, link.getEntityPath());
// start send span and store updated context
parentContext.set(tracerProvider.startSpan(
diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java
index 0676d5f1145f..f21d8734f4bf 100644
--- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java
+++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java
@@ -44,6 +44,7 @@
import static com.azure.core.util.tracing.Tracer.DIAGNOSTIC_ID_KEY;
import static com.azure.core.util.tracing.Tracer.PARENT_SPAN_KEY;
+import static com.azure.core.util.tracing.Tracer.SPAN_BUILDER_KEY;
import static com.azure.core.util.tracing.Tracer.SPAN_CONTEXT_KEY;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.mockito.ArgumentMatchers.any;
@@ -244,6 +245,13 @@ public void sendStartSpanSingleMessage() {
}
);
+ when(tracer1.start(eq("Azure.eventhubs.send"), any(), eq(ProcessKind.LINK))).thenAnswer(
+ invocation -> {
+ Context passed = invocation.getArgument(1, Context.class);
+ return passed.addData(SPAN_BUILDER_KEY, "value");
+ }
+ );
+
// Act
StepVerifier.create(asyncProducer.send(testData, sendOptions))
.verifyComplete();
@@ -293,6 +301,12 @@ public void sendMessageRetrySpanTest() {
return passed.addData(PARENT_SPAN_KEY, "value");
}
);
+ when(tracer1.start(eq("Azure.eventhubs.send"), any(), eq(ProcessKind.LINK))).thenAnswer(
+ invocation -> {
+ Context passed = invocation.getArgument(1, Context.class);
+ return passed.addData(SPAN_BUILDER_KEY, "value");
+ }
+ );
//Act
StepVerifier.create(asyncProducer.send(testData, sendOptions)).verifyComplete();
diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java
index b06267314e79..516bfb79b739 100644
--- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java
+++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java
@@ -44,6 +44,7 @@
import static com.azure.core.util.tracing.Tracer.DIAGNOSTIC_ID_KEY;
import static com.azure.core.util.tracing.Tracer.PARENT_SPAN_KEY;
+import static com.azure.core.util.tracing.Tracer.SPAN_BUILDER_KEY;
import static com.azure.core.util.tracing.Tracer.SPAN_CONTEXT_KEY;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.mockito.ArgumentMatchers.any;
@@ -168,6 +169,13 @@ public void sendStartSpanSingleMessage() {
return passed.addData(PARENT_SPAN_KEY, "value").addData(DIAGNOSTIC_ID_KEY, "value2");
}
);
+ when(tracer1.start(eq("Azure.eventhubs.send"), any(), eq(ProcessKind.LINK))).thenAnswer(
+ invocation -> {
+ Context passed = invocation.getArgument(1, Context.class);
+ return passed.addData(SPAN_BUILDER_KEY, "value");
+ }
+ );
+
//Act
producer.send(eventData);
@@ -209,6 +217,13 @@ public void sendMessageRetrySpanTest() {
}
);
+ when(tracer1.start(eq("Azure.eventhubs.send"), any(), eq(ProcessKind.LINK))).thenAnswer(
+ invocation -> {
+ Context passed = invocation.getArgument(1, Context.class);
+ return passed.addData(SPAN_BUILDER_KEY, "value");
+ }
+ );
+
//Act
producer.send(eventData);
From 2a2d41e33b38bb11c07fa1e284256112d354f321 Mon Sep 17 00:00:00 2001
From: Sameeksha Vaity
Date: Wed, 11 Dec 2019 17:46:09 -0800
Subject: [PATCH 3/9] update method name to getSpanBuilder()
---
.../amqp/implementation/TracerProvider.java | 15 +-
.../opentelemetry/OpenTelemetryTracer.java | 17 +-
.../OpenTelemetryTracerTest.java | 4 +-
.../azure/core/util/tracing/ProcessKind.java | 6 +-
.../com/azure/core/util/tracing/Tracer.java | 16 ++
.../tracing/TracerJavaDocCodeSnippets.java | 17 ++
.../EventHubProducerAsyncClient.java | 161 +++++++++---------
.../EventHubProducerAsyncClientTest.java | 5 +-
.../eventhubs/EventHubProducerClientTest.java | 4 +-
9 files changed, 143 insertions(+), 102 deletions(-)
diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java
index 143fa83d748c..7fb7ab659813 100644
--- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java
+++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java
@@ -108,6 +108,20 @@ public Context extractContext(String diagnosticId, Context context) {
return local;
}
+ /**
+ * For each tracer plugged into the SDK a new context containing the span builder is returned.
+ *
+ * @param context Additional metadata containing the span name for creating the span builer.
+ */
+ public Context getSpanBuilder(Context context) {
+ Context local = Objects.requireNonNull(context, "'context' cannot be null.");
+ String spanName = getSpanName(ProcessKind.SEND);
+ for (Tracer tracer : tracers) {
+ local = tracer.getSpanBuilder(spanName, local);
+ }
+ return local;
+ }
+
private void end(String statusMessage, Throwable throwable, Context context) {
for (Tracer tracer : tracers) {
tracer.end(statusMessage, throwable, context);
@@ -118,7 +132,6 @@ private String getSpanName(ProcessKind processKind) {
String spanName = "EventHubs.";
switch (processKind) {
case SEND:
- case LINK:
spanName += "send";
break;
case MESSAGE:
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 57faba6e86ba..b631d887bc24 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
@@ -46,7 +46,7 @@ public Context start(String spanName, Context context) {
Objects.requireNonNull(spanName, "'spanName' cannot be null.");
Objects.requireNonNull(context, "'context' cannot be null.");
- Builder spanBuilder = getSpanBuilder(spanName, context);
+ Builder spanBuilder = getParentSpanBuilder(spanName, context);
Span span = spanBuilder.startSpan();
return context.addData(PARENT_SPAN_KEY, span);
@@ -66,7 +66,7 @@ public Context start(String spanName, Context context, ProcessKind processKind)
switch (processKind) {
case SEND:
- // use previosuly created span builder from the LINK process.
+ // use previously created span builder from the LINK process.
spanBuilder = getOrDefault(context, SPAN_BUILDER_KEY, null, Builder.class);
if (spanBuilder == null) {
return Context.NONE;
@@ -78,15 +78,13 @@ public Context start(String spanName, Context context, ProcessKind processKind)
}
return context.addData(PARENT_SPAN_KEY, span);
case MESSAGE:
- spanBuilder = getSpanBuilder(spanName, context);
+ spanBuilder = getParentSpanBuilder(spanName, context);
span = spanBuilder.startSpan();
// Add diagnostic Id and trace-headers to Context
context = setContextData(span);
return context.addData(PARENT_SPAN_KEY, span);
case PROCESS:
return startScopedSpan(spanName, context);
- case LINK:
- return context.addData(SPAN_BUILDER_KEY, getSpanBuilder(spanName, context));
default:
return Context.NONE;
}
@@ -178,6 +176,11 @@ public Context extractContext(String diagnosticId, Context context) {
return AmqpPropagationFormatUtil.extractContext(diagnosticId, context);
}
+ @Override
+ public Context getSpanBuilder(String spanName, Context context) {
+ return context.addData(SPAN_BUILDER_KEY, getParentSpanBuilder(spanName, context));
+ }
+
/**
* Starts a new child {@link Span} with parent being the remote and uses the {@link Span} is in the current Context,
* to return an object that represents that scope.
@@ -194,7 +197,7 @@ private Context startScopedSpan(String spanName, Context context) {
if (spanContext != null) {
span = startSpanWithRemoteParent(spanName, spanContext);
} else {
- Builder spanBuilder = getSpanBuilder(spanName, context);
+ Builder spanBuilder = getParentSpanBuilder(spanName, context);
span = spanBuilder.setSpanKind(Span.Kind.SERVER).startSpan();
}
if (span.isRecording()) {
@@ -274,7 +277,7 @@ private static String parseComponentValue(String spanName) {
* @param context The context containing the span and the span name.
* @return A {@code Span.Builder} to create and start a new {@code Span}.
*/
- private Builder getSpanBuilder(String spanName, Context context) {
+ private Builder getParentSpanBuilder(String spanName, Context context) {
Span parentSpan = getOrDefault(context, PARENT_SPAN_KEY, null, Span.class);
String spanNameKey = getOrDefault(context, USER_SPAN_NAME_KEY, null, String.class);
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 d687bde4647d..693b3d237642 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
@@ -183,9 +183,9 @@ public void startSpanProcessKindProcess() {
}
@Test
- public void startSpanProcessKindLink() {
+ public void getSpanBuilderTest() {
// Act
- final Context updatedContext = openTelemetryTracer.start(METHOD_NAME, Context.NONE, ProcessKind.LINK);
+ final Context updatedContext = openTelemetryTracer.getSpanBuilder(METHOD_NAME, Context.NONE);
assertTrue(updatedContext.getData(SPAN_BUILDER_KEY).isPresent());
}
diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/ProcessKind.java b/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/ProcessKind.java
index 96239adc2924..d0410d8e5007 100644
--- a/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/ProcessKind.java
+++ b/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/ProcessKind.java
@@ -18,9 +18,5 @@ public enum ProcessKind {
/**
* Custom process call to process received messages.
*/
- PROCESS,
- /**
- * Custom process call to link messages to Send.
- */
- LINK
+ PROCESS
}
diff --git a/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/Tracer.java b/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/Tracer.java
index 463450338325..2090b8307cec 100644
--- a/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/Tracer.java
+++ b/sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/Tracer.java
@@ -204,4 +204,20 @@ public interface Tracer {
* @throws NullPointerException if {@code diagnosticId} or {@code context} is {@code null}.
*/
Context extractContext(String diagnosticId, Context context);
+
+ /**
+ * Returns a span builder with the provided name in {@link Context}.
+ *
+ * Code samples
+ *
+ * Returns a builder with the provided span name.
+ * {@codesnippet com.azure.core.util.tracing.getSpanBuilder#string-context}
+ *
+ * @param spanName Name to give the span for the created builder.
+ * @param context Additional metadata that is passed through the call stack.
+ *
+ * @return The updated {@link Context} object containing the span builder.
+ * @throws NullPointerException if {@code context} or {@code spanName} is {@code null}.
+ */
+ Context getSpanBuilder(String spanName, Context context);
}
diff --git a/sdk/core/azure-core/src/samples/java/com/azure/core/util/tracing/TracerJavaDocCodeSnippets.java b/sdk/core/azure-core/src/samples/java/com/azure/core/util/tracing/TracerJavaDocCodeSnippets.java
index b84e833acbd8..bc99564e894a 100644
--- a/sdk/core/azure-core/src/samples/java/com/azure/core/util/tracing/TracerJavaDocCodeSnippets.java
+++ b/sdk/core/azure-core/src/samples/java/com/azure/core/util/tracing/TracerJavaDocCodeSnippets.java
@@ -7,6 +7,7 @@
import static com.azure.core.util.tracing.Tracer.ENTITY_PATH_KEY;
import static com.azure.core.util.tracing.Tracer.HOST_NAME_KEY;
import static com.azure.core.util.tracing.Tracer.PARENT_SPAN_KEY;
+import static com.azure.core.util.tracing.Tracer.SPAN_BUILDER_KEY;
/**
* Contains code snippets when generating javadocs through doclets for {@link Tracer}.
@@ -120,6 +121,18 @@ public void extractContext() {
// END: com.azure.core.util.tracing.extractContext#string-context
}
+ /**
+ * Code snippet for {@link Tracer#getSpanBuilder(String, Context)}
+ */
+ public void getSpanBuilder() {
+ // BEGIN: com.azure.core.util.tracing.getSpanBuilder#string-context
+ // Returns a span builder with the provided name
+ String methodName = "message-span";
+ Context spanContext = tracer.getSpanBuilder(methodName, Context.NONE);
+ System.out.printf("Span context of the current tracing span: %s%n", spanContext.getData(SPAN_BUILDER_KEY).get());
+ // END: com.azure.core.util.tracing.getSpanBuilder#string-context
+ }
+
//Noop Tracer
private static final class TracerImplementation implements Tracer {
@Override
@@ -161,5 +174,9 @@ public void addLink(Context context) {
public Context extractContext(String diagnosticId, Context context) {
return null;
}
+
+ @Override
+ public Context getSpanBuilder(String spanName, Context context) { return null;
+ }
}
}
diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java
index 48e23d755469..967209676adc 100644
--- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java
+++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClient.java
@@ -116,8 +116,8 @@ public class EventHubProducerAsyncClient implements Closeable {
* load balance the messages amongst available partitions.
*/
EventHubProducerAsyncClient(String fullyQualifiedNamespace, String eventHubName, EventHubConnection connection,
- AmqpRetryOptions retryOptions, TracerProvider tracerProvider, MessageSerializer messageSerializer,
- boolean isSharedConnection) {
+ AmqpRetryOptions retryOptions, TracerProvider tracerProvider, MessageSerializer messageSerializer,
+ boolean isSharedConnection) {
this.fullyQualifiedNamespace = fullyQualifiedNamespace;
this.eventHubName = eventHubName;
this.connection = connection;
@@ -170,9 +170,7 @@ public Flux getPartitionIds() {
* events in the partition event stream.
*
* @param partitionId The unique identifier of a partition associated with the Event Hub.
- *
* @return The set of information for the requested partition under the Event Hub this client is associated with.
- *
* @throws NullPointerException if {@code partitionId} is null.
*/
@ServiceMethod(returns = ReturnType.SINGLE)
@@ -193,9 +191,7 @@ public Mono createBatch() {
* Creates an {@link EventDataBatch} configured with the options specified.
*
* @param options A set of options used to configure the {@link EventDataBatch}.
- *
* @return A new {@link EventDataBatch} that can fit as many events as the transport allows.
- *
* @throws NullPointerException if {@code options} is null.
*/
public Mono createBatch(CreateBatchOptions options) {
@@ -208,39 +204,39 @@ public Mono createBatch(CreateBatchOptions options) {
final int batchMaxSize = options.getMaximumSizeInBytes();
if (!CoreUtils.isNullOrEmpty(partitionKey)
- && !CoreUtils.isNullOrEmpty(partitionId)) {
+ && !CoreUtils.isNullOrEmpty(partitionId)) {
return monoError(logger, new IllegalArgumentException(String.format(Locale.US,
"CreateBatchOptions.getPartitionKey() and CreateBatchOptions.getPartitionId() are both set. "
+ "Only one or the other can be used. partitionKey: '%s'. partitionId: '%s'",
partitionKey, partitionId)));
} else if (!CoreUtils.isNullOrEmpty(partitionKey)
- && partitionKey.length() > MAX_PARTITION_KEY_LENGTH) {
+ && partitionKey.length() > MAX_PARTITION_KEY_LENGTH) {
return monoError(logger, new IllegalArgumentException(String.format(Locale.US,
"Partition key '%s' exceeds the maximum allowed length: '%s'.", partitionKey,
MAX_PARTITION_KEY_LENGTH)));
}
return getSendLink(partitionId)
- .flatMap(link -> link.getLinkSize()
- .flatMap(size -> {
- final int maximumLinkSize = size > 0
- ? size
- : MAX_MESSAGE_LENGTH_BYTES;
-
- if (batchMaxSize > maximumLinkSize) {
- return monoError(logger,
- new IllegalArgumentException(String.format(Locale.US,
- "BatchOptions.maximumSizeInBytes (%s bytes) is larger than the link size (%s bytes).",
- batchMaxSize, maximumLinkSize)));
- }
-
- final int batchSize = batchMaxSize > 0
- ? batchMaxSize
- : maximumLinkSize;
-
- return Mono.just(new EventDataBatch(batchSize, partitionId, partitionKey, link::getErrorContext,
- tracerProvider));
- }));
+ .flatMap(link -> link.getLinkSize()
+ .flatMap(size -> {
+ final int maximumLinkSize = size > 0
+ ? size
+ : MAX_MESSAGE_LENGTH_BYTES;
+
+ if (batchMaxSize > maximumLinkSize) {
+ return monoError(logger,
+ new IllegalArgumentException(String.format(Locale.US,
+ "BatchOptions.maximumSizeInBytes (%s bytes) is larger than the link size (%s bytes).",
+ batchMaxSize, maximumLinkSize)));
+ }
+
+ final int batchSize = batchMaxSize > 0
+ ? batchMaxSize
+ : maximumLinkSize;
+
+ return Mono.just(new EventDataBatch(batchSize, partitionId, partitionKey, link::getErrorContext,
+ tracerProvider));
+ }));
}
/**
@@ -254,7 +250,6 @@ public Mono createBatch(CreateBatchOptions options) {
*
*
* @param event Event to send to the service.
- *
* @return A {@link Mono} that completes when the event is pushed to the service.
*/
Mono send(EventData event) {
@@ -277,7 +272,6 @@ Mono send(EventData event) {
*
* @param event Event to send to the service.
* @param options The set of options to consider when sending this event.
- *
* @return A {@link Mono} that completes when the event is pushed to the service.
*/
Mono send(EventData event, SendOptions options) {
@@ -296,7 +290,6 @@ Mono send(EventData event, SendOptions options) {
* size is the max amount allowed on the link.
*
* @param events Events to send to the service.
- *
* @return A {@link Mono} that completes when all events are pushed to the service.
*/
Mono send(Iterable events) {
@@ -314,7 +307,6 @@ Mono send(Iterable events) {
*
* @param events Events to send to the service.
* @param options The set of options to consider when sending this batch.
- *
* @return A {@link Mono} that completes when all events are pushed to the service.
*/
Mono send(Iterable events, SendOptions options) {
@@ -333,7 +325,6 @@ Mono send(Iterable events, SendOptions options) {
* size is the max amount allowed on the link.
*
* @param events Events to send to the service.
- *
* @return A {@link Mono} that completes when all events are pushed to the service.
*/
Mono send(Flux events) {
@@ -351,7 +342,6 @@ Mono send(Flux events) {
*
* @param events Events to send to the service.
* @param options The set of options to consider when sending this batch.
- *
* @return A {@link Mono} that completes when all events are pushed to the service.
*/
Mono send(Flux events, SendOptions options) {
@@ -368,9 +358,7 @@ Mono send(Flux events, SendOptions options) {
* Sends the batch to the associated Event Hub.
*
* @param batch The batch to send to the service.
- *
* @return A {@link Mono} that completes when the batch is pushed to the service.
- *
* @throws NullPointerException if {@code batch} is {@code null}.
* @see EventHubProducerAsyncClient#createBatch()
* @see EventHubProducerAsyncClient#createBatch(CreateBatchOptions)
@@ -395,21 +383,28 @@ public Mono send(EventDataBatch batch) {
final String partitionKey = batch.getPartitionKey();
final boolean isTracingEnabled = tracerProvider.isEnabled();
final AtomicReference parentContext = isTracingEnabled
- ? new AtomicReference<>(Context.NONE)
- : null;
+ ? new AtomicReference<>(Context.NONE)
+ : null;
+ final AtomicReference sharedContext = isTracingEnabled
+ ? new AtomicReference<>(Context.NONE)
+ : null;
+ final AtomicReference isFirst = new AtomicReference<>(true);
- // initiate addLink on send span, get shared span builder for all links
- Context sharedContext = isTracingEnabled ? tracerProvider.startSpan(parentContext.get(), ProcessKind.LINK) :
- null;
final List messages = batch.getEvents().stream().map(event -> {
final Message message = messageSerializer.serialize(event);
if (isTracingEnabled) {
- tracerProvider.addSpanLinks(sharedContext.addData(SPAN_CONTEXT_KEY, event.getContext()));
+ if (isFirst.getAndSet(false)) {
+ parentContext.set(event.getContext());
+ // get shared span builder for all links
+ sharedContext.set(tracerProvider.getSpanBuilder(parentContext.get()));
+ }
+ Context sharedSpanBuilderContext = sharedContext.get();
+ tracerProvider.addSpanLinks(sharedSpanBuilderContext.addData(SPAN_CONTEXT_KEY, event.getContext()));
}
if (!CoreUtils.isNullOrEmpty(partitionKey)) {
final MessageAnnotations messageAnnotations = message.getMessageAnnotations() == null
- ? new MessageAnnotations(new HashMap<>())
- : message.getMessageAnnotations();
+ ? new MessageAnnotations(new HashMap<>())
+ : message.getMessageAnnotations();
messageAnnotations.getValue().put(AmqpConstants.PARTITION_KEY, partitionKey);
message.setMessageAnnotations(messageAnnotations);
@@ -419,19 +414,19 @@ public Mono send(EventDataBatch batch) {
}).collect(Collectors.toList());
return getSendLink(batch.getPartitionId())
- .flatMap(link -> {
- if (isTracingEnabled) {
- Context userSpanContext = sharedContext;
- Context entityContext = userSpanContext.addData(ENTITY_PATH_KEY, link.getEntityPath());
- // start send span and store updated context
- parentContext.set(tracerProvider.startSpan(
- entityContext.addData(HOST_NAME_KEY, link.getHostname()), ProcessKind.SEND));
- }
- return messages.size() == 1
- ? link.send(messages.get(0))
- : link.send(messages);
-
- }).doOnEach(signal -> {
+ .flatMap(link -> {
+ if (isTracingEnabled) {
+ Context userSpanContext = sharedContext.get();
+ Context entityContext = userSpanContext.addData(ENTITY_PATH_KEY, link.getEntityPath());
+ // start send span and store updated context
+ parentContext.set(tracerProvider.startSpan(
+ entityContext.addData(HOST_NAME_KEY, link.getHostname()), ProcessKind.SEND));
+ }
+ return messages.size() == 1
+ ? link.send(messages.get(0))
+ : link.send(messages);
+
+ }).doOnEach(signal -> {
if (isTracingEnabled) {
tracerProvider.endSpan(parentContext.get(), signal);
}
@@ -443,7 +438,7 @@ private Mono sendInternal(Flux events, SendOptions options) {
final String partitionId = options.getPartitionId();
if (!CoreUtils.isNullOrEmpty(partitionKey)
- && !CoreUtils.isNullOrEmpty(partitionId)) {
+ && !CoreUtils.isNullOrEmpty(partitionId)) {
return monoError(logger, new IllegalArgumentException(String.format(Locale.US,
"SendOptions.getPartitionKey() and SendOptions.getPartitionId() are both set. Only one or the"
+ " other can be used. partitionKey: '%s'. partitionId: '%s'",
@@ -451,38 +446,38 @@ private Mono sendInternal(Flux events, SendOptions options) {
}
return getSendLink(options.getPartitionId())
- .flatMap(link -> link.getLinkSize()
- .flatMap(size -> {
- final int batchSize = size > 0 ? size : MAX_MESSAGE_LENGTH_BYTES;
- final CreateBatchOptions batchOptions = new CreateBatchOptions()
- .setPartitionKey(options.getPartitionKey())
- .setPartitionId(options.getPartitionId())
- .setMaximumSizeInBytes(batchSize);
- return events.collect(new EventDataCollector(batchOptions, 1, link::getErrorContext,
- tracerProvider));
- })
- .flatMap(list -> sendInternal(Flux.fromIterable(list))));
+ .flatMap(link -> link.getLinkSize()
+ .flatMap(size -> {
+ final int batchSize = size > 0 ? size : MAX_MESSAGE_LENGTH_BYTES;
+ final CreateBatchOptions batchOptions = new CreateBatchOptions()
+ .setPartitionKey(options.getPartitionKey())
+ .setPartitionId(options.getPartitionId())
+ .setMaximumSizeInBytes(batchSize);
+ return events.collect(new EventDataCollector(batchOptions, 1, link::getErrorContext,
+ tracerProvider));
+ })
+ .flatMap(list -> sendInternal(Flux.fromIterable(list))));
}
private Mono sendInternal(Flux eventBatches) {
return eventBatches
- .flatMap(this::send)
- .then()
- .doOnError(error -> {
- logger.error(Messages.ERROR_SENDING_BATCH, error);
- });
+ .flatMap(this::send)
+ .then()
+ .doOnError(error -> {
+ logger.error(Messages.ERROR_SENDING_BATCH, error);
+ });
}
private String getEntityPath(String partitionId) {
return CoreUtils.isNullOrEmpty(partitionId)
- ? eventHubName
- : String.format(Locale.US, SENDER_ENTITY_PATH_FORMAT, eventHubName, partitionId);
+ ? eventHubName
+ : String.format(Locale.US, SENDER_ENTITY_PATH_FORMAT, eventHubName, partitionId);
}
private String getLinkName(String partitionId) {
return CoreUtils.isNullOrEmpty(partitionId)
- ? StringUtil.getRandomString("EC")
- : StringUtil.getRandomString("PS");
+ ? StringUtil.getRandomString("EC")
+ : StringUtil.getRandomString("PS");
}
private Mono getSendLink(String partitionId) {
@@ -493,7 +488,7 @@ private Mono getSendLink(String partitionId) {
return Mono.just(openLink);
} else {
return connection.createSendLink(getLinkName(partitionId), entityPath, retryOptions)
- .map(link -> openLinks.computeIfAbsent(entityPath, unusedKey -> link));
+ .map(link -> openLinks.computeIfAbsent(entityPath, unusedKey -> link));
}
}
@@ -522,7 +517,7 @@ public void close() {
* AmqpErrorCondition#LINK_PAYLOAD_SIZE_EXCEEDED}.
*/
private static class EventDataCollector implements Collector,
- List> {
+ List> {
private final String partitionKey;
private final String partitionId;
private final int maxMessageSize;
@@ -533,11 +528,11 @@ private static class EventDataCollector implements Collector 0
- ? options.getMaximumSizeInBytes()
- : MAX_MESSAGE_LENGTH_BYTES;
+ ? options.getMaximumSizeInBytes()
+ : MAX_MESSAGE_LENGTH_BYTES;
this.partitionKey = options.getPartitionKey();
this.partitionId = options.getPartitionId();
this.contextProvider = contextProvider;
diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java
index f21d8734f4bf..0863275b439f 100644
--- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java
+++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerAsyncClientTest.java
@@ -245,7 +245,7 @@ public void sendStartSpanSingleMessage() {
}
);
- when(tracer1.start(eq("Azure.eventhubs.send"), any(), eq(ProcessKind.LINK))).thenAnswer(
+ when(tracer1.getSpanBuilder(eq("Azure.eventhubs.send"), any())).thenAnswer(
invocation -> {
Context passed = invocation.getArgument(1, Context.class);
return passed.addData(SPAN_BUILDER_KEY, "value");
@@ -301,7 +301,8 @@ public void sendMessageRetrySpanTest() {
return passed.addData(PARENT_SPAN_KEY, "value");
}
);
- when(tracer1.start(eq("Azure.eventhubs.send"), any(), eq(ProcessKind.LINK))).thenAnswer(
+
+ when(tracer1.getSpanBuilder(eq("Azure.eventhubs.send"), any())).thenAnswer(
invocation -> {
Context passed = invocation.getArgument(1, Context.class);
return passed.addData(SPAN_BUILDER_KEY, "value");
diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java
index 516bfb79b739..fbcf352b3b0a 100644
--- a/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java
+++ b/sdk/eventhubs/azure-messaging-eventhubs/src/test/java/com/azure/messaging/eventhubs/EventHubProducerClientTest.java
@@ -169,7 +169,7 @@ public void sendStartSpanSingleMessage() {
return passed.addData(PARENT_SPAN_KEY, "value").addData(DIAGNOSTIC_ID_KEY, "value2");
}
);
- when(tracer1.start(eq("Azure.eventhubs.send"), any(), eq(ProcessKind.LINK))).thenAnswer(
+ when(tracer1.getSpanBuilder(eq("Azure.eventhubs.send"), any())).thenAnswer(
invocation -> {
Context passed = invocation.getArgument(1, Context.class);
return passed.addData(SPAN_BUILDER_KEY, "value");
@@ -217,7 +217,7 @@ public void sendMessageRetrySpanTest() {
}
);
- when(tracer1.start(eq("Azure.eventhubs.send"), any(), eq(ProcessKind.LINK))).thenAnswer(
+ when(tracer1.getSpanBuilder(eq("Azure.eventhubs.send"), any())).thenAnswer(
invocation -> {
Context passed = invocation.getArgument(1, Context.class);
return passed.addData(SPAN_BUILDER_KEY, "value");
From ba1bf10dd6a84fa65a33d19f547a228edf09f8f3 Mon Sep 17 00:00:00 2001
From: Sameeksha Vaity
Date: Wed, 11 Dec 2019 18:05:34 -0800
Subject: [PATCH 4/9] add tracer provider test
---
.../amqp/implementation/TracerProvider.java | 4 +-
.../implementation/TracerProviderTest.java | 37 +++++++++++++++++++
.../tracing/opencensus/OpenCensusTracer.java | 6 +++
.../opentelemetry/OpenTelemetryTracer.java | 12 +++---
.../OpenTelemetryTracerTest.java | 2 +-
.../com/azure/core/util/tracing/Tracer.java | 4 +-
.../tracing/TracerJavaDocCodeSnippets.java | 8 ++--
.../EventHubProducerAsyncClient.java | 2 +-
.../EventHubProducerAsyncClientTest.java | 4 +-
.../eventhubs/EventHubProducerClientTest.java | 4 +-
10 files changed, 63 insertions(+), 20 deletions(-)
diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java
index 7fb7ab659813..526d657154fe 100644
--- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java
+++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/implementation/TracerProvider.java
@@ -113,11 +113,11 @@ public Context extractContext(String diagnosticId, Context context) {
*
* @param context Additional metadata containing the span name for creating the span builer.
*/
- public Context getSpanBuilder(Context context) {
+ public Context getSharedSpanBuilder(Context context) {
Context local = Objects.requireNonNull(context, "'context' cannot be null.");
String spanName = getSpanName(ProcessKind.SEND);
for (Tracer tracer : tracers) {
- local = tracer.getSpanBuilder(spanName, local);
+ local = tracer.getSharedSpanBuilder(spanName, local);
}
return local;
}
diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/TracerProviderTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/TracerProviderTest.java
index 1c48c1c00181..e9d3f120e6d0 100644
--- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/TracerProviderTest.java
+++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/implementation/TracerProviderTest.java
@@ -24,6 +24,7 @@
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.never;
@@ -194,4 +195,40 @@ public void addSpanLinks() {
// Act
assertThrows(NullPointerException.class, () -> tracerProvider.addSpanLinks(null));
}
+
+ @Test
+ public void getSpanBuilderReturnsUpdatedContext() {
+ // Arrange
+ final String spanBuilderKey = "spanBuilder-key";
+ final String spanBuilderValue = "spanBuilder-value";
+
+ final String spanBuilderKey1 = "spanBuilder-key1";
+ final String spanBuilderValue1 = "spanBuilder-value1";
+ final Context startingContext = Context.NONE;
+
+ when(tracer.getSharedSpanBuilder(anyString(), any())).thenAnswer(
+ invocation -> {
+ Context passed = invocation.getArgument(1, Context.class);
+ return passed.addData(spanBuilderKey, spanBuilderValue);
+ }
+ );
+ when(tracer2.getSharedSpanBuilder(anyString(), any())).thenAnswer(
+ invocation -> {
+ Context passed = invocation.getArgument(1, Context.class);
+ return passed.addData(spanBuilderKey1, spanBuilderValue1);
+ }
+ );
+
+ // Act
+ final Context updatedContext = tracerProvider.getSharedSpanBuilder(startingContext);
+
+ // Assert
+ final Optional