1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- import {Organization} from 'sentry/types';
- import {AggregationKey} from 'sentry/utils/fields';
- import {isOnDemandQueryString} from 'sentry/utils/onDemandMetrics';
- import {hasOnDemandMetricWidgetFeature} from 'sentry/utils/onDemandMetrics/features';
- import {Widget, WidgetType} from 'sentry/views/dashboards/types';
- /**
- * We determine that a widget is an on-demand metric widget if the widget
- * 1. type is discover
- * 2. contains no grouping
- * 3. contains only one query condition
- * 4. contains only one aggregate and does not contain unsupported aggregates
- * 5. contains one of the keys that are not supported by the standard metrics.
- */
- export function isOnDemandMetricWidget(widget: Widget): boolean {
- if (widget.widgetType !== WidgetType.DISCOVER) {
- return false;
- }
- // currently we only support widgets without grouping
- const columns = widget.queries.flatMap(query => query.columns);
- if (columns.length > 0) {
- return false;
- }
- const conditions = widget.queries.flatMap(query => query.conditions);
- const hasNonStandardConditions = conditions.some(condition =>
- isOnDemandQueryString(condition)
- );
- // currently we only support one query per widget for on-demand metrics
- if (conditions.length > 1 || !hasNonStandardConditions) {
- return false;
- }
- const aggregates = widget.queries.flatMap(query => query.aggregates);
- const unsupportedAggregates = [
- AggregationKey.PERCENTILE,
- AggregationKey.APDEX,
- AggregationKey.FAILURE_RATE,
- ];
- // check if any of the aggregates contains unsupported aggregates as substr
- const hasUnsupportedAggregates = aggregates.some(aggregate =>
- unsupportedAggregates.some(agg => aggregate.includes(agg))
- );
- // currently we only support one aggregate per widget for on-demand metrics
- return aggregates.length > 1 || !hasUnsupportedAggregates;
- }
- export const shouldUseOnDemandMetrics = (organization: Organization, widget: Widget) => {
- return isOnDemandMetricWidget(widget) && hasOnDemandMetricWidgetFeature(organization);
- };
|