Skip to content

Commit 3024868

Browse files
authored
Capture enduser.id in servlet instrumentation (#6225)
* Capture enduser.id in servlet instrumentation * delete TomcatAdditionalAttributesExtractor * spotless * spotless
1 parent 72e0b26 commit 3024868

File tree

6 files changed

+46
-67
lines changed

6 files changed

+46
-67
lines changed

instrumentation/grizzly-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grizzly/GrizzlySingletons.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ public final class GrizzlySingletons {
3636
.addOperationMetrics(HttpServerMetrics.get())
3737
.addContextCustomizer(
3838
(context, request, attributes) ->
39-
new AppServerBridge.Builder().recordException().init(context))
39+
new AppServerBridge.Builder()
40+
.captureServletAttributes()
41+
.recordException()
42+
.init(context))
4043
.addContextCustomizer(
4144
(context, httpRequestPacket, startAttributes) -> GrizzlyErrorHolder.init(context))
4245
.addContextCustomizer(HttpRouteHolder.get())

instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/BaseServletHelper.java

+39-6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge;
1818
import io.opentelemetry.javaagent.bootstrap.servlet.MappingResolver;
1919
import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath;
20+
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
21+
import java.security.Principal;
2022
import java.util.function.Function;
2123

2224
public abstract class BaseServletHelper<REQUEST, RESPONSE> {
@@ -92,25 +94,56 @@ public Context updateContext(
9294
}
9395

9496
/**
95-
* Capture servlet request parameters as span attributes when SERVER span is not create by servlet
97+
* Capture servlet specific span attributes when SERVER span is not create by servlet
9698
* instrumentation.
97-
*
98-
* <p>When SERVER span is created by servlet instrumentation we register {@link
99-
* ServletRequestParametersExtractor} as an attribute extractor. When SERVER span is not created
100-
* by servlet instrumentation we call this method on exit from the last servlet or filter.
10199
*/
102100
public void captureServletAttributes(Context context, REQUEST request) {
103-
if (parameterExtractor == null || !AppServerBridge.captureServletAttributes(context)) {
101+
if (!AppServerBridge.captureServletAttributes(context)) {
104102
return;
105103
}
106104
Span serverSpan = LocalRootSpan.fromContextOrNull(context);
107105
if (serverSpan == null) {
108106
return;
109107
}
110108

109+
captureRequestParameters(serverSpan, request);
110+
captureEnduserId(serverSpan, request);
111+
}
112+
113+
/**
114+
* Capture servlet request parameters as span attributes when SERVER span is not create by servlet
115+
* instrumentation.
116+
*
117+
* <p>When SERVER span is created by servlet instrumentation we register {@link
118+
* ServletRequestParametersExtractor} as an attribute extractor. When SERVER span is not created
119+
* by servlet instrumentation we call this method on exit from the last servlet or filter.
120+
*/
121+
private void captureRequestParameters(Span serverSpan, REQUEST request) {
122+
if (parameterExtractor == null) {
123+
return;
124+
}
125+
111126
parameterExtractor.setAttributes(request, (key, value) -> serverSpan.setAttribute(key, value));
112127
}
113128

129+
/**
130+
* Capture {@link SemanticAttributes#ENDUSER_ID} as span attributes when SERVER span is not create
131+
* by servlet instrumentation.
132+
*
133+
* <p>When SERVER span is created by servlet instrumentation we register {@link
134+
* ServletAdditionalAttributesExtractor} as an attribute extractor. When SERVER span is not
135+
* created by servlet instrumentation we call this method on exit from the last servlet or filter.
136+
*/
137+
private void captureEnduserId(Span serverSpan, REQUEST request) {
138+
Principal principal = accessor.getRequestUserPrincipal(request);
139+
if (principal != null) {
140+
String name = principal.getName();
141+
if (name != null) {
142+
serverSpan.setAttribute(SemanticAttributes.ENDUSER_ID, name);
143+
}
144+
}
145+
}
146+
114147
/*
115148
Given request already has a context associated with it.
116149
As there should not be nested spans of kind SERVER, we should NOT create a new span here.

instrumentation/tomcat/tomcat-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/Tomcat10Singletons.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
public final class Tomcat10Singletons {
1919
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.tomcat-10.0";
2020
private static final Instrumenter<Request, Response> INSTRUMENTER =
21-
TomcatInstrumenterFactory.create(
22-
INSTRUMENTATION_NAME, Servlet5Accessor.INSTANCE, Tomcat10ServletEntityProvider.INSTANCE);
21+
TomcatInstrumenterFactory.create(INSTRUMENTATION_NAME, Servlet5Accessor.INSTANCE);
2322
private static final TomcatHelper<HttpServletRequest, HttpServletResponse> HELPER =
2423
new TomcatHelper<>(
2524
INSTRUMENTER, Tomcat10ServletEntityProvider.INSTANCE, Servlet5Singletons.helper());

instrumentation/tomcat/tomcat-7.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/Tomcat7Singletons.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@
1818
public final class Tomcat7Singletons {
1919
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.tomcat-7.0";
2020
private static final Instrumenter<Request, Response> INSTRUMENTER =
21-
TomcatInstrumenterFactory.create(
22-
INSTRUMENTATION_NAME, Servlet3Accessor.INSTANCE, Tomcat7ServletEntityProvider.INSTANCE);
21+
TomcatInstrumenterFactory.create(INSTRUMENTATION_NAME, Servlet3Accessor.INSTANCE);
2322
private static final TomcatHelper<HttpServletRequest, HttpServletResponse> HELPER =
2423
new TomcatHelper<>(
2524
INSTRUMENTER, Tomcat7ServletEntityProvider.INSTANCE, Servlet3Singletons.helper());

instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatAdditionalAttributesExtractor.java

-49
This file was deleted.

instrumentation/tomcat/tomcat-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/tomcat/common/TomcatInstrumenterFactory.java

+1-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package io.opentelemetry.javaagent.instrumentation.tomcat.common;
77

88
import io.opentelemetry.api.GlobalOpenTelemetry;
9-
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
109
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1110
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder;
1211
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerAttributesExtractor;
@@ -25,13 +24,9 @@ public final class TomcatInstrumenterFactory {
2524
private TomcatInstrumenterFactory() {}
2625

2726
public static <REQUEST, RESPONSE> Instrumenter<Request, Response> create(
28-
String instrumentationName,
29-
ServletAccessor<REQUEST, RESPONSE> accessor,
30-
TomcatServletEntityProvider<REQUEST, RESPONSE> servletEntityProvider) {
27+
String instrumentationName, ServletAccessor<REQUEST, RESPONSE> accessor) {
3128
TomcatHttpAttributesGetter httpAttributesGetter = new TomcatHttpAttributesGetter();
3229
TomcatNetAttributesGetter netAttributesGetter = new TomcatNetAttributesGetter();
33-
AttributesExtractor<Request, Response> additionalAttributeExtractor =
34-
new TomcatAdditionalAttributesExtractor<>(accessor, servletEntityProvider);
3530

3631
return Instrumenter.<Request, Response>builder(
3732
GlobalOpenTelemetry.get(),
@@ -41,7 +36,6 @@ public static <REQUEST, RESPONSE> Instrumenter<Request, Response> create(
4136
.setErrorCauseExtractor(new ServletErrorCauseExtractor<>(accessor))
4237
.addAttributesExtractor(HttpServerAttributesExtractor.create(httpAttributesGetter))
4338
.addAttributesExtractor(NetServerAttributesExtractor.create(netAttributesGetter))
44-
.addAttributesExtractor(additionalAttributeExtractor)
4539
.addContextCustomizer(HttpRouteHolder.get())
4640
.addContextCustomizer(
4741
(context, request, attributes) ->

0 commit comments

Comments
 (0)