Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
request options checkpoint
  • Loading branch information
Liudmila Molkova committed Jan 6, 2025
commit 5b3de6113830266524121eedab934bf6ef04bf51
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import io.clientcore.core.telemetry.Scope;
import io.clientcore.core.telemetry.tracing.Span;
import io.clientcore.core.telemetry.tracing.SpanContext;
import io.clientcore.core.telemetry.tracing.SpanKind;
import io.clientcore.core.telemetry.tracing.Tracer;
import io.clientcore.core.util.ClientLogger;
import io.clientcore.core.util.Context;
Expand All @@ -31,7 +30,6 @@
import static io.clientcore.core.implementation.UrlRedactionUtil.getRedactedUri;
import static io.clientcore.core.telemetry.TelemetryProvider.DISABLE_TRACING_KEY;
import static io.clientcore.core.telemetry.tracing.SpanKind.CLIENT;
import static io.clientcore.core.telemetry.tracing.SpanKind.INTERNAL;

/**
* The instrumentation policy is responsible for instrumenting the HTTP request and response with distributed tracing
Expand Down Expand Up @@ -109,8 +107,7 @@ public Response<?> process(HttpRequest request, HttpPipelineNextPolicy next) {
}

String sanitizedUrl = getRedactedUri(request.getUri(), allowedQueryParams);
Span span = tracer.spanBuilder(request.getHttpMethod().toString(), CLIENT)
.setParent(request.getRequestOptions().getContext())
Span span = tracer.spanBuilder(request.getHttpMethod().toString(), CLIENT, request.getRequestOptions())
.setAttribute(HTTP_REQUEST_METHOD, request.getHttpMethod().toString())
.setAttribute(URL_FULL, sanitizedUrl)
.setAttribute(SERVER_ADDRESS, request.getUri().getHost())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import static io.clientcore.core.implementation.telemetry.otel.OTelInitializer.SPAN_KIND_CLASS;

public class OTelSpanBuilder implements SpanBuilder {
static final OTelSpanBuilder NOOP = new OTelSpanBuilder(null, SpanKind.INTERNAL, new LibraryTelemetryOptions("noop"));
static final OTelSpanBuilder NOOP = new OTelSpanBuilder(null, SpanKind.INTERNAL, Context.none(), new LibraryTelemetryOptions("noop"));

private static final MethodHandles.Lookup LOOKUP = MethodHandles.publicLookup();
private static final ClientLogger LOGGER = new ClientLogger(OTelSpanBuilder.class);
Expand All @@ -43,7 +43,7 @@ public class OTelSpanBuilder implements SpanBuilder {
private final Object otelSpanBuilder;
private final boolean suppressNestedSpans;
private final SpanKind spanKind;
private Context context = Context.none();
private final Context context;

static {
MethodHandle setParentInvoker = null;
Expand Down Expand Up @@ -93,11 +93,12 @@ public class OTelSpanBuilder implements SpanBuilder {
NOOP_SPAN = noopSpan;
}

OTelSpanBuilder(Object otelSpanBuilder, SpanKind kind, LibraryTelemetryOptions libraryOptions) {
OTelSpanBuilder(Object otelSpanBuilder, SpanKind kind, Context parent, LibraryTelemetryOptions libraryOptions) {
this.otelSpanBuilder = otelSpanBuilder;
this.suppressNestedSpans
= libraryOptions == null || !LibraryTelemetryOptionsAccessHelper.isSpanSuppressionDisabled(libraryOptions);
this.spanKind = kind;
this.context = parent;
}

@Override
Expand All @@ -114,12 +115,6 @@ public SpanBuilder setAttribute(String key, Object value) {
return this;
}

@Override
public SpanBuilder setParent(Context parent) {
this.context = parent;
return this;
}

@Override
public Span startSpan() {
if (OTelInitializer.isInitialized() && otelSpanBuilder != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@

package io.clientcore.core.implementation.telemetry.otel.tracing;

import io.clientcore.core.http.models.RequestOptions;
import io.clientcore.core.implementation.telemetry.otel.OTelInitializer;
import io.clientcore.core.telemetry.LibraryTelemetryOptions;
import io.clientcore.core.telemetry.tracing.SpanBuilder;
import io.clientcore.core.telemetry.tracing.SpanKind;
import io.clientcore.core.telemetry.tracing.Tracer;
import io.clientcore.core.util.ClientLogger;
import io.clientcore.core.util.Context;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
Expand Down Expand Up @@ -86,10 +88,11 @@ private OTelTracer(Object otelTracer, LibraryTelemetryOptions libraryOptions) {
}

@Override
public SpanBuilder spanBuilder(String spanName, SpanKind kind) {
public SpanBuilder spanBuilder(String spanName, SpanKind kind, RequestOptions options) {
if (isEnabled()) {
try {
return new OTelSpanBuilder(SPAN_BUILDER_INVOKER.invoke(otelTracer, spanName), kind, libraryOptions);
Context parent = options == null ? Context.none() : options.getContext();
return new OTelSpanBuilder(SPAN_BUILDER_INVOKER.invoke(otelTracer, spanName), kind, parent, libraryOptions);
} catch (Throwable t) {
OTelInitializer.runtimeError(LOGGER, t);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,6 @@ public SpanBuilder setAttribute(String key, Object value) {
return this;
}

@Override
public SpanBuilder setParent(Context parent) {
return this;
}

@Override
public Span startSpan() {
return NOOP_SPAN;
Expand All @@ -93,5 +88,5 @@ public String getTraceFlags() {

private static final Scope NOOP_SCOPE = () -> {
};
private static final Tracer NOOP_TRACER = (spanName, kind) -> NOOP_SPAN_BUILDER;
private static final Tracer NOOP_TRACER = (spanName, kind, ctx) -> NOOP_SPAN_BUILDER;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@

package io.clientcore.core.telemetry.tracing;

import io.clientcore.core.util.Context;

/**
* Represents a span builder.
* <p>
Expand All @@ -21,14 +19,6 @@ public interface SpanBuilder {
*/
SpanBuilder setAttribute(String key, Object value);

