traceContextVitals.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import {useTheme} from '@emotion/react';
  2. import {VitalMeter} from 'sentry/views/insights/browser/webVitals/components/webVitalMeters';
  3. import type {WebVitals} from 'sentry/views/insights/browser/webVitals/types';
  4. import type {TraceTree} from 'sentry/views/performance/newTraceDetails/traceModels/traceTree';
  5. type Props = {
  6. tree: TraceTree;
  7. };
  8. const ALLOWED_VITALS = ['lcp', 'fcp', 'cls', 'ttfb', 'inp'];
  9. export function TraceContextVitals({tree}: Props) {
  10. const theme = useTheme();
  11. const hasWebVitals = tree.vital_types.has('web');
  12. const hasValidWebVitals = Array.from(tree.vitals.values()).some(vitalGroup =>
  13. vitalGroup.some(vital => ALLOWED_VITALS.includes(vital.key))
  14. );
  15. if (!hasWebVitals || !hasValidWebVitals) {
  16. return null;
  17. }
  18. return ALLOWED_VITALS.map((webVital, index) => {
  19. let vital: TraceTree.CollectedVital | undefined;
  20. tree.vitals.forEach(entry => (vital = entry.find(v => v.key === webVital)));
  21. // Render empty state
  22. if (!vital || !vital.score) {
  23. return (
  24. <VitalMeter
  25. key={webVital}
  26. webVital={webVital as WebVitals}
  27. score={undefined}
  28. meterValue={undefined}
  29. color={theme.charts.getColorPalette(3)[index]}
  30. showTooltip
  31. isAggregateMode={false}
  32. />
  33. );
  34. }
  35. const colors = theme.charts.getColorPalette(3);
  36. return (
  37. <VitalMeter
  38. key={vital.key}
  39. webVital={vital.key as WebVitals}
  40. score={vital.score}
  41. meterValue={vital.measurement.value}
  42. showTooltip
  43. color={colors[index]}
  44. isAggregateMode={false}
  45. />
  46. );
  47. });
  48. }