Skip to content

Commit bcd693f

Browse files
authored
elasticsarch-rest: add stable semconv request method handling (#9345)
1 parent 0c40a44 commit bcd693f

File tree

4 files changed

+52
-3
lines changed

4 files changed

+52
-3
lines changed

instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7TelemetryBuilder.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,14 @@
99
import io.opentelemetry.api.OpenTelemetry;
1010
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
1111
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
12+
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesExtractorBuilder;
13+
import io.opentelemetry.instrumentation.api.internal.HttpConstants;
1214
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestInstrumenterFactory;
1315
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestRequest;
1416
import java.util.ArrayList;
17+
import java.util.HashSet;
1518
import java.util.List;
19+
import java.util.Set;
1620
import org.elasticsearch.client.Response;
1721

1822
public final class ElasticsearchRest7TelemetryBuilder {
@@ -22,6 +26,7 @@ public final class ElasticsearchRest7TelemetryBuilder {
2226
private final OpenTelemetry openTelemetry;
2327
private final List<AttributesExtractor<ElasticsearchRestRequest, Response>> attributesExtractors =
2428
new ArrayList<>();
29+
private Set<String> knownMethods = HttpConstants.KNOWN_METHODS;
2530

2631
ElasticsearchRest7TelemetryBuilder(OpenTelemetry openTelemetry) {
2732
this.openTelemetry = openTelemetry;
@@ -38,14 +43,33 @@ public ElasticsearchRest7TelemetryBuilder addAttributesExtractor(
3843
return this;
3944
}
4045

46+
/**
47+
* Configures the instrumentation to recognize an alternative set of HTTP request methods.
48+
*
49+
* <p>By default, this instrumentation defines "known" methods as the ones listed in <a
50+
* href="https://www.rfc-editor.org/rfc/rfc9110.html#name-methods">RFC9110</a> and the PATCH
51+
* method defined in <a href="https://www.rfc-editor.org/rfc/rfc5789.html">RFC5789</a>.
52+
*
53+
* <p>Note: calling this method <b>overrides</b> the default known method sets completely; it does
54+
* not supplement it.
55+
*
56+
* @param knownMethods A set of recognized HTTP request methods.
57+
* @see HttpClientAttributesExtractorBuilder#setKnownMethods(Set)
58+
*/
59+
@CanIgnoreReturnValue
60+
public ElasticsearchRest7TelemetryBuilder setKnownMethods(Set<String> knownMethods) {
61+
this.knownMethods = new HashSet<>(knownMethods);
62+
return this;
63+
}
64+
4165
/**
4266
* Returns a new {@link ElasticsearchRest7Telemetry} with the settings of this {@link
4367
* ElasticsearchRest7TelemetryBuilder}.
4468
*/
4569
public ElasticsearchRest7Telemetry build() {
4670
Instrumenter<ElasticsearchRestRequest, Response> instrumenter =
4771
ElasticsearchRestInstrumenterFactory.create(
48-
openTelemetry, INSTRUMENTATION_NAME, attributesExtractors, false);
72+
openTelemetry, INSTRUMENTATION_NAME, attributesExtractors, knownMethods, false);
4973

5074
return new ElasticsearchRest7Telemetry(instrumenter);
5175
}

instrumentation/elasticsearch/elasticsearch-rest-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchRestJavaagentInstrumenterFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1010
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestInstrumenterFactory;
1111
import io.opentelemetry.instrumentation.elasticsearch.rest.internal.ElasticsearchRestRequest;
12+
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
1213
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
1314
import java.util.Collections;
1415
import org.elasticsearch.client.Response;
@@ -27,6 +28,7 @@ public static Instrumenter<ElasticsearchRestRequest, Response> create(
2728
GlobalOpenTelemetry.get(),
2829
instrumentationName,
2930
Collections.emptyList(),
31+
CommonConfig.get().getKnownHttpRequestMethods(),
3032
CAPTURE_SEARCH_QUERY);
3133
}
3234
}

instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchClientAttributeExtractor.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@
66
package io.opentelemetry.instrumentation.elasticsearch.rest.internal;
77

88
import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet;
9+
import static io.opentelemetry.instrumentation.api.internal.HttpConstants._OTHER;
910

1011
import io.opentelemetry.api.common.AttributeKey;
1112
import io.opentelemetry.api.common.AttributesBuilder;
1213
import io.opentelemetry.context.Context;
1314
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
15+
import io.opentelemetry.instrumentation.api.instrumenter.http.internal.HttpAttributes;
1416
import io.opentelemetry.instrumentation.api.instrumenter.network.internal.NetworkAttributes;
1517
import io.opentelemetry.instrumentation.api.instrumenter.url.internal.UrlAttributes;
1618
import io.opentelemetry.instrumentation.api.internal.SemconvStability;
1719
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
1820
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
21+
import java.util.HashSet;
22+
import java.util.Set;
1923
import javax.annotation.Nullable;
2024
import org.apache.http.HttpHost;
2125
import org.elasticsearch.client.Response;
@@ -31,6 +35,12 @@ public class ElasticsearchClientAttributeExtractor
3135

3236
private static final Cache<String, AttributeKey<String>> pathPartKeysCache = Cache.bounded(64);
3337

38+
private final Set<String> knownMethods;
39+
40+
ElasticsearchClientAttributeExtractor(Set<String> knownMethods) {
41+
this.knownMethods = new HashSet<>(knownMethods);
42+
}
43+
3444
private static void setServerAttributes(AttributesBuilder attributes, Response response) {
3545
HttpHost host = response.getHost();
3646
if (host != null) {
@@ -79,7 +89,18 @@ private static void setPathPartsAttributes(
7989
@Override
8090
public void onStart(
8191
AttributesBuilder attributes, Context parentContext, ElasticsearchRestRequest request) {
82-
internalSet(attributes, SemanticAttributes.HTTP_METHOD, request.getMethod());
92+
String method = request.getMethod();
93+
if (SemconvStability.emitStableHttpSemconv()) {
94+
if (method == null || knownMethods.contains(method)) {
95+
internalSet(attributes, HttpAttributes.HTTP_REQUEST_METHOD, method);
96+
} else {
97+
internalSet(attributes, HttpAttributes.HTTP_REQUEST_METHOD, _OTHER);
98+
internalSet(attributes, HttpAttributes.HTTP_REQUEST_METHOD_ORIGINAL, method);
99+
}
100+
}
101+
if (SemconvStability.emitOldHttpSemconv()) {
102+
internalSet(attributes, SemanticAttributes.HTTP_METHOD, method);
103+
}
83104
setPathPartsAttributes(attributes, request);
84105
}
85106

instrumentation/elasticsearch/elasticsearch-rest-common/library/src/main/java/io/opentelemetry/instrumentation/elasticsearch/rest/internal/ElasticsearchRestInstrumenterFactory.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
1212
import io.opentelemetry.instrumentation.api.instrumenter.db.DbClientAttributesExtractor;
1313
import java.util.List;
14+
import java.util.Set;
1415
import org.elasticsearch.client.Response;
1516

1617
/**
@@ -25,11 +26,12 @@ public static Instrumenter<ElasticsearchRestRequest, Response> create(
2526
OpenTelemetry opentelemetry,
2627
String instrumentationName,
2728
List<AttributesExtractor<ElasticsearchRestRequest, Response>> attributesExtractors,
29+
Set<String> knownMethods,
2830
boolean captureSearchQuery) {
2931
ElasticsearchDbAttributesGetter dbClientAttributesGetter =
3032
new ElasticsearchDbAttributesGetter(captureSearchQuery);
3133
ElasticsearchClientAttributeExtractor esClientAtrributesExtractor =
32-
new ElasticsearchClientAttributeExtractor();
34+
new ElasticsearchClientAttributeExtractor(knownMethods);
3335
ElasticsearchSpanNameExtractor nameExtractor =
3436
new ElasticsearchSpanNameExtractor(dbClientAttributesGetter);
3537

0 commit comments

Comments
 (0)