Beispiel #1
0
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']))
Beispiel #5
0
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