dashboard.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import {urlEncode} from '@sentry/utils';
  2. import type {PageFilters} from 'sentry/types';
  3. import {emptyWidget} from 'sentry/utils/metrics/constants';
  4. import {formatMRI, MRIToField} from 'sentry/utils/metrics/mri';
  5. import type {MetricsQuery} from 'sentry/utils/metrics/types';
  6. import {MetricDisplayType} from 'sentry/utils/metrics/types';
  7. import type {Widget} from 'sentry/views/dashboards/types';
  8. import {
  9. DashboardWidgetSource,
  10. DisplayType,
  11. WidgetType,
  12. } from 'sentry/views/dashboards/types';
  13. const getDDMWidgetName = (metricsQuery: MetricsQuery) => {
  14. return `${metricsQuery.op}(${formatMRI(metricsQuery.mri)})`;
  15. };
  16. export function convertToDashboardWidget(
  17. metricsQuery: MetricsQuery,
  18. displayType?: MetricDisplayType
  19. ): Widget {
  20. // @ts-expect-error TODO: pass interval
  21. return {
  22. title: metricsQuery.title || getDDMWidgetName(metricsQuery),
  23. displayType: toDisplayType(displayType),
  24. widgetType: WidgetType.METRICS,
  25. limit: !metricsQuery.groupBy?.length ? 1 : 10,
  26. queries: [getWidgetQuery(metricsQuery)],
  27. };
  28. }
  29. export function toMetricDisplayType(displayType: unknown): MetricDisplayType {
  30. if (Object.values(MetricDisplayType).includes(displayType as MetricDisplayType)) {
  31. return displayType as MetricDisplayType;
  32. }
  33. return MetricDisplayType.LINE;
  34. }
  35. export function toDisplayType(displayType: unknown): DisplayType {
  36. if (Object.values(DisplayType).includes(displayType as DisplayType)) {
  37. return displayType as DisplayType;
  38. }
  39. return DisplayType.LINE;
  40. }
  41. export function defaultMetricWidget(selection: PageFilters) {
  42. return convertToDashboardWidget({...selection, ...emptyWidget}, MetricDisplayType.LINE);
  43. }
  44. export function getWidgetQuery(metricsQuery: MetricsQuery) {
  45. const field = MRIToField(metricsQuery.mri, metricsQuery.op || '');
  46. return {
  47. name: '',
  48. aggregates: [field],
  49. columns: metricsQuery.groupBy ?? [],
  50. fields: [field],
  51. conditions: metricsQuery.query ?? '',
  52. orderby: '',
  53. };
  54. }
  55. export function encodeWidgetQuery(query) {
  56. return urlEncode({
  57. ...query,
  58. aggregates: query.aggregates.join(','),
  59. fields: query.fields?.join(','),
  60. columns: query.columns.join(','),
  61. });
  62. }
  63. export function getWidgetAsQueryParams(
  64. metricsQuery: MetricsQuery,
  65. urlWidgetQuery: string,
  66. displayType?: MetricDisplayType
  67. ) {
  68. const {start, end, period} = metricsQuery.datetime;
  69. const {projects} = metricsQuery;
  70. return {
  71. source: DashboardWidgetSource.DDM,
  72. start,
  73. end,
  74. statsPeriod: period,
  75. defaultWidgetQuery: urlWidgetQuery,
  76. defaultTableColumns: [],
  77. defaultTitle: getDDMWidgetName(metricsQuery),
  78. environment: metricsQuery.environments,
  79. displayType,
  80. project: projects,
  81. };
  82. }