From 8ec0d9b3a51d55b33964bc86ed30fd3a2184807e Mon Sep 17 00:00:00 2001 From: Sindhur Malleni Date: Sun, 13 Mar 2016 16:24:45 -0400 Subject: [PATCH] Adding lib/Grafana Refactoring some code to make use of the library + Splitting into methods + Making methods independent with akrzos suggestions Change-Id: I7a18d4c506a5dcd28d96872226e5001d4603cf48 --- browbeat-complete.yaml | 4 +++- browbeat-config.yaml | 6 ++++-- lib/Grafana.py | 49 ++++++++++++++++++++++++++++++++++++++++++ lib/PerfKit.py | 35 ++++++------------------------ lib/Rally.py | 33 +++++----------------------- lib/Shaker.py | 14 +++++++++++- 6 files changed, 80 insertions(+), 61 deletions(-) create mode 100644 lib/Grafana.py diff --git a/browbeat-complete.yaml b/browbeat-complete.yaml index 80b758000..7bc7bfdcf 100644 --- a/browbeat-complete.yaml +++ b/browbeat-complete.yaml @@ -2,7 +2,7 @@ browbeat: results : results/ sudo: true - connmon: true + connmon: false rerun: 3 ansible: hosts: ansible/hosts @@ -189,6 +189,8 @@ shaker: port: 5555 flavor: m1.small join_timeout: 600 + sleep_before: 5 + sleep_after: 5 venv: /home/stack/shaker-venv scenarios: l2-4-1: diff --git a/browbeat-config.yaml b/browbeat-config.yaml index 5363f7d63..069fb5a93 100644 --- a/browbeat-config.yaml +++ b/browbeat-config.yaml @@ -2,7 +2,7 @@ browbeat: results : results/ sudo: true - connmon: true + connmon: false rerun: 1 ansible: hosts: ansible/hosts @@ -47,10 +47,12 @@ perfkit: data_disk_size: 4 shaker: enabled: true - server: (Address of machine running browbeat) + server: (Address of machine running browbeat-Undercloud) port: 5555 flavor: m1.small join_timeout: 600 + sleep_before: 5 + sleep_after: 5 venv: /home/stack/shaker-venv scenarios: l2: diff --git a/lib/Grafana.py b/lib/Grafana.py new file mode 100644 index 000000000..d17cfcb6c --- /dev/null +++ b/lib/Grafana.py @@ -0,0 +1,49 @@ +import logging +import subprocess + +class Grafana: + def __init__(self, config): + self.logger = logging.getLogger('browbeat.Grafana') + self.config = config + self.cloud_name = self.config['grafana']['cloud_name'] + self.hosts_file = self.config['ansible']['hosts'] + self.grafana_ip = self.config['grafana']['grafana_ip'] + self.grafana_port = self.config['grafana']['grafana_port'] + self.playbook = self.config['ansible']['grafana_snapshot'] + + def get_extra_vars(self, from_ts, to_ts, result_dir, test_name): + extra_vars = 'grafana_ip={} '.format(self.config['grafana']['grafana_ip']) + extra_vars += 'grafana_port={} '.format(self.config['grafana']['grafana_port']) + extra_vars += 'grafana_api_key={} '.format(self.config['grafana']['snapshot']['grafana_api_key']) + extra_vars += 'from={} '.format(from_ts) + extra_vars += 'to={} '.format(to_ts) + extra_vars += 'results_dir={}/{} '.format(result_dir, test_name) + extra_vars += 'var_cloud={} '.format(self.cloud_name) + if self.config['grafana']['snapshot']['snapshot_compute']: + extra_vars += 'snapshot_compute=true ' + return extra_vars + + def print_dashboard_url(self, from_ts, to_ts, test_name): + if 'grafana' in self.config and self.config['grafana']['enabled']: + url = 'http://{}:{}/dashboard/db/'.format(self.grafana_ip, self.grafana_port) + for dashboard in self.config['grafana']['dashboards']: + full_url = '{}{}?from={}&to={}&var-Cloud={}'.format(url, dashboard, from_ts, to_ts, + self.cloud_name) + self.logger.info('{} - Grafana URL: {}'.format(test_name, full_url)) + + def log_snapshot_playbook_cmd(self, from_ts, to_ts, result_dir, test_name): + if 'grafana' in self.config and self.config['grafana']['enabled']: + extra_vars = self.get_extra_vars(from_ts, to_ts, result_dir, test_name) + snapshot_cmd = 'ansible-playbook -i {} {} -e "{}"'.format(self.hosts_file, self.playbook, + extra_vars) + self.logger.info('Snapshot command: {}'.format(snapshot_cmd)) + + def run_playbook(self, from_ts, to_ts, result_dir, test_name): + if 'grafana' in self.config and self.config['grafana']['enabled']: + extra_vars = self.get_extra_vars(from_ts, to_ts, result_dir, test_name) + subprocess_cmd = ['ansible-playbook', '-i', self.hosts_file, self.playbook, '-e', + '{}'.format(extra_vars)] + snapshot_log = open('{}/snapshot.log'.format(result_dir), 'a+') + self.logger.info('Running ansible to create snapshots for: {}'.format(test_name)) + subprocess.Popen(subprocess_cmd, stdout=snapshot_log, stderr=subprocess.STDOUT) + diff --git a/lib/PerfKit.py b/lib/PerfKit.py index ef7eaf3b6..f53df4bb8 100644 --- a/lib/PerfKit.py +++ b/lib/PerfKit.py @@ -1,5 +1,6 @@ from Connmon import Connmon from Tools import Tools +from Grafana import Grafana import glob import logging import datetime @@ -8,7 +9,6 @@ import shutil import subprocess import time - class PerfKit: def __init__(self, config): self.logger = logging.getLogger('browbeat.PerfKit') @@ -16,6 +16,7 @@ class PerfKit: self.error_count = 0 self.tools = Tools(self.config) self.connmon = Connmon(self.config) + self.grafana = Grafana(self.config) self.test_count = 0 self.scenario_count = 0 @@ -93,34 +94,10 @@ class PerfKit: shutil.rmtree("/tmp/perfkitbenchmarker/run_browbeat") # Grafana integration - if 'grafana' in self.config and self.config['grafana']['enabled']: - grafana_ip = self.config['grafana']['grafana_ip'] - grafana_port = self.config['grafana']['grafana_port'] - url = 'http://{}:{}/dashboard/db/'.format(grafana_ip, grafana_port) - cloud_name = self.config['grafana']['cloud_name'] - for dashboard in self.config['grafana']['dashboards']: - full_url = '{}{}?from={}&to={}&var-Cloud={}'.format(url, dashboard, from_ts, to_ts, - cloud_name) - self.logger.info('{} - Grafana URL: {}'.format(test_name, full_url)) - if self.config['grafana']['snapshot']['enabled']: - hosts_file = self.config['ansible']['hosts'] - playbook = self.config['ansible']['grafana_snapshot'] - extra_vars = 'grafana_ip={} '.format(grafana_ip) - extra_vars += 'grafana_port={} '.format(grafana_port) - extra_vars += 'grafana_api_key={} '.format(self.config['grafana']['snapshot']['grafana_api_key']) - extra_vars += 'from={} '.format(from_ts) - extra_vars += 'to={} '.format(to_ts) - extra_vars += 'results_dir={}/{} '.format(result_dir, test_name) - extra_vars += 'var_cloud={} '.format(cloud_name) - if self.config['grafana']['snapshot']['snapshot_compute']: - extra_vars += 'snapshot_compute=true ' - snapshot_cmd = 'ansible-playbook -i {} {} -e "{}"'.format(hosts_file, playbook, - extra_vars) - subprocess_cmd = ['ansible-playbook', '-i', hosts_file, playbook, '-e', - '{}'.format(extra_vars)] - self.logger.info('Snapshot command: {}'.format(snapshot_cmd)) - snapshot_log = open('{}/snapshot.log'.format(result_dir), 'a+') - subprocess.Popen(subprocess_cmd, stdout=snapshot_log, stderr=subprocess.STDOUT) + self.grafana.print_dashboard_url(from_ts, to_ts, test_name) + self.grafana.log_snapshot_playbook_cmd(from_ts, to_ts, result_dir, test_name) + self.grafana.run_playbook(from_ts, to_ts, result_dir, test_name) + def start_workloads(self): self.logger.info("Starting PerfKitBenchmarker Workloads.") diff --git a/lib/Rally.py b/lib/Rally.py index d5cd92185..34cd3cb99 100644 --- a/lib/Rally.py +++ b/lib/Rally.py @@ -1,6 +1,7 @@ from Connmon import Connmon from Tools import Tools from collections import OrderedDict +from Grafana import Grafana import datetime import glob import logging @@ -16,6 +17,7 @@ class Rally: self.config = config self.tools = Tools(self.config) self.connmon = Connmon(self.config) + self.grafana = Grafana(self.config) self.error_count = 0 self.test_count = 0 self.scenario_count = 0 @@ -40,34 +42,9 @@ class Rally: time.sleep(self.config['rally']['sleep_after']) to_ts = int(time.time() * 1000) - if 'grafana' in self.config and self.config['grafana']['enabled']: - grafana_ip = self.config['grafana']['grafana_ip'] - grafana_port = self.config['grafana']['grafana_port'] - url = 'http://{}:{}/dashboard/db/'.format(grafana_ip, grafana_port) - cloud_name = self.config['grafana']['cloud_name'] - for dashboard in self.config['grafana']['dashboards']: - full_url = '{}{}?from={}&to={}&var-Cloud={}'.format(url, dashboard, from_ts, to_ts, - cloud_name) - self.logger.info('{} - Grafana URL: {}'.format(test_name, full_url)) - if self.config['grafana']['snapshot']['enabled']: - hosts_file = self.config['ansible']['hosts'] - playbook = self.config['ansible']['grafana_snapshot'] - extra_vars = 'grafana_ip={} '.format(grafana_ip) - extra_vars += 'grafana_port={} '.format(grafana_port) - extra_vars += 'grafana_api_key={} '.format(self.config['grafana']['snapshot']['grafana_api_key']) - extra_vars += 'from={} '.format(from_ts) - extra_vars += 'to={} '.format(to_ts) - extra_vars += 'results_dir={}/{} '.format(result_dir, test_name) - extra_vars += 'var_cloud={} '.format(cloud_name) - if self.config['grafana']['snapshot']['snapshot_compute']: - extra_vars += 'snapshot_compute=true ' - snapshot_cmd = 'ansible-playbook -i {} {} -e "{}"'.format(hosts_file, playbook, - extra_vars) - subprocess_cmd = ['ansible-playbook', '-i', hosts_file, playbook, '-e', - '{}'.format(extra_vars)] - self.logger.info('Snapshot command: {}'.format(snapshot_cmd)) - snapshot_log = open('{}/snapshot.log'.format(result_dir), 'a+') - subprocess.Popen(subprocess_cmd, stdout=snapshot_log, stderr=subprocess.STDOUT) + self.grafana.print_dashboard_url(from_ts, to_ts, test_name) + self.grafana.log_snapshot_playbook_cmd(from_ts, to_ts, result_dir, test_name) + self.grafana.run_playbook(from_ts, to_ts, result_dir, test_name) def workload_logger(self, result_dir): base = result_dir.split('/') diff --git a/lib/Shaker.py b/lib/Shaker.py index 80df43df2..651ce2dec 100644 --- a/lib/Shaker.py +++ b/lib/Shaker.py @@ -1,15 +1,18 @@ from Tools import Tools +from Grafana import Grafana import yaml import logging import datetime import os import json +import time class Shaker: def __init__(self, config): self.logger=logging.getLogger('browbeat.Shaker') self.config = config self.tools = Tools(self.config) + self.grafana = Grafana(self.config) self.fail_scenarios = 0 self.pass_scenarios = 0 self.scenarios_count = 0 @@ -107,10 +110,19 @@ class Shaker: " --debug > {4}/{5}.log 2>&1").format(server_endpoint, port_no, flavor, filename, result_dir, test_name, timeout) cmd = ("{}; {}").format(cmd_1, cmd_2) + from_ts = int(time.time() * 1000) + if 'sleep_before' in self.config['shaker']: + time.sleep(self.config['shaker']['sleep_before']) self.tools.run_cmd(cmd) self.scenarios_count += 1 self.result_check(result_dir, test_name, scenario) - + if 'sleep_after' in self.config['shaker']: + time.sleep(self.config['shaker']['sleep_after']) + to_ts = int(time.time() * 1000) + #Snapshotting + self.grafana.print_dashboard_url(from_ts, to_ts, test_name) + self.grafana.log_snapshot_playbook_cmd(from_ts, to_ts, result_dir, test_name) + self.grafana.run_playbook(from_ts, to_ts, result_dir, test_name) def run_shaker(self): self.logger.info("Starting Shaker workloads")