spanDescription.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import {useMemo} from 'react';
  2. import styled from '@emotion/styled';
  3. import Feature from 'sentry/components/acl/feature';
  4. import {CodeSnippet} from 'sentry/components/codeSnippet';
  5. import {Project} from 'sentry/types';
  6. import {StackTraceMiniFrame} from 'sentry/views/starfish/components/stackTraceMiniFrame';
  7. import {MetricsResponse, SpanMetricsField} from 'sentry/views/starfish/types';
  8. import {SQLishFormatter} from 'sentry/views/starfish/utils/sqlish/SQLishFormatter';
  9. type Props = {
  10. span: Pick<
  11. MetricsResponse,
  12. SpanMetricsField.SPAN_OP | SpanMetricsField.SPAN_DESCRIPTION
  13. > & {
  14. data?: {
  15. 'code.filepath'?: string;
  16. 'code.function'?: string;
  17. 'code.lineno'?: number;
  18. };
  19. };
  20. project?: Project;
  21. };
  22. export function SpanDescription({span, project}: Props) {
  23. if (span[SpanMetricsField.SPAN_OP]?.startsWith('db')) {
  24. return <DatabaseSpanDescription span={span} project={project} />;
  25. }
  26. return <WordBreak>{span[SpanMetricsField.SPAN_DESCRIPTION]}</WordBreak>;
  27. }
  28. const formatter = new SQLishFormatter();
  29. function DatabaseSpanDescription({span, project}: Props) {
  30. const rawDescription = span[SpanMetricsField.SPAN_DESCRIPTION];
  31. const formatterDescription = useMemo(() => {
  32. return formatter.toString(rawDescription);
  33. }, [rawDescription]);
  34. return (
  35. <Frame>
  36. <CodeSnippet language="sql" isRounded={false}>
  37. {formatterDescription}
  38. </CodeSnippet>
  39. <Feature features={['organizations:performance-database-view-query-source']}>
  40. {span?.data?.['code.filepath'] && (
  41. <StackTraceMiniFrame
  42. project={project}
  43. frame={{
  44. absPath: span?.data?.['code.filepath'],
  45. lineNo: span?.data?.['code.lineno'],
  46. function: span?.data?.['code.function'],
  47. }}
  48. />
  49. )}
  50. </Feature>
  51. </Frame>
  52. );
  53. }
  54. const Frame = styled('div')`
  55. border: solid 1px ${p => p.theme.border};
  56. border-radius: ${p => p.theme.borderRadius};
  57. overflow: hidden;
  58. `;
  59. const WordBreak = styled('div')`
  60. word-break: break-word;
  61. `;