dashboard.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. // @ts-expect-error TODO: pass interval
  22. return {
  23. title,
  24. displayType: toDisplayType(displayType),
  25. widgetType: WidgetType.METRICS,
  26. limit: 10,
  27. queries: metricQueries.map(query =>
  28. 'formula' in query ? getWidgetEquation(query) : getWidgetQuery(query)
  29. ),
  30. };
  31. }
  32. export function toDisplayType(displayType: unknown): DisplayType {
  33. if (Object.values(DisplayType).includes(displayType as DisplayType)) {
  34. return displayType as DisplayType;
  35. }
  36. return DisplayType.LINE;
  37. }
  38. export function getWidgetQuery(metricsQuery: QueryParams): WidgetQuery {
  39. const field = MRIToField(metricsQuery.mri, metricsQuery.op);
  40. return {
  41. name: defined(metricsQuery.id) ? `${metricsQuery.id}` : '',
  42. aggregates: [field],
  43. columns: metricsQuery.groupBy ?? [],
  44. fields: [field],
  45. conditions: metricsQuery.query ?? '',
  46. // @ts-expect-error TODO: change type of orderby
  47. orderby: undefined,
  48. isHidden: metricsQuery.isHidden,
  49. };
  50. }
  51. export function getWidgetEquation(equation: EquationParams): WidgetQuery {
  52. return {
  53. name: '',
  54. aggregates: [`equation|${equation.formula}`],
  55. columns: [],
  56. fields: [`equation|${equation.formula}`],
  57. conditions: '',
  58. // @ts-expect-error TODO: change type of orderby
  59. orderby: undefined,
  60. isHidden: equation.isHidden,
  61. };
  62. }
  63. export function encodeWidgetQuery(query) {
  64. return urlEncode({
  65. ...query,
  66. aggregates: query.aggregates.join(','),
  67. fields: query.fields?.join(','),
  68. columns: query.columns.join(','),
  69. });
  70. }
  71. export function getWidgetAsQueryParams(
  72. selection: PageFilters,
  73. urlWidgetQuery: string,
  74. displayType?: MetricDisplayType
  75. ) {
  76. const {start, end, period} = selection.datetime;
  77. const {projects} = selection;
  78. return {
  79. start,
  80. end,
  81. statsPeriod: period,
  82. defaultWidgetQuery: urlWidgetQuery,
  83. defaultTableColumns: [],
  84. defaultTitle: '',
  85. environment: selection.environments,
  86. displayType,
  87. project: projects,
  88. };
  89. }