Skip to content

Commit 16c2d5a

Browse files
authored
Update addEvent API to attach events to span in Context (Azure#22332)
1 parent cf85dfc commit 16c2d5a

File tree

4 files changed

+88
-15
lines changed

4 files changed

+88
-15
lines changed

sdk/core/azure-core-tracing-opentelemetry/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Release History
22

33
## 1.0.0-beta.12 (Unreleased)
4-
4+
### Key Bugs Fixed
5+
- Fixed `addEvent` API to use the span provided in the context rather than `Span.current()`.
56

67
## 1.0.0-beta.11 (2021-06-07)
78

sdk/core/azure-core-tracing-opentelemetry/src/main/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracer.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,15 @@ public void end(int responseCode, Throwable throwable, Context context) {
127127
public void setAttribute(String key, String value, Context context) {
128128
Objects.requireNonNull(context, "'context' cannot be null");
129129
if (CoreUtils.isNullOrEmpty(value)) {
130-
logger.warning("Failed to set span attribute since value is null or empty.");
130+
logger.verbose("Failed to set span attribute since value is null or empty.");
131131
return;
132132
}
133133

134134
final Span span = getOrDefault(context, PARENT_SPAN_KEY, null, Span.class);
135135
if (span != null) {
136136
span.setAttribute(key, value);
137137
} else {
138-
logger.warning("Failed to find span to add attribute.");
138+
logger.verbose("Failed to find span to add attribute.");
139139
}
140140
}
141141

@@ -154,7 +154,7 @@ public Context setSpanName(String spanName, Context context) {
154154
public void end(String statusMessage, Throwable throwable, Context context) {
155155
Span span = getOrDefault(context, PARENT_SPAN_KEY, null, Span.class);
156156
if (span == null) {
157-
logger.warning("Failed to find span to end it.");
157+
logger.verbose("Failed to find span to end it.");
158158
return;
159159
}
160160

@@ -169,13 +169,13 @@ public void end(String statusMessage, Throwable throwable, Context context) {
169169
public void addLink(Context context) {
170170
final SpanBuilder spanBuilder = getOrDefault(context, SPAN_BUILDER_KEY, null, SpanBuilder.class);
171171
if (spanBuilder == null) {
172-
logger.warning("Failed to find spanBuilder to link it.");
172+
logger.verbose("Failed to find spanBuilder to link it.");
173173
return;
174174
}
175175

176176
final SpanContext spanContext = getOrDefault(context, SPAN_CONTEXT_KEY, null, SpanContext.class);
177177
if (spanContext == null) {
178-
logger.warning("Failed to find span context to link it.");
178+
logger.verbose("Failed to find span context to link it.");
179179
return;
180180
}
181181
spanBuilder.addLink(spanContext);
@@ -198,12 +198,22 @@ public Context getSharedSpanBuilder(String spanName, Context context) {
198198
* {@inheritDoc}
199199
*/
200200
@Override
201+
@SuppressWarnings("deprecation")
201202
public void addEvent(String eventName, Map<String, Object> traceEventAttributes, OffsetDateTime timestamp) {
203+
addEvent(eventName, traceEventAttributes, timestamp, new Context(PARENT_SPAN_KEY, Span.current()));
204+
}
205+
206+
/**
207+
* {@inheritDoc}
208+
*/
209+
@Override
210+
public void addEvent(String eventName, Map<String, Object> traceEventAttributes, OffsetDateTime timestamp,
211+
Context context) {
202212
Objects.requireNonNull(eventName, "'eventName' cannot be null.");
203213

204-
Span currentSpan = Span.current();
214+
Span currentSpan = getOrDefault(context, PARENT_SPAN_KEY, null, Span.class);
205215
if (currentSpan == null) {
206-
logger.info("Failed to find a starting span to associate the {} with.", eventName);
216+
logger.verbose("Failed to find a starting span to associate the {} with.", eventName);
207217
return;
208218
}
209219

sdk/core/azure-core-tracing-opentelemetry/src/test/java/com/azure/core/tracing/opentelemetry/OpenTelemetryTracerTest.java

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ public void startSpanOverloadNullPointerException() {
293293
@Test
294294
public void addLinkTest() {
295295
// Arrange
296-
SpanBuilder span = tracer.spanBuilder("parent-span");
296+
SpanBuilder span = tracer.spanBuilder(PARENT_SPAN_KEY);
297297
Span toLinkSpan = tracer.spanBuilder("new test span").startSpan();
298298

299299
Context spanContext = new Context(
@@ -317,7 +317,7 @@ public void addLinkTest() {
317317
@Test
318318
public void addLinkNoSpanContextTest() {
319319
// Arrange
320-
SpanBuilder span = tracer.spanBuilder("parent-span");
320+
SpanBuilder span = tracer.spanBuilder(PARENT_SPAN_KEY);
321321

322322
// Act
323323
openTelemetryTracer.addLink(new Context(SPAN_BUILDER_KEY, span));
@@ -331,7 +331,7 @@ public void addLinkNoSpanContextTest() {
331331
@Test
332332
public void addLinkNoSpanToLinkTest() {
333333
// Arrange
334-
SpanBuilder span = tracer.spanBuilder("parent-span");
334+
SpanBuilder span = tracer.spanBuilder(PARENT_SPAN_KEY);
335335

336336
// Act
337337
openTelemetryTracer.addLink(Context.NONE);
@@ -489,10 +489,11 @@ public void addEventWithNonNullEventName() {
489489
final String eventName = "event-0";
490490

491491
// Act
492-
openTelemetryTracer.addEvent(eventName, null, null);
492+
openTelemetryTracer.addEvent(eventName, null, null, tracingContext);
493493

494494
// Assert
495495
final ReadableSpan recordEventsSpan = (ReadableSpan) tracingContext.getData(PARENT_SPAN_KEY).get();
496+
assertEquals(PARENT_SPAN_KEY, recordEventsSpan.getName());
496497
List<EventData> eventData = recordEventsSpan.toSpanData().getEvents();
497498
assertNotNull(eventData);
498499
assertEquals(1, eventData.size());
@@ -513,10 +514,11 @@ public void addEventWithAttributes() {
513514
}};
514515

515516
// Act
516-
openTelemetryTracer.addEvent(eventName, input, null);
517+
openTelemetryTracer.addEvent(eventName, input, null, tracingContext);
517518

518519
// Assert
519520
final ReadableSpan recordEventsSpan = (ReadableSpan) tracingContext.getData(PARENT_SPAN_KEY).get();
521+
assertEquals(PARENT_SPAN_KEY, recordEventsSpan.getName());
520522
List<EventData> eventData = recordEventsSpan.toSpanData().getEvents();
521523
assertNotNull(eventData);
522524
assertEquals(1, eventData.size());
@@ -541,10 +543,11 @@ public void addEventWithTimeSpecification() {
541543
OffsetDateTime eventTime = OffsetDateTime.parse("2021-01-01T18:35:24.00Z");
542544

543545
// Act
544-
openTelemetryTracer.addEvent(eventName, null, eventTime);
546+
openTelemetryTracer.addEvent(eventName, null, eventTime, tracingContext);
545547

546548
// Assert
547549
final ReadableSpan recordEventsSpan = (ReadableSpan) tracingContext.getData(PARENT_SPAN_KEY).get();
550+
assertEquals(PARENT_SPAN_KEY, recordEventsSpan.getName());
548551
List<EventData> eventData = recordEventsSpan.toSpanData().getEvents();
549552
assertNotNull(eventData);
550553
assertEquals(1, eventData.size());
@@ -560,7 +563,7 @@ public void addEventAfterSpanEnd() {
560563

561564
// Act
562565
parentSpan.end();
563-
openTelemetryTracer.addEvent(eventName, null, null);
566+
openTelemetryTracer.addEvent(eventName, null, null, tracingContext);
564567

565568
// Assert
566569
final ReadableSpan recordEventsSpan = (ReadableSpan) tracingContext.getData(PARENT_SPAN_KEY).get();
@@ -570,6 +573,44 @@ public void addEventAfterSpanEnd() {
570573
assertEquals(0, eventData.size());
571574
}
572575

576+
@Test
577+
public void addEventWithChildSpan() {
578+
// Arrange
579+
tracingContext = openTelemetryTracer.start("child-span-1", tracingContext);
580+
final String eventName = "event-0";
581+
OffsetDateTime eventTime = OffsetDateTime.parse("2021-01-01T18:35:24.00Z");
582+
583+
// Act
584+
openTelemetryTracer.addEvent(eventName, null, eventTime, tracingContext);
585+
586+
// Assert
587+
final ReadableSpan recordEventsSpan = (ReadableSpan) tracingContext.getData(PARENT_SPAN_KEY).get();
588+
assertEquals("child-span-1", recordEventsSpan.getName());
589+
List<EventData> eventData = recordEventsSpan.toSpanData().getEvents();
590+
assertNotNull(eventData);
591+
assertEquals(1, eventData.size());
592+
assertEquals(eventName, eventData.get(0).getName());
593+
assertEquals(eventTime,
594+
OffsetDateTime.ofInstant(Instant.ofEpochMilli(eventData.get(0).getEpochNanos() / 1000000), ZoneOffset.UTC));
595+
}
596+
597+
@Test
598+
public void addEventWithoutEventSpanContext() {
599+
// Arrange
600+
final String eventName = "event-0";
601+
OffsetDateTime eventTime = OffsetDateTime.parse("2021-01-01T18:35:24.00Z");
602+
603+
// Act
604+
openTelemetryTracer.addEvent(eventName, null, eventTime);
605+
606+
// Assert
607+
final ReadableSpan recordEventsSpan = (ReadableSpan) tracingContext.getData(PARENT_SPAN_KEY).get();
608+
assertEquals(PARENT_SPAN_KEY, recordEventsSpan.getName());
609+
List<EventData> eventData = recordEventsSpan.toSpanData().getEvents();
610+
assertNotNull(eventData);
611+
assertEquals(1, eventData.size());
612+
}
613+
573614
private static void assertSpanWithExplicitParent(Context updatedContext, String parentSpanId) {
574615
assertNotNull(updatedContext.getData(PARENT_SPAN_KEY).get());
575616

sdk/core/azure-core/src/main/java/com/azure/core/util/tracing/Tracer.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,28 @@ default Context getSharedSpanBuilder(String spanName, Context context) {
248248
* @param attributes the additional attributes to be set for the event.
249249
* @param timestamp The instant, in UTC, at which the event will be associated to the span.
250250
* @throws NullPointerException if {@code eventName} is {@code null}.
251+
* @deprecated Use {@link #addEvent(String, Map, OffsetDateTime, Context)}
251252
*/
253+
@Deprecated
252254
default void addEvent(String name, Map<String, Object> attributes, OffsetDateTime timestamp) {
253255
}
256+
257+
/**
258+
* Adds an event to the span present in the {@code Context} with the provided {@code timestamp}
259+
* and {@code attributes}.
260+
* <p>This API does not provide any normalization if provided timestamps are out of range of the current
261+
* span timeline</p>
262+
* <p>Supported attribute values include String, double, boolean, long, String [], double [], long [].
263+
* Any other Object value type and null values will be silently ignored.</p>
264+
*
265+
* @param name the name of the event.
266+
* @param attributes the additional attributes to be set for the event.
267+
* @param timestamp The instant, in UTC, at which the event will be associated to the span.
268+
* @param context the call metadata containing information of the span to which the event should be associated with.
269+
* @throws NullPointerException if {@code eventName} is {@code null}.
270+
*/
271+
default void addEvent(String name, Map<String, Object> attributes, OffsetDateTime timestamp,
272+
Context context) {
273+
274+
}
254275
}

0 commit comments

Comments
 (0)