Skip to content

Commit d565401

Browse files
author
wdeng
committed
#13295: Instrumenter.getNanos() returns non-epoch timestamp.
1 parent 9711bd4 commit d565401

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/Instrumenter.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ private void doEnd(
266266

267267
private static long getNanos(@Nullable Instant time) {
268268
if (time == null) {
269-
return System.nanoTime();
269+
time = Instant.now();
270270
}
271271
return TimeUnit.SECONDS.toNanos(time.getEpochSecond()) + time.getNano();
272272
}

instrumentation-api/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/InstrumenterTest.java

+42
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,23 @@
2525
import io.opentelemetry.context.Context;
2626
import io.opentelemetry.context.ContextKey;
2727
import io.opentelemetry.context.propagation.TextMapGetter;
28+
import io.opentelemetry.instrumentation.api.internal.InstrumenterUtil;
2829
import io.opentelemetry.instrumentation.api.internal.SchemaUrlProvider;
2930
import io.opentelemetry.instrumentation.api.internal.SpanKey;
3031
import io.opentelemetry.instrumentation.api.internal.SpanKeyProvider;
3132
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
3233
import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;
3334
import io.opentelemetry.sdk.trace.data.LinkData;
3435
import io.opentelemetry.sdk.trace.data.StatusData;
36+
import java.time.Instant;
3537
import java.util.Collections;
3638
import java.util.HashMap;
3739
import java.util.Map;
3840
import java.util.concurrent.atomic.AtomicReference;
3941
import java.util.stream.Collectors;
4042
import java.util.stream.Stream;
4143
import javax.annotation.Nullable;
44+
import org.assertj.core.api.Assertions;
4245
import org.junit.jupiter.api.Test;
4346
import org.junit.jupiter.api.extension.ExtendWith;
4447
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -581,6 +584,45 @@ void instrumentationVersion_default() {
581584
span -> span.hasName("span").hasInstrumentationScopeInfo(expectedLibraryInfo)));
582585
}
583586

587+
@Test
588+
void instrumenterGetNanosWithNullArgument() {
589+
AtomicReference<Long> endTime = new AtomicReference<>();
590+
OperationListener operationListener =
591+
new OperationListener() {
592+
@Override
593+
public Context onStart(Context context, Attributes startAttributes, long startNanos) {
594+
return context;
595+
}
596+
597+
@Override
598+
public void onEnd(Context context, Attributes endAttributes, long endNanos) {
599+
endTime.set(endNanos);
600+
}
601+
};
602+
603+
InstrumenterBuilder<Map<String, String>, Map<String, String>> builder =
604+
Instrumenter.builder(
605+
otelTesting.getOpenTelemetry(), "test-instrumentation", name -> "span");
606+
builder.addOperationListener(operationListener);
607+
InstrumenterUtil.propagateOperationListenersToOnEnd(builder);
608+
609+
Instant startTime = Instant.now();
610+
Instrumenter<Map<String, String>, Map<String, String>> instrumenter =
611+
builder.buildInstrumenter();
612+
InstrumenterUtil.startAndEnd(
613+
instrumenter, Context.root(), emptyMap(), emptyMap(), null, startTime, null);
614+
615+
otelTesting
616+
.assertTraces()
617+
.hasTracesSatisfyingExactly(
618+
trace ->
619+
trace.hasSpansSatisfyingExactly(span -> span.hasName("span").startsAt(startTime)));
620+
System.out.printf(
621+
"Epoche second of start: %d and end: %d\n",
622+
startTime.getEpochSecond(), endTime.get() / 1_000_000_000);
623+
Assertions.assertThat(endTime.get() / 1_000_000_000 == startTime.getEpochSecond()).isTrue();
624+
}
625+
584626
@Test
585627
void instrumentationVersion_custom() {
586628
Instrumenter<Map<String, String>, Map<String, String>> instrumenter =

0 commit comments

Comments
 (0)