def test_relate(self): self.rd = StanData() self.rd.append(1, StanDict(m4=4.0, m5=5.0, m2=1.0)) self.rd.append(2, StanDict(m4=None, m5=None, m2=2.0)) related_data = self.dd.relate(by_metric='m1', flat=False) self.assertEqual(self.rd, related_data)
def get_stat(jm) -> StanData: result = StanData() for ts in jm.index: metrics = StanDict() for metric in jm[ts]: metrics[metric] = jm[ts][metric] result.append(ts, metrics) return result
def __init__(self): self.file_path = None self.pandas_data_frame = None self.sec = 1000 self.sampling_time = 1 self.data = StanData() self.data_rps = StanData() self.__metrics = None
def setUp(self): self.d1 = StanData() self.d1.append(1499763762, StanDict(m1=1, m2=1)) self.d1.append(1499763761, StanDict(m1=2, m2=2)) self.d2 = StanData() self.d2.append(1499763762, StanDict(m4=4, m5=5)) self.d2.append(1499763763, StanDict(m4=4, m5=5)) self.dd = StanData() self.dd.append(1499763762, StanDict(m1=1, m2=1, m4=4, m5=5)) self.dd.append(1499763761, StanDict(m1=2, m2=2)) self.dd.append(1499763763, StanDict(m4=4, m5=5))
class JmeterCsvParser(Parser): def __init__(self): self.file_path = None self.pandas_data_frame = None self.sec = 1000 self.sampling_time = 1 self.data = StanData() self.data_rps = StanData() self.__metrics = None def __read_csv_to_df(self): """ # TODO: Описать возможные параметры для парсинга :return: """ read_csv_param = dict( index_col=['timeStamp'], low_memory=True, na_values=[' ', '', 'null'], converters={'timeStamp': lambda a: float(a) / self.sec}, ) self.pandas_data_frame = pd.read_csv(self.file_path, **read_csv_param) self.pandas_data_frame = self.pandas_data_frame[self.pandas_data_frame['success'] == True] return self.pandas_data_frame def __get_df_elapsed(self): """ :return: Таблица с elapsed в заголовке название запросов/операций """ self.pandas_data_frame['timeStamp_round'] = [round(a / 1) * 1 for a in self.pandas_data_frame.index] df_elapsed = self.pandas_data_frame.pivot_table( columns=['label'], index='timeStamp_round', values='elapsed', aggfunc=pd.np.mean, ) return df_elapsed def __get_df_rps(self): """ :return: таблица с rps в заголовке название запросов/операций """ self.pandas_data_frame['timeStamp_round'] = [round(a / 1) * 1 for a in self.pandas_data_frame.index] df_rps = self.pandas_data_frame.pivot_table( columns=['label'], index='timeStamp_round', values='SampleCount', aggfunc=pd.np.sum, ) return df_rps def __label_per_time(self): """ Наполнение структуры StanDict длительности отклика в заголовке название запросов/операций :return: """ df = self.__get_df_elapsed() for ts in df.index: record = StanDict() for label in self.__get_unique_label(): record[label] = df.get_value(ts, label) self.data.append(ts, record) def __rps_per_time(self): """ Наполнение структуры StanData rps по запросам/операциям :return: """ df = self.__get_df_rps() for ts in df.index: record = StanDict() for label in self.__get_unique_label(): record[label] = df.get_value(ts, label) self.data_rps.append(ts, record) def __success_samples_per_time(self): """ :return: """ samples_per_time = self.pandas_data_frame['SampleCount'].groupby( self.pandas_data_frame.index.map( lambda a: round(a / self.sampling_time) * self.sampling_time)).sum() # TODO: round? for ts in samples_per_time.keys(): self.data.append(ts, StanDict(SampleCount=samples_per_time.get(ts))) def __error_samples_per_time(self): """ :return: """ samples_per_time = self.pandas_data_frame['ErrorCount'].groupby( self.pandas_data_frame.index.map( lambda a: round(a / self.sampling_time) * self.sampling_time)).sum() for ts in samples_per_time.keys(): self.data.append(ts, StanDict(ErrorCount=samples_per_time.get(ts))) def __mean_per_time(self): """ Время отклика :return: """ _elapsed = self.pandas_data_frame['elapsed'].groupby( self.pandas_data_frame.index.map( lambda a: round(a / self.sampling_time) * self.sampling_time)).mean() for ts in _elapsed.keys(): self.data.append(ts, StanDict(elapsed_mean_all=_elapsed.get(ts))) def __thread_per_time(self): """ количество тредов :return: """ quant = self.pandas_data_frame['allThreads'].groupby( self.pandas_data_frame.index.map( lambda a: round(a / self.sampling_time) * self.sampling_time)).mean() for ts in quant.keys(): self.data.append(ts, StanDict(allThreads=quant.get(ts))) def __get_unique_label(self): """ :return: список уникальных запросов/транзакций """ label = set() for _ in self.pandas_data_frame['label'].unique(): label.add(_) return label def __get_analize(self): """ #TODO: пенести в отдельный модуль <label>: 95% rps:<>; 95% elapsed: <> :return: """ df = self.__get_df_elapsed() df_rps = self.__get_df_rps() print(' ') print('#results jmeter:') sample_count = self.pandas_data_frame['SampleCount'].sum() error_count = self.pandas_data_frame['ErrorCount'].sum() percent_error = error_count / (sample_count + error_count) * 100 print('Успешных запросов: ', sample_count, ' ', 'Ошибки: ', error_count) print('Недоступность продукта: {} %;'.format(percent_error), ' Доступность продукта: {} %;\n'.format(100 - percent_error)) print('Перцентиль – это накопленный (суммированный) процент встречаемости конкретного результата, \n' 'который складывается из процента встречаемости выбранного результата и всех предшествующих \n' 'ему результатов, т.е. стоящих ниже данного по своей величине.\n') print('{:<50}: mean rps: {:<10}| 95% elapsed: {:<10}|'. format('\tlabel', 'rps', 'elapsed')) for label in self.__get_unique_label(): print('{:>30}: mean rps: {:>10}| 95% elapsed: {:>10}|' .format(label, round(df_rps[label].mean(), 2), round(df[label].quantile(0.95), 2), )) def __analyze(self): """ :return: """ self.__success_samples_per_time() self.__error_samples_per_time() self.__mean_per_time() self.__thread_per_time() self.__label_per_time() self.__get_analize() def get_stat(self) -> StanData: return self.data def get_rps_stat(self) -> StanData: return self.data_rps def parse(self, file_path: str): self.file_path = file_path self.__read_csv_to_df() self.__analyze() def parser_rps(self, file_path: str): self.file_path = file_path self.__read_csv_to_df() self.__rps_per_time()
def test_save_and_load(self): self.d1.save('out.pkl') dd1 = StanData.load('out.pkl') self.assertEqual(dd1, self.d1)
class TestStanData(unittest.TestCase): def setUp(self): self.d1 = StanData() self.d1.append(1499763762, StanDict(m1=1, m2=1)) self.d1.append(1499763761, StanDict(m1=2, m2=2)) self.d2 = StanData() self.d2.append(1499763762, StanDict(m4=4, m5=5)) self.d2.append(1499763763, StanDict(m4=4, m5=5)) self.dd = StanData() self.dd.append(1499763762, StanDict(m1=1, m2=1, m4=4, m5=5)) self.dd.append(1499763761, StanDict(m1=2, m2=2)) self.dd.append(1499763763, StanDict(m4=4, m5=5)) def test_len_dd(self): dd = self.d1 + self.d2 self.assertEqual(dd, self.dd) def test_metrics_len(self): dd = self.d1 + self.d2 self.assertEqual(len(dd.metrics), 4) def test_save_and_load(self): self.d1.save('out.pkl') dd1 = StanData.load('out.pkl') self.assertEqual(dd1, self.d1) def test_append_not_StanDict(self): ''' исключение если передаем структуру не Standict :return: ''' pass def test_metrics_intersection(self): pass def test_flat(self): self.d1_f = StanFlatData() self.d1_f['timestamp'] = [1499763761, 1499763762] self.d1_f['index'] = [0, 1] self.d1_f['m2'] = [2, 1] self.d1_f['m1'] = [2, 1] self.assertEqual(self.d1.flat(), self.d1_f) def test_relate(self): self.rd = StanData() self.rd.append(1, StanDict(m4=4.0, m5=5.0, m2=1.0)) self.rd.append(2, StanDict(m4=None, m5=None, m2=2.0)) related_data = self.dd.relate(by_metric='m1', flat=False) self.assertEqual(self.rd, related_data) def test_relate_flat(self): self.rd_f = StanFlatData() self.rd_f['m1'] = [1, 2] self.rd_f['m2'] = [1.0, 2.0] self.rd_f['m4'] = [4.0, None] self.rd_f['m5'] = [5.0, None] related_data = self.dd.relate(by_metric='m1') self.assertEqual(related_data, self.rd_f)
return jm def get_stat(jm) -> StanData: result = StanData() for ts in jm.index: metrics = StanDict() for metric in jm[ts]: metrics[metric] = jm[ts][metric] result.append(ts, metrics) return result if __name__ == '__main__': JM_RES = '/home/usr/stan/examples/files/jm_sg.csv' GRAPH_DIR = '/home/usr/Dropbox/projects/stan/examples/files/' __metrics = None data = StanData() jm = read_csv_to_df(JM_RES) print('1: ', jm.shape) __metrics = jm['label'].unique() data = set() jm.index = [round(a / 1) * 1 for a in jm.index] for ts in jm.index: for _ in __metrics: data.add(ts, _, jm[ts][_])