/**
* Sets the parent.
*
* @param parent The parent.
* @return Updated {@link SpanBuilder} object.
*/
SpanBuilder setParent(Context parent);

/**
* Starts the span.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import io.opentelemetry.sdk.trace.data.SpanData;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import org.eclipse.jetty.server.Request;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -415,16 +416,18 @@ public void customUrlRedaction() throws IOException {
public void explicitLibraryCallParent() throws IOException {
io.clientcore.core.telemetry.tracing.Tracer tracer
= TelemetryProvider.getInstance().getTracer(otelOptions, new LibraryTelemetryOptions("test-library"));
io.clientcore.core.telemetry.tracing.Span parent = tracer.spanBuilder("parent", INTERNAL).startSpan();

Context parentCtx = Context.of(TelemetryProvider.TRACE_CONTEXT_KEY, parent);
RequestOptions requestOptions = new RequestOptions();
io.clientcore.core.telemetry.tracing.Span parent = tracer.spanBuilder("parent", INTERNAL, requestOptions).startSpan();

requestOptions.setContext(Context.of(TelemetryProvider.TRACE_CONTEXT_KEY, parent));

HttpPipeline pipeline = new HttpPipelineBuilder().policies(new InstrumentationPolicy(otelOptions, null))
.httpClient(request -> new MockHttpResponse(request, 200))
.build();

pipeline.send(new HttpRequest(HttpMethod.GET, "https://localhost:8080/path/to/resource?query=param")
.setRequestOptions(new RequestOptions().setContext(parentCtx))).close();
.setRequestOptions(requestOptions)).close();

parent.end();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.data.SpanData;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import org.eclipse.jetty.server.Request;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -97,11 +98,13 @@ public void testDisabledSuppression() {
Tracer innerTracer = TelemetryProvider.getInstance()
.getTracer(otelOptions, new LibraryTelemetryOptions("test-library").disableSpanSuppression(true));

Span outerSpan = outerTracer.spanBuilder("outerSpan", CLIENT)
RequestOptions options = new RequestOptions();
Span outerSpan = outerTracer.spanBuilder("outerSpan", CLIENT, options)
.startSpan();
Context outerCtx = Context.of(TelemetryProvider.TRACE_CONTEXT_KEY, outerSpan);
Span innerSpan = innerTracer.spanBuilder("innerSpan", CLIENT)
.setParent(outerCtx)

options.setContext(Context.of(TelemetryProvider.TRACE_CONTEXT_KEY, outerSpan));

Span innerSpan = innerTracer.spanBuilder("innerSpan", CLIENT, options)
.startSpan();
innerSpan.end();
outerSpan.end();
Expand All @@ -121,9 +124,11 @@ public void disabledSuppressionDoesNotAffectChildren() {
.getTracer(otelOptions, new LibraryTelemetryOptions("test-library").disableSpanSuppression(true));
Tracer innerTracer = TelemetryProvider.getInstance().getTracer(otelOptions, DEFAULT_LIB_OPTIONS);

Span outerSpan = outerTracer.spanBuilder("outerSpan", CLIENT).startSpan();
Context outerCtx = Context.of(TelemetryProvider.TRACE_CONTEXT_KEY, outerSpan);
Span innerSpan = innerTracer.spanBuilder("innerSpan", CLIENT).setParent(outerCtx).startSpan();
RequestOptions options = new RequestOptions();
Span outerSpan = outerTracer.spanBuilder("outerSpan", CLIENT, options).startSpan();

options.setContext(Context.of(TelemetryProvider.TRACE_CONTEXT_KEY, outerSpan));
Span innerSpan = innerTracer.spanBuilder("innerSpan", CLIENT, options).startSpan();
innerSpan.end();
outerSpan.end();

Expand All @@ -137,28 +142,30 @@ public void disabledSuppressionDoesNotAffectChildren() {
@SuppressWarnings("try")
public void noSuppressionForSiblings() {
Tracer tracer = TelemetryProvider.getInstance().getTracer(otelOptions, DEFAULT_LIB_OPTIONS);
Span first = tracer.spanBuilder("first", CLIENT).startSpan();
Span first = tracer.spanBuilder("first", CLIENT, null).startSpan();
try (Scope outerScope = first.makeCurrent()) {
first.setAttribute("key", "valueOuter");
} finally {
first.end();
}

tracer.spanBuilder("second", CLIENT).startSpan().end();
tracer.spanBuilder("second", CLIENT, null).startSpan().end();
assertEquals(2, exporter.getFinishedSpanItems().size());
}

@Test
public void multipleLayers() {
Tracer tracer = TelemetryProvider.getInstance().getTracer(otelOptions, DEFAULT_LIB_OPTIONS);

Span outer = tracer.spanBuilder("outer", CLIENT).startSpan();
Context outerCtx = Context.of(TelemetryProvider.TRACE_CONTEXT_KEY, outer);
RequestOptions options = new RequestOptions();

Span outer = tracer.spanBuilder("outer", CLIENT, options).startSpan();
options.setContext(Context.of(TelemetryProvider.TRACE_CONTEXT_KEY, outer));

Span inner = tracer.spanBuilder("inner", PRODUCER).setParent(outerCtx).startSpan();
Context innerCtx = Context.of(TelemetryProvider.TRACE_CONTEXT_KEY, inner);
Span inner = tracer.spanBuilder("inner", PRODUCER, options).startSpan();
options.setContext(options.getContext().put(TelemetryProvider.TRACE_CONTEXT_KEY, inner));

Span suppressed = tracer.spanBuilder("suppressed", CLIENT).setParent(innerCtx).startSpan();
Span suppressed = tracer.spanBuilder("suppressed", CLIENT, options).startSpan();
suppressed.end();
inner.end();
outer.end();
Expand All @@ -179,14 +186,14 @@ public void multipleLayers() {
public void testSuppressionExplicitContext(SpanKind outerKind, SpanKind innerKind, int expectedSpanCount) {
Tracer tracer = TelemetryProvider.getInstance().getTracer(otelOptions, DEFAULT_LIB_OPTIONS);

Span outerSpan = tracer.spanBuilder("outerSpan", outerKind)
RequestOptions options = new RequestOptions();
Span outerSpan = tracer.spanBuilder("outerSpan", outerKind, options)
.setAttribute("key", "valueOuter")
.startSpan();

Context outerCtx = Context.of(TelemetryProvider.TRACE_CONTEXT_KEY, outerSpan);
options.setContext(Context.of(TelemetryProvider.TRACE_CONTEXT_KEY, outerSpan));

Span innerSpan = tracer.spanBuilder("innerSpan", innerKind)
.setParent(outerCtx)
Span innerSpan = tracer.spanBuilder("innerSpan", innerKind, options)
.setAttribute("key", "valueInner")
.startSpan();
// sanity check - this should not throw
Expand Down Expand Up @@ -226,12 +233,12 @@ public void testSuppressionExplicitContext(SpanKind outerKind, SpanKind innerKin
public void testSuppressionImplicitContext(SpanKind outerKind, SpanKind innerKind, int expectedSpanCount) {
Tracer tracer = TelemetryProvider.getInstance().getTracer(otelOptions, DEFAULT_LIB_OPTIONS);

Span outerSpan = tracer.spanBuilder("outerSpan", outerKind)
Span outerSpan = tracer.spanBuilder("outerSpan", outerKind, null)
.setAttribute("key", "valueOuter")
.startSpan();
Span innerSpan = null;
try (Scope outerScope = outerSpan.makeCurrent()) {
innerSpan = tracer.spanBuilder("innerSpan", innerKind)
innerSpan = tracer.spanBuilder("innerSpan", innerKind, null)
.setAttribute("key", "valueInner")
.startSpan();
io.opentelemetry.api.trace.Span outerCurrentSpan = io.opentelemetry.api.trace.Span.current();
Expand Down Expand Up @@ -314,11 +321,10 @@ static class SampleClient {

@SuppressWarnings("try")
public void protocolMethod(RequestOptions options) {
Span span = tracer.spanBuilder("protocolMethod", INTERNAL)
.setParent(options == null ? Context.none() : options.getContext())
Span span = tracer.spanBuilder("protocolMethod", INTERNAL, options)
.startSpan();

// TODO (limolkova): should we put span on the RequestOptions directly?
// TODO (limolkova): should we have addContext(k, v) on options?
options.setContext(options.getContext().put(TelemetryProvider.TRACE_CONTEXT_KEY, span));

try (Scope scope = span.makeCurrent()) {
Expand All @@ -335,8 +341,7 @@ public void protocolMethod(RequestOptions options) {

@SuppressWarnings("try")
public void convenienceMethod(RequestOptions options) {
Span span = tracer.spanBuilder("convenienceMethod", INTERNAL)
.setParent(options == null ? Context.none() : options.getContext())
Span span = tracer.spanBuilder("convenienceMethod", INTERNAL, options)
.startSpan();

options.setContext(options.getContext().put(TelemetryProvider.TRACE_CONTEXT_KEY, span));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
package io.clientcore.core.telemetry;

import io.clientcore.core.telemetry.tracing.Tracer;
import io.clientcore.core.util.Context;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.TracerProvider;
Expand Down Expand Up @@ -61,7 +60,7 @@ public void createTracerTracingDisabled() {

Tracer tracer = TelemetryProvider.getInstance().getTracer(options, DEFAULT_LIB_OPTIONS);
assertFalse(tracer.isEnabled());
tracer.spanBuilder("test", INTERNAL).startSpan().end();
tracer.spanBuilder("test", INTERNAL, null).startSpan().end();

assertEquals(0, exporter.getFinishedSpanItems().size());
}
Expand All @@ -75,7 +74,7 @@ public void createTracerGlobalOTel() throws Exception {
Tracer tracer = TelemetryProvider.getInstance().getTracer(null, DEFAULT_LIB_OPTIONS);
assertTrue(tracer.isEnabled());

tracer.spanBuilder("test", INTERNAL).startSpan().end();
tracer.spanBuilder("test", INTERNAL, null).startSpan().end();

assertEquals(1, exporter.getFinishedSpanItems().size());
SpanData span = exporter.getFinishedSpanItems().get(0);
Expand All @@ -102,7 +101,7 @@ public void createTracerExplicitOTel() throws Exception {
.getTracer(new TelemetryOptions<OpenTelemetry>().setProvider(localOTel), DEFAULT_LIB_OPTIONS);
assertTrue(tracer.isEnabled());

tracer.spanBuilder("test", INTERNAL).startSpan().end();
tracer.spanBuilder("test", INTERNAL, null).startSpan().end();

assertTrue(exporter.getFinishedSpanItems().isEmpty());
assertEquals(1, localExporter.getFinishedSpanItems().size());
Expand Down Expand Up @@ -131,7 +130,7 @@ public void createTracerWithLibInfo() throws Exception {
Tracer tracer = TelemetryProvider.getInstance().getTracer(null, libOptions);
assertTrue(tracer.isEnabled());

tracer.spanBuilder("test", INTERNAL).startSpan().end();
tracer.spanBuilder("test", INTERNAL, null).startSpan().end();

SpanData span = exporter.getFinishedSpanItems().get(0);
assertEquals("test-library", span.getInstrumentationScopeInfo().getName());
Expand Down
Loading