8000 Surface server name process tag for tomcat · DataDog/dd-trace-java@2a759f7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2a759f7

Browse files
committed
Surface server name process tag for tomcat
1 parent db037c4 commit 2a759f7

File tree

6 files changed

+114
-5
lines changed

6 files changed

+114
-5
lines changed

dd-java-agent/instrumentation/tomcat-5.5/src/latestDepTest/groovy/TomcatServer.groovy

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import com.google.common.io.Files
2-
import datadog.trace.agent.test.base.HttpServer
32
import datadog.trace.agent.test.base.WebsocketServer
3+
import datadog.trace.api.Config
4+
import datadog.trace.api.Process 10000 Tags
5+
import datadog.trace.util.TraceUtils
46
import jakarta.servlet.ServletContextEvent
57
import jakarta.servlet.ServletContextListener
68
import jakarta.websocket.Session
@@ -62,6 +64,12 @@ class TomcatServer implements WebsocketServer {
6264
server.start()
6365
port = server.service.findConnectors()[0].localPort
6466
assert port > 0
67+
if (Config.get().isExperimentalPropagateProcessTagsEnabled()) {
68+
def serverName = TraceUtils.normalizeTag(server.getEngine().getName())
69+
assert ProcessTags.getTagsAsStringList().containsAll(["server.type:tomcat", "server.name:" + serverName])
70+
} else {
71+
assert ProcessTags.getTagsAsStringList() == null
72+
}
6573
}
6674

6775
@Override

dd-java-agent/instrumentation/tomcat-5.5/src/latestDepTest/groovy/TomcatServletTest.groovy

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import datadog.trace.api.ProcessTags
2+
13
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.WEBSOCKET
24

35
import datadog.trace.agent.test.base.HttpServer
@@ -21,6 +23,7 @@ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.CUSTOM
2123
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.EXCEPTION
2224
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS
2325
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT_ERROR
26+
import static datadog.trace.api.config.GeneralConfig.EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED
2427
import static org.junit.Assume.assumeTrue
2528

