Skip to content

Commit

Permalink
Pulling out annotations via mbean WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
MattAlp committed Jun 20, 2024
1 parent bd8d687 commit bd304f9
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,18 @@

import com.datadog.profiling.controller.openjdk.OpenJdkController;
import datadog.trace.bootstrap.instrumentation.jfr.JfrHelper;
import de.thetaphi.forbiddenapis.SuppressForbidden;
import java.io.File;
import java.io.FileNotFoundException;
import java.lang.management.ManagementFactory;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import jdk.jfr.Category;
import jdk.jfr.Description;
import jdk.jfr.Enabled;
Expand All @@ -26,6 +34,7 @@
@StackTrace(false)
public class SmapEntryEvent extends Event {
private static final AtomicBoolean registered = new AtomicBoolean(false);
private static boolean annotatedMapsAvailable;
private static final Logger log = LoggerFactory.getLogger(OpenJdkController.class);
private static final String VSYSCALL_START_ADDRESS = "ffffffffff600000";

Expand Down Expand Up @@ -206,6 +215,45 @@ public SmapEntryEvent(
this.encounteredForeignKeys = encounteredForeignKeys;
}

private static HashMap<String, String> getRegionAnnotations() {
if (annotatedMapsAvailable) {
try {
ObjectName objectName = new ObjectName("com.sun.management:type=DiagnosticCommand");
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

String[] emptyStringArgs = {};
Object[] dcmdArgs = {emptyStringArgs};
String[] signature = {String[].class.getName()};

String[] lines =
((String) mbs.invoke(objectName, "systemMap", dcmdArgs, signature)).split("\n");
HashMap<String, String> annotatedRegions = new HashMap<>();
Pattern pattern =
Pattern.compile(
"([0-9a-fA-Fx]+)\\s+-\\s+([0-9a-fA-Fx]+)\\s+(\\d+)\\s+(\\S+)\\s+(\\S+)(?:\\s+(.*))?");

for (String line : lines) {
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
String startAddress = matcher.group(1);
String description = matcher.group(6);
if (description.isEmpty()) {
annotatedRegions.put(startAddress, "UNDEFINED");
} else {
annotatedRegions.put(startAddress, description);
}
}
}

return annotatedRegions;
} catch (Exception e) {
return null;
}
}
return null;
}

@SuppressForbidden // split with one-char String use a fast-path without regex usage
public static void emit() {
long startAddress;
long endAddress;
Expand Down Expand Up @@ -418,6 +466,16 @@ public static void register() {
// Make sure the periodic event is registered only once
if (registered.compareAndSet(false, true)) {
JfrHelper.addPeriodicEvent(SmapEntryEvent.class, SmapEntryEvent::emit);
try {
ObjectName objectName = new ObjectName("com.sun.management:type=DiagnosticCommand");
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

annotatedMapsAvailable =
Arrays.stream(mbs.getMBeanInfo(objectName).getOperations())
.anyMatch(x -> x.getName().equals("systemMap"));
} catch (Exception e) {
annotatedMapsAvailable = false;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String[
+ "com.datadog.profiling.controller.openjdk.events.EndpointEvent:build_time,"
+ "com.datadog.profiling.controller.openjdk.events.QueueTimeEvent:build_time,"
+ "com.datadog.profiling.controller.openjdk.events.TimelineEvent:build_time,"
+ "com.datadog.profiling.controller.openjdk.events.SmapEntryEvent:build_time,"
+ "datadog.trace.api.Config:rerun,"
+ "datadog.trace.api.Platform:rerun,"
+ "datadog.trace.api.Platform$Captured:build_time,"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ public final class ProfilingConfig {
public static final String PROFILING_SMAP_COLLECTION_ENABLED =
"profiling.smap.collection.enabled";

public static final boolean PROFILING_SMAP_COLLECTION_ENABLED_DEFAULT = false;
public static final boolean PROFILING_SMAP_COLLECTION_ENABLED_DEFAULT = true;

public static final String PROFILING_QUEUEING_TIME_THRESHOLD_MILLIS =
"profiling.queueing.time.threshold.millis";
Expand Down

0 comments on commit bd304f9

Please sign in to comment.