content.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import {useCallback} from 'react';
  2. import Feature from 'sentry/components/acl/feature';
  3. import FeatureBadge from 'sentry/components/badge/featureBadge';
  4. import {Button} from 'sentry/components/button';
  5. import ButtonBar from 'sentry/components/buttonBar';
  6. import FeedbackWidgetButton from 'sentry/components/feedback/widget/feedbackWidgetButton';
  7. import * as Layout from 'sentry/components/layouts/thirds';
  8. import PageFiltersContainer from 'sentry/components/organizations/pageFilters/container';
  9. import {PageHeadingQuestionTooltip} from 'sentry/components/pageHeadingQuestionTooltip';
  10. import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle';
  11. import {t} from 'sentry/locale';
  12. import {decodeScalar} from 'sentry/utils/queryString';
  13. import {useLocation} from 'sentry/utils/useLocation';
  14. import {useNavigate} from 'sentry/utils/useNavigate';
  15. import useOrganization from 'sentry/utils/useOrganization';
  16. import {LogsTabContent} from 'sentry/views/explore/logs/logsTab';
  17. import {SpansTabContent} from 'sentry/views/explore/spans/spansTab';
  18. import TraceExplorerTabs from 'sentry/views/explore/tabBar';
  19. import {limitMaxPickableDays} from 'sentry/views/explore/utils';
  20. export function ExploreContent() {
  21. const organization = useOrganization();
  22. const {defaultPeriod, maxPickableDays, relativeOptions} = limitMaxPickableDays(
  23. organization!
  24. );
  25. const location = useLocation();
  26. const navigate = useNavigate();
  27. const switchToOldTraceExplorer = useCallback(() => {
  28. navigate({
  29. ...location,
  30. query: {
  31. ...location.query,
  32. view: 'trace',
  33. },
  34. });
  35. }, [location, navigate]);
  36. const ourlogsEnabled = organization.features.includes('ourlogs-enabled');
  37. const selectedTab = decodeScalar(location.query.exploreTab, 'spans');
  38. return (
  39. <SentryDocumentTitle title={t('Traces')} orgSlug={organization?.slug}>
  40. <PageFiltersContainer maxPickableDays={maxPickableDays}>
  41. <Layout.Page>
  42. <Layout.Header>
  43. <Layout.HeaderContent>
  44. <Layout.Title>
  45. {t('Traces')}
  46. <PageHeadingQuestionTooltip
  47. docsUrl="https://github.com/getsentry/sentry/discussions/81239"
  48. title={t(
  49. 'Find problematic spans/traces or compute real-time metrics via aggregation.'
  50. )}
  51. linkLabel={t('Read the Discussion')}
  52. />
  53. <FeatureBadge
  54. title={t(
  55. 'This feature is available for early adopters and the UX may change'
  56. )}
  57. type="beta"
  58. />
  59. </Layout.Title>
  60. </Layout.HeaderContent>
  61. <Layout.HeaderActions>
  62. <ButtonBar gap={1}>
  63. <Feature organization={organization} features="visibility-explore-admin">
  64. <Button onClick={switchToOldTraceExplorer} size="sm">
  65. {t('Switch to Old Trace Explore')}
  66. </Button>
  67. </Feature>
  68. <FeedbackWidgetButton />
  69. </ButtonBar>
  70. </Layout.HeaderActions>
  71. {ourlogsEnabled ? <TraceExplorerTabs selected={selectedTab} /> : null}
  72. </Layout.Header>
  73. {ourlogsEnabled && selectedTab === 'logs' ? (
  74. <LogsTabContent />
  75. ) : (
  76. <SpansTabContent
  77. defaultPeriod={defaultPeriod}
  78. maxPickableDays={maxPickableDays}
  79. relativeOptions={relativeOptions}
  80. />
  81. )}
  82. </Layout.Page>
  83. </PageFiltersContainer>
  84. </SentryDocumentTitle>
  85. );
  86. }