samplingSDKAlert.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import styled from '@emotion/styled';
  2. import {openModal} from 'sentry/actionCreators/modal';
  3. import Alert from 'sentry/components/alert';
  4. import Button from 'sentry/components/button';
  5. import ProjectBadge from 'sentry/components/idBadge/projectBadge';
  6. import {t} from 'sentry/locale';
  7. import space from 'sentry/styles/space';
  8. import {Organization} from 'sentry/types';
  9. import {RecommendedSdkUpgrade, SamplingRule} from 'sentry/types/sampling';
  10. import {
  11. RecommendedStepsModal,
  12. RecommendedStepsModalProps,
  13. } from './modals/recommendedStepsModal';
  14. import {isUniformRule} from './utils';
  15. type Props = Pick<RecommendedStepsModalProps, 'projectId' | 'onReadDocs'> & {
  16. organization: Organization;
  17. recommendedSdkUpgrades: RecommendedSdkUpgrade[];
  18. rules: SamplingRule[];
  19. showLinkToTheModal?: boolean;
  20. };
  21. export function SamplingSDKAlert({
  22. organization,
  23. projectId,
  24. recommendedSdkUpgrades,
  25. rules,
  26. onReadDocs,
  27. showLinkToTheModal = true,
  28. }: Props) {
  29. if (recommendedSdkUpgrades.length === 0) {
  30. return null;
  31. }
  32. function handleOpenRecommendedSteps() {
  33. openModal(modalProps => (
  34. <RecommendedStepsModal
  35. {...modalProps}
  36. onReadDocs={onReadDocs}
  37. organization={organization}
  38. projectId={projectId}
  39. recommendedSdkUpgrades={recommendedSdkUpgrades}
  40. />
  41. ));
  42. }
  43. const atLeastOneRuleActive = rules.some(rule => rule.active);
  44. const uniformRule = rules.find(isUniformRule);
  45. return (
  46. <Alert
  47. data-test-id="recommended-sdk-upgrades-alert"
  48. type={atLeastOneRuleActive ? 'error' : 'info'}
  49. showIcon
  50. trailingItems={
  51. showLinkToTheModal && uniformRule ? (
  52. <Button onClick={handleOpenRecommendedSteps} priority="link" borderless>
  53. {atLeastOneRuleActive ? t('Resolve Now') : t('Learn More')}
  54. </Button>
  55. ) : undefined
  56. }
  57. >
  58. {atLeastOneRuleActive
  59. ? t(
  60. 'Server-side sampling rules are in effect without the following SDK’s being updated to their latest version.'
  61. )
  62. : t(
  63. 'To keep a consistent amount of transactions across your applications multiple services, we recommend you update the SDK versions for the following projects:'
  64. )}
  65. <Projects>
  66. {recommendedSdkUpgrades.map(recommendedSdkUpgrade => (
  67. <ProjectBadge
  68. key={recommendedSdkUpgrade.project.id}
  69. project={recommendedSdkUpgrade.project}
  70. avatarSize={16}
  71. />
  72. ))}
  73. </Projects>
  74. </Alert>
  75. );
  76. }
  77. const Projects = styled('div')`
  78. display: flex;
  79. flex-wrap: wrap;
  80. gap: ${space(1.5)};
  81. justify-content: flex-start;
  82. margin-top: ${space(1)};
  83. `;