io.opentelemetry.instrumentation.spring.web.v3_1.SpringWebTelemetryBuilder Maven / Gradle / Ivy
Show all versions of opentelemetry-spring-web-3.1 Show documentation
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.spring.web.v3_1;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.instrumentation.api.incubator.builder.internal.DefaultHttpClientInstrumenterBuilder;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesExtractorBuilder;
import io.opentelemetry.instrumentation.spring.web.v3_1.internal.WebTelemetryUtil;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpResponse;
/** A builder of {@link SpringWebTelemetry}. */
public final class SpringWebTelemetryBuilder {
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.spring-web-3.1";
private final DefaultHttpClientInstrumenterBuilder builder;
static {
WebTelemetryUtil.setBuilderExtractor(SpringWebTelemetryBuilder::getBuilder);
}
SpringWebTelemetryBuilder(OpenTelemetry openTelemetry) {
builder =
new DefaultHttpClientInstrumenterBuilder<>(
INSTRUMENTATION_NAME, openTelemetry, SpringWebHttpAttributesGetter.INSTANCE)
.setHeaderSetter(HttpRequestSetter.INSTANCE);
}
private DefaultHttpClientInstrumenterBuilder getBuilder() {
return builder;
}
/**
* Adds an additional {@link AttributesExtractor} to invoke to set attributes to instrumented
* items.
*/
@CanIgnoreReturnValue
public SpringWebTelemetryBuilder addAttributeExtractor(
AttributesExtractor super HttpRequest, ? super ClientHttpResponse> attributesExtractor) {
builder.addAttributeExtractor(attributesExtractor);
return this;
}
/**
* Configures the HTTP request headers that will be captured as span attributes.
*
* @param requestHeaders A list of HTTP header names.
*/
@CanIgnoreReturnValue
public SpringWebTelemetryBuilder setCapturedRequestHeaders(List requestHeaders) {
builder.setCapturedRequestHeaders(requestHeaders);
return this;
}
/**
* Configures the HTTP response headers that will be captured as span attributes.
*
* @param responseHeaders A list of HTTP header names.
*/
@CanIgnoreReturnValue
public SpringWebTelemetryBuilder setCapturedResponseHeaders(List responseHeaders) {
builder.setCapturedResponseHeaders(responseHeaders);
return this;
}
/** Sets custom {@link SpanNameExtractor} via transform function. */
@CanIgnoreReturnValue
public SpringWebTelemetryBuilder setSpanNameExtractor(
Function<
SpanNameExtractor super HttpRequest>,
? extends SpanNameExtractor super HttpRequest>>
spanNameExtractorTransformer) {
builder.setSpanNameExtractor(spanNameExtractorTransformer);
return this;
}
/**
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
*
* By default, this instrumentation defines "known" methods as the ones listed in RFC9110 and the PATCH
* method defined in RFC5789.
*
*
Note: calling this method overrides the default known method sets completely; it does
* not supplement it.
*
* @param knownMethods A set of recognized HTTP request methods.
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
*/
@CanIgnoreReturnValue
public SpringWebTelemetryBuilder setKnownMethods(Set knownMethods) {
builder.setKnownMethods(knownMethods);
return this;
}
/**
* Configures the instrumentation to emit experimental HTTP client metrics.
*
* @param emitExperimentalHttpClientMetrics {@code true} if the experimental HTTP client metrics
* are to be emitted.
*/
@CanIgnoreReturnValue
public SpringWebTelemetryBuilder setEmitExperimentalHttpClientMetrics(
boolean emitExperimentalHttpClientMetrics) {
builder.setEmitExperimentalHttpClientMetrics(emitExperimentalHttpClientMetrics);
return this;
}
/**
* Returns a new {@link SpringWebTelemetry} with the settings of this {@link
* SpringWebTelemetryBuilder}.
*/
public SpringWebTelemetry build() {
return new SpringWebTelemetry(builder.build());
}
}