trace.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import {Fragment, useMemo} from 'react';
  2. import type {Tag} from 'sentry/actionCreators/events';
  3. import type {EventTransaction} from 'sentry/types';
  4. import {generateQueryWithTag} from 'sentry/utils';
  5. import type EventView from 'sentry/utils/discover/eventView';
  6. import {formatTagKey} from 'sentry/utils/discover/fields';
  7. import type {
  8. TraceFullDetailed,
  9. TraceSplitResults,
  10. } from 'sentry/utils/performance/quickTrace/types';
  11. import type {UseApiQueryResult} from 'sentry/utils/queryClient';
  12. import type RequestError from 'sentry/utils/requestError/requestError';
  13. import {useLocation} from 'sentry/utils/useLocation';
  14. import useOrganization from 'sentry/utils/useOrganization';
  15. import Tags from 'sentry/views/discover/tags';
  16. import {TraceWarnings} from 'sentry/views/performance/newTraceDetails/traceWarnings';
  17. import {isTraceNode} from '../../guards';
  18. import type {TraceTree, TraceTreeNode} from '../../traceModels/traceTree';
  19. import {IssueList} from '../details/issues/issues';
  20. type TraceDetailsProps = {
  21. node: TraceTreeNode<TraceTree.NodeValue> | null;
  22. rootEventResults: UseApiQueryResult<EventTransaction, RequestError>;
  23. tagsQueryResults: UseApiQueryResult<Tag[], RequestError>;
  24. traceEventView: EventView;
  25. traces: TraceSplitResults<TraceFullDetailed> | null;
  26. tree: TraceTree;
  27. };
  28. export function TraceDetails(props: TraceDetailsProps) {
  29. const location = useLocation();
  30. const organization = useOrganization();
  31. const issues = useMemo(() => {
  32. if (!props.node) {
  33. return [];
  34. }
  35. return [...props.node.errors, ...props.node.performance_issues];
  36. }, [props.node]);
  37. if (!props.node) {
  38. return null;
  39. }
  40. if (!(props.node && isTraceNode(props.node))) {
  41. throw new Error('Expected a trace node');
  42. }
  43. const {data: rootEvent} = props.rootEventResults;
  44. return (
  45. <Fragment>
  46. {props.tree.type === 'trace' ? <TraceWarnings type={props.tree.shape} /> : null}
  47. <IssueList issues={issues} node={props.node} organization={organization} />
  48. {rootEvent ? (
  49. <Tags
  50. tagsQueryResults={props.tagsQueryResults}
  51. generateUrl={(key: string, value: string) => {
  52. const url = props.traceEventView.getResultsViewUrlTarget(
  53. organization.slug,
  54. false
  55. );
  56. url.query = generateQueryWithTag(url.query, {
  57. key: formatTagKey(key),
  58. value,
  59. });
  60. return url;
  61. }}
  62. totalValues={props.tree.eventsCount}
  63. eventView={props.traceEventView}
  64. organization={organization}
  65. location={location}
  66. />
  67. ) : null}
  68. </Fragment>
  69. );
  70. }