Read active instances info from new phantom stat

This commit is contained in:
Andrey Pohilko 2014-04-01 17:53:55 +04:00
parent 0032955547
commit 6aad093a18
5 changed files with 558 additions and 156 deletions

View File

@ -1,4 +1,13 @@
""" Contains Phantom Plugin, Console widgets, result reader classes """ """ Contains Phantom Plugin, Console widgets, result reader classes """
# FIXME: 3 there is no graceful way to interrupt the process of phout import
import json
import os
import socket
import subprocess
import sys
import time
import datetime
from Tank.Plugins import ConsoleScreen from Tank.Plugins import ConsoleScreen
from Tank.Plugins.Aggregator import AggregatorPlugin, AggregateResultListener, \ from Tank.Plugins.Aggregator import AggregatorPlugin, AggregateResultListener, \
AbstractReader AbstractReader
@ -6,20 +15,10 @@ from Tank.Plugins.Autostop import AutostopPlugin, AbstractCriteria
from Tank.Plugins.ConsoleOnline import ConsoleOnlinePlugin, AbstractInfoWidget from Tank.Plugins.ConsoleOnline import ConsoleOnlinePlugin, AbstractInfoWidget
from Tank.Plugins.PhantomUtils import PhantomConfig from Tank.Plugins.PhantomUtils import PhantomConfig
from tankcore import AbstractPlugin from tankcore import AbstractPlugin
import os
import socket
import subprocess
import sys
import tankcore import tankcore
import time
import datetime
# FIXME: 3 there is no graceful way to interrupt the process in phout
# import mode
class PhantomPlugin(AbstractPlugin, AggregateResultListener): class PhantomPlugin(AbstractPlugin, AggregateResultListener):
""" Plugin for running phantom tool """ """ Plugin for running phantom tool """
OPTION_CONFIG = "config" OPTION_CONFIG = "config"
@ -201,7 +200,6 @@ class PhantomPlugin(AbstractPlugin, AggregateResultListener):
class PhantomProgressBarWidget(AbstractInfoWidget, AggregateResultListener): class PhantomProgressBarWidget(AbstractInfoWidget, AggregateResultListener):
""" """
Widget that displays progressbar Widget that displays progressbar
""" """
@ -266,10 +264,8 @@ class PhantomProgressBarWidget(AbstractInfoWidget, AggregateResultListener):
progress_chars = '=' * (int(pb_width * progress) - 1) progress_chars = '=' * (int(pb_width * progress) - 1)
progress_chars += self.krutilka.next() progress_chars += self.krutilka.next()
res += color_bg + progress_chars + screen.markup.RESET + color_fg + \ res += color_bg + progress_chars + screen.markup.RESET + color_fg
'~' * \ res += '~' * (pb_width - int(pb_width * progress)) + screen.markup.RESET + ' '
(pb_width - int(pb_width * progress)) + \
screen.markup.RESET + ' '
res += str_perc + "\n" res += str_perc + "\n"
eta = 'ETA: %s' % eta_time eta = 'ETA: %s' % eta_time
@ -284,7 +280,6 @@ class PhantomProgressBarWidget(AbstractInfoWidget, AggregateResultListener):
class PhantomInfoWidget(AbstractInfoWidget, AggregateResultListener): class PhantomInfoWidget(AbstractInfoWidget, AggregateResultListener):
""" """
Widget with information about current run state Widget with information about current run state
""" """
@ -323,11 +318,9 @@ class PhantomInfoWidget(AbstractInfoWidget, AggregateResultListener):
res += "Active instances: " res += "Active instances: "
if float(self.instances) / self.instances_limit > 0.8: if float(self.instances) / self.instances_limit > 0.8:
res += screen.markup.RED + \ res += screen.markup.RED + str(self.instances) + screen.markup.RESET
str(self.instances) + screen.markup.RESET
elif float(self.instances) / self.instances_limit > 0.5: elif float(self.instances) / self.instances_limit > 0.5:
res += screen.markup.YELLOW + \ res += screen.markup.YELLOW + str(self.instances) + screen.markup.RESET
str(self.instances) + screen.markup.RESET
else: else:
res += str(self.instances) res += str(self.instances)
@ -340,24 +333,18 @@ class PhantomInfoWidget(AbstractInfoWidget, AggregateResultListener):
res += "\n Accuracy: " res += "\n Accuracy: "
if self.selfload < 80: if self.selfload < 80:
res += screen.markup.RED + \ res += screen.markup.RED + ('%.2f' % self.selfload) + screen.markup.RESET
('%.2f' % self.selfload) + screen.markup.RESET
elif self.selfload < 95: elif self.selfload < 95:
res += screen.markup.YELLOW + \ res += screen.markup.YELLOW + ('%.2f' % self.selfload) + screen.markup.RESET
('%.2f' % self.selfload) + screen.markup.RESET
else: else:
res += ('%.2f' % self.selfload) res += ('%.2f' % self.selfload)
res += "%\n Time lag: " res += "%\n Time lag: "
if self.time_lag > self.owner.buffered_seconds * 5: if self.time_lag > self.owner.buffered_seconds * 5:
self.log.debug("Time lag: %s", self.time_lag) self.log.debug("Time lag: %s", self.time_lag)
res += screen.markup.RED + \ res += screen.markup.RED + str(datetime.timedelta(seconds=self.time_lag)) + screen.markup.RESET
str(datetime.timedelta(seconds=self.time_lag)) + \
screen.markup.RESET
elif self.time_lag > self.owner.buffered_seconds: elif self.time_lag > self.owner.buffered_seconds:
res += screen.markup.YELLOW + \ res += screen.markup.YELLOW + str(datetime.timedelta(seconds=self.time_lag)) + screen.markup.RESET
str(datetime.timedelta(seconds=self.time_lag)) + \
screen.markup.RESET
else: else:
res += str(datetime.timedelta(seconds=self.time_lag)) res += str(datetime.timedelta(seconds=self.time_lag))
@ -378,10 +365,7 @@ class PhantomInfoWidget(AbstractInfoWidget, AggregateResultListener):
class PhantomReader(AbstractReader): class PhantomReader(AbstractReader):
""" Adapter to read phout files """
"""
Adapter to read phout files
"""
def __init__(self, owner, phantom): def __init__(self, owner, phantom):
AbstractReader.__init__(self, owner) AbstractReader.__init__(self, owner)
@ -390,10 +374,10 @@ class PhantomReader(AbstractReader):
self.phout = None self.phout = None
self.stat = None self.stat = None
self.stat_data = {} self.stat_data = {}
self.pending_datetime = None
self.steps = [] self.steps = []
self.first_request_time = sys.maxint self.first_request_time = sys.maxint
self.partial_buffer = '' self.partial_buffer = ''
self.stat_read_buffer = ''
self.pending_second_data_queue = [] self.pending_second_data_queue = []
self.last_sample_time = 0 self.last_sample_time = 0
self.read_lines_count = 0 self.read_lines_count = 0
@ -412,6 +396,7 @@ class PhantomReader(AbstractReader):
"Opening stat file: %s", self.phantom.phantom.stat_log) "Opening stat file: %s", self.phantom.phantom.stat_log)
self.stat = open(self.phantom.phantom.stat_log, 'r') self.stat = open(self.phantom.phantom.stat_log, 'r')
def close_files(self): def close_files(self):
if self.stat: if self.stat:
self.stat.close() self.stat.close()
@ -419,33 +404,40 @@ class PhantomReader(AbstractReader):
if self.phout: if self.phout:
self.phout.close() self.phout.close()
def get_next_sample(self, force): def get_next_sample(self, force):
if self.stat and len(self.data_queue) < self.buffered_seconds * 2: if self.stat and len(self.data_queue) < self.buffered_seconds * 2:
self.__read_stat_data() self.__read_stat_data()
return self.__read_phout_data(force) return self.__read_phout_data(force)
def __read_stat_data(self): def __read_stat_data(self):
""" Read active instances info """ """ Read active instances info """
stat = self.stat.readlines() end_marker = "\n},"
for line in stat: self.stat_read_buffer += self.stat.read()
if line.startswith('time\t'): while end_marker in self.stat_read_buffer:
date_str = line[len('time:\t') - 1:].strip()[:-5].strip() chunk_str = self.stat_read_buffer[:self.stat_read_buffer.find(end_marker) + len(end_marker) - 1]
date_obj = datetime.datetime.strptime( self.stat_read_buffer = self.stat_read_buffer[self.stat_read_buffer.find(end_marker) + len(end_marker) + 1:]
date_str, '%Y-%m-%d %H:%M:%S') chunk = json.loads("{%s}" % chunk_str)
self.pending_datetime = int(time.mktime(date_obj.timetuple())) self.log.debug("Stat chunk (left %s bytes): %s", len(self.stat_read_buffer), chunk)
self.stat_data[self.pending_datetime] = 0
if line.startswith('tasks\t'):
if not self.pending_datetime:
raise RuntimeError(
"Can't have tasks info without timestamp")
self.stat_data[self.pending_datetime] += int( for date_str in chunk.keys():
line[len('tasks\t'):]) statistics = chunk[date_str]
self.log.debug(
"Active instances: %s=>%s", self.pending_datetime, self.stat_data[self.pending_datetime]) date_obj = datetime.datetime.strptime(date_str.split(".")[0], '%Y-%m-%d %H:%M:%S')
pending_datetime = int(time.mktime(date_obj.timetuple()))
self.stat_data[pending_datetime] = 0
for benchmark_name in statistics.keys():
if not benchmark_name.startswith("benchmark_io"):
continue
benchmark = statistics[benchmark_name]
self.stat_data[pending_datetime] += benchmark["stream_method"]["mmtasks"][2]
self.log.debug("Active instances: %s=>%s", pending_datetime, self.stat_data[pending_datetime])
self.log.debug("Instances info buffer size: %s", len(self.stat_data)) self.log.debug("Instances info buffer size: %s", len(self.stat_data))
def __read_phout_data(self, force): def __read_phout_data(self, force):
""" Read phantom results """ """ Read phantom results """
if self.phout and len(self.data_queue) < self.buffered_seconds * 2: if self.phout and len(self.data_queue) < self.buffered_seconds * 2:
@ -499,16 +491,15 @@ class PhantomReader(AbstractReader):
# accuracy # accuracy
data_item = (data[1], active, rt_real / 1000, data[11], data[10], data_item = (data[1], active, rt_real / 1000, data[11], data[10],
int(data[8]), int(data[9]), int(data[8]), int(data[9]),
int(data[3]) / 1000, int(data[4]) / 1000, int( int(data[3]) / 1000, int(data[4]) / 1000,
data[5]) / 1000, int(data[6]) / 1000, int(data[5]) / 1000, int(data[6]) / 1000,
(float(data[7]) + 1) / (rt_real + 1)) (float(data[7]) + 1) / (rt_real + 1))
self.data_buffer[cur_time].append(data_item) self.data_buffer[cur_time].append(data_item)
spent = time.time() - time_before spent = time.time() - time_before
if spent: if spent:
self.log.debug( self.log.debug("Parsing speed: %s lines/sec", int(len(phout) / spent))
"Parsing speed: %s lines/sec", int(len(phout) / spent))
self.log.debug("Read lines total: %s", self.read_lines_count) self.log.debug("Read lines total: %s", self.read_lines_count)
self.log.debug("Seconds queue: %s", self.data_queue) self.log.debug("Seconds queue: %s", self.data_queue)
self.log.debug("Seconds buffer (up to %s): %s", self.log.debug("Seconds buffer (up to %s): %s",
@ -581,7 +572,6 @@ class PhantomReader(AbstractReader):
class UsedInstancesCriteria(AbstractCriteria): class UsedInstancesCriteria(AbstractCriteria):
""" """
Autostop criteria, based on active instances count Autostop criteria, based on active instances count
""" """

View File

@ -38,7 +38,7 @@ setup_t stat_setup = setup_stat_t {
io_t monitor_io = io_monitor_t { io_t monitor_io = io_monitor_t {
list = { benchmark_io $stat_benchmarks } list = { main_scheduler benchmark_io $stat_benchmarks }
stat_id = default stat_id = default
period = 1s period = 1s

View File

@ -15,107 +15,107 @@ class PhantomPluginTestCase(TankTestCase):
core.load_plugins() core.load_plugins()
core.plugins_configure() core.plugins_configure()
core.plugins_prepare_test() core.plugins_prepare_test()
self.foo = PhantomPlugin(core) self.phantom_plugin_instance = PhantomPlugin(core)
def tearDown(self): def tearDown(self):
del self.foo del self.phantom_plugin_instance
self.foo = None self.phantom_plugin_instance = None
if os.path.exists("ready_conf_phout.txt"): if os.path.exists("ready_conf_phout.txt"):
os.remove("ready_conf_phout.txt") os.remove("ready_conf_phout.txt")
def test_run(self): def test_run(self):
self.foo.core.set_option(PhantomPlugin.SECTION, "config", '') self.phantom_plugin_instance.core.set_option(PhantomPlugin.SECTION, "config", '')
self.foo.configure() self.phantom_plugin_instance.configure()
self.foo.prepare_test() self.phantom_plugin_instance.prepare_test()
reader = PhantomReader(AggregatorPlugin(self.foo.core), self.foo) reader = PhantomReader(AggregatorPlugin(self.phantom_plugin_instance.core), self.phantom_plugin_instance)
reader.phout_file = self.foo.phantom.phout_file reader.phout_file = self.phantom_plugin_instance.phantom.phout_file
self.foo.start_test() self.phantom_plugin_instance.start_test()
while self.foo.is_test_finished() < 0: while self.phantom_plugin_instance.is_test_finished() < 0:
self.foo.log.debug("Not finished") self.phantom_plugin_instance.log.debug("Not finished")
reader.check_open_files() reader.check_open_files()
reader.get_next_sample(False) reader.get_next_sample(False)
time.sleep(1) time.sleep(1)
if self.foo.is_test_finished() != 0: if self.phantom_plugin_instance.is_test_finished() != 0:
raise RuntimeError("RC: %s" % self.foo.is_test_finished()) raise RuntimeError("RC: %s" % self.phantom_plugin_instance.is_test_finished())
self.foo.end_test(0) self.phantom_plugin_instance.end_test(0)
reader.get_next_sample(True) reader.get_next_sample(True)
def test_run_ready_conf(self): def test_run_ready_conf(self):
self.foo.core.set_option(PhantomPlugin.SECTION, "config", 'data/phantom_ready.conf') self.phantom_plugin_instance.core.set_option(PhantomPlugin.SECTION, "config", 'data/phantom_ready.conf')
self.foo.core.add_artifact_file("ready_conf_phout.txt") self.phantom_plugin_instance.core.add_artifact_file("ready_conf_phout.txt")
self.foo.configure() self.phantom_plugin_instance.configure()
self.foo.prepare_test() self.phantom_plugin_instance.prepare_test()
self.foo.start_test() self.phantom_plugin_instance.start_test()
while self.foo.is_test_finished() < 0: while self.phantom_plugin_instance.is_test_finished() < 0:
self.foo.log.debug("Not finished") self.phantom_plugin_instance.log.debug("Not finished")
time.sleep(1) time.sleep(1)
if self.foo.is_test_finished() != 0: if self.phantom_plugin_instance.is_test_finished() != 0:
raise RuntimeError("RC: %s" % self.foo.is_test_finished()) raise RuntimeError("RC: %s" % self.phantom_plugin_instance.is_test_finished())
self.assertTrue(os.path.getsize("ready_conf_phout.txt") > 0) self.assertTrue(os.path.getsize("ready_conf_phout.txt") > 0)
self.foo.end_test(0) self.phantom_plugin_instance.end_test(0)
def test_run_uri_style(self): def test_run_uri_style(self):
self.foo.set_option("ammofile", "") self.phantom_plugin_instance.set_option("ammofile", "")
self.foo.set_option("uris", "/") self.phantom_plugin_instance.set_option("uris", "/")
self.foo.configure() self.phantom_plugin_instance.configure()
self.foo.prepare_test() self.phantom_plugin_instance.prepare_test()
self.foo.start_test() self.phantom_plugin_instance.start_test()
while self.foo.is_test_finished() < 0: while self.phantom_plugin_instance.is_test_finished() < 0:
self.foo.log.debug("Not finished") self.phantom_plugin_instance.log.debug("Not finished")
time.sleep(1) time.sleep(1)
if self.foo.is_test_finished() != 0: if self.phantom_plugin_instance.is_test_finished() != 0:
raise RuntimeError("RC: %s" % self.foo.is_test_finished()) raise RuntimeError("RC: %s" % self.phantom_plugin_instance.is_test_finished())
self.foo.end_test(0) self.phantom_plugin_instance.end_test(0)
def test_run_interrupt(self): def test_run_interrupt(self):
self.foo.configure() self.phantom_plugin_instance.configure()
self.foo.prepare_test() self.phantom_plugin_instance.prepare_test()
self.foo.start_test() self.phantom_plugin_instance.start_test()
time.sleep(2) time.sleep(2)
self.foo.end_test(0) self.phantom_plugin_instance.end_test(0)
def test_run_stepper_cache(self): def test_run_stepper_cache(self):
self.foo.configure() self.phantom_plugin_instance.configure()
self.foo.prepare_test() self.phantom_plugin_instance.prepare_test()
self.foo.prepare_test() self.phantom_plugin_instance.prepare_test()
def test_domain_name(self): def test_domain_name(self):
self.foo.core.set_option('phantom', 'address', 'yandex.ru:443') self.phantom_plugin_instance.core.set_option('phantom', 'address', 'yandex.ru:443')
self.foo.configure() self.phantom_plugin_instance.configure()
self.assertEqual("443", self.foo.get_info().port) self.assertEqual("443", self.phantom_plugin_instance.get_info().port)
self.assertEqual("yandex.ru", self.foo.get_info().address) self.assertEqual("yandex.ru", self.phantom_plugin_instance.get_info().address)
def test_domain_name_and_port(self): def test_domain_name_and_port(self):
self.foo.core.set_option('phantom', 'address', 'yandex.ru:80') self.phantom_plugin_instance.core.set_option('phantom', 'address', 'yandex.ru:80')
self.foo.configure() self.phantom_plugin_instance.configure()
def test_ipv4(self): def test_ipv4(self):
self.foo.core.set_option('phantom', 'address', '127.0.0.1') self.phantom_plugin_instance.core.set_option('phantom', 'address', '127.0.0.1')
self.foo.configure() self.phantom_plugin_instance.configure()
def test_ipv6(self): def test_ipv6(self):
self.foo.core.set_option('phantom', 'address', '2a02:6b8:0:c1f::161:cd') self.phantom_plugin_instance.core.set_option('phantom', 'address', '2a02:6b8:0:c1f::161:cd')
self.foo.configure() self.phantom_plugin_instance.configure()
def test_ipv4_and_port(self): def test_ipv4_and_port(self):
self.foo.core.set_option('phantom', 'address', '127.0.0.1:80') self.phantom_plugin_instance.core.set_option('phantom', 'address', '127.0.0.1:80')
self.foo.configure() self.phantom_plugin_instance.configure()
def test_domain_name_fail(self): def test_domain_name_fail(self):
self.foo.core.set_option('phantom', 'address', 'ya.ru') self.phantom_plugin_instance.core.set_option('phantom', 'address', 'ya.ru')
try: try:
self.foo.configure() self.phantom_plugin_instance.configure()
raise RuntimeError() raise RuntimeError()
except: except:
pass pass
def test_reader(self): def test_reader(self):
self.foo.phantom_start_time = time.time() self.phantom_plugin_instance.phantom_start_time = time.time()
reader = PhantomReader(AggregatorPlugin(self.foo.core), self.foo) reader = PhantomReader(AggregatorPlugin(self.phantom_plugin_instance.core), self.phantom_plugin_instance)
reader.phout_file = 'data/phout_timeout_mix.txt' reader.phout_file = 'data/phout_timeout_mix.txt'
reader.check_open_files() reader.check_open_files()
@ -130,76 +130,75 @@ class PhantomPluginTestCase(TankTestCase):
def test_stepper_no_steps(self): def test_stepper_no_steps(self):
self.foo.core.set_option('phantom', 'rps_schedule', '') self.phantom_plugin_instance.core.set_option('phantom', 'rps_schedule', '')
self.foo.core.set_option('phantom', 'instances_schedule', '') self.phantom_plugin_instance.core.set_option('phantom', 'instances_schedule', '')
wrapper = StepperWrapper(self.foo.core, PhantomPlugin.SECTION) wrapper = StepperWrapper(self.phantom_plugin_instance.core, PhantomPlugin.SECTION)
wrapper.ammo_file = 'data/dummy.ammo' wrapper.ammo_file = 'data/dummy.ammo'
wrapper.prepare_stepper() wrapper.prepare_stepper()
wrapper.prepare_stepper() wrapper.prepare_stepper()
def test_stepper_instances_sched(self): def test_stepper_instances_sched(self):
self.foo.core.set_option('phantom', 'instances', '1000') self.phantom_plugin_instance.core.set_option('phantom', 'instances', '1000')
self.foo.core.set_option('phantom', 'rps_schedule', '') self.phantom_plugin_instance.core.set_option('phantom', 'rps_schedule', '')
self.foo.core.set_option('phantom', 'instances_schedule', 'line(1,100,1m)') self.phantom_plugin_instance.core.set_option('phantom', 'instances_schedule', 'line(1,100,1m)')
self.foo.core.set_option('phantom', 'use_caching', '0') self.phantom_plugin_instance.core.set_option('phantom', 'use_caching', '0')
self.foo.core.set_option('phantom', 'ammo_file', 'data/dummy.ammo') self.phantom_plugin_instance.core.set_option('phantom', 'ammo_file', 'data/dummy.ammo')
wrapper = StepperWrapper(self.foo.core, PhantomPlugin.SECTION) wrapper = StepperWrapper(self.phantom_plugin_instance.core, PhantomPlugin.SECTION)
wrapper.read_config() wrapper.read_config()
wrapper.prepare_stepper() wrapper.prepare_stepper()
self.assertEqual(100, wrapper.instances) self.assertEqual(100, wrapper.instances)
def test_stepper_instances_override(self): def test_stepper_instances_override(self):
self.foo.core.set_option('phantom', 'instances', '20000') self.phantom_plugin_instance.core.set_option('phantom', 'instances', '20000')
self.foo.core.set_option('phantom', 'rps_schedule', 'line(1,100,1m)') self.phantom_plugin_instance.core.set_option('phantom', 'rps_schedule', 'line(1,100,1m)')
self.foo.core.set_option('phantom', 'use_caching', '0') self.phantom_plugin_instance.core.set_option('phantom', 'use_caching', '0')
self.foo.core.set_option('phantom', 'ammo_file', 'data/dummy.ammo') self.phantom_plugin_instance.core.set_option('phantom', 'ammo_file', 'data/dummy.ammo')
wrapper = StepperWrapper(self.foo.core, PhantomPlugin.SECTION) wrapper = StepperWrapper(self.phantom_plugin_instance.core, PhantomPlugin.SECTION)
wrapper.read_config() wrapper.read_config()
wrapper.prepare_stepper() wrapper.prepare_stepper()
self.assertEqual(20000, wrapper.instances) self.assertEqual(20000, wrapper.instances)
def test_cached_stepper_instances_sched(self): def test_cached_stepper_instances_sched(self):
# Making cache file # Making cache file
self.foo.core.set_option('phantom', 'instances', '1000') self.phantom_plugin_instance.core.set_option('phantom', 'instances', '1000')
self.foo.core.set_option('phantom', 'rps_schedule', '') self.phantom_plugin_instance.core.set_option('phantom', 'rps_schedule', '')
self.foo.core.set_option('phantom', 'instances_schedule', 'line(1,100,1m)') self.phantom_plugin_instance.core.set_option('phantom', 'instances_schedule', 'line(1,100,1m)')
self.foo.core.set_option('phantom', 'ammo_file', 'data/dummy.ammo') self.phantom_plugin_instance.core.set_option('phantom', 'ammo_file', 'data/dummy.ammo')
wrapper = StepperWrapper(self.foo.core, PhantomPlugin.SECTION) wrapper = StepperWrapper(self.phantom_plugin_instance.core, PhantomPlugin.SECTION)
wrapper.read_config() wrapper.read_config()
wrapper.prepare_stepper() wrapper.prepare_stepper()
self.tearDown() self.tearDown()
self.setUp() self.setUp()
self.foo.core.set_option('phantom', 'instances', '1000') self.phantom_plugin_instance.core.set_option('phantom', 'instances', '1000')
self.foo.core.set_option('phantom', 'rps_schedule', '') self.phantom_plugin_instance.core.set_option('phantom', 'rps_schedule', '')
self.foo.core.set_option('phantom', 'instances_schedule', 'line(1,100,1m)') self.phantom_plugin_instance.core.set_option('phantom', 'instances_schedule', 'line(1,100,1m)')
self.foo.core.set_option('phantom', 'ammo_file', 'data/dummy.ammo') self.phantom_plugin_instance.core.set_option('phantom', 'ammo_file', 'data/dummy.ammo')
wrapper = StepperWrapper(self.foo.core, PhantomPlugin.SECTION) wrapper = StepperWrapper(self.phantom_plugin_instance.core, PhantomPlugin.SECTION)
wrapper.read_config() wrapper.read_config()
wrapper.prepare_stepper() wrapper.prepare_stepper()
self.assertEqual(100, wrapper.instances) self.assertEqual(100, wrapper.instances)
def test_phout_import(self): def test_phout_import(self):
self.foo.core.set_option('phantom', 'phout_file', 'data/phout_timeout_mix.txt') self.phantom_plugin_instance.core.set_option('phantom', 'phout_file', 'data/phout_timeout_mix.txt')
self.foo.core.set_option('phantom', 'instances', '1') self.phantom_plugin_instance.core.set_option('phantom', 'instances', '1')
self.foo.core.set_option('phantom', 'ammo_count', '1') self.phantom_plugin_instance.core.set_option('phantom', 'ammo_count', '1')
self.foo.configure() self.phantom_plugin_instance.configure()
self.foo.prepare_test() self.phantom_plugin_instance.prepare_test()
self.foo.start_test() self.phantom_plugin_instance.start_test()
self.assertEqual(self.foo.is_test_finished(), -1) self.assertEqual(self.phantom_plugin_instance.is_test_finished(), -1)
sec = SecondAggregateData() sec = SecondAggregateData()
sec.overall.RPS = 1 sec.overall.RPS = 1
self.foo.aggregate_second(sec) self.phantom_plugin_instance.aggregate_second(sec)
self.assertEqual(self.foo.is_test_finished(), -1) self.assertEqual(self.phantom_plugin_instance.is_test_finished(), -1)
self.assertEqual(self.foo.is_test_finished(), 0) self.assertEqual(self.phantom_plugin_instance.is_test_finished(), 0)
self.foo.end_test(0) self.phantom_plugin_instance.end_test(0)
self.foo.post_process(0) self.phantom_plugin_instance.post_process(0)
def test_cached_stpd_info(self): def test_cached_stpd_info(self):
self.foo.core.set_option('phantom', 'stpd_file', 'data/dummy.ammo.stpd') self.phantom_plugin_instance.core.set_option('phantom', 'stpd_file', 'data/dummy.ammo.stpd')
wrapper = StepperWrapper(self.foo.core, PhantomPlugin.SECTION) wrapper = StepperWrapper(self.phantom_plugin_instance.core, PhantomPlugin.SECTION)
wrapper.read_config() wrapper.read_config()
wrapper.prepare_stepper() wrapper.prepare_stepper()
self.assertEqual(10, wrapper.instances) self.assertEqual(10, wrapper.instances)

View File

@ -7,7 +7,24 @@ phantom_path=phantom
#config=data/phantom_ready.conf #config=data/phantom_ready.conf
ammofile=data/dummy.ammo ammofile=data/dummy.ammo
#instances_schedule=line(1,10,1m) #instances_schedule=line(1,10,1m)
loop=1 #loop=1
ammo_limit=100
rps_schedule=const(1,1) line(1,5,10)
#uris=/
# /test
# /test2
headers=Host: www.ya.ru
Connection: close
use_caching=1
[phantom-1]
phantom_path=phantom
#config=data/phantom_ready.conf
ammofile=data/dummy.ammo
#instances_schedule=line(1,10,1m)
#loop=1
ammo_limit=100 ammo_limit=100
rps_schedule=const(1,1) line(1,5,10) rps_schedule=const(1,1) line(1,5,10)
#uris=/ #uris=/

View File

@ -0,0 +1,396 @@
"2014-03-31 21:09:10.798 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { "674 -- 1074" : 18, "423 -- 674" : 37 }
}
},
"stream_method" : {
"conns" : [482, 459],
"in" : [1469370, 1399557],
"out" : [8676, 8263],
"mmtasks" : [0, 952, 1000],
"load" : 0.000,
"mcount" : {
"mcount" : { "Success" : 55 }
},
"http_proto0" : {
"mcount" : {
"mcount" : { "OK" : 55 }
}
},
"source_log" : {
"delta" : [0, 45812, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [55, 52],
"out" : [3701, 3524]
}
}
}
}
},
"2014-03-31 21:09:11.799 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { "1710 -- 2723" : 12, "1074 -- 1710" : 85, "674 -- 1074" : 5 }
}
},
"stream_method" : {
"conns" : [0, 0],
"in" : [1966188, 1964954],
"out" : [0, 0],
"mmtasks" : [843, 881, 945],
"load" : 0.000,
"mcount" : {
"mcount" : { "Success" : 102 }
},
"http_proto0" : {
"mcount" : {
"mcount" : { "OK" : 102 }
}
},
"source_log" : {
"delta" : [47508, 48016, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [102, 101],
"out" : [7104, 7099]
}
}
}
}
},
"2014-03-31 21:09:12.799 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { "2723 -- 4337" : 38, "1710 -- 2723" : 68 }
}
},
"stream_method" : {
"conns" : [144, 144],
"in" : [1859994, 1860232],
"out" : [2592, 2592],
"mmtasks" : [737, 784, 843],
"load" : 0.000,
"mcount" : {
"mcount" : { "Success" : 106 }
},
"http_proto0" : {
"mcount" : {
"mcount" : { "OK" : 106 }
}
},
"source_log" : {
"delta" : [47508, 48005, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [106, 106],
"out" : [7435, 7435]
}
}
}
}
},
"2014-03-31 21:09:13.799 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { "2723 -- 4337" : 94 }
}
},
"stream_method" : {
"conns" : [0, 0],
"in" : [1970467, 1970977],
"out" : [0, 0],
"mmtasks" : [643, 687, 737],
"load" : 0.000,
"mcount" : {
"mcount" : { "Success" : 94 }
},
"http_proto0" : {
"mcount" : {
"mcount" : { "OK" : 94 }
}
},
"source_log" : {
"delta" : [47508, 48012, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [94, 94],
"out" : [6722, 6723]
}
}
}
}
},
"2014-03-31 21:09:14.799 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { "4337 -- 6907" : 47, "2723 -- 4337" : 25 }
}
},
"stream_method" : {
"conns" : [0, 0],
"in" : [1643815, 1643272],
"out" : [0, 0],
"mmtasks" : [571, 598, 643],
"load" : 0.000,
"mcount" : {
"mcount" : { "Success" : 72 }
},
"http_proto0" : {
"mcount" : {
"mcount" : { "OK" : 72 }
}
},
"source_log" : {
"delta" : [47508, 47984, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [72, 71],
"out" : [5210, 5208]
}
}
}
}
},
"2014-03-31 21:09:15.799 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { "4337 -- 6907" : 100 }
}
},
"stream_method" : {
"conns" : [0, 0],
"in" : [1594333, 1594191],
"out" : [0, 0],
"mmtasks" : [471, 510, 571],
"load" : 0.000,
"mcount" : {
"mcount" : { "Success" : 100 }
},
"http_proto0" : {
"mcount" : {
"mcount" : { "OK" : 100 }
}
},
"source_log" : {
"delta" : [47508, 47995, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [100, 99],
"out" : [7269, 7268]
}
}
}
}
},
"2014-03-31 21:09:16.798 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { "4337 -- 6907" : 97 }
}
},
"stream_method" : {
"conns" : [56, 56],
"in" : [1837381, 1839245],
"out" : [1008, 1009],
"mmtasks" : [374, 416, 471],
"load" : 0.000,
"mcount" : {
"mcount" : { "Success" : 97 }
},
"http_proto0" : {
"mcount" : {
"mcount" : { "OK" : 97 }
}
},
"source_log" : {
"delta" : [47508, 48000, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [97, 97],
"out" : [7043, 7050]
}
}
}
}
},
"2014-03-31 21:09:17.799 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { "6907 -- 11000" : 85 }
}
},
"stream_method" : {
"conns" : [117, 116],
"in" : [1967289, 1965557],
"out" : [2106, 2104],
"mmtasks" : [289, 335, 374],
"load" : 0.000,
"mcount" : {
"mcount" : { "Success" : 85 }
},
"http_proto0" : {
"mcount" : {
"mcount" : { "OK" : 85 }
}
},
"source_log" : {
"delta" : [47508, 48005, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [85, 84],
"out" : [6079, 6073]
}
}
}
}
},
"2014-03-31 21:09:18.799 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { "6907 -- 11000" : 88 }
}
},
"stream_method" : {
"conns" : [0, 0],
"in" : [1443060, 1443049],
"out" : [0, 0],
"mmtasks" : [201, 233, 289],
"load" : 0.000,
"mcount" : {
"mcount" : { "Success" : 88 }
},
"http_proto0" : {
"mcount" : {
"mcount" : { "OK" : 88 }
}
},
"source_log" : {
"delta" : [47508, 47999, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [88, 87],
"out" : [6354, 6353]
}
}
}
}
},
"2014-03-31 21:09:19.799 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { }
}
},
"stream_method" : {
"conns" : [0, 0],
"in" : [0, 0],
"out" : [0, 0],
"mmtasks" : [201, 201, 201],
"load" : 0.000,
"mcount" : {
"mcount" : { }
},
"http_proto0" : {
"mcount" : {
"mcount" : { }
}
},
"source_log" : {
"delta" : [47508, 48013, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [0, 0],
"out" : [0, 0]
}
}
}
}
},
"2014-03-31 21:09:20.799 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { "11000 --" : 198 }
}
},
"stream_method" : {
"conns" : [0, 0],
"in" : [0, 0],
"out" : [0, 0],
"mmtasks" : [3, 199, 201],
"load" : 0.000,
"mcount" : {
"mcount" : { "Connection timed out" : 198 }
},
"http_proto0" : {
"mcount" : {
"mcount" : { }
}
},
"source_log" : {
"delta" : [47508, 47997, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [199, 198],
"out" : [11741, 11740]
}
}
}
}
},
"2014-03-31 21:09:20.799 +0400" : {
"benchmark_io" : {
"simple_times" : {
"mcount" : {
"mcount" : { "11000 --" : 3 }
}
},
"stream_method" : {
"conns" : [0, 0],
"in" : [0, 0],
"out" : [0, 0],
"mmtasks" : [0, 1, 3],
"load" : 0.000,
"mcount" : {
"mcount" : { "Connection timed out" : 3 }
},
"http_proto0" : {
"mcount" : {
"mcount" : { }
}
},
"source_log" : {
"delta" : [47508, 0, 47508]
},
"loggers" : {
"brief_logger" : {
"records" : [2, 7299],
"out" : [118, 430656]
}
}
}
}
}