Skip to content

Commit 3a38cd6

Browse files
committed
Override tracing preferred service name and pin to dynamic config
1 parent 0869a9d commit 3a38cd6

File tree

3 files changed

+57
-8
lines changed

3 files changed

+57
-8
lines changed

dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1533,7 +1533,7 @@ private DDSpanContext buildSpanContext() {
15331533
serviceName = rootSpan != null ? rootSpan.getServiceName() : null;
15341534
}
15351535
if (serviceName == null) {
1536-
serviceName = CoreTracer.this.serviceName;
1536+
serviceName = captureTraceConfig().defaultServiceName;
15371537
}
15381538

15391539
final CharSequence operationName =
@@ -1611,6 +1611,7 @@ public void run() {
16111611

16121612
protected class ConfigSnapshot extends DynamicConfig.Snapshot {
16131613
final Sampler sampler;
1614+
final String defaultServiceName;
16141615

16151616
protected ConfigSnapshot(
16161617
DynamicConfig<ConfigSnapshot>.Builder builder, ConfigSnapshot oldSnapshot) {
@@ -1623,6 +1624,12 @@ protected ConfigSnapshot(
16231624
} else {
16241625
sampler = Sampler.Builder.forConfig(CoreTracer.this.initialConfig, this);
16251626
}
1627+
final String preferredName = SpanNaming.instance().localRoot().getPreferredServiceName();
1628+
if (preferredName != null) {
1629+
this.defaultServiceName = preferredName;
1630+
} else {
1631+
this.defaultServiceName = CoreTracer.this.serviceName;
1632+
}
16261633
}
16271634
}
16281635
}

internal-api/src/main/java/datadog/trace/api/naming/SpanNaming.java

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import datadog.trace.api.naming.v0.NamingSchemaV0;
55
import datadog.trace.api.naming.v1.NamingSchemaV1;
66
import javax.annotation.Nonnull;
7+
import javax.annotation.Nullable;
78

89
/** This is the main entry point to drive span naming decisions. */
910
public class SpanNaming {
@@ -14,21 +15,38 @@ private static class Singleton {
1415
private static SpanNaming INSTANCE = new SpanNaming();
1516
}
1617

18+
public static class ForLocalRoot {
19+
private final boolean mutable;
20+
private volatile String preferredServiceName;
21+
22+
public ForLocalRoot(final Config config) {
23+
this.mutable = !config.isServiceNameSetByUser();
24+
}
25+
26+
@Nullable
27+
public String getPreferredServiceName() {
28+
return preferredServiceName;
29+
}
30+
31+
public boolean maybeOverrideServiceName(final String serviceName) {
32+
if (mutable) {
33+
preferredServiceName = serviceName;
34+
}
35+
return mutable;
36+
}
37+
}
38+
1739
public static SpanNaming instance() {
1840
return Singleton.INSTANCE;
1941
}
2042

2143
private final NamingSchema namingSchema;
2244
private final int version;
2345

24-
// Choice of version will be driven by a configuration parameter when all the instrumentations'
25-
// naming will be addressed
26-
private SpanNaming() {
27-
this(Config.get().getSpanAttributeSchemaVersion());
28-
}
46+
private final ForLocalRoot localRootNaming;
2947

30-
private SpanNaming(final int version) {
31-
this.version = version;
48+
private SpanNaming() {
49+
this.version = Config.get().getSpanAttributeSchemaVersion();
3250
switch (version) {
3351
case 1:
3452
namingSchema = new NamingSchemaV1();
@@ -37,13 +55,19 @@ private SpanNaming(final int version) {
3755
namingSchema = new NamingSchemaV0();
3856
break;
3957
}
58+
this.localRootNaming = new ForLocalRoot(Config.get());
4059
}
4160

4261
@Nonnull
4362
public NamingSchema namingSchema() {
4463
return namingSchema;
4564
}
4665

66+
@Nonnull
67+
public ForLocalRoot localRoot() {
68+
return localRootNaming;
69+
}
70+
4771
public int version() {
4872
return version;
4973
}

internal-api/src/test/groovy/datadog/trace/api/naming/NamingV0ForkedTest.groovy

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.api.naming
22

3+
import datadog.trace.api.Config
34
import datadog.trace.api.config.GeneralConfig
45
import datadog.trace.api.config.TracerConfig
56
import datadog.trace.test.util.DDSpecification
@@ -23,4 +24,21 @@ class NamingV0ForkedTest extends DDSpecification {
2324
assert schema.cache().service("anything") == null
2425
assert schema.cloud().serviceForRequest("any", "anything") == null
2526
}
27+
28+
def "test local root service name override"() {
29+
setup:
30+
if (ddService != null) {
31+
injectSysConfig("dd.service", ddService)
32+
}
33+
def instance = new SpanNaming.ForLocalRoot(Config.get())
34+
when:
35+
def overridden = instance.maybeOverrideServiceName("some")
36+
then:
37+
overridden == bool
38+
instance.getPreferredServiceName() == expected
39+
where:
40+
ddService | expected | bool
41+
null | "some" | true
42+
"thing" | null | false
43+
}
2644
}

0 commit comments

Comments
 (0)