Exemple #1
0
def _get_performance_features(fuzzer_name, job_type, datetime_start,
                              datetime_end):
    """Get raw performance features stored in BigQuery."""
    query_fields = [
        fuzzer_stats.QueryField(fuzzer_stats.TestcaseQuery.ALIAS, column, None)
        for column in constants.QUERY_COLUMNS
    ]

    # TODO(mmoroz): the query should be possible for datetime as well object.
    query = fuzzer_stats.TestcaseQuery(
        fuzzer_name=fuzzer_name,
        job_types=[job_type],
        query_fields=query_fields,
        group_by=fuzzer_stats.QueryGroupBy.GROUP_BY_NONE,
        date_start=datetime_start.date(),
        date_end=datetime_end.date())

    client = big_query.Client()

    try:
        result = client.query(query=query.build())
    except Exception as e:
        logging.error('Exception during BigQuery request: %s\n', str(e))
        raise helpers.EarlyExitException('Internal error.', 500)

    if not result.rows:
        raise helpers.EarlyExitException('No stats.', 404)

    return result
def _parse_stats_column_fields(results, stats_columns, group_by, fuzzer, jobs):
    """Parse stats columns."""
    result = []
    columns = fuzzer_stats.parse_stats_column_fields(stats_columns)

    # Insert first column (group by)
    group_by_field_name = fuzzer_stats.group_by_to_field_name(group_by)
    columns.insert(0, fuzzer_stats.QueryField("j", group_by_field_name, None))

    contexts = {}

    for column in columns:
        if isinstance(column, fuzzer_stats.QueryField):
            key = "%s_%s" % (column.table_alias, column.select_alias)

            for i, field_info in enumerate(results["schema"]["fields"]):
                # the 'name' field could either be "prefix_fieldname" or simply
                # "fieldname"
                if (field_info["name"] == column.select_alias
                        or field_info["name"] == key):
                    result.append(
                        QueryField(
                            column,
                            i,
                            _bigquery_type_to_charts_type(field_info["type"]),
                            field_info["type"],
                        ))
                    break
        elif isinstance(column, fuzzer_stats.BuiltinFieldSpecifier):
            # Builtin field.
            # Create new context if it does not exist.
            field_class = column.field_class()
            if not field_class:
                continue

            context_class = field_class.CONTEXT_CLASS
            context = contexts.setdefault(context_class,
                                          context_class(fuzzer, jobs))
            result.append(BuiltinField(column, column.create(context)))

    return result