Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use crate::{
schema::{
Dashboard, DashboardBuilder, DataLink, Datasource, FieldConfig, FieldConfigCustom,
FieldConfigDefaults, GridPos, LogPanel, Panel, QueryVariable, QueryVariableQuery, Target,
TextBoxVariable, TimeSeriesPanel, Transformation,
TextBoxVariable, TimeSeriesPanel, Transformation, VariableSortOrder,
},
sql::Query,
util::UrlBuilder,
Expand Down Expand Up @@ -100,12 +100,14 @@ pub fn extra_dashboard(config: &TeamConfig) -> Result<Dashboard> {
);
builder.add_application_variable(config)?;
builder.add_channel_variable();
builder.add_variable(error_type_variable());
builder.add_variable(version_variable());
builder.add_variable(build_date_variable());
builder.add_variable(TextBoxVariable {
label: "Search details".into(),
name: "details".into(),
..TextBoxVariable::default()
});
builder.add_variable(error_type_variable());
builder.add_filter_sql_variable();

builder.add_panel_full(error_list_count_panel());
Expand Down Expand Up @@ -134,19 +136,72 @@ ORDER BY metrics.string.rust_component_errors_error_type",
}
}

pub fn version_variable() -> QueryVariable {
let query = QueryVariableQuery::from_sql(
"\
SELECT 'All' as text, '' as value
UNION ALL
SELECT version as text, version as value
FROM (
SELECT DISTINCT CAST(mozfun.norm.extract_version(client_info.app_display_version, 'major') AS STRING) as version
FROM mozdata.fenix.rust_component_errors
WHERE submission_timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 14 day)
AND mozfun.norm.extract_version(client_info.app_display_version, 'major') IS NOT NULL
ORDER BY 1 DESC
)",
);

QueryVariable {
label: "Version".into(),
name: "version".into(),
datasource: Datasource::bigquery(),
query,
sort: Some(VariableSortOrder::AlphabeticalDescending),
..QueryVariable::default()
}
}

pub fn build_date_variable() -> QueryVariable {
let query = QueryVariableQuery::from_sql(
"\
SELECT 'None' as text, '' as value
UNION ALL
SELECT build_date as text, build_date as value
FROM (
SELECT DISTINCT SUBSTR(client_info.build_date, 0, 10) as build_date
FROM mozdata.fenix.rust_component_errors
WHERE submission_timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 14 day)
ORDER BY 1 DESC
)",
);

QueryVariable {
label: "Group by build date".into(),
name: "build_date".into(),
datasource: Datasource::bigquery(),
sort: Some(VariableSortOrder::AlphabeticalDescending),
query,
..QueryVariable::default()
}
}

fn error_list_count_panel() -> Panel {
let mut query = Query {
select: vec!["$__timeGroup(submission_timestamp, $__interval) as time".into()],
select: vec![
"$__timeGroup(submission_timestamp, $__interval) as time".into(),
"IF('${build_date}' = '', '', IF(build_date < '${build_date}', '< ${build_date}', '>= ${build_date}')) as build_date".into(),
],
where_: vec![
"error_type='${error_type}'".into(),
"$__timeFilter(submission_timestamp)".into(),
"normalized_channel = '${channel}'".into(),
"('${details}' = '' OR details LIKE '%${details}%')".into(),
"'${version}' = '' OR version = CAST('${version}' AS NUMERIC)".into(),
"'${details}' = '' OR details LIKE '%${details}%'".into(),
"${filter_sql}".into(),
],
from: error_subquery().as_subquery(),
group_by: Some("1".into()),
order_by: Some("time DESC".into()),
group_by: Some("1, 2".into()),
order_by: Some("1 ASC, 2 ASC".into()),
..Query::default()
};
query.add_count_per_day_column("COUNT(*)", "errors");
Expand Down Expand Up @@ -183,6 +238,7 @@ fn error_list_log_panel() -> Panel {
"error_type='${error_type}'".into(),
"$__timeFilter(submission_timestamp)".into(),
"normalized_channel = '${channel}'".into(),
"'${version}' = '' OR version = CAST('${version}' AS NUMERIC)".into(),
"('${details}' = '' OR details LIKE '%${details}%')".into(),
"${filter_sql}".into(),
],
Expand Down Expand Up @@ -210,6 +266,9 @@ fn error_list_log_panel() -> Panel {
fn error_subquery() -> Query {
let mut subquery = Query {
select: vec![
"SUBSTR(client_info.build_date, 0, 10) as build_date".into(),
"mozfun.norm.extract_version(client_info.app_display_version, 'major') as version"
.into(),
"metrics.string.rust_component_errors_error_type as error_type".into(),
"metrics.string.rust_component_errors_details as details".into(),
"metrics.string_list.rust_component_errors_breadcrumbs as breadcrumbs".into(),
Expand Down
30 changes: 30 additions & 0 deletions tools/generate-rust-dashboards/src/schema.rs
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ pub struct QueryVariable {
pub multi: bool,
pub allow_custom_value: bool,
pub query: QueryVariableQuery,
pub sort: Option<VariableSortOrder>,
pub hide: VariableHide,
}

Expand Down Expand Up @@ -326,6 +327,17 @@ pub enum CustomVariableSelection {
Multiple { value: Vec<String> },
}

pub enum VariableSortOrder {
AlphabeticalAscending,
AlphabeticalDescending,
NumericalAscending,
NumericalDescending,
AlphabeticalCaseInsensitiveAscending,
AlphabeticalCaseInsensitiveDescending,
NaturalAscending,
NaturalDescending,
}

impl Default for Dashboard {
fn default() -> Self {
Self {
Expand Down Expand Up @@ -524,6 +536,24 @@ impl Serialize for SortOrder {
}
}

impl Serialize for VariableSortOrder {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match self {
Self::AlphabeticalAscending => serializer.serialize_u32(1),
Self::AlphabeticalDescending => serializer.serialize_u32(2),
Self::NumericalAscending => serializer.serialize_u32(3),
Self::NumericalDescending => serializer.serialize_u32(4),
Self::AlphabeticalCaseInsensitiveAscending => serializer.serialize_u32(5),
Self::AlphabeticalCaseInsensitiveDescending => serializer.serialize_u32(6),
Self::NaturalAscending => serializer.serialize_u32(7),
Self::NaturalDescending => serializer.serialize_u32(8),
}
}
}

impl GridPos {
/// Create a GridPos from a height only
///
Expand Down
8 changes: 4 additions & 4 deletions tools/generate-rust-dashboards/src/sql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,12 @@ impl Query {
// TODO: Add UNIONs once we are enable the glean pipeline for iOS and/or Desktop
// let from = format!("
// (
// SELECT * FROM mozdata.fenix.{table_name} WHERE '${{application}}' = 'android'
// UNION ALL SELECT * FROM mozdata.firefox_ios.{table_name} WHERE '${{application}}' = 'ios'
// UNION ALL SELECT * FROM mozdata.firefox_desktop.{table_name} WHERE '${{application}}' = 'desktop'
// SELECT * FROM mozdata.fenix.{table_name} WHERE '${{application}}' = 'firefox_android'
// UNION ALL SELECT * FROM mozdata.firefox_ios.{table_name} WHERE '${{application}}' = 'firefox_ios'
// UNION ALL SELECT * FROM mozdata.firefox_desktop.{table_name} WHERE '${{application}}' = 'firefox_desktop'
// )");
self.from = format!(
"(SELECT * FROM mozdata.fenix.{table_name} WHERE '${{application}}' = 'android')"
"(SELECT * FROM mozdata.fenix.{table_name} WHERE '${{application}}' = 'firefox_android')"
);
}
}