index.tsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import {Fragment, useMemo} from 'react';
  2. import type {Tag} from 'sentry/actionCreators/events';
  3. import type {ApiResult} from 'sentry/api';
  4. import type {EventTransaction} from 'sentry/types/event';
  5. import type EventView from 'sentry/utils/discover/eventView';
  6. import type {
  7. TraceFullDetailed,
  8. TraceSplitResults,
  9. } from 'sentry/utils/performance/quickTrace/types';
  10. import type {UseApiQueryResult, UseInfiniteQueryResult} from 'sentry/utils/queryClient';
  11. import type RequestError from 'sentry/utils/requestError/requestError';
  12. import {useLocation} from 'sentry/utils/useLocation';
  13. import useOrganization from 'sentry/utils/useOrganization';
  14. import {TraceWarnings} from 'sentry/views/performance/newTraceDetails/traceWarnings';
  15. import {isTraceNode} from '../../../guards';
  16. import type {TraceMetaQueryResults} from '../../../traceApi/useTraceMeta';
  17. import type {TraceTree, TraceTreeNode} from '../../../traceModels/traceTree';
  18. import type {TraceType} from '../../../traceType';
  19. import {IssueList} from '../../details/issues/issues';
  20. import {TraceDrawerComponents} from '../../details/styles';
  21. import {GeneralInfo} from './generalInfo';
  22. import {TagsSummary} from './tagsSummary';
  23. type TraceDetailsProps = {
  24. metaResults: TraceMetaQueryResults;
  25. node: TraceTreeNode<TraceTree.NodeValue> | null;
  26. rootEventResults: UseApiQueryResult<EventTransaction, RequestError>;
  27. tagsInfiniteQueryResults: UseInfiniteQueryResult<ApiResult<Tag[]>, unknown>;
  28. traceEventView: EventView;
  29. traceType: TraceType;
  30. traces: TraceSplitResults<TraceFullDetailed> | null;
  31. tree: TraceTree;
  32. };
  33. export function TraceDetails(props: TraceDetailsProps) {
  34. const location = useLocation();
  35. const organization = useOrganization();
  36. const issues = useMemo(() => {
  37. if (!props.node) {
  38. return [];
  39. }
  40. return [...props.node.errors, ...props.node.performance_issues];
  41. }, [props.node]);
  42. if (!props.node) {
  43. return null;
  44. }
  45. if (!(props.node && isTraceNode(props.node))) {
  46. throw new Error('Expected a trace node');
  47. }
  48. return (
  49. <Fragment>
  50. {props.tree.type === 'trace' ? <TraceWarnings type={props.traceType} /> : null}
  51. <IssueList issues={issues} node={props.node} organization={organization} />
  52. <TraceDrawerComponents.SectionCardGroup>
  53. <GeneralInfo
  54. organization={organization}
  55. traces={props.traces}
  56. tree={props.tree}
  57. node={props.node}
  58. rootEventResults={props.rootEventResults}
  59. metaResults={props.metaResults}
  60. />
  61. <TagsSummary
  62. tagsInfiniteQueryResults={props.tagsInfiniteQueryResults}
  63. organization={organization}
  64. location={location}
  65. eventView={props.traceEventView}
  66. totalValues={props.tree.eventsCount}
  67. />
  68. </TraceDrawerComponents.SectionCardGroup>
  69. </Fragment>
  70. );
  71. }