Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ public static final class JsonBased extends BootstrapInitializationTelemetry {

// one way false to true
private volatile boolean incomplete = false;
private volatile boolean error = false;

JsonBased(JsonSender sender) {
this.sender = sender;
Expand All @@ -111,11 +112,14 @@ public void initMetaInfo(String attr, String value) {
public void onAbort(String reasonCode) {
onPoint("library_entrypoint.abort", "reason:" + reasonCode);
markIncomplete();
setMetaInfo("abort", mapResultClass(reasonCode), reasonCode);
}

@Override
public void onError(Throwable t) {
error = true;
onPoint("library_entrypoint.error", "error_type:" + t.getClass().getName());
setMetaInfo("error", "internal_error", t.getMessage());
}

@Override
Expand All @@ -126,7 +130,32 @@ public void onFatalError(Throwable t) {

@Override
public void onError(String reasonCode) {
error = true;
onPoint("library_entrypoint.error", "error_type:" + reasonCode);
setMetaInfo("error", mapResultClass(reasonCode), reasonCode);
}

private void setMetaInfo(String result, String resultClass, String resultReason) {
initMetaInfo("result", result);
initMetaInfo("result_class", resultClass);
initMetaInfo("result_reason", resultReason);
}

private String mapResultClass(String reasonCode) {
if (reasonCode == null) {
return "success";
}

switch (reasonCode) {
case "already_initialized":
return "already_instrumented";
case "other-java-agents":
return "incompatible_library";
case "jdk_tool":
return "unsupported_binary";
default:
return "unknown";
}
}

private void onPoint(String name, String tag) {
Expand All @@ -143,6 +172,10 @@ public void markIncomplete() {

@Override
public void finish() {
if (!this.incomplete && !this.error) {
setMetaInfo("success", "success", "Successfully configured ddtrace package");
}

try (JsonWriter writer = new JsonWriter()) {
writer.beginObject();
writer.name("metadata").beginObject();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

/** Special lightweight pre-main class that skips installation on incompatible JVMs. */
public class AgentPreCheck {
public static final int MIN_JAVA_VERSION = 8;

public static void premain(final String agentArgs, final Instrumentation inst) {
agentmain(agentArgs, inst);
}
Expand Down Expand Up @@ -55,7 +57,11 @@ static void sendTelemetry(String forwarderPath, String javaVersion, String agent
+ "\","
+ "\"tracer_version\":\""
+ agentVersion
+ "\"},"
+ "\","
+ "\"result\":\"abort\","
+ "\"result_class\":\"unknown\","
+ "\"result_reason\":\"incompatible_runtime\""
+ "},"
+ "\"points\":[{"
+ "\"name\":\"library_entrypoint.abort\","
+ "\"tags\":[\"reason:incompatible_runtime\"]"
Expand Down Expand Up @@ -87,7 +93,7 @@ private static boolean compatible() {
static boolean compatible(String javaVersion, String javaHome, PrintStream output) {
int majorJavaVersion = parseJavaMajorVersion(javaVersion);

if (majorJavaVersion >= 8) {
if (majorJavaVersion >= MIN_JAVA_VERSION) {
return true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,10 @@ class AgentPreCheckTest extends Specification {
"language_name": "jvm",
"runtime_version": "1.6.0_45",
"language_version": "1.6.0_45",
"tracer_version": "1.50"
"tracer_version": "1.50",
"result": "abort",
"result_class": "unknown",
"result_reason": "incompatible_runtime"
},
"points": [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,47 @@ class BootstrapInitializationTelemetryTest extends Specification {
initTelemetryProxy.setAdaptee(initTelemetry)

this.initTelemetry = initTelemetryProxy
this.initTelemetry.initMetaInfo("runtime_name", "java")
this.initTelemetry.initMetaInfo("runtime_version", "1.8.0_382")
this.capture = capture
}

def "real example"() {
def "test success"() {
when:
initTelemetry.initMetaInfo("runtime_name", "java")
initTelemetry.initMetaInfo("runtime_version", "1.8.0_382")
initTelemetry.finish()

then:
capture.json() == json("success", "success", "Successfully configured ddtrace package",
[[name: "library_entrypoint.complete"]])
}

def "real example"() {
when:
initTelemetry.onError(new Exception("foo"))
initTelemetry.finish()

then:
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"}]}'
capture.json() == json("error", "internal_error", "foo", [
[name: "library_entrypoint.error", tags: ["error_type:java.lang.Exception"]],
[name: "library_entrypoint.complete"]
])
}

def "test abort"() {
when:
initTelemetry.onAbort(reasonCode)
initTelemetry.finish()

then:
capture.json() == json("abort", resultClass, reasonCode,
[[name: "library_entrypoint.abort", tags: ["reason:${reasonCode}"]]])

where:
reasonCode | resultClass
"jdk_tool" | "unsupported_binary"
"already_initialized" | "already_instrumented"
"other-java-agents" | "incompatible_library"
"foo" | "unknown"
}

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

then:
!capture.json().contains("library_entrypoint.complete")
capture.json() == json("error", "internal_error", "foo",
[[name: "library_entrypoint.error", tags: ["error_type:java.lang.Exception"]]])
}

def "incomplete on abort"() {
Expand All @@ -76,6 +106,10 @@ class BootstrapInitializationTelemetryTest extends Specification {
!capture.json().contains("library_entrypoint.complete")
}

private String json(String result, String resultClass, String resultReason, List points) {
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)}}"""
}

static class Capture implements BootstrapInitializationTelemetry.JsonSender {
String json

Expand Down