[web] Allow benchmarks to customize their score keys (#51493)
diff --git a/dev/benchmarks/macrobenchmarks/lib/src/web/recorder.dart b/dev/benchmarks/macrobenchmarks/lib/src/web/recorder.dart
index d93d89a..4ebcf6d 100644
--- a/dev/benchmarks/macrobenchmarks/lib/src/web/recorder.dart
+++ b/dev/benchmarks/macrobenchmarks/lib/src/web/recorder.dart
@@ -430,6 +430,7 @@
Map<String, dynamic> toJson() {
return <String, dynamic>{
'name': name,
+ 'scoreKeys': <String>['averageDrawFrameDuration'],
'averageDrawFrameDuration': averageDrawFrameDuration.inMicroseconds,
'drawFrameDurationNoise': drawFrameDurationNoise,
'frames': frames
diff --git a/dev/devicelab/lib/tasks/web_benchmarks.dart b/dev/devicelab/lib/tasks/web_benchmarks.dart
index ee1da2d..0211fe0 100644
--- a/dev/devicelab/lib/tasks/web_benchmarks.dart
+++ b/dev/devicelab/lib/tasks/web_benchmarks.dart
@@ -124,10 +124,33 @@
print('Received profile data');
for (final Map<String, dynamic> profile in profiles) {
final String benchmarkName = profile['name'] as String;
- final String benchmarkScoreKey = '$benchmarkName.$backend.averageDrawFrameDuration';
- taskResult[benchmarkScoreKey] = profile['averageDrawFrameDuration'].toDouble(); // micros
- taskResult['$benchmarkName.$backend.drawFrameDurationNoise'] = profile['drawFrameDurationNoise'].toDouble(); // micros
- benchmarkScoreKeys.add(benchmarkScoreKey);
+ if (benchmarkName.isEmpty) {
+ throw 'Benchmark name is empty';
+ }
+
+ final String namespace = '$benchmarkName.$backend';
+ final List<String> scoreKeys = List<String>.from(profile['scoreKeys'] as List<dynamic>);
+ if (scoreKeys == null || scoreKeys.isEmpty) {
+ throw 'No score keys in benchmark "$benchmarkName"';
+ }
+ for (final String scoreKey in scoreKeys) {
+ if (scoreKey == null || scoreKey.isEmpty) {
+ throw 'Score key is empty in benchmark "$benchmarkName". '
+ 'Received [${scoreKeys.join(', ')}]';
+ }
+ if (scoreKey.contains('.')) {
+ throw 'Score key contain dots in benchmark "$benchmarkName". '
+ 'Received [${scoreKeys.join(', ')}]';
+ }
+ benchmarkScoreKeys.add('$namespace.$scoreKey');
+ }
+
+ for (final String key in profile.keys) {
+ if (key == 'name' || key == 'scoreKeys') {
+ continue;
+ }
+ taskResult['$namespace.$key'] = profile[key];
+ }
}
return TaskResult.success(taskResult, benchmarkScoreKeys: benchmarkScoreKeys);
} finally {