Files
2024-02-15 17:01:50 +00:00

225 lines
6.3 KiB
TypeScript

import {t} from 'sentry/locale';
import {TOP_N} from 'sentry/utils/discover/types';
import type {Widget} from '../types';
import {DisplayType, WidgetType} from '../types';
export type WidgetTemplate = Widget & {
description: string;
};
export const getDefaultWidgets = () => {
return [
{
id: 'duration-distribution',
title: t('Duration Distribution'),
description: t('Compare transaction durations across different percentiles.'),
displayType: DisplayType.LINE,
widgetType: WidgetType.DISCOVER,
interval: '5m',
queries: [
{
name: '',
conditions: 'event.type:transaction',
fields: [
'p50(transaction.duration)',
'p75(transaction.duration)',
'p95(transaction.duration)',
],
aggregates: [
'p50(transaction.duration)',
'p75(transaction.duration)',
'p95(transaction.duration)',
],
columns: [],
orderby: '',
},
],
},
{
id: 'high-throughput-transactions',
title: t('High Throughput Transactions'),
description: t('Top 5 transactions with the largest volume.'),
displayType: DisplayType.TOP_N,
widgetType: WidgetType.DISCOVER,
interval: '5m',
queries: [
{
name: '',
conditions: 'event.type:transaction',
fields: ['transaction', 'count()'],
aggregates: ['count()'],
columns: ['transaction'],
orderby: '-count()',
},
],
},
{
id: 'crash-rates-recent-releases',
title: t('Crash Rates for Recent Releases'),
description: t('Percentage of crashed sessions for latest releases.'),
displayType: DisplayType.LINE,
widgetType: WidgetType.RELEASE,
interval: '5m',
limit: 8,
queries: [
{
name: '',
conditions: '',
fields: ['crash_rate(session)', 'release'],
aggregates: ['crash_rate(session)'],
columns: ['release'],
orderby: '-release',
},
],
},
{
id: 'session-health',
title: t('Session Health'),
description: t('Number of abnormal, crashed, errored and healthy sessions.'),
displayType: DisplayType.TABLE,
widgetType: WidgetType.RELEASE,
interval: '5m',
queries: [
{
name: '',
conditions: '',
fields: ['session.status', 'sum(session)'],
aggregates: ['sum(session)'],
columns: ['session.status'],
orderby: '-sum(session)',
},
],
},
{
id: 'lcp-country',
title: t('LCP by Country'),
description: t('Table showing page load times by country.'),
displayType: DisplayType.TABLE,
widgetType: WidgetType.DISCOVER,
interval: '5m',
queries: [
{
name: '',
conditions: 'has:geo.country_code',
fields: ['geo.country_code', 'geo.region', 'p75(measurements.lcp)'],
aggregates: ['p75(measurements.lcp)'],
columns: ['geo.country_code', 'geo.region'],
orderby: '-p75(measurements.lcp)',
},
],
},
{
id: 'miserable-users',
title: t('Miserable Users'),
description: t('Unique users who have experienced slow load times.'),
displayType: DisplayType.BIG_NUMBER,
widgetType: WidgetType.DISCOVER,
interval: '5m',
queries: [
{
name: '',
conditions: '',
fields: ['count_miserable(user,300)'],
aggregates: ['count_miserable(user,300)'],
columns: [],
orderby: '',
},
],
},
{
id: 'slow-vs-fast',
title: t('Slow vs. Fast Transactions'),
description: t(
'Percentage breakdown of transaction durations over and under 300ms.'
),
displayType: DisplayType.BAR,
widgetType: WidgetType.DISCOVER,
interval: '5m',
queries: [
{
name: '',
conditions: 'event.type:transaction',
fields: [
'equation|(count_if(transaction.duration,greater,300) / count()) * 100',
'equation|(count_if(transaction.duration,lessOrEquals,300) / count()) * 100',
],
aggregates: [
'equation|(count_if(transaction.duration,greater,300) / count()) * 100',
'equation|(count_if(transaction.duration,lessOrEquals,300) / count()) * 100',
],
columns: [],
orderby: '',
},
],
},
{
id: 'issue-for-review',
title: t('Issues For Review'),
description: t('Most recently seen unresolved issues for review.'),
displayType: DisplayType.TABLE,
widgetType: WidgetType.ISSUE,
interval: '5m',
queries: [
{
name: '',
conditions: 'is:unresolved is:for_review',
fields: ['issue', 'assignee', 'events', 'title'],
aggregates: [],
columns: ['issue', 'assignee', 'events', 'title'],
orderby: 'date',
},
],
},
{
id: 'top-unhandled',
title: t('Top Unhandled Error Types'),
description: t('Most frequently encountered unhandled errors.'),
displayType: DisplayType.TOP_N,
widgetType: WidgetType.DISCOVER,
interval: '5m',
queries: [
{
name: '',
conditions: 'error.unhandled:true',
fields: ['error.type', 'count()'],
aggregates: ['count()'],
columns: ['error.type'],
orderby: '-count()',
},
],
},
{
id: 'users-affected',
title: t('Users Affected by Errors'),
description: t('Footprint of unique users affected by errors.'),
displayType: DisplayType.LINE,
widgetType: WidgetType.DISCOVER,
interval: '5m',
queries: [
{
name: '',
conditions: 'event.type:error',
fields: ['count_unique(user)', 'count()'],
aggregates: ['count_unique(user)', 'count()'],
columns: [],
orderby: '',
},
],
},
];
};
export function getTopNConvertedDefaultWidgets(): Readonly<Array<WidgetTemplate>> {
return getDefaultWidgets().map(widget => {
if (widget.displayType === DisplayType.TOP_N) {
return {
...widget,
displayType: DisplayType.AREA,
limit: TOP_N,
};
}
return widget;
});
}