replayAnalyticsEvents.tsx 5.7 KB

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