def test_get_grouped_profiled_requests(session, request_1, endpoint): assert not get_grouped_profiled_requests(session, endpoint_id=endpoint.id) add_stack_line(session, request_id=request_1.id, position=0, indent=1, duration=1, code_line="code") session.commit() assert get_grouped_profiled_requests(session, endpoint_id=endpoint.id)
def test_get_grouped_profiled_requests(self): with session_scope() as db_session: self.assertEqual( get_grouped_profiled_requests(db_session, endpoint_id=ENDPOINT_ID), []) add_stack_line(db_session, request_id=ENDPOINT_ID, position=0, indent=1, duration=1, code_line="code") self.assertNotEqual( get_grouped_profiled_requests(db_session, endpoint_id=ENDPOINT_ID), [])
def get_grouped_profiler(db_session, endpoint_id): """ :param db_session: session for the database :param endpoint_id: endpoint to filter on :return: """ requests = get_grouped_profiled_requests(db_session, endpoint_id) db_session.expunge_all() histogram = defaultdict(list) # path -> [list of values] path_hash = PathHash() for r in requests: for index, stack_line in enumerate(r.stack_lines): key = path_hash.get_stacklines_path(r.stack_lines, index) histogram[key].append(stack_line.duration) table = [] for key, duration_list in sorted(histogram.items(), key=lambda row: row[0]): table.append({ 'indent': path_hash.get_indent(key) - 1, 'code': path_hash.get_code(key), 'hits': len(duration_list), 'duration': sum(duration_list), 'std': numpy.std(duration_list), 'total_hits': len(requests), }) return table
def grouped_profiler(endpoint_id): with session_scope() as db_session: details = get_endpoint_details(db_session, endpoint_id) requests = get_grouped_profiled_requests(db_session, endpoint_id) db_session.expunge_all() total_duration = sum([r.duration for r in requests]) histogram = defaultdict(list) # path -> [list of values] path_hash = PathHash() for r in requests: for index, stack_line in enumerate(r.stack_lines): key = path_hash.get_stacklines_path(r.stack_lines, index) histogram[key].append(stack_line.duration) table = [] for key, duration_list in sorted(histogram.items(), key=lambda row: row[0]): table.append( GroupedStackLine(indent=path_hash.get_indent(key) - 1, code=path_hash.get_code(key), values=duration_list, total_sum=total_duration, total_hits=len(requests))) for index, item in enumerate(table): table[index].compute_body(index, table) sunburst = json.dumps(table_to_json(table)) return render_template('fmd_dashboard/profiler_grouped.html', details=details, table=table, sunburst=sunburst, title='Grouped Profiler results for {}'.format( details['endpoint']))
def get_grouped_profiler(session, endpoint_id, version=None, previous_results=[], changes=[]): """ :param session: session for the database :param endpoint_id: endpoint to filter on :return: """ requests = get_grouped_profiled_requests(session, endpoint_id, version) session.expunge_all() histogram = defaultdict(list) # path -> [list of values] path_hash = PathHash() for r in requests: for index, stack_line in enumerate(r.stack_lines): key = path_hash.get_stacklines_path(r.stack_lines, index) histogram[key].append(stack_line.duration) table = [] for key, duration_list in sorted(histogram.items(), key=lambda row: row[0]): previous = next((x for x in previous_results if x['id'] == key), None) hits = len(duration_list) duration = sum(duration_list) avg_duration = duration / hits std = numpy.std(duration_list) total_hits = len(requests) prev_hits = previous['hits'] if previous is not None else 0 prev_duration = previous['duration'] if previous is not None else 0 prev_avg_duration = previous[ 'avg_duration'] if previous is not None else 0 was_changed = path_hash.get_code(key) in changes duration_change = ( avg_duration - prev_avg_duration ) / prev_avg_duration if prev_avg_duration is not 0 else avg_duration regression = bool(was_changed and (avg_duration - prev_avg_duration) > std) table.append({ 'id': key, 'indent': path_hash.get_indent(key) - 1, 'code': path_hash.get_code(key), 'hits': hits, 'duration': duration, 'avg_duration': avg_duration, 'std': std, 'total_hits': total_hits, 'previous_hits': prev_hits, 'previous_duration': prev_duration, 'previous_avg_duration': prev_avg_duration, 'was_changed': was_changed, 'duration_change': duration_change, 'regression': regression, }) return table