perfkitbenchmarker/traces/collectd.py (40 lines of code) (raw):
# Copyright 2015 PerfKitBenchmarker Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Records system performance counters during benchmark runs using collectd.
http://collectd.org
"""
import logging
import os
import posixpath
from absl import flags
from perfkitbenchmarker import background_tasks
from perfkitbenchmarker import events
from perfkitbenchmarker import stages
from perfkitbenchmarker import vm_util
from perfkitbenchmarker.linux_packages import collectd
flags.DEFINE_boolean(
'collectd', False, 'Install and run collectd on the guest.'
)
flags.DEFINE_string('collectd_output', None, 'Path to store collectd results.')
class _CollectdCollector:
"""Manages running collectd during a test, and fetching the CSV results."""
def __init__(self, target_dir):
self.target_dir = target_dir
def _FetchResults(self, vm):
"""Stops collectd on the VM, fetches CSV results."""
logging.info('Fetching collectd results')
local_dir = os.path.join(self.target_dir, vm.name + '-collectd')
# On the remote host, CSV files are in:
# self.csv_dir/<fqdn>/<category>.
# Since AWS VMs have a FQDN different from the VM name, we rename locally.
vm.PullFile(local_dir, posixpath.join(collectd.CSV_DIR, '*', ''))
def Before(self, unused_sender, benchmark_spec):
"""Install collectd.
Args:
benchmark_spec: benchmark_spec.BenchmarkSpec. The benchmark currently
running.
"""
logging.info('Installing collectd')
vms = benchmark_spec.vms
background_tasks.RunThreaded(lambda vm: vm.Install('collectd'), vms)
def After(self, unused_sender, benchmark_spec):
"""Stop / delete collectd, fetch results from VMs.
Args:
benchmark_spec: benchmark_spec.BenchmarkSpec. The benchmark that stopped
running.
"""
logging.info('Stopping collectd')
vms = benchmark_spec.vms
background_tasks.RunThreaded(self._FetchResults, vms)
def Register(parsed_flags):
"""Register the collector if FLAGS.collectd is set."""
if not parsed_flags.collectd:
return
logging.info('Registering collectd collector')
output_directory = parsed_flags.collectd_output or vm_util.GetTempDir()
if not os.path.isdir(output_directory):
raise OSError(
'collectd output directory does not exist: {}'.format(output_directory)
)
collector = _CollectdCollector(output_directory)
events.before_phase.connect(collector.Before, stages.RUN, weak=False)
events.after_phase.connect(collector.After, stages.RUN, weak=False)