replayAnalyticsEvents.tsx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import type {LayoutKey} from 'sentry/utils/replays/hooks/useReplayLayout';
  2. import type {Output} from 'sentry/views/replays/detail/network/details/getOutputType';
  3. import type {ReferrerTableType} from 'sentry/views/replays/replayTable/tableCell';
  4. export type ReplayEventParameters = {
  5. 'replay.accessibility-issue-clicked': {
  6. issue_description: string;
  7. issue_impact: string | undefined;
  8. };
  9. 'replay.canvas-detected-banner-clicked': {};
  10. 'replay.details-data-loaded': {
  11. be_errors: number;
  12. fe_errors: number;
  13. finished_at_delta: number; // Log the change (positive number==later date) in finished_at
  14. project_platform: string;
  15. replay_errors: number;
  16. replay_id: string;
  17. started_at_delta: number; // Log the change (negative number==earlier date) in started_at
  18. total_errors: number;
  19. };
  20. 'replay.details-has-hydration-error': {
  21. num_errors: number;
  22. replay_id: string;
  23. };
  24. 'replay.details-layout-changed': {
  25. chosen_layout: LayoutKey;
  26. default_layout: LayoutKey;
  27. };
  28. 'replay.details-network-panel-closed': {
  29. is_sdk_setup: boolean;
  30. };
  31. 'replay.details-network-panel-opened': {
  32. is_sdk_setup: boolean;
  33. resource_method: string;
  34. resource_status: string;
  35. resource_type: string;
  36. };
  37. 'replay.details-network-tab-changed': {
  38. is_sdk_setup: boolean;
  39. output: Output;
  40. resource_method: string;
  41. resource_status: string;
  42. resource_type: string;
  43. tab: string;
  44. };
  45. 'replay.details-resized-panel': {
  46. layout: LayoutKey;
  47. slide_motion: 'toTop' | 'toBottom' | 'toLeft' | 'toRight';
  48. };
  49. 'replay.details-resource-docs-clicked': {
  50. title: string;
  51. };
  52. 'replay.details-tab-changed': {
  53. tab: string;
  54. };
  55. 'replay.details-time-spent': {
  56. seconds: number;
  57. user_email: string;
  58. };
  59. // similar purpose as "replay.details-viewed", however we're capturing the navigation action
  60. // in order to also include a project platform
  61. 'replay.list-navigate-to-details': {
  62. platform: string | undefined;
  63. project_id: string | undefined;
  64. referrer: string;
  65. referrer_table?: ReferrerTableType;
  66. };
  67. 'replay.list-paginated': {
  68. direction: 'next' | 'prev';
  69. };
  70. 'replay.list-sorted': {
  71. column: string;
  72. };
  73. 'replay.list-time-spent': {
  74. seconds: number;
  75. user_email: string;
  76. };
  77. 'replay.list-view-setup-sidebar': {};
  78. 'replay.play-pause': {
  79. context: string;
  80. play: boolean;
  81. user_email: string;
  82. };
  83. 'replay.rage-click-sdk-banner.dismissed': {
  84. surface: string;
  85. };
  86. 'replay.rage-click-sdk-banner.rendered': {
  87. is_dismissed: boolean;
  88. surface: string;
  89. };
  90. 'replay.render-issues-group-list': {
  91. platform: string | undefined;
  92. project_id: string | undefined;
  93. };
  94. 'replay.render-player': {
  95. aspect_ratio: 'portrait' | 'landscape';
  96. context: string;
  97. // What scale is the video as a percent, bucketed into ranges of 10% increments
  98. // example:
  99. // - The video is shown at 25% the normal size
  100. // - in CSS we use the statement `transform: scale(0.25);`
  101. // - The logged value is `20`, because the scale is in the range of 20% to 30%.
  102. scale_bucket: 0 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100;
  103. };
  104. 'replay.search': {
  105. search_keys: string;
  106. };
  107. 'replay.toggle-fullscreen': {
  108. context: string;
  109. fullscreen: boolean;
  110. user_email: string;
  111. };
  112. };
  113. export type ReplayEventKey = keyof ReplayEventParameters;
  114. export const replayEventMap: Record<ReplayEventKey, string | null> = {
  115. 'replay.accessibility-issue-clicked': 'Clicked Replay Accessibility Issue',
  116. 'replay.canvas-detected-banner-clicked': 'Clicked Canvas Detected in Replay Banner',
  117. 'replay.details-data-loaded': 'Replay Details Data Loaded',
  118. 'replay.details-has-hydration-error': 'Replay Details Has Hydration Error',
  119. 'replay.details-layout-changed': 'Changed Replay Details Layout',
  120. 'replay.details-network-panel-closed': 'Closed Replay Network Details Panel',
  121. 'replay.details-network-panel-opened': 'Opened Replay Network Details Panel',
  122. 'replay.details-network-tab-changed': 'Changed Replay Network Details Tab',
  123. 'replay.details-resized-panel': 'Resized Replay Details Panel',
  124. 'replay.details-resource-docs-clicked': 'Replay Details Resource Docs Clicked',
  125. 'replay.details-tab-changed': 'Changed Replay Details Tab',
  126. 'replay.details-time-spent': 'Time Spent Viewing Replay Details',
  127. 'replay.list-navigate-to-details': 'Replays List Navigate to Replay Details',
  128. 'replay.list-paginated': 'Paginated Replay List',
  129. 'replay.list-sorted': 'Sorted Replay List',
  130. 'replay.list-time-spent': 'Time Spent Viewing Replay List',
  131. 'replay.list-view-setup-sidebar': 'Views Set Up Replays Sidebar',
  132. 'replay.play-pause': 'Played/Paused Replay',
  133. 'replay.rage-click-sdk-banner.dismissed': 'Replay Rage Click SDK Banner Dismissed',
  134. 'replay.rage-click-sdk-banner.rendered': 'Replay Rage Click SDK Banner Rendered',
  135. 'replay.render-issues-group-list': 'Render Issues Detail Replay List',
  136. 'replay.render-player': 'Rendered ReplayPlayer',
  137. 'replay.search': 'Searched Replay',
  138. 'replay.toggle-fullscreen': 'Toggled Replay Fullscreen',
  139. };