Skip to content

Commit 680b391

Browse files
authored
feat: adding client servicename as request header (#425)
* adding client servicename as request header * placing ServiceNameHeaderUtils in javaagent-core * spotless apply
1 parent c001586 commit 680b391

File tree

12 files changed

+241
-0
lines changed

12 files changed

+241
-0
lines changed

instrumentation/apache-httpclient-4.0/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ val versions: Map<String, String> by extra
4141

4242
dependencies {
4343
api(project(":instrumentation:java-streams"))
44+
4445
library("org.apache.httpcomponents:httpclient:4.0")
4546
testImplementation(project(":testing-common"))
4647
}

instrumentation/apache-httpclient-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/apachehttpclient/v4_0/ApacheHttpClientUtils.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.hypertrace.agent.core.instrumentation.buffer.BoundedByteArrayOutputStream;
4141
import org.hypertrace.agent.core.instrumentation.utils.ContentTypeCharsetUtils;
4242
import org.hypertrace.agent.core.instrumentation.utils.ContentTypeUtils;
43+
import org.hypertrace.agent.core.instrumentation.utils.ServiceNameHeaderUtils;
4344
import org.slf4j.Logger;
4445
import org.slf4j.LoggerFactory;
4546

@@ -58,6 +59,12 @@ public static void addRequestHeaders(Span span, HeaderIterator headerIterator) {
5859
addHeaders(span, headerIterator, HypertraceSemanticAttributes::httpRequestHeader);
5960
}
6061

62+
public static void addClientServiceNameHeader(HttpMessage request) {
63+
request.addHeader(
64+
ServiceNameHeaderUtils.getClientServiceKey(),
65+
ServiceNameHeaderUtils.getClientServiceName());
66+
}
67+
6168
private static void addHeaders(
6269
Span span,
6370
HeaderIterator headerIterator,
@@ -73,6 +80,9 @@ public static void traceRequest(Span span, HttpMessage request) {
7380
ApacheHttpClientUtils.addRequestHeaders(span, request.headerIterator());
7481
}
7582

83+
// Add service name header to outgoing requests
84+
ApacheHttpClientUtils.addClientServiceNameHeader(request);
85+
7686
if (instrumentationConfig.httpBody().request()
7787
&& request instanceof HttpEntityEnclosingRequest) {
7888
HttpEntityEnclosingRequest entityRequest = (HttpEntityEnclosingRequest) request;

instrumentation/grpc-1.6/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/grpc/v1_6/client/GrpcClientInterceptor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,16 @@
3030
import io.opentelemetry.javaagent.instrumentation.hypertrace.grpc.v1_6.GrpcSpanDecorator;
3131
import org.hypertrace.agent.core.config.InstrumentationConfig;
3232
import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes;
33+
import org.hypertrace.agent.core.instrumentation.utils.ServiceNameHeaderUtils;
3334
import org.slf4j.Logger;
3435
import org.slf4j.LoggerFactory;
3536

3637
public class GrpcClientInterceptor implements ClientInterceptor {
3738

39+
private static final Metadata.Key<String> SERVICE_NAME_METADATA_KEY =
40+
Metadata.Key.of(
41+
ServiceNameHeaderUtils.getClientServiceKey(), Metadata.ASCII_STRING_MARSHALLER);
42+
3843
private static final Logger log = LoggerFactory.getLogger(GrpcClientInterceptor.class);
3944

4045
@Override
@@ -69,6 +74,9 @@ static final class TracingClientCall<ReqT, RespT>
6974

7075
@Override
7176
public void start(Listener<RespT> responseListener, Metadata headers) {
77+
// Add service name header to outgoing requests
78+
headers.put(SERVICE_NAME_METADATA_KEY, ServiceNameHeaderUtils.getClientServiceName());
79+
7280
super.start(new TracingClientCallListener<>(responseListener, span), headers);
7381

7482
try {

instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_0/client/HttpClientRequestTracingHandler.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.hypertrace.agent.core.instrumentation.utils.ContentLengthUtils;
4141
import org.hypertrace.agent.core.instrumentation.utils.ContentTypeCharsetUtils;
4242
import org.hypertrace.agent.core.instrumentation.utils.ContentTypeUtils;
43+
import org.hypertrace.agent.core.instrumentation.utils.ServiceNameHeaderUtils;
4344

4445
public class HttpClientRequestTracingHandler extends ChannelOutboundHandlerAdapter {
4546

@@ -68,6 +69,13 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) {
6869
headersMap.forEach(span::setAttribute);
6970
}
7071

72+
// Add service name header to outgoing requests
73+
httpRequest
74+
.headers()
75+
.add(
76+
ServiceNameHeaderUtils.getClientServiceKey(),
77+
ServiceNameHeaderUtils.getClientServiceName());
78+
7179
CharSequence contentType = DataCaptureUtils.getContentType(httpRequest);
7280
if (instrumentationConfig.httpBody().request()
7381
&& contentType != null

instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/netty/v4_1/client/HttpClientRequestTracingHandler.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.hypertrace.agent.core.instrumentation.utils.ContentLengthUtils;
4141
import org.hypertrace.agent.core.instrumentation.utils.ContentTypeCharsetUtils;
4242
import org.hypertrace.agent.core.instrumentation.utils.ContentTypeUtils;
43+
import org.hypertrace.agent.core.instrumentation.utils.ServiceNameHeaderUtils;
4344

4445
public class HttpClientRequestTracingHandler extends ChannelOutboundHandlerAdapter {
4546

@@ -67,6 +68,13 @@ public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise prm) {
6768
headersMap.forEach(span::setAttribute);
6869
}
6970

71+
// Add service name header to outgoing requests
72+
httpRequest
73+
.headers()
74+
.add(
75+
ServiceNameHeaderUtils.getClientServiceKey(),
76+
ServiceNameHeaderUtils.getClientServiceName());
77+
7078
CharSequence contentType = DataCaptureUtils.getContentType(httpRequest);
7179
if (instrumentationConfig.httpBody().request()
7280
&& contentType != null

instrumentation/okhttp/okhttp-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/okhttp/v3_0/OkHttpTracingInterceptor.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.hypertrace.agent.core.config.InstrumentationConfig;
3737
import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes;
3838
import org.hypertrace.agent.core.instrumentation.utils.ContentTypeUtils;
39+
import org.hypertrace.agent.core.instrumentation.utils.ServiceNameHeaderUtils;
3940
import org.slf4j.Logger;
4041
import org.slf4j.LoggerFactory;
4142

@@ -57,6 +58,10 @@ public Response intercept(Chain chain) throws IOException {
5758
if (instrumentationConfig.httpHeaders().request()) {
5859
captureHeaders(span, request.headers(), HypertraceSemanticAttributes::httpRequestHeader);
5960
}
61+
62+
// Add service name header to outgoing requests
63+
request = addClientSeriveNameHeader(request);
64+
6065
captureRequestBody(span, request.body());
6166

6267
Response response = chain.proceed(request);
@@ -149,4 +154,16 @@ private static void captureHeaders(
149154
}
150155
}
151156
}
157+
158+
private static Request addClientSeriveNameHeader(Request request) {
159+
// Add service name header to outgoing requests
160+
request =
161+
request
162+
.newBuilder()
163+
.addHeader(
164+
ServiceNameHeaderUtils.getClientServiceKey(),
165+
ServiceNameHeaderUtils.getClientServiceName())
166+
.build();
167+
return request;
168+
}
152169
}

instrumentation/vertx/vertx-web-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/hypertrace/vertx/HttpRequestInstrumentation.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.hypertrace.agent.core.instrumentation.buffer.BoundedBuffersFactory;
4444
import org.hypertrace.agent.core.instrumentation.buffer.BoundedCharArrayWriter;
4545
import org.hypertrace.agent.core.instrumentation.utils.ContentTypeUtils;
46+
import org.hypertrace.agent.core.instrumentation.utils.ServiceNameHeaderUtils;
4647

4748
public class HttpRequestInstrumentation implements TypeInstrumentation {
4849

@@ -93,6 +94,11 @@ public static void enter(@Advice.This HttpClientRequest request) {
9394
return;
9495
}
9596

97+
request
98+
.headers()
99+
.add(
100+
ServiceNameHeaderUtils.getClientServiceKey(),
101+
ServiceNameHeaderUtils.getClientServiceName());
96102
Contexts contexts = VirtualField.find(HttpClientRequest.class, Contexts.class).get(request);
97103
if (contexts == null) {
98104
return;

javaagent-core/src/main/java/org/hypertrace/agent/core/config/InstrumentationConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ public interface InstrumentationConfig {
2727
/** Maximum capture body size in bytes. */
2828
int maxBodySizeBytes();
2929

30+
/** Service name. */
31+
String getServiceName();
32+
3033
/** Data capture for HTTP headers. */
3134
Message httpHeaders();
3235

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright The Hypertrace Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.hypertrace.agent.core.instrumentation.utils;
18+
19+
import org.hypertrace.agent.core.config.InstrumentationConfig;
20+
21+
/** Utility class for adding service name header to outgoing requests (exit calls). */
22+
public class ServiceNameHeaderUtils {
23+
24+
private static final String SERVICE_NAME_HEADER = "ta-client-servicename";
25+
26+
private static final String serviceName =
27+
InstrumentationConfig.ConfigProvider.get().getServiceName();
28+
29+
private ServiceNameHeaderUtils() {}
30+
31+
public static String getClientServiceKey() {
32+
return SERVICE_NAME_HEADER;
33+
}
34+
35+
/**
36+
* Gets the service name from HypertraceConfig.
37+
*
38+
* @return the service name configured in the agent
39+
*/
40+
public static String getClientServiceName() {
41+
return serviceName;
42+
}
43+
}

otel-extensions/src/main/java/org/hypertrace/agent/otel/extensions/config/InstrumentationConfigImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ public int maxBodySizeBytes() {
4646
return agentConfig.getDataCapture().getBodyMaxSizeBytes().getValue();
4747
}
4848

49+
@Override
50+
public String getServiceName() {
51+
return agentConfig.getServiceName().getValue();
52+
}
53+
4954
@Override
5055
public Message httpHeaders() {
5156
return this.httpHeaders;

0 commit comments

Comments
 (0)