Skip to content

Commit

Permalink
Allow configuring captured HTTP headers in library instrumentations (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
Mateusz Rzeszutek authored Oct 6, 2021
1 parent d3dbe41 commit f80f4a9
Show file tree
Hide file tree
Showing 18 changed files with 192 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@
final class ApacheHttpClientHttpAttributesExtractor
extends HttpClientAttributesExtractor<ApacheHttpClientRequest, HttpResponse> {

// TODO: add support for capturing HTTP headers in library instrumentations
ApacheHttpClientHttpAttributesExtractor() {
super(CapturedHttpHeaders.empty());
ApacheHttpClientHttpAttributesExtractor(CapturedHttpHeaders capturedHttpHeaders) {
super(capturedHttpHeaders);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
package io.opentelemetry.instrumentation.apachehttpclient.v4_3;

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
Expand All @@ -27,6 +29,7 @@ public final class ApacheHttpClientTracingBuilder {

private final List<AttributesExtractor<? super ApacheHttpClientRequest, ? super HttpResponse>>
additionalExtractors = new ArrayList<>();
private CapturedHttpHeaders capturedHttpHeaders = CapturedHttpHeaders.client(Config.get());

ApacheHttpClientTracingBuilder(OpenTelemetry openTelemetry) {
this.openTelemetry = openTelemetry;
Expand All @@ -43,13 +46,26 @@ public ApacheHttpClientTracingBuilder addAttributeExtractor(
return this;
}

/**
* Configure the instrumentation to capture chosen HTTP request and response headers as span
* attributes.
*
* @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured
* HTTP request and response names.
*/
public ApacheHttpClientTracingBuilder captureHttpHeaders(
CapturedHttpHeaders capturedHttpHeaders) {
this.capturedHttpHeaders = capturedHttpHeaders;
return this;
}

/**
* Returns a new {@link ApacheHttpClientTracing} configured with this {@link
* ApacheHttpClientTracingBuilder}.
*/
public ApacheHttpClientTracing build() {
HttpClientAttributesExtractor<ApacheHttpClientRequest, HttpResponse> httpAttributesExtractor =
new ApacheHttpClientHttpAttributesExtractor();
new ApacheHttpClientHttpAttributesExtractor(capturedHttpHeaders);
SpanNameExtractor<? super ApacheHttpClientRequest> spanNameExtractor =
HttpSpanNameExtractor.create(httpAttributesExtractor);
SpanStatusExtractor<? super ApacheHttpClientRequest, ? super HttpResponse> spanStatusExtractor =
Expand All @@ -62,6 +78,7 @@ public ApacheHttpClientTracing build() {
.setSpanStatusExtractor(spanStatusExtractor)
.addAttributesExtractor(httpAttributesExtractor)
.addAttributesExtractor(netAttributesExtractor)
.addAttributesExtractors(additionalExtractors)
// We manually inject because we need to inject internal requests for redirects.
.newInstrumenter(SpanKindExtractor.alwaysClient());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@
final class ArmeriaHttpClientAttributesExtractor
extends HttpClientAttributesExtractor<RequestContext, RequestLog> {

// TODO: add support for capturing HTTP headers in library instrumentations
ArmeriaHttpClientAttributesExtractor() {
super(CapturedHttpHeaders.empty());
ArmeriaHttpClientAttributesExtractor(CapturedHttpHeaders capturedHttpHeaders) {
super(capturedHttpHeaders);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@
final class ArmeriaHttpServerAttributesExtractor
extends HttpServerAttributesExtractor<RequestContext, RequestLog> {

// TODO: add support for capturing HTTP headers in library instrumentations
ArmeriaHttpServerAttributesExtractor() {
super(CapturedHttpHeaders.empty());
ArmeriaHttpServerAttributesExtractor(CapturedHttpHeaders capturedHttpHeaders) {
super(capturedHttpHeaders);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@
import com.linecorp.armeria.common.logging.RequestLog;
import com.linecorp.armeria.server.ServiceRequestContext;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.InstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
Expand All @@ -29,6 +31,8 @@ public final class ArmeriaTracingBuilder {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.armeria-1.3";

private final OpenTelemetry openTelemetry;
private CapturedHttpHeaders capturedHttpClientHeaders = CapturedHttpHeaders.client(Config.get());
private CapturedHttpHeaders capturedHttpServerHeaders = CapturedHttpHeaders.server(Config.get());

private final List<AttributesExtractor<? super RequestContext, ? super RequestLog>>
additionalExtractors = new ArrayList<>();
Expand Down Expand Up @@ -61,11 +65,37 @@ public ArmeriaTracingBuilder addAttributeExtractor(
return this;
}

/**
* Configure the HTTP client instrumentation to capture chosen HTTP request and response headers
* as span attributes.
*
* @param capturedHttpClientHeaders An instance of {@link CapturedHttpHeaders} containing the
* configured HTTP request and response names.
*/
public ArmeriaTracingBuilder captureHttpClientHeaders(
CapturedHttpHeaders capturedHttpClientHeaders) {
this.capturedHttpClientHeaders = capturedHttpClientHeaders;
return this;
}

/**
* Configure the HTTP server instrumentation to capture chosen HTTP request and response headers
* as span attributes.
*
* @param capturedHttpServerHeaders An instance of {@link CapturedHttpHeaders} containing the
* configured HTTP request and response names.
*/
public ArmeriaTracingBuilder captureHttpServerHeaders(
CapturedHttpHeaders capturedHttpServerHeaders) {
this.capturedHttpServerHeaders = capturedHttpServerHeaders;
return this;
}

public ArmeriaTracing build() {
ArmeriaHttpClientAttributesExtractor clientAttributesExtractor =
new ArmeriaHttpClientAttributesExtractor();
new ArmeriaHttpClientAttributesExtractor(capturedHttpClientHeaders);
ArmeriaHttpServerAttributesExtractor serverAttributesExtractor =
new ArmeriaHttpServerAttributesExtractor();
new ArmeriaHttpServerAttributesExtractor(capturedHttpServerHeaders);

ArmeriaNetAttributesExtractor netAttributesExtractor = new ArmeriaNetAttributesExtractor();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,27 @@
/** JettyClientTracing, the Entrypoint for tracing Jetty client. */
public final class JettyClientTracing {

private final HttpClient httpClient;

/** Returns a new {@link JettyClientTracing} configured with the given {@link OpenTelemetry}. */
public static JettyClientTracing create(OpenTelemetry openTelemetry) {
JettyClientTracingBuilder builder = newBuilder(openTelemetry);
return builder.build();
}

/**
* Returns a new {@link JettyClientTracingBuilder} configured with the given {@link
* OpenTelemetry}.
*/
public static JettyClientTracingBuilder newBuilder(OpenTelemetry openTelemetry) {
return new JettyClientTracingBuilder(openTelemetry);
}

public HttpClient getHttpClient() {
return httpClient;
}
private final HttpClient httpClient;

JettyClientTracing(HttpClient httpClient) {
this.httpClient = httpClient;
}

public HttpClient getHttpClient() {
return httpClient;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,23 @@
package io.opentelemetry.instrumentation.jetty.httpclient.v9_2;

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders;
import io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal.JettyClientInstrumenterBuilder;
import org.eclipse.jetty.client.HttpClientTransport;
import org.eclipse.jetty.client.api.Request;
import org.eclipse.jetty.client.api.Response;
import org.eclipse.jetty.util.ssl.SslContextFactory;

/** A builder of {@link JettyClientTracing}. */
public final class JettyClientTracingBuilder {

private final OpenTelemetry openTelemetry;
private final JettyClientInstrumenterBuilder instrumenterBuilder;
private HttpClientTransport httpClientTransport;
private SslContextFactory sslContextFactory;

public JettyClientTracingBuilder(OpenTelemetry openTelemetry) {
this.openTelemetry = openTelemetry;
JettyClientTracingBuilder(OpenTelemetry openTelemetry) {
instrumenterBuilder = new JettyClientInstrumenterBuilder(openTelemetry);
}

public JettyClientTracingBuilder setHttpClientTransport(HttpClientTransport httpClientTransport) {
Expand All @@ -33,13 +35,36 @@ public JettyClientTracingBuilder setSslContextFactory(SslContextFactory sslConte
return this;
}

public JettyClientTracing build() {
JettyClientInstrumenterBuilder instrumenterBuilder =
new JettyClientInstrumenterBuilder(this.openTelemetry);
Instrumenter<Request, Response> instrumenter = instrumenterBuilder.build();
/**
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
* items.
*/
public JettyClientTracingBuilder addAttributeExtractor(
AttributesExtractor<? super Request, ? super Response> attributesExtractor) {
instrumenterBuilder.addAttributeExtractor(attributesExtractor);
return this;
}

/**
* Configure the instrumentation to capture chosen HTTP request and response headers as span
* attributes.
*
* @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured
* HTTP request and response names.
*/
public JettyClientTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttpHeaders) {
instrumenterBuilder.captureHttpHeaders(capturedHttpHeaders);
return this;
}

/**
* Returns a new {@link JettyClientTracing} with the settings of this {@link
* JettyClientTracingBuilder}.
*/
public JettyClientTracing build() {
TracingHttpClient tracingHttpClient =
TracingHttpClient.buildNew(instrumenter, this.sslContextFactory, this.httpClientTransport);
TracingHttpClient.buildNew(
instrumenterBuilder.build(), this.sslContextFactory, this.httpClientTransport);

return new JettyClientTracing(tracingHttpClient);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@

final class JettyClientHttpAttributesExtractor
extends HttpClientAttributesExtractor<Request, Response> {

private static final Logger logger =
LoggerFactory.getLogger(JettyClientHttpAttributesExtractor.class);

// TODO: add support for capturing HTTP headers in library instrumentations
JettyClientHttpAttributesExtractor() {
super(CapturedHttpHeaders.empty());
JettyClientHttpAttributesExtractor(CapturedHttpHeaders capturedHttpHeaders) {
super(capturedHttpHeaders);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
package io.opentelemetry.instrumentation.jetty.httpclient.v9_2.internal;

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanStatusExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
Expand All @@ -27,20 +29,27 @@ public final class JettyClientInstrumenterBuilder {

private final List<AttributesExtractor<? super Request, ? super Response>> additionalExtractors =
new ArrayList<>();
private CapturedHttpHeaders capturedHttpHeaders = CapturedHttpHeaders.client(Config.get());

public JettyClientInstrumenterBuilder(OpenTelemetry openTelemetry) {
this.openTelemetry = openTelemetry;
}

public JettyClientInstrumenterBuilder addAttributeExtractor(
AttributesExtractor<? super Request, ? super Response> attributesExtractor) {
additionalExtractors.add(attributesExtractor);
return this;
}

public JettyClientInstrumenterBuilder(OpenTelemetry openTelemetry) {
this.openTelemetry = openTelemetry;
public JettyClientInstrumenterBuilder captureHttpHeaders(
CapturedHttpHeaders capturedHttpHeaders) {
this.capturedHttpHeaders = capturedHttpHeaders;
return this;
}

public Instrumenter<Request, Response> build() {
HttpClientAttributesExtractor<Request, Response> httpAttributesExtractor =
new JettyClientHttpAttributesExtractor();
new JettyClientHttpAttributesExtractor(capturedHttpHeaders);
SpanNameExtractor<Request> spanNameExtractor =
HttpSpanNameExtractor.create(httpAttributesExtractor);
SpanStatusExtractor<Request, Response> spanStatusExtractor =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,12 @@ class JettyHttpClient9LibraryTest extends AbstractJettyClient9Test implements Li

@Override
HttpClient createStandardClient() {
JettyClientTracingBuilder jettyClientTracingBuilder = new JettyClientTracingBuilder(getOpenTelemetry())
return jettyClientTracingBuilder.build().getHttpClient()
return JettyClientTracing.create(getOpenTelemetry()).getHttpClient()
}

@Override
HttpClient createHttpsClient(SslContextFactory sslContextFactory) {
JettyClientTracingBuilder jettyClientTracingBuilder = new JettyClientTracingBuilder(getOpenTelemetry())
return jettyClientTracingBuilder
return JettyClientTracing.newBuilder(getOpenTelemetry())
.setSslContextFactory(sslContextFactory)
.build()
.getHttpClient()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,8 @@

final class OkHttpAttributesExtractor extends HttpClientAttributesExtractor<Request, Response> {

// TODO: add support for capturing HTTP headers in library instrumentations
OkHttpAttributesExtractor() {
super(CapturedHttpHeaders.empty());
OkHttpAttributesExtractor(CapturedHttpHeaders capturedHttpHeaders) {
super(capturedHttpHeaders);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
import static io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor.alwaysClient;

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.config.Config;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
import io.opentelemetry.instrumentation.api.instrumenter.http.CapturedHttpHeaders;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientMetrics;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanNameExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpSpanStatusExtractor;
Expand All @@ -26,6 +28,7 @@ public final class OkHttpTracingBuilder {
private final OpenTelemetry openTelemetry;
private final List<AttributesExtractor<Request, Response>> additionalExtractors =
new ArrayList<>();
private CapturedHttpHeaders capturedHttpHeaders = CapturedHttpHeaders.client(Config.get());

OkHttpTracingBuilder(OpenTelemetry openTelemetry) {
this.openTelemetry = openTelemetry;
Expand All @@ -41,9 +44,22 @@ public OkHttpTracingBuilder addAttributesExtractor(
return this;
}

/**
* Configure the instrumentation to capture chosen HTTP request and response headers as span
* attributes.
*
* @param capturedHttpHeaders An instance of {@link CapturedHttpHeaders} containing the configured
* HTTP request and response names.
*/
public OkHttpTracingBuilder captureHttpHeaders(CapturedHttpHeaders capturedHttpHeaders) {
this.capturedHttpHeaders = capturedHttpHeaders;
return this;
}

/** Returns a new {@link OkHttpTracing} with the settings of this {@link OkHttpTracingBuilder}. */
public OkHttpTracing build() {
OkHttpAttributesExtractor httpAttributesExtractor = new OkHttpAttributesExtractor();
OkHttpAttributesExtractor httpAttributesExtractor =
new OkHttpAttributesExtractor(capturedHttpHeaders);
OkHttpNetAttributesExtractor netAttributesExtractor = new OkHttpNetAttributesExtractor();

Instrumenter<Request, Response> instrumenter =
Expand Down
Loading

0 comments on commit f80f4a9

Please sign in to comment.