Skip to content

Commit 42c2947

Browse files
authored
feat(ddm): ddm dashboard widget type (#60080)
1 parent 8033ef3 commit 42c2947

File tree

12 files changed

+673
-29
lines changed

12 files changed

+673
-29
lines changed

static/app/actionCreators/metrics.tsx

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ import {getInterval} from 'sentry/components/charts/utils';
33
import {normalizeDateTimeParams} from 'sentry/components/organizations/pageFilters/parse';
44
import {DateString, MetricsApiResponse, Organization} from 'sentry/types';
55
import {defined} from 'sentry/utils';
6+
import {getDateTimeParams, getMetricsInterval, parseMRI} from 'sentry/utils/metrics';
67

7-
export type DoMetricsRequestOptions = {
8+
export type DoReleaseHealthRequestOptions = {
89
field: string[];
910
orgSlug: Organization['slug'];
1011
cursor?: string;
@@ -25,7 +26,7 @@ export type DoMetricsRequestOptions = {
2526
statsPeriodStart?: string;
2627
};
2728

28-
export const doMetricsRequest = (
29+
export const doReleaseHealthRequest = (
2930
api: Client,
3031
{
3132
field,
@@ -44,7 +45,7 @@ export const doMetricsRequest = (
4445
statsPeriodStart,
4546
statsPeriodEnd,
4647
...dateTime
47-
}: DoMetricsRequestOptions
48+
}: DoReleaseHealthRequestOptions
4849
): Promise<MetricsApiResponse | [MetricsApiResponse, string, ResponseMeta]> => {
4950
const {start, end, statsPeriod} = normalizeDateTimeParams(dateTime, {
5051
allowEmptyPeriod: true,
@@ -75,3 +76,70 @@ export const doMetricsRequest = (
7576

7677
return api.requestPromise(pathname, {includeAllArgs, query: urlQuery});
7778
};
79+
80+
export type DoMetricsRequestOptions = {
81+
field: string[];
82+
orgSlug: Organization['slug'];
83+
cursor?: string;
84+
end?: DateString;
85+
environment?: Readonly<string[]>;
86+
groupBy?: string[];
87+
includeAllArgs?: boolean;
88+
includeSeries?: number;
89+
includeTotals?: number;
90+
interval?: string;
91+
limit?: number;
92+
orderBy?: string;
93+
project?: Readonly<number[]>;
94+
query?: string;
95+
start?: DateString;
96+
statsPeriod?: string | null;
97+
statsPeriodEnd?: string;
98+
statsPeriodStart?: string;
99+
};
100+
101+
export const doMetricsRequest = (
102+
api: Client,
103+
{
104+
field,
105+
orgSlug,
106+
environment,
107+
groupBy,
108+
interval,
109+
limit,
110+
project,
111+
query,
112+
includeAllArgs = false,
113+
...dateTime
114+
}: DoReleaseHealthRequestOptions
115+
): Promise<MetricsApiResponse | [MetricsApiResponse, string, ResponseMeta]> => {
116+
const {useCase} = parseMRI(field[0]) ?? {useCase: 'custom'};
117+
118+
const {start, end, statsPeriod, utc} = normalizeDateTimeParams(dateTime, {
119+
allowEmptyPeriod: true,
120+
allowAbsoluteDatetime: true,
121+
allowAbsolutePageDatetime: true,
122+
});
123+
124+
// @ts-expect-error
125+
const datetime = getDateTimeParams({start, end, period: statsPeriod, utc});
126+
127+
const metricsInterval = getMetricsInterval(datetime, useCase);
128+
129+
const urlQuery = {
130+
...datetime,
131+
query,
132+
project,
133+
environment,
134+
field,
135+
useCase,
136+
interval: interval || metricsInterval,
137+
groupBy,
138+
per_page: limit,
139+
useNewMetricsLayer: false,
140+
};
141+
142+
const pathname = `/organizations/${orgSlug}/metrics/data/`;
143+
144+
return api.requestPromise(pathname, {includeAllArgs, query: urlQuery});
145+
};

static/app/components/modals/widgetViewerModal.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ import {
8484
} from 'sentry/views/dashboards/widgetCard/dashboardsMEPContext';
8585
import {GenericWidgetQueriesChildrenProps} from 'sentry/views/dashboards/widgetCard/genericWidgetQueries';
8686
import IssueWidgetQueries from 'sentry/views/dashboards/widgetCard/issueWidgetQueries';
87+
import MetricWidgetQueries from 'sentry/views/dashboards/widgetCard/metricWidgetQueries';
8788
import ReleaseWidgetQueries from 'sentry/views/dashboards/widgetCard/releaseWidgetQueries';
8889
import {WidgetCardChartContainer} from 'sentry/views/dashboards/widgetCard/widgetCardChartContainer';
8990
import WidgetQueries from 'sentry/views/dashboards/widgetCard/widgetQueries';
@@ -790,6 +791,32 @@ function WidgetViewerModal(props: Props) {
790791
{renderReleaseTable}
791792
</ReleaseWidgetQueries>
792793
);
794+
case WidgetType.METRICS:
795+
if (tableData && chartUnmodified && widget.displayType === DisplayType.TABLE) {
796+
return renderReleaseTable({
797+
tableResults: tableData,
798+
loading: false,
799+
pageLinks: defaultPageLinks,
800+
});
801+
}
802+
return (
803+
<MetricWidgetQueries
804+
api={api}
805+
organization={organization}
806+
widget={tableWidget}
807+
selection={modalTableSelection}
808+
limit={
809+
widget.displayType === DisplayType.TABLE
810+
? FULL_TABLE_ITEM_LIMIT
811+
: HALF_TABLE_ITEM_LIMIT
812+
}
813+
cursor={cursor}
814+
dashboardFilters={dashboardFilters}
815+
>
816+
{/* TODO(ddm): Check if we need to use a diffrent implementation, for now we fallback to release table */}
817+
{renderReleaseTable}
818+
</MetricWidgetQueries>
819+
);
793820
case WidgetType.DISCOVER:
794821
default:
795822
if (tableData && chartUnmodified && widget.displayType === DisplayType.TABLE) {

static/app/utils/metrics.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ export function useMetricsData({
139139
const useCase = getUseCaseFromMRI(mri);
140140
const field = op ? `${op}(${mri})` : mri;
141141

142-
const interval = getMetricsInterval(datetime, mri);
142+
const interval = getMetricsInterval(datetime, useCase);
143143

144144
const queryToSend = {
145145
...getDateTimeParams(datetime),
@@ -240,15 +240,14 @@ export function useMetricsDataZoom(props: MetricsQuery) {
240240
}
241241

242242
// Wraps getInterval since other users of this function, and other metric use cases do not have support for 10s granularity
243-
function getMetricsInterval(dateTimeObj: DateTimeObject, mri: string) {
243+
export function getMetricsInterval(dateTimeObj: DateTimeObject, useCase: UseCase) {
244244
const interval = getInterval(dateTimeObj, 'metrics');
245245

246246
if (interval !== '1m') {
247247
return interval;
248248
}
249249

250250
const diffInMinutes = getDiffInMinutes(dateTimeObj);
251-
const useCase = getUseCaseFromMRI(mri);
252251

253252
if (diffInMinutes <= 60 && useCase === 'custom') {
254253
return '10s';
@@ -257,7 +256,7 @@ function getMetricsInterval(dateTimeObj: DateTimeObject, mri: string) {
257256
return interval;
258257
}
259258

260-
function getDateTimeParams({start, end, period}: PageFilters['datetime']) {
259+
export function getDateTimeParams({start, end, period}: PageFilters['datetime']) {
261260
return period
262261
? {statsPeriod: period}
263262
: {start: moment(start).toISOString(), end: moment(end).toISOString()};

static/app/views/dashboards/datasetConfig/base.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {getNumEquations} from '../utils';
2323

2424
import {ErrorsAndTransactionsConfig} from './errorsAndTransactions';
2525
import {IssuesConfig} from './issues';
26+
import {MetricsConfig} from './metrics';
2627
import {ReleasesConfig} from './releases';
2728

2829
export type WidgetBuilderSearchBarProps = {
@@ -212,16 +213,24 @@ export function getDatasetConfig<T extends WidgetType | undefined>(
212213
? typeof IssuesConfig
213214
: T extends WidgetType.RELEASE
214215
? typeof ReleasesConfig
216+
: T extends WidgetType.METRICS
217+
? typeof MetricsConfig
215218
: typeof ErrorsAndTransactionsConfig;
216219

217220
export function getDatasetConfig(
218221
widgetType?: WidgetType
219-
): typeof IssuesConfig | typeof ReleasesConfig | typeof ErrorsAndTransactionsConfig {
222+
):
223+
| typeof IssuesConfig
224+
| typeof ReleasesConfig
225+
| typeof MetricsConfig
226+
| typeof ErrorsAndTransactionsConfig {
220227
switch (widgetType) {
221228
case WidgetType.ISSUE:
222229
return IssuesConfig;
223230
case WidgetType.RELEASE:
224231
return ReleasesConfig;
232+
case WidgetType.METRICS:
233+
return MetricsConfig;
225234
case WidgetType.DISCOVER:
226235
default:
227236
return ErrorsAndTransactionsConfig;

0 commit comments

Comments
 (0)