elasticsarch-rest: add stable semconv request method handling (#9345)
This commit is contained in:
parent
0c40a4466b
commit
bcd693f614
|
@ -9,10 +9,14 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue;
|
||||||
import io.opentelemetry.api.OpenTelemetry;
|
import io.opentelemetry.api.OpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
|
||||||
|
import io.opentelemetry.instrumentation.api.internal.HttpConstants;
|
||||||
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestInstrumenterFactory;
|
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestInstrumenterFactory;
|
||||||
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestRequest;
|
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestRequest;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import org.elasticsearch.client.Response;
|
import org.elasticsearch.client.Response;
|
||||||
|
|
||||||
public final class ElasticsearchRest7TelemetryBuilder {
|
public final class ElasticsearchRest7TelemetryBuilder {
|
||||||
|
@ -22,6 +26,7 @@ public final class ElasticsearchRest7TelemetryBuilder {
|
||||||
private final OpenTelemetry openTelemetry;
|
private final OpenTelemetry openTelemetry;
|
||||||
private final List<AttributesExtractor<ElasticsearchRestRequest, Response>> attributesExtractors =
|
private final List<AttributesExtractor<ElasticsearchRestRequest, Response>> attributesExtractors =
|
||||||
new ArrayList<>();
|
new ArrayList<>();
|
||||||
|
private Set<String> knownMethods = HttpConstants.KNOWN_METHODS;
|
||||||
|
|
||||||
ElasticsearchRest7TelemetryBuilder(OpenTelemetry openTelemetry) {
|
ElasticsearchRest7TelemetryBuilder(OpenTelemetry openTelemetry) {
|
||||||
this.openTelemetry = openTelemetry;
|
this.openTelemetry = openTelemetry;
|
||||||
|
@ -38,6 +43,25 @@ public final class ElasticsearchRest7TelemetryBuilder {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
|
||||||
|
*
|
||||||
|
* <p>By default, this instrumentation defines "known" methods as the ones listed in <a
|
||||||
|
* href="https://www.rfc-editor.org/rfc/rfc9110.html#name-methods">RFC9110</a> and the PATCH
|
||||||
|
* method defined in <a href="https://www.rfc-editor.org/rfc/rfc5789.html">RFC5789</a>.
|
||||||
|
*
|
||||||
|
* <p>Note: calling this method <b>overrides</b> 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 ElasticsearchRest7TelemetryBuilder setKnownMethods(Set<String> knownMethods) {
|
||||||
|
this.knownMethods = new HashSet<>(knownMethods);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a new {@link ElasticsearchRest7Telemetry} with the settings of this {@link
|
* Returns a new {@link ElasticsearchRest7Telemetry} with the settings of this {@link
|
||||||
* ElasticsearchRest7TelemetryBuilder}.
|
* ElasticsearchRest7TelemetryBuilder}.
|
||||||
|
@ -45,7 +69,7 @@ public final class ElasticsearchRest7TelemetryBuilder {
|
||||||
public ElasticsearchRest7Telemetry build() {
|
public ElasticsearchRest7Telemetry build() {
|
||||||
Instrumenter<ElasticsearchRestRequest, Response> instrumenter =
|
Instrumenter<ElasticsearchRestRequest, Response> instrumenter =
|
||||||
ElasticsearchRestInstrumenterFactory.create(
|
ElasticsearchRestInstrumenterFactory.create(
|
||||||
openTelemetry, INSTRUMENTATION_NAME, attributesExtractors, false);
|
openTelemetry, INSTRUMENTATION_NAME, attributesExtractors, knownMethods, false);
|
||||||
|
|
||||||
return new ElasticsearchRest7Telemetry(instrumenter);
|
return new ElasticsearchRest7Telemetry(instrumenter);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestInstrumenterFactory;
|
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestInstrumenterFactory;
|
||||||
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestRequest;
|
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestRequest;
|
||||||
|
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
|
||||||
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
|
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import org.elasticsearch.client.Response;
|
import org.elasticsearch.client.Response;
|
||||||
|
@ -27,6 +28,7 @@ public final class ElasticsearchRestJavaagentInstrumenterFactory {
|
||||||
GlobalOpenTelemetry.get(),
|
GlobalOpenTelemetry.get(),
|
||||||
instrumentationName,
|
instrumentationName,
|
||||||
Collections.emptyList(),
|
Collections.emptyList(),
|
||||||
|
CommonConfig.get().getKnownHttpRequestMethods(),
|
||||||
CAPTURE_SEARCH_QUERY);
|
CAPTURE_SEARCH_QUERY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,16 +6,20 @@
|
||||||
package io.opentelemetry.instrumentation.elasticsearch.rest.internal;
|
package io.opentelemetry.instrumentation.elasticsearch.rest.internal;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet;
|
import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet;
|
||||||
|
import static io.opentelemetry.instrumentation.api.internal.HttpConstants._OTHER;
|
||||||
|
|
||||||
import io.opentelemetry.api.common.AttributeKey;
|
import io.opentelemetry.api.common.AttributeKey;
|
||||||
import io.opentelemetry.api.common.AttributesBuilder;
|
import io.opentelemetry.api.common.AttributesBuilder;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
|
||||||
|
import io.opentelemetry.instrumentation.api.instrumenter.http.internal.HttpAttributes;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.NetworkAttributes;
|
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.NetworkAttributes;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.url.internal.UrlAttributes;
|
import io.opentelemetry.instrumentation.api.instrumenter.url.internal.UrlAttributes;
|
||||||
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
|
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
|
||||||
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
|
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
|
||||||
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import org.apache.http.HttpHost;
|
import org.apache.http.HttpHost;
|
||||||
import org.elasticsearch.client.Response;
|
import org.elasticsearch.client.Response;
|
||||||
|
@ -31,6 +35,12 @@ public class ElasticsearchClientAttributeExtractor
|
||||||
|
|
||||||
private static final Cache<String, AttributeKey<String>> pathPartKeysCache = Cache.bounded(64);
|
private static final Cache<String, AttributeKey<String>> pathPartKeysCache = Cache.bounded(64);
|
||||||
|
|
||||||
|
private final Set<String> knownMethods;
|
||||||
|
|
||||||
|
ElasticsearchClientAttributeExtractor(Set<String> knownMethods) {
|
||||||
|
this.knownMethods = new HashSet<>(knownMethods);
|
||||||
|
}
|
||||||
|
|
||||||
private static void setServerAttributes(AttributesBuilder attributes, Response response) {
|
private static void setServerAttributes(AttributesBuilder attributes, Response response) {
|
||||||
HttpHost host = response.getHost();
|
HttpHost host = response.getHost();
|
||||||
if (host != null) {
|
if (host != null) {
|
||||||
|
@ -79,7 +89,18 @@ public class ElasticsearchClientAttributeExtractor
|
||||||
@Override
|
@Override
|
||||||
public void onStart(
|
public void onStart(
|
||||||
AttributesBuilder attributes, Context parentContext, ElasticsearchRestRequest request) {
|
AttributesBuilder attributes, Context parentContext, ElasticsearchRestRequest request) {
|
||||||
internalSet(attributes, SemanticAttributes.HTTP_METHOD, request.getMethod());
|
String method = request.getMethod();
|
||||||
|
if (SemconvStability.emitStableHttpSemconv()) {
|
||||||
|
if (method == null || knownMethods.contains(method)) {
|
||||||
|
internalSet(attributes, HttpAttributes.HTTP_REQUEST_METHOD, method);
|
||||||
|
} else {
|
||||||
|
internalSet(attributes, HttpAttributes.HTTP_REQUEST_METHOD, _OTHER);
|
||||||
|
internalSet(attributes, HttpAttributes.HTTP_REQUEST_METHOD_ORIGINAL, method);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (SemconvStability.emitOldHttpSemconv()) {
|
||||||
|
internalSet(attributes, SemanticAttributes.HTTP_METHOD, method);
|
||||||
|
}
|
||||||
setPathPartsAttributes(attributes, request);
|
setPathPartsAttributes(attributes, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
|
||||||
import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientAttributesExtractor;
|
import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientAttributesExtractor;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import org.elasticsearch.client.Response;
|
import org.elasticsearch.client.Response;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -25,11 +26,12 @@ public final class ElasticsearchRestInstrumenterFactory {
|
||||||
OpenTelemetry opentelemetry,
|
OpenTelemetry opentelemetry,
|
||||||
String instrumentationName,
|
String instrumentationName,
|
||||||
List<AttributesExtractor<ElasticsearchRestRequest, Response>> attributesExtractors,
|
List<AttributesExtractor<ElasticsearchRestRequest, Response>> attributesExtractors,
|
||||||
|
Set<String> knownMethods,
|
||||||
boolean captureSearchQuery) {
|
boolean captureSearchQuery) {
|
||||||
ElasticsearchDbAttributesGetter dbClientAttributesGetter =
|
ElasticsearchDbAttributesGetter dbClientAttributesGetter =
|
||||||
new ElasticsearchDbAttributesGetter(captureSearchQuery);
|
new ElasticsearchDbAttributesGetter(captureSearchQuery);
|
||||||
ElasticsearchClientAttributeExtractor esClientAtrributesExtractor =
|
ElasticsearchClientAttributeExtractor esClientAtrributesExtractor =
|
||||||
new ElasticsearchClientAttributeExtractor();
|
new ElasticsearchClientAttributeExtractor(knownMethods);
|
||||||
ElasticsearchSpanNameExtractor nameExtractor =
|
ElasticsearchSpanNameExtractor nameExtractor =
|
||||||
new ElasticsearchSpanNameExtractor(dbClientAttributesGetter);
|
new ElasticsearchSpanNameExtractor(dbClientAttributesGetter);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue