Esempio n. 1
0
def signature_summary(request, params):
    '''Return a list of specific aggregations. '''

    context = {}

    params['signature'] = '=' + params['signature'][0]
    params['_aggs.signature'] = [
        'hang_type',
        'process_type',
        'startup_crash',
        '_histogram.uptime',
    ]
    params['_results_number'] = 0
    params['_facets'] = [
        'platform_pretty_version',
        'cpu_name',
        'process_type',
        'flash_version',
    ]
    params['_histogram.uptime'] = ['product']
    params['_histogram_interval.uptime'] = 60
    params['_aggs.adapter_vendor_id'] = ['adapter_device_id']
    params['_aggs.android_cpu_abi.android_manufacturer.android_model'] = [
        'android_version'
    ]
    params['_aggs.product.version'] = ['_cardinality.install_time']

    # If the user has permissions, show exploitability.
    all_fields = SuperSearchFields().get()
    if has_permissions(request.user,
                       all_fields['exploitability']['permissions_needed']):
        params['_histogram.date'] = ['exploitability']

    api = SuperSearchUnredacted()

    # Now make the actual request with all expected parameters.
    try:
        search_results = api.get(**params)
    except BadArgumentError as e:
        # We need to return the error message in some HTML form for jQuery to
        # pick it up.
        return http.HttpResponseBadRequest(render_exception(e))

    facets = search_results['facets']

    _transform_uptime_summary(facets)
    _transform_graphics_summary(facets)
    _transform_mobile_summary(facets)
    _transform_exploitability_summary(facets)

    context['query'] = search_results
    context['product_version_total'] = search_results['total']
    if 'signature' in facets and len(facets['signature']) > 0:
        context['signature_stats'] = SignatureStats(
            search_results['facets']['signature'][0], search_results['total'])

    return render(request, 'signature/signature_summary.html', context)
Esempio n. 2
0
def get_topcrashers_stats(**kwargs):
    """Return the results of a search. """
    params = kwargs
    range_type = params.pop('_range_type')
    dates = get_date_boundaries(params)

    params['_aggs.signature'] = [
        'platform',
        'is_garbage_collecting',
        'hang_type',
        'process_type',
        'startup_crash',
        '_histogram.uptime',
        '_cardinality.install_time',
    ]
    params['_histogram_interval.uptime'] = 60

    # We don't care about no results, only facets.
    params['_results_number'] = 0

    if params.get('process_type') in ('any', 'all'):
        params['process_type'] = None

    if range_type == 'build':
        params['build_id'] = [
            '>=' + datetime_to_build_id(dates[0]),
            '<' + datetime_to_build_id(dates[1])
        ]

    api = SuperSearchUnredacted()
    search_results = api.get(**params)

    signatures_stats = []
    if search_results['total'] > 0:
        # Run the same query but for the previous date range, so we can
        # compare the rankings and show rank changes.
        delta = (dates[1] - dates[0]) * 2
        params['date'] = [
            '>=' + (dates[1] - delta).isoformat(), '<' + dates[0].isoformat()
        ]
        params['_aggs.signature'] = [
            'platform',
        ]
        params['_facets_size'] *= 2

        if range_type == 'build':
            params['date'][1] = '<' + dates[1].isoformat()
            params['build_id'] = [
                '>=' + datetime_to_build_id(dates[1] - delta),
                '<' + datetime_to_build_id(dates[0])
            ]

        previous_range_results = api.get(**params)
        previous_signatures = get_comparison_signatures(previous_range_results)

        for index, signature in enumerate(
                search_results['facets']['signature']):
            previous_signature = previous_signatures.get(signature['term'])
            signatures_stats.append(
                SignatureStats(
                    signature=signature,
                    num_total_crashes=search_results['total'],
                    rank=index,
                    platforms=models.Platforms().get_all()['hits'],
                    previous_signature=previous_signature,
                ))
    return signatures_stats
Esempio n. 3
0
    def test_SignatureStats(self):
        signature = {
            'count': 2,
            'term':
            'EMPTY: no crashing thread identified; ERROR_NO_MINIDUMP_HEADER',
            'facets': {
                'histogram_uptime': [{
                    'count': 2,
                    'term': 0
                }],
                'startup_crash': [{
                    'count': 2,
                    'term': 'F'
                }],
                'cardinality_install_time': {
                    'value': 1
                },
                'is_garbage_collecting': [],
                'process_type': [],
                'platform': [{
                    'count': 2,
                    'term': ''
                }],
                'hang_type': [{
                    'count': 2,
                    'term': 0
                }]
            }
        }
        platforms = [{
            'code': 'win',
            'name': 'Windows'
        }, {
            'code': 'mac',
            'name': 'Mac OS X'
        }, {
            'code': 'lin',
            'name': 'Linux'
        }, {
            'code': 'unknown',
            'name': 'Unknown'
        }]
        signature_stats = SignatureStats(
            signature=signature,
            rank=1,
            num_total_crashes=2,
            platforms=platforms,
            previous_signature=None,
        )

        assert signature_stats.rank == 1
        assert signature_stats.signature_term \
            == 'EMPTY: no crashing thread identified; ERROR_NO_MINIDUMP_HEADER'
        assert signature_stats.percent_of_total_crashes == 100.0
        assert signature_stats.num_crashes == 2
        assert signature_stats.num_crashes_per_platform \
            == {'mac_count': 0, 'lin_count': 0, 'win_count': 0}
        assert signature_stats.num_crashes_in_garbage_collection == 0
        assert signature_stats.num_installs == 1
        assert signature_stats.num_crashes == 2
        assert signature_stats.num_startup_crashes == 0
        assert signature_stats.is_startup_crash == 0
        assert signature_stats.is_potential_startup_crash == 0
        assert signature_stats.is_startup_window_crash is True
        assert signature_stats.is_hang_crash is False
        assert signature_stats.is_plugin_crash is False