Index: tools/perf/metrics/webrtc_stats.py |
diff --git a/tools/perf/metrics/webrtc_stats.py b/tools/perf/metrics/webrtc_stats.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e96bfcc9d664b279d05d81c3e66ce1d3759833a3 |
--- /dev/null |
+++ b/tools/perf/metrics/webrtc_stats.py |
@@ -0,0 +1,73 @@ |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import json |
+ |
+from metrics import Metric |
+from telemetry.core import camel_case |
+from telemetry.value import list_of_scalar_values |
+ |
+INTERESTING_METRICS = { |
+ 'packetsReceived': { |
+ 'units': 'packets', |
+ 'description': 'Packets received by the peer connection', |
+ }, |
+ 'packetsSent': { |
+ 'units': 'packets', |
+ 'description': 'Packets sent by the peer connection', |
+ }, |
+ 'googDecodeMs': { |
+ 'units': 'ms', |
+ 'description': 'Time spent decoding.', |
+ }, |
+ 'googMaxDecodeMs': { |
+ 'units': 'ms', |
+ 'description': 'Maximum time spent decoding one frame.', |
+ }, |
+ # TODO(phoglund): Add much more interesting metrics. |
+} |
+ |
+def SortStatsIntoTimeSeries(report_batches): |
+ time_series = {} |
+ for report_batch in report_batches: |
+ for report in report_batch: |
+ for stat_name, value in report.iteritems(): |
+ if stat_name not in INTERESTING_METRICS: |
+ continue |
+ time_series.setdefault(stat_name, []).append(float(value)) |
+ |
+ return time_series |
+ |
+ |
+class WebRtcStatisticsMetric(Metric): |
+ """Makes it possible to measure stats from peer connections.""" |
+ |
+ def __init__(self): |
+ super(WebRtcStatisticsMetric, self).__init__() |
+ self._all_reports = None |
+ |
+ def Start(self, page, tab): |
+ pass |
+ |
+ def Stop(self, page, tab): |
+ """Digs out stats from data populated by the javascript in webrtc_cases.""" |
+ self._all_reports = tab.EvaluateJavaScript( |
+ 'JSON.stringify(window.peerConnectionReports)') |
+ |
+ def AddResults(self, tab, results): |
+ if not self._all_reports: |
+ return |
+ |
+ reports = json.loads(self._all_reports) |
+ for i, report in enumerate(reports): |
+ time_series = SortStatsIntoTimeSeries(report) |
+ |
+ for stat_name, values in time_series.iteritems(): |
+ stat_name_underscored = camel_case.ToUnderscore(stat_name) |
+ trace_name = 'peer_connection_%d_%s' % (i, stat_name_underscored) |
+ results.AddValue(list_of_scalar_values.ListOfScalarValues( |
+ results.current_page, trace_name, |
+ INTERESTING_METRICS[stat_name]['units'], values, |
+ description=INTERESTING_METRICS[stat_name]['description'], |
+ important=False)) |