dashboard.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import {urlEncode} from '@sentry/utils';
  2. import type {PageFilters} from 'sentry/types/core';
  3. import {defined} from 'sentry/utils';
  4. import {MRIToField} from 'sentry/utils/metrics/mri';
  5. import type {MetricDisplayType, MetricsQuery} from 'sentry/utils/metrics/types';
  6. import type {Widget, WidgetQuery} from 'sentry/views/dashboards/types';
  7. import {DisplayType, WidgetType} from 'sentry/views/dashboards/types';
  8. interface QueryParams extends MetricsQuery {
  9. id?: number;
  10. isHidden?: boolean;
  11. }
  12. interface EquationParams {
  13. formula: string;
  14. isHidden?: boolean;
  15. }
  16. export function convertToDashboardWidget(
  17. metricQueries: (QueryParams | EquationParams)[],
  18. displayType?: MetricDisplayType,
  19. title = ''
  20. ): Widget {
  21. // TODO: Ged rid of ts-expect-error
  22. // @ts-expect-error TODO: pass interval
  23. return {
  24. title,
  25. displayType: toDisplayType(displayType),
  26. widgetType: WidgetType.METRICS,
  27. limit: 10,
  28. queries: metricQueries.map(query =>
  29. 'formula' in query ? getWidgetEquation(query) : getWidgetQuery(query)
  30. ),
  31. };
  32. }
  33. export function toDisplayType(displayType: unknown): DisplayType {
  34. if (Object.values(DisplayType).includes(displayType as DisplayType)) {
  35. return displayType as DisplayType;
  36. }
  37. return DisplayType.LINE;
  38. }
  39. export function getWidgetQuery(metricsQuery: QueryParams): WidgetQuery {
  40. const field = MRIToField(metricsQuery.mri, metricsQuery.aggregation);
  41. return {
  42. name: defined(metricsQuery.id) ? `${metricsQuery.id}` : '',
  43. aggregates: [field],
  44. columns: metricsQuery.groupBy ?? [],
  45. fields: [field],
  46. conditions: metricsQuery.query ?? '',
  47. // @ts-expect-error TODO: change type of orderby
  48. orderby: undefined,
  49. isHidden: metricsQuery.isHidden,
  50. };
  51. }
  52. export function getWidgetEquation(equation: EquationParams): WidgetQuery {
  53. return {
  54. name: '',
  55. aggregates: [`equation|${equation.formula}`],
  56. columns: [],
  57. fields: [`equation|${equation.formula}`],
  58. conditions: '',
  59. // @ts-expect-error TODO: change type of orderby
  60. orderby: undefined,
  61. isHidden: equation.isHidden,
  62. };
  63. }
  64. export function encodeWidgetQuery(query) {
  65. return urlEncode({
  66. ...query,
  67. aggregates: query.aggregates.join(','),
  68. fields: query.fields?.join(','),
  69. columns: query.columns.join(','),
  70. });
  71. }
  72. export function getWidgetAsQueryParams(
  73. selection: PageFilters,
  74. urlWidgetQuery: string,
  75. displayType?: MetricDisplayType
  76. ) {
  77. const {start, end, period} = selection.datetime;
  78. const {projects} = selection;
  79. return {
  80. start,
  81. end,
  82. statsPeriod: period,
  83. defaultWidgetQuery: urlWidgetQuery,
  84. defaultTableColumns: [],
  85. defaultTitle: '',
  86. environment: selection.environments,
  87. displayType,
  88. project: projects,
  89. };
  90. }