| Index: tools/telemetry/telemetry/core/platform/power_monitor/powermetrics_power_monitor.py
 | 
| diff --git a/tools/telemetry/telemetry/core/platform/power_monitor/powermetrics_power_monitor.py b/tools/telemetry/telemetry/core/platform/power_monitor/powermetrics_power_monitor.py
 | 
| index 74006d16b743aeafd9620597a53b54b61587eed3..badbdb0268c9739da9ba8832da42b4d9c8245ee3 100644
 | 
| --- a/tools/telemetry/telemetry/core/platform/power_monitor/powermetrics_power_monitor.py
 | 
| +++ b/tools/telemetry/telemetry/core/platform/power_monitor/powermetrics_power_monitor.py
 | 
| @@ -17,6 +17,7 @@ from telemetry.core.platform import power_monitor
 | 
|  
 | 
|  
 | 
|  class PowerMetricsPowerMonitor(power_monitor.PowerMonitor):
 | 
| +
 | 
|    def __init__(self, backend):
 | 
|      super(PowerMetricsPowerMonitor, self).__init__()
 | 
|      self._powermetrics_process = None
 | 
| @@ -30,7 +31,7 @@ class PowerMetricsPowerMonitor(power_monitor.PowerMonitor):
 | 
|  
 | 
|    def StartMonitoringPower(self, browser):
 | 
|      assert not self._powermetrics_process, (
 | 
| -        "Must call StopMonitoringPower().")
 | 
| +        'Must call StopMonitoringPower().')
 | 
|      # Empirically powermetrics creates an empty output file immediately upon
 | 
|      # starting.  We detect file creation as a signal that measurement has
 | 
|      # started.  In order to avoid various race conditions in tempfile creation
 | 
| @@ -39,7 +40,7 @@ class PowerMetricsPowerMonitor(power_monitor.PowerMonitor):
 | 
|      # name.
 | 
|      self._output_directory = tempfile.mkdtemp()
 | 
|      self._output_filename = os.path.join(self._output_directory,
 | 
| -        'powermetrics.output')
 | 
| +                                         'powermetrics.output')
 | 
|      args = ['-f', 'plist',
 | 
|              '-u', self._output_filename,
 | 
|              '-i0',
 | 
| @@ -86,7 +87,7 @@ class PowerMetricsPowerMonitor(power_monitor.PowerMonitor):
 | 
|          if |powermetrics_output| is empty - crbug.com/353250 .
 | 
|      """
 | 
|      if len(powermetrics_output) == 0:
 | 
| -      logging.warning("powermetrics produced zero length output")
 | 
| +      logging.warning('powermetrics produced zero length output')
 | 
|        return None
 | 
|  
 | 
|      # Container to collect samples for running averages.
 | 
| @@ -95,17 +96,17 @@ class PowerMetricsPowerMonitor(power_monitor.PowerMonitor):
 | 
|      #    powermetrics' output.
 | 
|      def ConstructMetric(out_path, src_path):
 | 
|        RunningAverage = collections.namedtuple('RunningAverage', [
 | 
| -        'out_path', 'src_path', 'samples'])
 | 
| +          'out_path', 'src_path', 'samples'])
 | 
|        return RunningAverage(out_path, src_path, [])
 | 
|  
 | 
|      # List of RunningAverage objects specifying metrics we want to aggregate.
 | 
|      metrics = [
 | 
|          ConstructMetric(
 | 
|              ['component_utilization', 'whole_package', 'average_frequency_hz'],
 | 
| -            ['processor','freq_hz']),
 | 
| +            ['processor', 'freq_hz']),
 | 
|          ConstructMetric(
 | 
|              ['component_utilization', 'whole_package', 'idle_percent'],
 | 
| -            ['processor','packages', 0, 'c_state_ratio'])]
 | 
| +            ['processor', 'packages', 0, 'c_state_ratio'])]
 | 
|  
 | 
|      def DataWithMetricKeyPath(metric, powermetrics_output):
 | 
|        """Retrieve the sample from powermetrics' output for a given metric.
 | 
| @@ -122,7 +123,7 @@ class PowerMetricsPowerMonitor(power_monitor.PowerMonitor):
 | 
|          out_data = out_data[k]
 | 
|  
 | 
|        assert type(out_data) in [int, float], (
 | 
| -          "Was expecting a number: %s (%s)" % (type(out_data), out_data))
 | 
| +          'Was expecting a number: %s (%s)' % (type(out_data), out_data))
 | 
