Skip to content

Commit 1e04539

Browse files
committed
added url template.
1 parent e366fcc commit 1e04539

File tree

5 files changed

+22
-2
lines changed

5 files changed

+22
-2
lines changed

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpClientAttributesGetter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesGetter;
99
import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesGetter;
10+
import io.opentelemetry.instrumentation.api.semconv.url.UrlAttributesGetter;
1011
import javax.annotation.Nullable;
1112

1213
/**
@@ -21,7 +22,8 @@
2122
public interface HttpClientAttributesGetter<REQUEST, RESPONSE>
2223
extends HttpCommonAttributesGetter<REQUEST, RESPONSE>,
2324
NetworkAttributesGetter<REQUEST, RESPONSE>,
24-
ServerAttributesGetter<REQUEST> {
25+
ServerAttributesGetter<REQUEST>,
26+
UrlAttributesGetter<REQUEST> {
2527

2628
/**
2729
* Returns the absolute URL describing a network resource according to <a

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/http/HttpSpanNameExtractor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,11 @@ static final class Client<REQUEST> implements SpanNameExtractor<REQUEST> {
7070
@Override
7171
public String extract(REQUEST request) {
7272
String method = getter.getHttpRequestMethod(request);
73+
String template = getter.getUrlTemplate(request);
7374
if (method == null || !knownMethods.contains(method)) {
7475
return "HTTP";
7576
}
76-
return method;
77+
return template == null ? method : method + " " + template;
7778
}
7879
}
7980

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/url/UrlAttributesGetter.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,14 @@ default String getUrlPath(REQUEST request) {
5050
default String getUrlQuery(REQUEST request) {
5151
return null;
5252
}
53+
54+
/**
55+
* Returns the template used to build the full URL (if available)
56+
*
57+
* <p>Examples: {@code /users/{id}}; {@code /users?q={query}}</p>
58+
*/
59+
@Nullable
60+
default String getUrlTemplate(REQUEST request) {
61+
return null;
62+
}
5363
}

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/semconv/url/internal/InternalUrlAttributesExtractor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet;
99

10+
import io.opentelemetry.api.common.AttributeKey;
1011
import io.opentelemetry.api.common.AttributesBuilder;
1112
import io.opentelemetry.instrumentation.api.semconv.url.UrlAttributesGetter;
1213
import io.opentelemetry.semconv.UrlAttributes;
@@ -31,10 +32,12 @@ public void onStart(AttributesBuilder attributes, REQUEST request) {
3132
String urlScheme = getUrlScheme(request);
3233
String urlPath = getter.getUrlPath(request);
3334
String urlQuery = getter.getUrlQuery(request);
35+
String urlTemplate = getter.getUrlTemplate(request);
3436

3537
internalSet(attributes, UrlAttributes.URL_SCHEME, urlScheme);
3638
internalSet(attributes, UrlAttributes.URL_PATH, urlPath);
3739
internalSet(attributes, UrlAttributes.URL_QUERY, urlQuery);
40+
internalSet(attributes, AttributeKey.stringKey("url.template"), urlTemplate);
3841
}
3942

4043
private String getUrlScheme(REQUEST request) {

instrumentation/ktor/ktor-2-common/library/src/main/kotlin/io/opentelemetry/instrumentation/ktor/v2_0/common/KtorHttpClientAttributesGetter.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package io.opentelemetry.instrumentation.ktor.v2_0.common
77

88
import io.ktor.client.request.*
99
import io.ktor.client.statement.*
10+
import io.ktor.util.AttributeKey
1011
import io.opentelemetry.instrumentation.api.semconv.http.HttpClientAttributesGetter
1112

1213
internal object KtorHttpClientAttributesGetter : HttpClientAttributesGetter<HttpRequestData, HttpResponse> {
@@ -34,4 +35,7 @@ internal object KtorHttpClientAttributesGetter : HttpClientAttributesGetter<Http
3435
override fun getServerAddress(request: HttpRequestData) = request.url.host
3536

3637
override fun getServerPort(request: HttpRequestData) = request.url.port
38+
39+
private val urlTemplateAttributeKey = AttributeKey<String>("URL_TEMPLATE")
40+
override fun getUrlTemplate(request: HttpRequestData): String? = request.attributes.getOrNull(urlTemplateAttributeKey)
3741
}

0 commit comments

Comments
 (0)