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