Skip to content

Commit c5b6078

Browse files
Merge branch 'master' into alexeyk/unwind-root-cause
# Conflicts: # dd-java-agent/src/main/java/datadog/trace/bootstrap/BootstrapInitializationTelemetry.java # dd-java-agent/src/test/groovy/datadog/trace/bootstrap/BootstrapInitializationTelemetryTest.groovy
2 parents 2956153 + a6af97e commit c5b6078

File tree

14 files changed

+218
-36
lines changed

14 files changed

+218
-36
lines changed

.gitlab/one-pipeline.locked.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# DO NOT EDIT THIS FILE MANUALLY
22
# This file is auto-generated by automation.
33
include:
4-
- remote: https://gitlab-templates.ddbuild.io/libdatadog/one-pipeline/ca/d44e89797a5a47c43cf712193abefe2178a004176606f7e01b77d1ec49a3ef5e/one-pipeline.yml
4+
- remote: https://gitlab-templates.ddbuild.io/libdatadog/one-pipeline/ca/a0486057161f85a77e39ad2aa60ac66bb52414696d9b3dd87177df1057b11295/one-pipeline.yml

dd-java-agent/src/main/java/datadog/trace/bootstrap/BootstrapInitializationTelemetry.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public static final class JsonBased extends BootstrapInitializationTelemetry {
9898

9999
// one way false to true
100100
private volatile boolean incomplete = false;
101+
private volatile boolean error = false;
101102

102103
JsonBased(JsonSender sender) {
103104
this.sender = sender;
@@ -117,10 +118,14 @@ public void initMetaInfo(String attr, String value) {
117118
public void onAbort(String reasonCode) {
118119
onPoint("library_entrypoint.abort", "reason:" + reasonCode);
119120
markIncomplete();
121+
setMetaInfo("abort", mapResultClass(reasonCode), reasonCode);
120122
}
121123

122124
@Override
123125
public void onError(Throwable t) {
126+
error = true;
127+
setMetaInfo("error", "internal_error", t.getMessage());
128+
124129
List<String> causes = new ArrayList<>();
125130

126131
Throwable cause = t.getCause();
@@ -162,7 +167,32 @@ public void onFatalError(Throwable t) {
162167

163168
@Override
164169
public void onError(String reasonCode) {
170+
error = true;
165171
onPoint("library_entrypoint.error", "error_type:" + reasonCode);
172+
setMetaInfo("error", mapResultClass(reasonCode), reasonCode);
173+
}
174+
175+
private void setMetaInfo(String result, String resultClass, String resultReason) {
176+
initMetaInfo("result", result);
177+
initMetaInfo("result_class", resultClass);
178+
initMetaInfo("result_reason", resultReason);
179+
}
180+
181+
private String mapResultClass(String reasonCode) {
182+
if (reasonCode == null) {
183+
return "success";
184+
}
185+
186+
switch (reasonCode) {
187+
case "already_initialized":
188+
return "already_instrumented";
189+
case "other-java-agents":
190+
return "incompatible_library";
191+
case "jdk_tool":
192+
return "unsupported_binary";
193+
default:
194+
return "unknown";
195+
}
166196
}
167197

168198
private void onPoint(String name, String tag) {
@@ -182,6 +212,10 @@ public void markIncomplete() {
182212

183213
@Override
184214
public void finish() {
215+
if (!this.incomplete && !this.error) {
216+
setMetaInfo("success", "success", "Successfully configured ddtrace package");
217+
}
218+
185219
try (JsonWriter writer = new JsonWriter()) {
186220
writer.beginObject();
187221
writer.name("metadata").beginObject();

dd-java-agent/src/main/java6/datadog/trace/bootstrap/AgentPreCheck.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
/** Special lightweight pre-main class that skips installation on incompatible JVMs. */
1313
public class AgentPreCheck {
14+
public static final int MIN_JAVA_VERSION = 8;
15+
1416
public static void premain(final String agentArgs, final Instrumentation inst) {
1517
agentmain(agentArgs, inst);
1618
}
@@ -55,7 +57,11 @@ static void sendTelemetry(String forwarderPath, String javaVersion, String agent
5557
+ "\","
5658
+ "\"tracer_version\":\""
5759
+ agentVersion
58-
+ "\"},"
60+
+ "\","
61+
+ "\"result\":\"abort\","
62+
+ "\"result_class\":\"unknown\","
63+
+ "\"result_reason\":\"incompatible_runtime\""
64+
+ "},"
5965
+ "\"points\":[{"
6066
+ "\"name\":\"library_entrypoint.abort\","
6167
+ "\"tags\":[\"reason:incompatible_runtime\"]"
@@ -87,7 +93,7 @@ private static boolean compatible() {
8793
static boolean compatible(String javaVersion, String javaHome, PrintStream output) {
8894
int majorJavaVersion = parseJavaMajorVersion(javaVersion);
8995

90-
if (majorJavaVersion >= 8) {
96+
if (majorJavaVersion >= MIN_JAVA_VERSION) {
9197
return true;
9298
}
9399

dd-java-agent/src/test/groovy/datadog/trace/bootstrap/AgentPreCheckTest.groovy

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,10 @@ class AgentPreCheckTest extends Specification {
125125
"language_name": "jvm",
126126
"runtime_version": "1.6.0_45",
127127
"language_version": "1.6.0_45",
128-
"tracer_version": "1.50"
128+
"tracer_version": "1.50",
129+
"result": "abort",
130+
"result_class": "unknown",
131+
"result_reason": "incompatible_runtime"
129132
},
130133
"points": [
131134
{

dd-java-agent/src/test/groovy/datadog/trace/bootstrap/BootstrapInitializationTelemetryTest.groovy

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,47 @@ class BootstrapInitializationTelemetryTest extends Specification {
2626
initTelemetryProxy.setAdaptee(initTelemetry)
2727

2828
this.initTelemetry = initTelemetryProxy
29+
this.initTelemetry.initMetaInfo("runtime_name", "java")
30+
this.initTelemetry.initMetaInfo("runtime_version", "1.8.0_382")
2931
this.capture = capture
3032
}
3133

32-
def "real example"() {
34+
def "test success"() {
3335
when:
34-
initTelemetry.initMetaInfo("runtime_name", "java")
35-
initTelemetry.initMetaInfo("runtime_version", "1.8.0_382")
36+
initTelemetry.finish()
3637

38+
then:
39+
capture.json() == json("success", "success", "Successfully configured ddtrace package",
40+
[[name: "library_entrypoint.complete"]])
41+
}
42+
43+
def "real example"() {
44+
when:
3745
initTelemetry.onError(new Exception("foo"))
3846
initTelemetry.finish()
3947

4048
then:
41-
capture.json() == '{"metadata":{"runtime_name":"java","runtime_version":"1.8.0_382"},"points":[{"name":"library_entrypoint.error","tags":["error_type:java.lang.Exception"]},{"name":"library_entrypoint.complete"}]}'
49+
capture.json() == json("error", "internal_error", "foo", [
50+
[name: "library_entrypoint.error", tags: ["error_type:java.lang.Exception"]],
51+
[name: "library_entrypoint.complete"]
52+
])
53+
}
54+
55+
def "test abort"() {
56+
when:
57+
initTelemetry.onAbort(reasonCode)
58+
initTelemetry.finish()
59+
60+
then:
61+
capture.json() == json("abort", resultClass, reasonCode,
62+
[[name: "library_entrypoint.abort", tags: ["reason:${reasonCode}"]]])
63+
64+
where:
65+
reasonCode | resultClass
66+
"jdk_tool" | "unsupported_binary"
67+
"already_initialized" | "already_instrumented"
68+
"other-java-agents" | "incompatible_library"
69+
"foo" | "unknown"
4270
}
4371

4472
def "trivial completion check"() {
@@ -65,6 +93,8 @@ class BootstrapInitializationTelemetryTest extends Specification {
6593

6694
then:
6795
!capture.json().contains("library_entrypoint.complete")
96+
capture.json() == json("error", "internal_error", "foo",
97+
[[name: "library_entrypoint.error", tags: ["error_type:java.lang.Exception"]]])
6898
}
6999

70100
def "incomplete on abort"() {
@@ -88,6 +118,10 @@ class BootstrapInitializationTelemetryTest extends Specification {
88118
capture.json() == '{"metadata":{"runtime_name":"java","runtime_version":"1.8.0_382"},"points":[{"name":"library_entrypoint.error","tags":["error_type:java.io.FileNotFoundException","error_type:java.lang.Exception"]},{"name":"library_entrypoint.complete"}]}'
89119
}
90120

121+
private String json(String result, String resultClass, String resultReason, List points) {
122+
return """{"metadata":{"runtime_name":"java","runtime_version":"1.8.0_382","result":"${result}","result_class":"${resultClass}","result_reason":"${resultReason}"},"points":${new groovy.json.JsonBuilder(points)}}"""
123+
}
124+
91125
static class Capture implements BootstrapInitializationTelemetry.JsonSender {
92126
String json
93127

dd-smoke-tests/dynamic-config/src/test/groovy/datadog/smoketest/AppSecActivationSmokeTest.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package datadog.smoketest
22

33
import datadog.smoketest.dynamicconfig.AppSecApplication
4+
import datadog.trace.test.util.Flaky
45

56
class AppSecActivationSmokeTest extends AbstractSmokeTest {
67

@@ -22,6 +23,7 @@ class AppSecActivationSmokeTest extends AbstractSmokeTest {
2223
processBuilder.directory(new File(buildDirectory))
2324
}
2425

26+
@Flaky
2527
void 'test activation config change is sent via RC'() {
2628
when:
2729
setRemoteConfig('datadog/2/ASM_FEATURES/asm_features_activation/config', '{"asm":{"enabled":true}}')

dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
4141
private static final String JAVAC_PLUGIN_VERSION = Config.get().ciVisibilityCompilerPluginVersion
4242
private static final String JACOCO_PLUGIN_VERSION = Config.get().ciVisibilityJacocoPluginVersion
4343

44-
private static final int DEPENDENCIES_DOWNLOAD_TIMEOUT_SECS = 400
45-
private static final int PROCESS_TIMEOUT_SECS = 120
44+
private static final int DEPENDENCIES_DOWNLOAD_TIMEOUT_SECS = 120
45+
private static final int PROCESS_TIMEOUT_SECS = 60
4646

4747
private static final int DEPENDENCIES_DOWNLOAD_RETRIES = 5
4848

@@ -293,9 +293,13 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
293293
private void retryUntilSuccessfulOrNoAttemptsLeft(List<String> mvnCommand, Map<String, String> additionalEnvVars = [:]) {
294294
def processBuilder = createProcessBuilder(mvnCommand, false, false, [], additionalEnvVars)
295295
for (int attempt = 0; attempt < DEPENDENCIES_DOWNLOAD_RETRIES; attempt++) {
296-
def exitCode = runProcess(processBuilder.start(), DEPENDENCIES_DOWNLOAD_TIMEOUT_SECS)
297-
if (exitCode == 0) {
298-
return
296+
try {
297+
def exitCode = runProcess(processBuilder.start(), DEPENDENCIES_DOWNLOAD_TIMEOUT_SECS)
298+
if (exitCode == 0) {
299+
return
300+
}
301+
} catch (TimeoutException e) {
302+
LOGGER.warn("Failed dependency resolution with exception: ", e)
299303
}
300304
}
301305
throw new AssertionError((Object) "Tried $DEPENDENCIES_DOWNLOAD_RETRIES times to execute $mvnCommand and failed")

dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public final class GeneralConfig {
6262
public static final String HEALTH_METRICS_STATSD_PORT = "trace.health.metrics.statsd.port";
6363
public static final String PERF_METRICS_ENABLED = "trace.perf.metrics.enabled";
6464

65+
public static final String TRACE_STATS_COMPUTATION_ENABLED = "trace.stats.computation.enabled";
6566
public static final String TRACER_METRICS_ENABLED = "trace.tracer.metrics.enabled";
6667
public static final String TRACER_METRICS_BUFFERING_ENABLED =
6768
"trace.tracer.metrics.buffering.enabled";

dd-trace-core/src/main/java/datadog/trace/common/writer/RemoteMapper.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ public interface RemoteMapper extends Mapper<List<? extends CoreSpan<?>>> {
1414

1515
RemoteMapper NO_OP = new NoopRemoteMapper();
1616

17-
byte[] RUNTIME_ID = DDTags.RUNTIME_ID_TAG.getBytes(UTF_8);
18-
byte[] LANGUAGE = DDTags.LANGUAGE_TAG_KEY.getBytes(UTF_8);
19-
20-
byte[] SERVICE = "service".getBytes(UTF_8);
21-
byte[] NAME = "name".getBytes(UTF_8);
22-
byte[] RESOURCE = "resource".getBytes(UTF_8);
23-
byte[] TRACE_ID = "trace_id".getBytes(UTF_8);
24-
byte[] SPAN_ID = "span_id".getBytes(UTF_8);
25-
byte[] PARENT_ID = "parent_id".getBytes(UTF_8);
26-
byte[] START = "start".getBytes(UTF_8);
27-
byte[] DURATION = "duration".getBytes(UTF_8);
28-
byte[] TYPE = "type".getBytes(UTF_8);
29-
byte[] ERROR = "error".getBytes(UTF_8);
30-
byte[] METRICS = "metrics".getBytes(UTF_8);
31-
byte[] META = "meta".getBytes(UTF_8);
17+
static final byte[] RUNTIME_ID = DDTags.RUNTIME_ID_TAG.getBytes(UTF_8);
18+
static final byte[] LANGUAGE = DDTags.LANGUAGE_TAG_KEY.getBytes(UTF_8);
19+
20+
static final byte[] SERVICE = "service".getBytes(UTF_8);
21+
static final byte[] NAME = "name".getBytes(UTF_8);
22+
static final byte[] RESOURCE = "resource".getBytes(UTF_8);
23+
static final byte[] TRACE_ID = "trace_id".getBytes(UTF_8);
24+
static final byte[] SPAN_ID = "span_id".getBytes(UTF_8);
25+
static final byte[] PARENT_ID = "parent_id".getBytes(UTF_8);
26+
static final byte[] START = "start".getBytes(UTF_8);
27+
static final byte[] DURATION = "duration".getBytes(UTF_8);
28+
static final byte[] TYPE = "type".getBytes(UTF_8);
29+
static final byte[] ERROR = "error".getBytes(UTF_8);
30+
static final byte[] METRICS = "metrics".getBytes(UTF_8);
31+
static final byte[] META = "meta".getBytes(UTF_8);
3232

3333
UTF8BytesString HTTP_STATUS = UTF8BytesString.create(Tags.HTTP_STATUS);
3434

dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/TraceMapper.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@
66
import datadog.trace.core.DDSpanContext;
77

88
public interface TraceMapper extends RemoteMapper {
9-
10-
UTF8BytesString THREAD_NAME = UTF8BytesString.create(DDTags.THREAD_NAME);
11-
UTF8BytesString THREAD_ID = UTF8BytesString.create(DDTags.THREAD_ID);
12-
UTF8BytesString SAMPLING_PRIORITY_KEY =
9+
static final UTF8BytesString THREAD_NAME = UTF8BytesString.create(DDTags.THREAD_NAME);
10+
static final UTF8BytesString THREAD_ID = UTF8BytesString.create(DDTags.THREAD_ID);
11+
static final UTF8BytesString SAMPLING_PRIORITY_KEY =
1312
UTF8BytesString.create(DDSpanContext.PRIORITY_SAMPLING_KEY);
14-
UTF8BytesString ORIGIN_KEY = UTF8BytesString.create(DDTags.ORIGIN_KEY);
15-
UTF8BytesString PROCESS_TAGS_KEY = UTF8BytesString.create(DDTags.PROCESS_TAGS);
13+
static final UTF8BytesString ORIGIN_KEY = UTF8BytesString.create(DDTags.ORIGIN_KEY);
14+
static final UTF8BytesString PROCESS_TAGS_KEY = UTF8BytesString.create(DDTags.PROCESS_TAGS);
1615
}

0 commit comments

Comments
 (0)