trace.tsx 2.2 KB

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