Provide option to prefix all metrics.

Default set to "perfetto".
Added debug logs from PerfettoGenericPostProcessor.

Bug: b/153672900, b/153736371
Change-Id: I4e41fc1b0433a573b81cdd07e16ff36f4c469e3d
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);
     }