2629
class TomcatServletTest extends AbstractServletTest<Tomcat, Context> {
@@ -66,6 +69,22 @@ class TomcatServletTest extends AbstractServletTest<Tomcat, Context> {
6669
true
6770
}
6871

72+
boolean testProcessTags() {
73+
false
74+
}
75+
76+
@Override
77+
protected void configurePreAgent() {
78+
super.configurePreAgent()
79+
injectSysConfig(EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, "${testProcessTags()}")
80+
ProcessTags.reset()
81+
}
82+
83+
def cleanupSpec() {
84+
injectSysConfig(EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, "false")
85+
ProcessTags.reset()
86+
}
87+
6988
@Override
7089
Map<String, Serializable> expectedExtraErrorInformation(ServerEndpoint endpoint) {
7190
if (endpoint.throwsException) {
@@ -267,6 +286,11 @@ class TomcatServletEnvEntriesTagTest extends TomcatServletTest {
267286
boolean testWebsockets() {
268287
false
269288
}
289+
290+
@Override
291+
boolean testProcessTags() {
292+
true
293+
}
270294
}
271295

272296

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package datadog.trace.instrumentation.tomcat;
2+
3+
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
4+
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
5+
6+
import com.google.auto.service.AutoService;
7+
import datadog.trace.agent.tooling.Instrumenter;
8+
import datadog.trace.agent.tooling.InstrumenterModule;
9+
import datadog.trace.api.ProcessTags;
10+
import net.bytebuddy.asm.Advice;
11+
import net.bytebuddy.implementation.bytecode.assign.Assigner;
12+
import org.apache.catalina.core.ContainerBase;
13+
import org.apache.catalina.core.StandardEngine;
14+
15+
@AutoService(InstrumenterModule.class)
16+
public class ContainerBaseInstrumentation extends InstrumenterModule.Tracing
17+
implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice {
18+
public ContainerBaseInstrumentation() {
19+
super("tomcat");
20+
}
21+
22+
@Override
23+
public String instrumentedType() {
24+
return "org.apache.catalina.core.ContainerBase";
25+
}
26+
27+
@Override
28+
public void methodAdvice(MethodTransformer transformer) {
29+
transformer.applyAdvice(
30+
isMethod().and(named("setName")), getClass().getName() + "$SetNameAdvice");
31+
}
32+
33+
public static class SetNameAdvice {
34+
@Advice.OnMethodExit(suppress = Throwable.class)
35+
public static void afterSetName(
36+
@Advice.This(typing = Assigner.Typing.DYNAMIC) final ContainerBase engine) {
37+
if (engine instanceof StandardEngine) {
38+
String engineName = engine.getName();
39+
if (engineName != null) {
40+
ProcessTags.addTag(ProcessTags.SERVER_NAME, engineName);
41+
ProcessTags.addTag(ProcessTags.SERVER_TYPE, "tomcat");
42+
}
43+
}
44+
}
45+
}
46+
}

dd-java-agent/instrumentation/tomcat-5.5/src/test/groovy/TomcatServletTest.groovy

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import datadog.trace.api.ProcessTags
2+
13
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.CUSTOM_EXCEPTION
24
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.ERROR
35
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.EXCEPTION
46
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND
57
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.REDIRECT
68
import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT_ERROR
9+
import static datadog.trace.api.config.GeneralConfig.EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED
710
import static org.junit.Assume.assumeTrue
811

912
import com.google.common.io.Files
@@ -85,6 +88,11 @@ abstract class TomcatServletTest extends AbstractServletTest<Embedded, Context>
8588
server.start()
8689
port = ((server.connectors[0] as Connector).protocolHandler as Http11BaseProtocol).ep.serverSocket.localPort
8790
assert port > 0
91+
if (testProcessTags()) {
92+
assert ProcessTags.getTagsAsStringList().containsAll(["server.type:tomcat", "server.name:test"])
93+
} else {
94+
assert ProcessTags.getTagsAsStringList() == null
95+
}
8896
}
8997

9098
@Override
@@ -172,6 +180,22 @@ abstract class TomcatServletTest extends AbstractServletTest<Embedded, Context>
172180
true
173181
}
174182

183+
184+
boolean testProcessTags() {
185+
false
186+
}
187+
188+
@Override
189+
protected void configurePreAgent() {
190+
super.configurePreAgent()
191+
injectSysConfig(EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, "${testProcessTags()}")
192+
}
193+
194+
def cleanupSpec() {
195+
injectSysConfig(EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, "false")
196+
ProcessTags.reset()
197+
}
198+
175199
boolean hasResponseSpan(ServerEndpoint endpoint) {
176200
def responseSpans = [REDIRECT, NOT_FOUND, ERROR, EXCEPTION, CUSTOM_EXCEPTION]
177201
return responseSpans.contains(endpoint)
@@ -316,4 +340,8 @@ class TomcatServletV0Test extends TomcatServletTest implements TestingGenericHtt
316340

317341
class TomcatServletV1ForkedTest extends TomcatServletTest implements TestingGenericHttpNamingConventions.ServerV1 {
318342

343+
@Override
344+
boolean testProcessTags() {
345+
true
346+
}
319347
}

internal-api/src/main/java/datadog/trace/api/ProcessTags.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class ProcessTags {
2121
private static boolean enabled = Config.get().isExperimentalPropagateProcessTagsEnabled();
2222
public static final String CLUSTER_NAME = "cluster.name";
2323
public static final String SERVER_NAME = "server.name";
24+
public static final String SERVER_TYPE = "server.type";
2425
public static final String ENTRYPOINT_NAME = "entrypoint.name";
2526
public static final String ENTRYPOINT_BASEDIR = "entrypoint.basedir";
2627
public static final String ENTRYPOINT_WORKDIR = "entrypoint.workdir";
@@ -130,6 +131,7 @@ private static boolean fillJbossTags(Map<String, String> tags) {
130131
tags, maybeGetSystemProperty("jboss.home.dir"), "jboss.home")) {
131132
insertTagFromSysPropIfPresent(tags, "jboss.server.name", SERVER_NAME);
132133
tags.put("jboss.mode", hasSystemProperty("[Standalone]") ? "standalone" : "domain");
134+
tags.put(SERVER_TYPE, "jboss");
133135
return true;
134136
}
135137
return false;
@@ -138,6 +140,7 @@ tags, maybeGetSystemProperty("jboss.home.dir"), "jboss.home")) {
138140
private static boolean fillWebsphereTags(Map<String, String> tags) {
139141
if (insertTagFromEnvIfPresent(tags, "WAS_CELL", CLUSTER_NAME)) {
140142
insertTagFromEnvIfPresent(tags, "SERVER_NAME", SERVER_NAME);
143+
tags.put(SERVER_TYPE, "websphere");
141144
return true;
142145
}
143146
return false;

internal-api/src/test/groovy/datadog/trace/api/ProcessTagsForkedTest.groovy

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ class ProcessTagsForkedTest extends DDSpecification {
5656
System.clearProperty("jboss.server.name")
5757
where:
5858
jbossHome | mode | serverName | expected
59-
"/opt/jboss/myserver" | "[Standalone]" | "standalone" | "entrypoint.basedir:somewhere,entrypoint.name:jboss-modules,entrypoint.type:jar,entrypoint.workdir:.+,jboss.home:myserver,jboss.mode:standalone,server.name:standalone"
60-
"/opt/jboss/myserver" | "[server1:12345]" | "server1" | "entrypoint.basedir:somewhere,entrypoint.name:jboss-modules,entrypoint.type:jar,entrypoint.workdir:.+,jboss.home:myserver,jboss.mode:domain,server.name:server1"
59+
"/opt/jboss/myserver" | "[Standalone]" | "standalone" | "entrypoint.basedir:somewhere,entrypoint.name:jboss-modules,entrypoint.type:jar,entrypoint.workdir:.+,jboss.home:myserver,jboss.mode:standalone,server.name:standalone,server.type:jboss"
60+
"/opt/jboss/myserver" | "[server1:12345]" | "server1" | "entrypoint.basedir:somewhere,entrypoint.name:jboss-modules,entrypoint.type:jar,entrypoint.workdir:.+,jboss.home:myserver,jboss.mode:domain,server.name:server1,server.type:jboss"
6161
null | "[Standalone]" | "standalone" | "entrypoint.basedir:somewhere,entrypoint.name:jboss-modules,entrypoint.type:jar,entrypoint.workdir:[^,]+" // don't expect jboss tags since home is missing
6262
}
6363

@@ -84,8 +84,8 @@ class ProcessTagsForkedTest extends DDSpecification {
8484
ProcessTags.reset()
8585
where:
8686
cellName | serverName | expected
87-
"cell1" | "server1" | "cluster.name:cell1,.+,server.name:server1.*"
88-
null | "server1" | "^((?!cluster.name|server.name).)*\$"
87+
"cell1" | "server1" | "cluster.name:cell1,.+,server.name:server1,server.type:websphere.*"
88+
null | "server1" | "^((?!cluster.name|server.name|server.type).)*\$"
8989
}
9090
9191
def 'should not calculate process tags by default'() {

0 commit comments

Comments
 (0)
0