Chromium Code Reviews| 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)) |