traceAnalytics.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. import * as Sentry from '@sentry/react';
  2. import type {Organization} from 'sentry/types/organization';
  3. import {trackAnalytics} from 'sentry/utils/analytics';
  4. import type {TraceTree} from 'sentry/views/performance/newTraceDetails/traceModels/traceTree';
  5. import type {TraceType} from 'sentry/views/performance/newTraceDetails/traceType';
  6. const trackTraceMetadata = (tree: TraceTree, organization: Organization) => {
  7. Sentry.metrics.increment(`trace.trace_shape.${tree.shape}`);
  8. // space[1] represents the node duration (in milliseconds)
  9. const trace_duration_seconds = (tree.root.space?.[1] ?? 0) / 1000;
  10. trackAnalytics('trace.metadata', {
  11. shape: tree.shape,
  12. // round trace_duration_seconds to nearest two decimal places
  13. trace_duration_seconds: Math.round(trace_duration_seconds * 100) / 100,
  14. num_root_children: tree.root.children.length,
  15. organization,
  16. });
  17. };
  18. const trackFailedToFetchTraceState = () =>
  19. Sentry.metrics.increment('trace.failed_to_fetch_trace');
  20. const trackEmptyTraceState = () => Sentry.metrics.increment('trace.empty_trace');
  21. const trackLayoutChange = (layout: string, organization: Organization) =>
  22. trackAnalytics('trace.trace_layout.change', {
  23. layout,
  24. organization,
  25. });
  26. const trackDrawerMinimize = (organization: Organization) =>
  27. trackAnalytics('trace.trace_layout.drawer_minimize', {
  28. organization,
  29. });
  30. const trackShowInView = (organization: Organization) =>
  31. trackAnalytics('trace.trace_layout.show_in_view', {
  32. organization,
  33. });
  34. const trackViewEventJSON = (organization: Organization) =>
  35. trackAnalytics('trace.trace_layout.view_event_json', {
  36. organization,
  37. });
  38. const trackTabPin = (organization: Organization) =>
  39. trackAnalytics('trace.trace_layout.tab_pin', {
  40. organization,
  41. });
  42. const trackTabView = (tab: string, organization: Organization) =>
  43. trackAnalytics('trace.trace_layout.tab_view', {
  44. organization,
  45. tab,
  46. });
  47. const trackSearchFocus = (organization: Organization) =>
  48. trackAnalytics('trace.trace_layout.search_focus', {
  49. organization,
  50. });
  51. const trackResetZoom = (organization: Organization) =>
  52. trackAnalytics('trace.trace_layout.reset_zoom', {
  53. organization,
  54. });
  55. const trackViewShortcuts = (organization: Organization) =>
  56. trackAnalytics('trace.trace_layout.view_shortcuts', {
  57. organization,
  58. });
  59. const trackTraceWarningType = (type: TraceType, organization: Organization) =>
  60. trackAnalytics('trace.trace_warning_type', {
  61. organization,
  62. type,
  63. });
  64. const traceAnalytics = {
  65. // Trace shape
  66. trackTraceMetadata,
  67. trackEmptyTraceState,
  68. trackFailedToFetchTraceState,
  69. // Drawer actions
  70. trackShowInView,
  71. trackViewEventJSON,
  72. // Layout actions
  73. trackLayoutChange,
  74. trackDrawerMinimize,
  75. trackSearchFocus,
  76. trackTabPin,
  77. trackTabView,
  78. // Toolbar actions
  79. trackResetZoom,
  80. trackViewShortcuts,
  81. trackTraceWarningType,
  82. };
  83. export {traceAnalytics};