[metrics] Use data from system_metrics_logger if available

This sets up a temporary fallback while we migrate all the tests to set
up system_metrics_logger, to get higher frequency CPU usage data.

BUG: b/156300857
TEST: fx test sl4f_client_test

Change-Id: Ic1429bc9b03b744a1f34bc6ad379166b1a08649e
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/512766
Reviewed-by: Nathan Rogers <nathanrogers@google.com>
Commit-Queue: Brian Hamrick <bhamrick@google.com>
diff --git a/sdk/testing/sl4f/client/BUILD.gn b/sdk/testing/sl4f/client/BUILD.gn
index eb0beeb..e082d3c 100644
--- a/sdk/testing/sl4f/client/BUILD.gn
+++ b/sdk/testing/sl4f/client/BUILD.gn
@@ -123,6 +123,7 @@
       "${root_out_dir}/fake_zedmon",
       "test/trace_processing_test_data/chrome_metadata.json",
       "test/trace_processing_test_data/cpu_metric.json",
+      "test/trace_processing_test_data/cpu_metric_system_metrics_logger.json",
       "test/trace_processing_test_data/flow_event_binding.json",
       "test/trace_processing_test_data/flow_ids.json",
       "test/trace_processing_test_data/flutter_app.json",
diff --git a/sdk/testing/sl4f/client/lib/src/trace_processing/metrics/cpu_metrics.dart b/sdk/testing/sl4f/client/lib/src/trace_processing/metrics/cpu_metrics.dart
index 949ace0..5f14bf0 100644
--- a/sdk/testing/sl4f/client/lib/src/trace_processing/metrics/cpu_metrics.dart
+++ b/sdk/testing/sl4f/client/lib/src/trace_processing/metrics/cpu_metrics.dart
@@ -27,11 +27,22 @@
         'Trace duration (${duration.toMilliseconds()} milliseconds) is too short to provide CPU information');
     return [];
   }
-  final cpuPercentages = getArgValuesFromEvents<num>(
+  List<double> cpuPercentages = getArgValuesFromEvents<num>(
           filterEventsTyped<CounterEvent>(getAllEvents(model),
-              category: 'system_metrics', name: 'cpu_usage'),
-          'average_cpu_percentage')
-      .map((x) => x.toDouble());
+              category: 'system_metrics_logger', name: 'cpu_usage'),
+          'cpu_usage')
+      .map((x) => x.toDouble())
+      .toList();
+  // TODO(b/156300857): Remove this fallback after all consumers have been
+  // updated to use system_metrics_logger.
+  if (cpuPercentages.isEmpty) {
+    cpuPercentages = getArgValuesFromEvents<num>(
+            filterEventsTyped<CounterEvent>(getAllEvents(model),
+                category: 'system_metrics', name: 'cpu_usage'),
+            'average_cpu_percentage')
+        .map((x) => x.toDouble())
+        .toList();
+  }
   _log.info('Average CPU Load: ${computeMean(cpuPercentages)}');
   final List<TestCaseResults> testCaseResults = [];
   if (extraArgs.containsKey(_aggregateMetricsOnly) &&
diff --git a/sdk/testing/sl4f/client/test/trace_processing_test.dart b/sdk/testing/sl4f/client/test/trace_processing_test.dart
index fff4f9e..bcc3152 100644
--- a/sdk/testing/sl4f/client/test/trace_processing_test.dart
+++ b/sdk/testing/sl4f/client/test/trace_processing_test.dart
@@ -539,6 +539,33 @@
     expect(aggregatedResults[7].values[0], _closeTo(31.50));
   });
 
+  test('CPU metric after system metrics logger migration', () async {
+    final model = await _modelFromPath(
+        'runtime_deps/cpu_metric_system_metrics_logger.json');
+    final results = cpuMetricsProcessor(model, {});
+    expect(results[0].values[0], _closeTo(43.00));
+    expect(results[0].values[1], _closeTo(20.00));
+    final aggregatedResults =
+        cpuMetricsProcessor(model, {'aggregateMetricsOnly': true});
+    expect(aggregatedResults.length, equals(8));
+    expect(aggregatedResults[0].label, equals('cpu_p5'));
+    expect(aggregatedResults[0].values[0], _closeTo(21.15));
+    expect(aggregatedResults[1].label, equals('cpu_p25'));
+    expect(aggregatedResults[1].values[0], _closeTo(25.75));
+    expect(aggregatedResults[2].label, equals('cpu_p50'));
+    expect(aggregatedResults[2].values[0], _closeTo(31.50));
+    expect(aggregatedResults[3].label, equals('cpu_p75'));
+    expect(aggregatedResults[3].values[0], _closeTo(37.25));
+    expect(aggregatedResults[4].label, equals('cpu_p95'));
+    expect(aggregatedResults[4].values[0], _closeTo(41.85));
+    expect(aggregatedResults[5].label, equals('cpu_min'));
+    expect(aggregatedResults[5].values[0], _closeTo(20.00));
+    expect(aggregatedResults[6].label, equals('cpu_max'));
+    expect(aggregatedResults[6].values[0], _closeTo(43.00));
+    expect(aggregatedResults[7].label, equals('cpu_average'));
+    expect(aggregatedResults[7].values[0], _closeTo(31.50));
+  });
+
   test('GPU metric', () async {
     {
       final model = await _modelFromPath('runtime_deps/gpu_utilization.json');
diff --git a/sdk/testing/sl4f/client/test/trace_processing_test_data/cpu_metric_system_metrics_logger.json b/sdk/testing/sl4f/client/test/trace_processing_test_data/cpu_metric_system_metrics_logger.json
new file mode 100644
index 0000000..eb3337c
--- /dev/null
+++ b/sdk/testing/sl4f/client/test/trace_processing_test_data/cpu_metric_system_metrics_logger.json
@@ -0,0 +1,43 @@
+{
+    "displayTimeUnit": "ns",
+    "systemTraceEvents": {
+        "events": [
+            {
+                "name": "root_presenter",
+                "ph": "p",
+                "pid": 7009
+            },
+            {
+                "name": "initial-thread",
+                "ph": "t",
+                "pid": 7009,
+                "tid": 7022
+            }
+        ],
+        "type": "fuchsia"
+    },
+    "traceEvents": [
+        {
+            "args": {
+                "cpu_usage": 43
+            },
+            "cat": "system_metrics_logger",
+            "name": "cpu_usage",
+            "ph": "C",
+            "pid": 7009,
+            "tid": 7022,
+            "ts": 3000000000
+        },
+        {
+            "args": {
+                "cpu_usage": 20
+            },
+            "cat": "system_metrics_logger",
+            "name": "cpu_usage",
+            "ph": "C",
+            "pid": 7009,
+            "tid": 7022,
+            "ts": 4100000000
+        }
+    ]
+}