spanDescription.tsx 2.1 KB

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