Merge "Provide option to prefix all metrics."
diff --git a/test_framework/com/android/tradefed/postprocessor/PerfettoGenericPostProcessor.java b/test_framework/com/android/tradefed/postprocessor/PerfettoGenericPostProcessor.java
index 14ec4ef..618b6bc 100644
--- a/test_framework/com/android/tradefed/postprocessor/PerfettoGenericPostProcessor.java
+++ b/test_framework/com/android/tradefed/postprocessor/PerfettoGenericPostProcessor.java
@@ -135,6 +135,12 @@
+ "keys parsed and value is be the replacement string.")
private Map<String, String> mReplacePrefixMap = new LinkedHashMap<String, String>();
+ @Option(
+ name = "perfetto-all-metric-prefix",
+ description = "Prefix to be used with the metrics collected from perfetto."
+ + "This will be applied before any other prefixes to metrics.")
+ private String mAllMetricPrefix = "perfetto";
+
// Matches 1.73, 1.73E+2
private Pattern mNumberWithExponentPattern =
Pattern.compile("[-+]?[0-9]*[\\.]?[0-9]+([eE][-+]?[0-9]+)?");
@@ -222,6 +228,9 @@
parsedMetrics.putAll(
filterMetrics(convertPerfettoProtoMessage(builder.build())));
replacePrefix(parsedMetrics);
+ // Generic prefix string is applied to all the metrics parsed from
+ // perfetto trace file.
+ replaceAllMetricPrefix(parsedMetrics);
break;
case binary:
TraceMetrics metricProto = null;
@@ -230,6 +239,9 @@
parsedMetrics
.putAll(filterMetrics(convertPerfettoProtoMessage(metricProto)));
replacePrefix(parsedMetrics);
+ // Generic prefix string is applied to all the metrics parsed from
+ // perfetto trace file.
+ replaceAllMetricPrefix(parsedMetrics);
break;
case json:
CLog.w("JSON perfetto metric file processing not supported.");
@@ -245,6 +257,7 @@
FileUtil.recursiveDelete(uncompressedDir);
}
}
+
return parsedMetrics;
}
@@ -279,6 +292,25 @@
}
/**
+ * Prefix all the metrics key with given string.
+ *
+ * @param processPerfettoMetrics metrics parsed from the perfetto proto file.
+ */
+ private void replaceAllMetricPrefix(Map<String, Metric.Builder> processPerfettoMetrics) {
+ if (mAllMetricPrefix == null || mAllMetricPrefix.isEmpty()) {
+ return;
+ }
+ Map<String, Metric.Builder> finalMetrics = new HashMap<String, Metric.Builder>();
+ for (Map.Entry<String, Metric.Builder> metric : processPerfettoMetrics.entrySet()) {
+ String newKey = String.format("%s_%s", mAllMetricPrefix, metric.getKey());
+ finalMetrics.put(newKey, metric.getValue());
+ CLog.d("Perfetto trace metric: key: %s value: %s", newKey, metric.getValue());
+ }
+ processPerfettoMetrics.clear();
+ processPerfettoMetrics.putAll(finalMetrics);
+ }
+
+ /**
* Expands the metric proto file as tree structure and converts it into key, value pairs by
* recursively constructing the key using the message name, proto fields with string values
* until the numeric proto field is encountered.
diff --git a/tests/src/com/android/tradefed/postprocessor/PerfettoGenericPostProcessorTest.java b/tests/src/com/android/tradefed/postprocessor/PerfettoGenericPostProcessorTest.java
index 71c02fd..d83c343 100644
--- a/tests/src/com/android/tradefed/postprocessor/PerfettoGenericPostProcessorTest.java
+++ b/tests/src/com/android/tradefed/postprocessor/PerfettoGenericPostProcessorTest.java
@@ -67,6 +67,7 @@
private static final String KEY_PREFIX_OPTION = "perfetto-prefix-key-field";
private static final String REGEX_OPTION_VALUE = "perfetto-metric-filter-regex";
private static final String ALL_METRICS_OPTION = "perfetto-include-all-metrics";
+ private static final String ALL_METRICS_PREFIX_OPTION = "perfetto-all-metric-prefix";
private static final String REPLACE_REGEX_OPTION = "perfetto-metric-replace-prefix";
private static final String FILE_FORMAT_OPTION = "trace-processor-output-format";
@@ -120,10 +121,10 @@
Map<String, Metric.Builder> parsedMetrics =
mProcessor.processRunMetricsAndLogs(new HashMap<>(), testLogs);
- assertMetricsContain(parsedMetrics, "android_startup-startup-1-startup_id", 1);
+ assertMetricsContain(parsedMetrics, "perfetto_android_startup-startup-1-startup_id", 1);
assertMetricsContain(
parsedMetrics,
- "android_startup-startup-1-package_name-com.google."
+ "perfetto_android_startup-startup-1-package_name-com.google."
+ "android.apps.nexuslauncher-to_first_frame-dur_ns",
36175473);
}
@@ -152,10 +153,10 @@
assertFalse("Metric key not expected but found",
parsedMetrics.containsKey("android_startup-startup-1-startup_id"));
- assertMetricsContain(parsedMetrics, "newprefix-startup_id", 1);
+ assertMetricsContain(parsedMetrics, "perfetto_newprefix-startup_id", 1);
assertMetricsContain(
parsedMetrics,
- "newprefix-package_name-com.google."
+ "perfetto_newprefix-package_name-com.google."
+ "android.apps.nexuslauncher-to_first_frame-dur_ns",
36175473);
}
@@ -180,7 +181,7 @@
// Test for non startup metrics exists.
assertMetricsContain(
parsedMetrics,
- "android_mem-process_metrics-process_name-"
+ "perfetto_android_mem-process_metrics-process_name-"
+ ".dataservices-total_counters-anon_rss-min",
27938816);
}
@@ -201,7 +202,29 @@
new TestDescription("class", "test"), new HashMap<>(), testLogs);
assertMetricsContain(
parsedMetrics,
- "android_mem-process_metrics-process_name-"
+ "perfetto_android_mem-process_metrics-process_name-"
+ + ".dataservices-total_counters-anon_rss-min",
+ 27938816);
+ }
+
+ /** Test custom all metric suffix is applied correctly. */
+ @Test
+ public void testParsingWithAllMetricsPrefix() throws ConfigurationException, IOException {
+ setupPerfettoMetricFile(METRIC_FILE_FORMAT.text, true);
+ mOptionSetter.setOptionValue(PREFIX_OPTION, PREFIX_OPTION_VALUE);
+ mOptionSetter.setOptionValue(ALL_METRICS_OPTION, "true");
+ mOptionSetter.setOptionValue(ALL_METRICS_PREFIX_OPTION, "custom_all_prefix");
+ Map<String, LogFile> testLogs = new HashMap<>();
+ testLogs.put(
+ PREFIX_OPTION_VALUE,
+ new LogFile(
+ perfettoMetricProtoFile.getAbsolutePath(), "some.url", LogDataType.TEXTPB));
+ Map<String, Metric.Builder> parsedMetrics =
+ mProcessor.processTestMetricsAndLogs(
+ new TestDescription("class", "test"), new HashMap<>(), testLogs);
+ assertMetricsContain(
+ parsedMetrics,
+ "custom_all_prefix_android_mem-process_metrics-process_name-"
+ ".dataservices-total_counters-anon_rss-min",
27938816);
}
@@ -221,7 +244,7 @@
mProcessor.processRunMetricsAndLogs(new HashMap<>(), testLogs);
assertMetricsContain(
parsedMetrics,
- "android_mem-process_metrics-process_name-"
+ "perfetto_android_mem-process_metrics-process_name-"
+ ".dataservices-total_counters-anon_rss-min",
27938816);
}
@@ -242,10 +265,10 @@
perfettoMetricProtoFile.getAbsolutePath(), "some.url", LogDataType.TEXTPB));
Map<String, Metric.Builder> parsedMetrics =
mProcessor.processRunMetricsAndLogs(new HashMap<>(), testLogs);
- assertMetricsContain(parsedMetrics, "android_startup-startup-startup_id", 2);
+ assertMetricsContain(parsedMetrics, "perfetto_android_startup-startup-startup_id", 2);
assertMetricsContain(
parsedMetrics,
- "android_startup-startup-package_name-com.google."
+ "perfetto_android_startup-startup-package_name-com.google."
+ "android.apps.nexuslauncher-to_first_frame-dur_ns",
53102401);
}
@@ -268,16 +291,16 @@
Map<String, Metric.Builder> parsedMetrics =
mProcessor.processRunMetricsAndLogs(new HashMap<>(), testLogs);
- assertMetricsContain(parsedMetrics, "android_startup-startup-1-startup_id", 1);
+ assertMetricsContain(parsedMetrics, "perfetto_android_startup-startup-1-startup_id", 1);
assertMetricsContain(
parsedMetrics,
- "android_startup-startup-1-package_name-com.google."
+ "perfetto_android_startup-startup-1-package_name-com.google."
+ "android.apps.nexuslauncher-to_first_frame-dur_ns",
36175473);
- assertMetricsContain(parsedMetrics, "android_startup-startup-2-startup_id", 2);
+ assertMetricsContain(parsedMetrics, "perfetto_android_startup-startup-2-startup_id", 2);
assertMetricsContain(
parsedMetrics,
- "android_startup-startup-2-package_name-com.google."
+ "perfetto_android_startup-startup-2-package_name-com.google."
+ "android.apps.nexuslauncher-to_first_frame-dur_ns",
53102401);
}
@@ -301,7 +324,7 @@
mProcessor.processRunMetricsAndLogs(new HashMap<>(), testLogs);
assertMetricsContain(parsedMetrics,
- "android_hwui_metric-process_info-process_name-com.android.systemui-all_mem_min",
+ "perfetto_android_hwui_metric-process_info-process_name-com.android.systemui-all_mem_min",
15120269);
}
@@ -323,7 +346,7 @@
mProcessor.processRunMetricsAndLogs(new HashMap<>(), testLogs);
assertMetricsContain(
parsedMetrics,
- "android_mem-process_metrics-process_name-"
+ "perfetto_android_mem-process_metrics-process_name-"
+ ".dataservices-total_counters-anon_rss-min",
27938816);
}
@@ -366,7 +389,7 @@
mProcessor.processRunMetricsAndLogs(new HashMap<>(), testLogs);
assertMetricsContain(
parsedMetrics,
- "android_mem-process_metrics-process_name-"
+ "perfetto_android_mem-process_metrics-process_name-"
+ ".dataservices-total_counters-anon_rss-min",
27938816);
}