|        return float(out_data)
 | 
|  
 | 
|      sample_durations = []
 | 
| @@ -130,13 +131,13 @@ class PowerMetricsPowerMonitor(power_monitor.PowerMonitor):
 | 
|      # powermetrics outputs multiple plists separated by null terminators.
 | 
|      raw_plists = powermetrics_output.split('\0')
 | 
|      raw_plists = [x for x in raw_plists if len(x) > 0]
 | 
| -    assert(len(raw_plists) == 1)
 | 
| +    assert len(raw_plists) == 1
 | 
|  
 | 
|      # -------- Examine contents of first plist for systems specs. --------
 | 
|      plist = PowerMetricsPowerMonitor._ParsePlistString(raw_plists[0])
 | 
|      if not plist:
 | 
| -      logging.warning("powermetrics produced invalid output, output length: "
 | 
| -          "%d" % len(powermetrics_output))
 | 
| +      logging.warning('powermetrics produced invalid output, output length: '
 | 
| +                      '%d', len(powermetrics_output))
 | 
|        return {}
 | 
|  
 | 
|      if 'GPU' in plist:
 | 
| @@ -148,7 +149,6 @@ class PowerMetricsPowerMonitor(power_monitor.PowerMonitor):
 | 
|                ['component_utilization', 'gpu', 'idle_percent'],
 | 
|                ['GPU', 0, 'c_state_ratio'])])
 | 
|  
 | 
| -
 | 
|      # There's no way of knowing ahead of time how many cpus and packages the
 | 
|      # current system has. Iterate over cores and cpus - construct metrics for
 | 
|      # each one.
 | 
| @@ -174,11 +174,11 @@ class PowerMetricsPowerMonitor(power_monitor.PowerMonitor):
 | 
|      # -------- Parse Data Out of Plists --------
 | 
|      plist = PowerMetricsPowerMonitor._ParsePlistString(raw_plists[0])
 | 
|      if not plist:
 | 
| -      logging.error("Error parsing plist.")
 | 
| +      logging.error('Error parsing plist.')
 | 
|        return {}
 | 
|  
 | 
|      # Duration of this sample.
 | 
| -    sample_duration_ms = int(plist['elapsed_ns']) / 10**6
 | 
| +    sample_duration_ms = int(plist['elapsed_ns']) / 10 ** 6
 | 
|      sample_durations.append(sample_duration_ms)
 | 
|  
 | 
|      if 'processor' not in plist:
 | 
| @@ -187,7 +187,7 @@ class PowerMetricsPowerMonitor(power_monitor.PowerMonitor):
 | 
|      processor = plist['processor']
 | 
|  
 | 
|      total_energy_consumption_mwh = (
 | 
| -        (float(processor.get('package_joules', 0)) / 3600.) * 10**3 )
 | 
| +        (float(processor.get('package_joules', 0)) / 3600.) * 10 ** 3)
 | 
|  
 | 
|      for m in metrics:
 | 
|        m.samples.append(DataWithMetricKeyPath(m, plist))
 | 
| @@ -230,7 +230,7 @@ class PowerMetricsPowerMonitor(power_monitor.PowerMonitor):
 | 
|  
 | 
|    def StopMonitoringPower(self):
 | 
|      assert self._powermetrics_process, (
 | 
| -        "StartMonitoringPower() not called.")
 | 
| +        'StartMonitoringPower() not called.')
 | 
|      # Tell powermetrics to take an immediate sample.
 | 
|      try:
 | 
|        self._powermetrics_process.terminate()
 | 
| 
 |