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..01ead17a8c6981aa088ec8dd0b03ed27faaece4d |
--- /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: |
tonyg
2014/09/29 16:45:21
Are there cases when this is expected? If not, per
phoglund_chromium
2014/09/30 13:37:48
Yes, the list will be empty if a page didn't end u
|
+ return |
+ |
+ reports = json.loads(self._all_reports) |
+ num_peer_connections = len(reports) |
+ for i in xrange(num_peer_connections): |
phoglund_chromium
2014/09/12 08:26:07
This is arguably complex enough to warrant a unit
tonyg
2014/09/29 16:45:22
Better written as:
for i, peer_connection in enume
tonyg
2014/09/29 16:45:22
Definitely. The main value is that without a unitt
phoglund_chromium
2014/09/30 13:37:48
Hm. I don't think I should play an actual WebRTC s
phoglund_chromium
2014/09/30 13:37:48
Done.
|
+ time_series = SortStatsIntoTimeSeries(reports[i]) |
+ |
+ for stat_name, values in time_series.iteritems(): |
+ trace_name = 'pc_%d_%s' % (i, camel_case.ToUnderscore(stat_name)) |
tonyg
2014/09/29 16:45:21
What is "pc_"? I recommend a more friendly name he
phoglund_chromium
2014/09/30 13:37:48
Done.
|
+ 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)) |