spansWidgetQueries.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import {useState} from 'react';
  2. import type {Client} from 'sentry/api';
  3. import type {PageFilters} from 'sentry/types/core';
  4. import type {
  5. Confidence,
  6. EventsStats,
  7. GroupedMultiSeriesEventsStats,
  8. MultiSeriesEventsStats,
  9. Organization,
  10. } from 'sentry/types/organization';
  11. import {defined} from 'sentry/utils';
  12. import {dedupeArray} from 'sentry/utils/dedupeArray';
  13. import type {EventsTableData, TableData} from 'sentry/utils/discover/discoverQuery';
  14. import getDynamicText from 'sentry/utils/getDynamicText';
  15. import {determineSeriesConfidence} from 'sentry/views/alerts/rules/metric/utils/determineSeriesConfidence';
  16. import {SpansConfig} from 'sentry/views/dashboards/datasetConfig/spans';
  17. import {combineConfidenceForSeries} from 'sentry/views/explore/utils';
  18. import {transformToSeriesMap} from 'sentry/views/insights/common/queries/useSortedTimeSeries';
  19. import type {DashboardFilters, Widget} from '../types';
  20. import {isEventsStats} from '../utils/isEventsStats';
  21. import type {
  22. GenericWidgetQueriesChildrenProps,
  23. OnDataFetchedProps,
  24. } from './genericWidgetQueries';
  25. import GenericWidgetQueries from './genericWidgetQueries';
  26. type SeriesResult = EventsStats | MultiSeriesEventsStats | GroupedMultiSeriesEventsStats;
  27. type TableResult = TableData | EventsTableData;
  28. type Props = {
  29. api: Client;
  30. children: (props: GenericWidgetQueriesChildrenProps) => JSX.Element;
  31. organization: Organization;
  32. selection: PageFilters;
  33. widget: Widget;
  34. cursor?: string;
  35. dashboardFilters?: DashboardFilters;
  36. limit?: number;
  37. onDataFetched?: (results: OnDataFetchedProps) => void;
  38. };
  39. function SpansWidgetQueries({
  40. children,
  41. api,
  42. organization,
  43. selection,
  44. widget,
  45. cursor,
  46. limit,
  47. dashboardFilters,
  48. onDataFetched,
  49. }: Props) {
  50. const config = SpansConfig;
  51. const [confidence, setConfidence] = useState<Confidence | null>(null);
  52. const afterFetchSeriesData = (result: SeriesResult) => {
  53. let seriesConfidence;
  54. if (isEventsStats(result)) {
  55. seriesConfidence = determineSeriesConfidence(result);
  56. } else {
  57. const dedupedYAxes = dedupeArray(widget.queries[0]?.aggregates ?? []);
  58. const seriesMap = transformToSeriesMap(result, dedupedYAxes);
  59. const series = dedupedYAxes.flatMap(yAxis => seriesMap[yAxis]).filter(defined);
  60. seriesConfidence = combineConfidenceForSeries(series);
  61. }
  62. setConfidence(seriesConfidence);
  63. onDataFetched?.({
  64. confidence: seriesConfidence,
  65. });
  66. };
  67. return getDynamicText({
  68. value: (
  69. <GenericWidgetQueries<SeriesResult, TableResult>
  70. config={config}
  71. api={api}
  72. organization={organization}
  73. selection={selection}
  74. widget={widget}
  75. cursor={cursor}
  76. limit={limit}
  77. dashboardFilters={dashboardFilters}
  78. onDataFetched={onDataFetched}
  79. afterFetchSeriesData={afterFetchSeriesData}
  80. >
  81. {props =>
  82. children({
  83. ...props,
  84. confidence,
  85. })
  86. }
  87. </GenericWidgetQueries>
  88. ),
  89. fixed: <div />,
  90. });
  91. }
  92. export default SpansWidgetQueries;