@oneuptime/common 12.0.33 → 12.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (652) hide show
  1. package/Models/AnalyticsModels/RumSession.ts +117 -1
  2. package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
  3. package/Models/DatabaseModels/AlertCustomField.ts +77 -3
  4. package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
  5. package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
  6. package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
  7. package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
  8. package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
  9. package/Models/DatabaseModels/RumApplication.ts +6 -6
  10. package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
  11. package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
  12. package/Models/DatabaseModels/TeamCustomField.ts +77 -3
  13. package/Models/DatabaseModels/TeamMember.ts +0 -9
  14. package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
  15. package/Models/DatabaseModels/TeamPermission.ts +3 -24
  16. package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
  17. package/Models/DatabaseModels/UserTelegram.ts +0 -4
  18. package/Scripts/benchmark-fanin-capacity.js +181 -0
  19. package/Server/API/TelemetryAPI.ts +1284 -164
  20. package/Server/API/UserNotificationSettingAPI.ts +55 -0
  21. package/Server/API/UserTelegramAPI.ts +48 -4
  22. package/Server/EnvironmentConfig.ts +35 -2
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  28. package/Server/Infrastructure/QueueWorker.ts +20 -14
  29. package/Server/Infrastructure/Semaphore.ts +2 -0
  30. package/Server/Middleware/TelemetryIngest.ts +453 -7
  31. package/Server/Services/AccessTokenService.ts +1 -0
  32. package/Server/Services/AlertCustomFieldService.ts +98 -0
  33. package/Server/Services/AlertService.ts +37 -0
  34. package/Server/Services/ApiKeyPermissionService.ts +461 -29
  35. package/Server/Services/CustomFieldMappingService.ts +879 -0
  36. package/Server/Services/GlobalConfigService.ts +194 -0
  37. package/Server/Services/IncidentCustomFieldService.ts +98 -0
  38. package/Server/Services/IncidentService.ts +35 -0
  39. package/Server/Services/MetricService.ts +194 -0
  40. package/Server/Services/MonitorService.ts +32 -0
  41. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +78 -25
  42. package/Server/Services/ProjectService.ts +22 -0
  43. package/Server/Services/RoutineEmailSettingsService.ts +73 -0
  44. package/Server/Services/RumSessionReplayViewService.ts +104 -24
  45. package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
  46. package/Server/Services/ScheduledMaintenanceService.ts +32 -0
  47. package/Server/Services/TeamMemberService.ts +78 -0
  48. package/Server/Services/TeamPermissionService.ts +235 -3
  49. package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
  50. package/Server/Services/UserNotificationSettingService.ts +34 -6
  51. package/Server/Services/UserTelegramService.ts +326 -5
  52. package/Server/Types/Database/QueryHelper.ts +2 -0
  53. package/Server/Utils/APIKey/AccessPermission.ts +5 -2
  54. package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
  55. package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
  56. package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
  57. package/Server/Utils/DataSource/EgressGuard.ts +177 -8
  58. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
  59. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +57 -4
  60. package/Server/Utils/FrontendEnvironment.ts +40 -0
  61. package/Server/Utils/LogRedaction.ts +20 -0
  62. package/Server/Utils/Logger.ts +11 -0
  63. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +338 -77
  64. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
  65. package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
  66. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +110 -15
  67. package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
  68. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
  69. package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
  70. package/Server/Utils/SSRFProtection.ts +217 -10
  71. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
  72. package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
  73. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
  74. package/Server/Utils/StartServer.ts +2 -17
  75. package/Server/Utils/TelegramVerificationToken.ts +185 -0
  76. package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
  77. package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
  78. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
  79. package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
  80. package/Server/Utils/VM/VMAPI.ts +1 -0
  81. package/Server/Utils/VM/VMRunner.ts +975 -95
  82. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
  83. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
  84. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
  85. package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
  86. package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
  87. package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
  88. package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
  89. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
  90. package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
  91. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
  92. package/Tests/ResponsiveVisibility.test.ts +115 -0
  93. package/Tests/ResponsiveVisibility.ts +183 -0
  94. package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
  95. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
  96. package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
  97. package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
  98. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +202 -0
  99. package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
  100. package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
  101. package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
  102. package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
  103. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
  104. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
  105. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
  106. package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
  107. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
  108. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
  109. package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
  110. package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
  111. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
  112. package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
  113. package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
  114. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +226 -1
  115. package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
  116. package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
  117. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
  118. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
  119. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
  120. package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
  121. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
  122. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
  123. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
  124. package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
  125. package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
  126. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
  127. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
  128. package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
  129. package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
  130. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
  131. package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
  132. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
  133. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
  134. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
  135. package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
  136. package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
  137. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
  138. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +584 -0
  139. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
  140. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
  141. package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
  142. package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
  143. package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
  144. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
  145. package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
  146. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
  147. package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
  148. package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
  149. package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
  150. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
  151. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
  152. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
  153. package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
  154. package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
  155. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
  156. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
  157. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
  158. package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
  159. package/Tests/Types/JSONFunctions.test.ts +260 -0
  160. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
  161. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
  162. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
  163. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
  164. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
  165. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
  166. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
  167. package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
  168. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
  169. package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
  170. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
  171. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
  172. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
  173. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
  174. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
  175. package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
  176. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
  177. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
  178. package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
  179. package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
  180. package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
  181. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
  182. package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
  183. package/Tests/Types/WebsiteRequest.test.ts +285 -3
  184. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
  185. package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
  186. package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
  187. package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
  188. package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
  189. package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
  190. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
  191. package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
  192. package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
  193. package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
  194. package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
  195. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
  196. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
  197. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
  198. package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
  199. package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
  200. package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
  201. package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
  202. package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
  203. package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
  204. package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
  205. package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
  206. package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
  207. package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
  208. package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
  209. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
  210. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
  211. package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
  212. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
  213. package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
  214. package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
  215. package/Tests/UI/Rum/ReplayHeader.test.tsx +711 -0
  216. package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
  217. package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
  218. package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
  219. package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
  220. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
  221. package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
  222. package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
  223. package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
  224. package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
  225. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
  226. package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
  227. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
  228. package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
  229. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
  230. package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
  231. package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
  232. package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
  233. package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
  234. package/Tests/Utils/API.test.ts +308 -0
  235. package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
  236. package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
  237. package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
  238. package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
  239. package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
  240. package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
  241. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
  242. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
  243. package/Tests/Utils/ValueFormatter.test.ts +148 -0
  244. package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
  245. package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
  246. package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
  247. package/Types/Icon/IconProp.ts +1 -0
  248. package/Types/JSONFunctions.ts +189 -43
  249. package/Types/Monitor/CephAlertTemplates.ts +157 -195
  250. package/Types/Monitor/DockerAlertTemplates.ts +338 -128
  251. package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
  252. package/Types/Monitor/HostAlertTemplates.ts +302 -130
  253. package/Types/Monitor/IotAlertTemplates.ts +112 -104
  254. package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
  255. package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
  256. package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
  257. package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
  258. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
  259. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
  260. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
  261. package/Types/Monitor/RumAlertTemplates.ts +46 -7
  262. package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
  263. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
  264. package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
  265. package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
  266. package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
  267. package/Types/Rum/SessionReplay.ts +209 -0
  268. package/Types/Rum/SessionReplayApi.ts +722 -0
  269. package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
  270. package/Types/Rum/SessionReplayConsentMode.ts +11 -7
  271. package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
  272. package/Types/Rum/SessionReplayHealth.ts +238 -0
  273. package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
  274. package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
  275. package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
  276. package/Types/WebsiteRequest.ts +85 -3
  277. package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
  278. package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
  279. package/UI/Components/Charts/Line/LineChart.tsx +13 -2
  280. package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
  281. package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
  282. package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
  283. package/UI/Components/Charts/Utils/XAxis.ts +217 -0
  284. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +143 -25
  285. package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
  286. package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
  287. package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
  288. package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
  289. package/UI/Components/Header/Header.tsx +25 -9
  290. package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
  291. package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
  292. package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
  293. package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
  294. package/UI/Components/Icon/Icon.tsx +11 -0
  295. package/UI/Components/JSONTable/JSONTable.tsx +2 -2
  296. package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
  297. package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
  298. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
  299. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
  300. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
  301. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
  302. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
  303. package/UI/Components/ModelTable/Column.ts +15 -0
  304. package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
  305. package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
  306. package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
  307. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
  308. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  309. package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
  310. package/UI/Components/Table/CellClassName.ts +81 -0
  311. package/UI/Components/Table/TableRow.tsx +20 -14
  312. package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
  313. package/UI/Components/Table/Types/Column.ts +36 -0
  314. package/UI/Components/Tooltip/Tooltip.tsx +11 -1
  315. package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
  316. package/UI/Components/Workflow/NodePlacement.ts +57 -0
  317. package/UI/Components/Workflow/Workflow.tsx +47 -18
  318. package/UI/Config.ts +15 -33
  319. package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
  320. package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
  321. package/UI/Utils/Telemetry/Telemetry.ts +10 -8
  322. package/Utils/API.ts +129 -3
  323. package/Utils/HTTPResponseBodyReader.ts +221 -0
  324. package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
  325. package/Utils/Rum/ChunkMath.ts +106 -0
  326. package/Utils/Rum/SessionReplayHealth.ts +732 -0
  327. package/Utils/Rum/SessionReplayStringMap.ts +226 -0
  328. package/Utils/Schema/ModelSchema.ts +1 -0
  329. package/Utils/StatusPage/ResourceSearch.ts +290 -0
  330. package/Utils/Telemetry/OriginAllowList.ts +355 -0
  331. package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
  332. package/Utils/ValueFormatter.ts +35 -1
  333. package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
  334. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
  335. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
  336. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
  338. package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
  339. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
  340. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
  341. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
  342. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  343. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
  344. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
  345. package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
  346. package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
  347. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
  348. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
  349. package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
  350. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  351. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
  352. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
  354. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
  356. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
  358. package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
  360. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
  362. package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
  364. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
  366. package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
  367. package/build/dist/Server/API/TelemetryAPI.js +769 -109
  368. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  369. package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
  370. package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
  371. package/build/dist/Server/API/UserTelegramAPI.js +28 -6
  372. package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
  373. package/build/dist/Server/EnvironmentConfig.js +29 -2
  374. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  375. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
  376. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
  377. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
  378. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
  379. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
  380. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
  381. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
  382. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
  383. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  384. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  385. package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
  386. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  387. package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
  388. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  389. package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
  390. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  391. package/build/dist/Server/Services/AccessTokenService.js +1 -0
  392. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  393. package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
  394. package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
  395. package/build/dist/Server/Services/AlertService.js +34 -0
  396. package/build/dist/Server/Services/AlertService.js.map +1 -1
  397. package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
  398. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  399. package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
  400. package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
  401. package/build/dist/Server/Services/GlobalConfigService.js +133 -0
  402. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
  404. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentService.js +32 -0
  406. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  407. package/build/dist/Server/Services/MetricService.js +163 -0
  408. package/build/dist/Server/Services/MetricService.js.map +1 -1
  409. package/build/dist/Server/Services/MonitorService.js +29 -0
  410. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  411. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +79 -27
  412. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/ProjectService.js +22 -0
  414. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  415. package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
  416. package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
  417. package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
  418. package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
  419. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
  420. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
  421. package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
  422. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  423. package/build/dist/Server/Services/TeamMemberService.js +62 -2
  424. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  425. package/build/dist/Server/Services/TeamPermissionService.js +166 -3
  426. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  427. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
  428. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  429. package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
  430. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  431. package/build/dist/Server/Services/UserTelegramService.js +257 -4
  432. package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
  433. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  434. package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
  435. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  436. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
  437. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
  438. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
  439. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
  440. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
  441. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
  442. package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
  443. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  444. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
  445. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
  446. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +44 -2
  447. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  448. package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
  449. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
  450. package/build/dist/Server/Utils/LogRedaction.js +20 -0
  451. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  452. package/build/dist/Server/Utils/Logger.js +10 -0
  453. package/build/dist/Server/Utils/Logger.js.map +1 -1
  454. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +287 -68
  455. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  456. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
  457. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  458. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
  459. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  460. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +88 -13
  461. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  462. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  463. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  464. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
  465. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  466. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
  467. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
  468. package/build/dist/Server/Utils/SSRFProtection.js +136 -9
  469. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  470. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
  471. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  472. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
  473. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
  474. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
  475. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  476. package/build/dist/Server/Utils/StartServer.js +3 -14
  477. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  478. package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
  479. package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
  480. package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
  481. package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
  482. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
  483. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
  484. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
  485. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
  486. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
  487. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
  488. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  489. package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
  490. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  491. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
  492. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
  493. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
  494. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
  495. package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
  496. package/build/dist/Types/CustomField/CustomFieldValueMapping.js.map +1 -0
  497. package/build/dist/Types/Icon/IconProp.js +1 -0
  498. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  499. package/build/dist/Types/JSONFunctions.js +118 -37
  500. package/build/dist/Types/JSONFunctions.js.map +1 -1
  501. package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
  502. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  503. package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
  504. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
  505. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
  506. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
  507. package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
  508. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
  509. package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
  510. package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
  511. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
  512. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  513. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
  514. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  515. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
  516. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
  517. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
  518. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  519. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
  520. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  521. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
  522. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  523. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
  524. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
  525. package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
  526. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  527. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
  528. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
  529. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
  530. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
  531. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
  532. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
  533. package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
  534. package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
  535. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
  536. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
  537. package/build/dist/Types/Rum/SessionReplay.js +117 -0
  538. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  539. package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
  540. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
  541. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
  542. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
  543. package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
  544. package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
  545. package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
  546. package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
  547. package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
  548. package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
  549. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
  550. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
  551. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
  552. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
  553. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
  554. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
  555. package/build/dist/Types/WebsiteRequest.js +55 -3
  556. package/build/dist/Types/WebsiteRequest.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
  558. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
  560. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
  562. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  563. package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
  564. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
  565. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  566. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
  567. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  568. package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
  569. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  570. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +80 -6
  571. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  572. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
  573. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
  574. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
  575. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  576. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
  577. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  578. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
  579. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
  580. package/build/dist/UI/Components/Header/Header.js +2 -3
  581. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  582. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
  583. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
  584. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
  585. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
  586. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
  587. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
  588. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
  589. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
  590. package/build/dist/UI/Components/Icon/Icon.js +5 -0
  591. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  592. package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
  593. package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
  594. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
  595. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
  596. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
  597. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
  598. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
  599. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
  600. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
  601. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  602. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
  603. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  604. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
  605. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  606. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
  607. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
  608. package/build/dist/UI/Components/Table/CellClassName.js +55 -0
  609. package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
  610. package/build/dist/UI/Components/Table/TableRow.js +16 -13
  611. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  612. package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
  613. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
  614. package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
  615. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  616. package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
  617. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  618. package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
  619. package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
  620. package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
  621. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  622. package/build/dist/UI/Config.js +10 -20
  623. package/build/dist/UI/Config.js.map +1 -1
  624. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
  625. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
  626. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
  627. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
  628. package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
  629. package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
  630. package/build/dist/Utils/API.js +67 -5
  631. package/build/dist/Utils/API.js.map +1 -1
  632. package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
  633. package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
  636. package/build/dist/Utils/Rum/ChunkMath.js +76 -0
  637. package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
  638. package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
  639. package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
  640. package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
  641. package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
  642. package/build/dist/Utils/Schema/ModelSchema.js +1 -0
  643. package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
  644. package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
  645. package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
  646. package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
  647. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
  648. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
  649. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
  650. package/build/dist/Utils/ValueFormatter.js +32 -1
  651. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  652. package/package.json +1 -1
@@ -9,18 +9,31 @@ import SessionReplayConsentMode from "../../../Types/Rum/SessionReplayConsentMod
9
9
  import { parseSessionReplayMaskingMode, } from "../../../Types/Rum/SessionReplayMaskingMode";
10
10
  import { DEFAULT_SESSION_REPLAY_RETENTION_IN_DAYS, SESSION_REPLAY_ALLOWED_RETENTION_DAYS, } from "../../../Types/Rum/SessionReplay";
11
11
  import SessionIdentity from "../../../Utils/Rum/SessionIdentity";
12
+ import OriginAllowList from "../../../Utils/Telemetry/OriginAllowList";
13
+ /*
14
+ * RumApplication.sessionReplaySamplePercentage's column default. Declared
15
+ * here rather than read off the model because this file compiles against
16
+ * checkouts whose model predates the column (see buildSelect).
17
+ */
18
+ const DEFAULT_SESSION_REPLAY_SAMPLE_PERCENTAGE = 100;
12
19
  /*
13
20
  * Resolves the session-replay policy for one (project, appIdentifier) pair,
14
21
  * which is what all three ingest-time gates need: the org-wide allow flag,
15
22
  * the per-application enable flag, and the origin allowlist.
16
23
  *
17
- * Every default in here is the REFUSING one. An application that has never
18
- * been configured, a project that has never opted in, a row whose policy
19
- * columns have not been migrated yet, and a lookup that fails outright all
20
- * resolve to "do not accept recordings". That is the opposite posture from
21
- * the log and trace scrub loaders, which continue with empty rules on
22
- * failure, and it is deliberate: a span recorded by mistake is a span, a
23
- * session recorded by mistake is a video of a real person.
24
+ * The two SWITCHES default to refusing. An application that has never been
25
+ * configured, a project that has never opted in, a row whose enable columns
26
+ * have not been migrated yet, and a lookup that fails outright all resolve
27
+ * to "do not accept recordings". That is the opposite posture from the log
28
+ * and trace scrub loaders, which continue with empty rules on failure, and
29
+ * it is deliberate: a span recorded by mistake is a span, a session
30
+ * recorded by mistake is a video of a real person.
31
+ *
32
+ * Once both switches say yes, the remaining policy columns default to what
33
+ * the MODEL defaults to (consent NotRequired, trigger Always, sample 100),
34
+ * because those are instructions to a recorder the customer has already
35
+ * switched on, and a silent downgrade to "record nothing" is the failure
36
+ * the Dashboard cannot explain. See loadPolicy.
24
37
  *
25
38
  * Cache shape follows the house convention for hot-path policy (a
26
39
  * process-local Map with a 60s TTL, as in LogScrubRuleService), with one
@@ -70,6 +83,40 @@ const RUM_APPLICATION_POLICY_COLUMNS = [
70
83
  const PROJECT_POLICY_COLUMNS = [
71
84
  "isSessionReplayAllowed",
72
85
  ];
86
+ /*
87
+ * WHY a policy lookup came back empty.
88
+ *
89
+ * getPolicy() folds every refusing state into null, which is the right
90
+ * shape for the gate (it must refuse, and the recorder is told "stop"), but
91
+ * the config endpoint, the /validate probe and the health counters all owe
92
+ * the customer a NAME: a project that was switched off, an application that
93
+ * was switched off, an identifier that matches no application, and a
94
+ * project killed by the operator's kill key are four different settings
95
+ * pages. Answering "not enabled for application" for all four sends the
96
+ * customer to the wrong one.
97
+ *
98
+ * A closed vocabulary that carries no project data; it is only ever
99
+ * answered to a request already holding a valid ingestion key for the
100
+ * project.
101
+ */
102
+ export var SessionReplayPolicyRefusal;
103
+ (function (SessionReplayPolicyRefusal) {
104
+ /* Project.isSessionReplayAllowed is false: the org-wide switch. */
105
+ SessionReplayPolicyRefusal["ProjectNotAllowed"] = "project-not-allowed";
106
+ /* RumApplication.isSessionReplayEnabled is false for this application. */
107
+ SessionReplayPolicyRefusal["ApplicationNotEnabled"] = "application-not-enabled";
108
+ /*
109
+ * No application by that identifier could be found or created. With a
110
+ * project that allows replay the application is created on first sight,
111
+ * so this is either a project that does not allow it or a creation that
112
+ * failed.
113
+ */
114
+ SessionReplayPolicyRefusal["ApplicationUnknown"] = "application-unknown";
115
+ /* The gate cache's Redis kill key is set for the project. */
116
+ SessionReplayPolicyRefusal["ProjectKilled"] = "project-killed";
117
+ /* No identifier was supplied at all. */
118
+ SessionReplayPolicyRefusal["IdentifierMissing"] = "app-identifier-missing";
119
+ })(SessionReplayPolicyRefusal || (SessionReplayPolicyRefusal = {}));
73
120
  export default class SessionReplayGateCache {
74
121
  /*
75
122
  * Resolve the policy for one application.
@@ -81,36 +128,63 @@ export default class SessionReplayGateCache {
81
128
  * produce different HTTP answers - a terminal 204 that stops the
82
129
  * recorder, versus a retryable 503 that does not silently discard a
83
130
  * recording during a database blip.
131
+ *
132
+ * Callers that need to say WHY the answer was null use resolvePolicy.
84
133
  */
85
134
  static async getPolicy(data) {
135
+ const resolution = await this.resolvePolicy(data);
136
+ return resolution.policy;
137
+ }
138
+ /*
139
+ * getPolicy with the refusal reason attached. Same caching, same kill-key
140
+ * check, same throw-on-lookup-failure contract.
141
+ */
142
+ static async resolvePolicy(data) {
86
143
  const appIdentifier = data.appIdentifier.trim();
87
144
  if (!appIdentifier) {
88
- return null;
145
+ return {
146
+ policy: null,
147
+ refusal: SessionReplayPolicyRefusal.IdentifierMissing,
148
+ };
89
149
  }
90
150
  const cacheKey = `${data.projectId.toString()}:${appIdentifier.toLowerCase()}`;
91
151
  const cached = SessionReplayGateCacheStore.getPolicyEntry(cacheKey);
92
- if (cached && Date.now() - cached.loadedAt < POLICY_CACHE_TTL_MS) {
152
+ if (cached &&
153
+ cached.policy &&
154
+ Date.now() - cached.loadedAt < POLICY_CACHE_TTL_MS) {
93
155
  /*
94
156
  * The kill key is consulted even on a cache hit - that is the whole
95
157
  * point of it. A cached "enabled" policy is only honoured while the
96
158
  * project has not been switched off in the last few seconds.
97
159
  */
98
- if (cached.policy &&
160
+ if (cached.policy.policy &&
99
161
  (await SessionReplayGateCacheStore.isProjectKilled(data.projectId))) {
100
- return null;
162
+ return {
163
+ policy: null,
164
+ refusal: SessionReplayPolicyRefusal.ProjectKilled,
165
+ };
101
166
  }
102
- return cached.policy;
167
+ return {
168
+ policy: cached.policy.policy,
169
+ refusal: cached.policy.refusal,
170
+ };
103
171
  }
104
- const policy = await this.loadPolicy({
172
+ const loaded = await this.loadPolicy({
105
173
  projectId: data.projectId,
106
174
  appIdentifier: appIdentifier,
107
175
  });
108
- SessionReplayGateCacheStore.setPolicyEntry(cacheKey, policy);
109
- if (policy &&
176
+ SessionReplayGateCacheStore.setPolicyEntry(cacheKey, {
177
+ policy: loaded.policy,
178
+ refusal: loaded.refusal,
179
+ });
180
+ if (loaded.policy &&
110
181
  (await SessionReplayGateCacheStore.isProjectKilled(data.projectId))) {
111
- return null;
182
+ return {
183
+ policy: null,
184
+ refusal: SessionReplayPolicyRefusal.ProjectKilled,
185
+ };
112
186
  }
113
- return policy;
187
+ return loaded;
114
188
  }
115
189
  static async loadPolicy(data) {
116
190
  const project = await ProjectService.findOneBy({
@@ -123,7 +197,14 @@ export default class SessionReplayGateCache {
123
197
  },
124
198
  });
125
199
  if (!project) {
126
- return null;
200
+ /*
201
+ * The key authenticated a project that no longer exists (deleted
202
+ * between the key check and here). Nothing about it is allowed.
203
+ */
204
+ return {
205
+ policy: null,
206
+ refusal: SessionReplayPolicyRefusal.ProjectNotAllowed,
207
+ };
127
208
  }
128
209
  const projectView = project;
129
210
  const isProjectAllowed = projectView["isSessionReplayAllowed"] === true;
@@ -153,7 +234,10 @@ export default class SessionReplayGateCache {
153
234
  */
154
235
  if (!app) {
155
236
  if (!isProjectAllowed) {
156
- return null;
237
+ return {
238
+ policy: null,
239
+ refusal: SessionReplayPolicyRefusal.ProjectNotAllowed,
240
+ };
157
241
  }
158
242
  await RumApplicationService.findOrCreateByAppIdentifier({
159
243
  projectId: data.projectId,
@@ -171,58 +255,89 @@ export default class SessionReplayGateCache {
171
255
  });
172
256
  }
173
257
  if (!app || !app.id) {
174
- return null;
258
+ return {
259
+ policy: null,
260
+ refusal: SessionReplayPolicyRefusal.ApplicationUnknown,
261
+ };
175
262
  }
176
263
  const appView = app;
177
264
  const isAppEnabled = appView["isSessionReplayEnabled"] === true;
178
265
  /*
179
266
  * Both flags are required. Returning null rather than a disabled policy
180
267
  * keeps every caller from having to remember to check them: if this
181
- * function hands back an object at all, recording is permitted.
268
+ * function hands back an object at all, recording is permitted. The
269
+ * project switch is reported ahead of the application switch because
270
+ * flipping the application on does nothing while the project is off.
182
271
  */
183
- if (!isProjectAllowed || !isAppEnabled) {
184
- return null;
272
+ if (!isProjectAllowed) {
273
+ return {
274
+ policy: null,
275
+ refusal: SessionReplayPolicyRefusal.ProjectNotAllowed,
276
+ };
277
+ }
278
+ if (!isAppEnabled) {
279
+ return {
280
+ policy: null,
281
+ refusal: SessionReplayPolicyRefusal.ApplicationNotEnabled,
282
+ };
185
283
  }
186
284
  const requestedRetentionDays = this.readNumber(appView["sessionReplayRetentionInDays"], DEFAULT_SESSION_REPLAY_RETENTION_IN_DAYS);
285
+ /*
286
+ * Null-column fallbacks are the MODEL defaults (RumApplication.ts:
287
+ * consent NotRequired, trigger Always, sample 100), not the refusing
288
+ * ones. This gate refuses through the two boolean switches above; once
289
+ * those say yes, a policy column that is null - an explicit null via the
290
+ * CRUD API, a partially applied migration, a checkout behind on
291
+ * migrations - must read as "the default the settings page shows", or
292
+ * the row silently reverts to "capture only on error, sample 0%" while
293
+ * the ingest-status page reports the row's own (null) values and cannot
294
+ * explain the silence. The recorder honours these three as instructions,
295
+ * so they must match what the Dashboard says the application does.
296
+ */
187
297
  return {
188
- projectId: data.projectId,
189
- rumApplicationId: app.id,
190
- isProjectAllowed: true,
191
- isAppEnabled: true,
192
- allowedOrigins: this.readStringArray(appView["sessionReplayAllowedOrigins"]),
193
- maskingMode: parseSessionReplayMaskingMode(appView["sessionReplayMaskingMode"]),
194
- consentMode: appView["sessionReplayConsentMode"] ===
195
- SessionReplayConsentMode.NotRequired
196
- ? SessionReplayConsentMode.NotRequired
197
- : SessionReplayConsentMode.RequireExplicit,
198
- captureTrigger: appView["sessionReplayCaptureTrigger"] ===
199
- SessionReplayCaptureTrigger.Always
200
- ? SessionReplayCaptureTrigger.Always
201
- : SessionReplayCaptureTrigger.OnErrorOrFrustration,
202
- samplePercentage: this.readNumber(appView["sessionReplaySamplePercentage"], 0),
203
- maskSelectors: this.readStringArray(appView["sessionReplayMaskSelectors"]),
204
- blockSelectors: this.readStringArray(appView["sessionReplayBlockSelectors"]),
205
- recordCanvas: appView["sessionReplayRecordCanvas"] === true,
206
- captureUserIdentity: appView["sessionReplayCaptureUserIdentity"] === true,
207
- captureGeo: appView["sessionReplayCaptureGeo"] === true,
208
- retentionInDays: SessionIdentity.clampRetentionDays(requestedRetentionDays, SESSION_REPLAY_ALLOWED_RETENTION_DAYS, DEFAULT_SESSION_REPLAY_RETENTION_IN_DAYS),
209
- monthlyBudgetInGB: this.readNullableNumber(appView["sessionReplayMonthlyBudgetInGB"]),
210
- ignoreErrorPatterns: this.readStringArray(appView["sessionReplayIgnoreErrorPatterns"]),
211
- tracePropagationOrigins: this.readStringArray(appView["sessionReplayTracePropagationOrigins"]),
212
- lcpBudgetMs: this.readNumber(appView["sessionReplayLcpBudgetMs"], 0),
213
- longTaskBudgetMs: this.readNumber(appView["sessionReplayLongTaskBudgetMs"], 0),
214
- slowRequestBudgetMs: this.readNumber(appView["sessionReplaySlowRequestBudgetMs"], 0),
215
- configEpoch: this.getConfigEpoch(app),
298
+ policy: {
299
+ projectId: data.projectId,
300
+ rumApplicationId: app.id,
301
+ isProjectAllowed: true,
302
+ isAppEnabled: true,
303
+ allowedOrigins: this.readStringArray(appView["sessionReplayAllowedOrigins"]),
304
+ maskingMode: parseSessionReplayMaskingMode(appView["sessionReplayMaskingMode"]),
305
+ consentMode: appView["sessionReplayConsentMode"] ===
306
+ SessionReplayConsentMode.RequireExplicit
307
+ ? SessionReplayConsentMode.RequireExplicit
308
+ : SessionReplayConsentMode.NotRequired,
309
+ captureTrigger: appView["sessionReplayCaptureTrigger"] ===
310
+ SessionReplayCaptureTrigger.OnErrorOrFrustration
311
+ ? SessionReplayCaptureTrigger.OnErrorOrFrustration
312
+ : SessionReplayCaptureTrigger.Always,
313
+ samplePercentage: this.readNumber(appView["sessionReplaySamplePercentage"], DEFAULT_SESSION_REPLAY_SAMPLE_PERCENTAGE),
314
+ maskSelectors: this.readStringArray(appView["sessionReplayMaskSelectors"]),
315
+ blockSelectors: this.readStringArray(appView["sessionReplayBlockSelectors"]),
316
+ recordCanvas: appView["sessionReplayRecordCanvas"] === true,
317
+ captureUserIdentity: appView["sessionReplayCaptureUserIdentity"] === true,
318
+ captureGeo: appView["sessionReplayCaptureGeo"] === true,
319
+ retentionInDays: SessionIdentity.clampRetentionDays(requestedRetentionDays, SESSION_REPLAY_ALLOWED_RETENTION_DAYS, DEFAULT_SESSION_REPLAY_RETENTION_IN_DAYS),
320
+ monthlyBudgetInGB: this.readNullableNumber(appView["sessionReplayMonthlyBudgetInGB"]),
321
+ ignoreErrorPatterns: this.readStringArray(appView["sessionReplayIgnoreErrorPatterns"]),
322
+ tracePropagationOrigins: this.readStringArray(appView["sessionReplayTracePropagationOrigins"]),
323
+ lcpBudgetMs: this.readNumber(appView["sessionReplayLcpBudgetMs"], 0),
324
+ longTaskBudgetMs: this.readNumber(appView["sessionReplayLongTaskBudgetMs"], 0),
325
+ slowRequestBudgetMs: this.readNumber(appView["sessionReplaySlowRequestBudgetMs"], 0),
326
+ configEpoch: this.getConfigEpoch(app),
327
+ },
328
+ refusal: null,
216
329
  };
217
330
  }
218
331
  /*
219
332
  * Is `origin` covered by the application's allowlist?
220
333
  *
221
- * Exact origin match, case-insensitive, plus a single leading "*." host
222
- * wildcard so a customer with per-tenant subdomains does not have to
223
- * enumerate thousands of them. Deliberately no scheme wildcard and no
224
- * path matching: an allowlist entry is an origin, and anything looser
225
- * would defeat the point of having one.
334
+ * The matching itself lives in Common/Utils/Telemetry/OriginAllowList so
335
+ * that this gate and the Browser telemetry-ingestion-key gate cannot drift
336
+ * apart - two allowlists with subtly different wildcard rules would be a
337
+ * confusing and exploitable split. What stays HERE is the empty-list
338
+ * policy, which is the one thing the two callers disagree about: session
339
+ * replay reads empty as "any origin", a Browser ingestion key reads it as
340
+ * "nothing". See the class comment in OriginAllowList.
226
341
  */
227
342
  static isOriginAllowed(policy, origin) {
228
343
  /*
@@ -245,40 +360,10 @@ export default class SessionReplayGateCache {
245
360
  /*
246
361
  * A configured allowlist is still enforced strictly: once the customer has
247
362
  * named their origins, a request without an Origin header is refused
248
- * rather than waved through.
363
+ * rather than waved through. OriginAllowList.matches answers false for a
364
+ * missing or blank origin, so that rule is carried by the delegate.
249
365
  */
250
- if (!origin) {
251
- return false;
252
- }
253
- const normalizedOrigin = origin.trim().toLowerCase();
254
- if (!normalizedOrigin) {
255
- return false;
256
- }
257
- for (const allowed of policy.allowedOrigins) {
258
- const normalizedAllowed = allowed.trim().toLowerCase();
259
- if (!normalizedAllowed) {
260
- continue;
261
- }
262
- if (normalizedAllowed === normalizedOrigin) {
263
- return true;
264
- }
265
- const wildcardIndex = normalizedAllowed.indexOf("://*.");
266
- if (wildcardIndex === -1) {
267
- continue;
268
- }
269
- const scheme = normalizedAllowed.substring(0, wildcardIndex + 3);
270
- const suffix = normalizedAllowed.substring(wildcardIndex + 4);
271
- /*
272
- * suffix keeps its leading dot, so "https://*.example.com" matches
273
- * "https://a.example.com" but NOT "https://evilexample.com".
274
- */
275
- if (normalizedOrigin.startsWith(scheme) &&
276
- normalizedOrigin.endsWith(suffix) &&
277
- normalizedOrigin.length > scheme.length + suffix.length) {
278
- return true;
279
- }
280
- }
281
- return false;
366
+ return OriginAllowList.matches(origin, policy.allowedOrigins);
282
367
  }
283
368
  /*
284
369
  * Invalidation. Delegated to the leaf store so the services that own the
@@ -1 +1 @@
1
- {"version":3,"file":"SessionReplayGateCache.js","sourceRoot":"","sources":["../../../../../Server/Utils/SessionReplay/SessionReplayGateCache.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,+BAA+B,CAAC;AAC3D,OAAO,qBAAqB,MAAM,sCAAsC,CAAC;AACzE,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,2BAA2B,EAAE,EAClC,mBAAmB,GAEpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,OAAO,MAAM,wCAAwC,CAAC;AAC7D,OAAO,cAAc,MAAM,+CAA+C,CAAC;AAG3E,OAAO,2BAA2B,MAAM,gDAAgD,CAAC;AACzF,OAAO,wBAAwB,MAAM,6CAA6C,CAAC;AACnF,OAAiC,EAC/B,6BAA6B,GAC9B,MAAM,6CAA6C,CAAC;AACrD,OAAO,EACL,wCAAwC,EACxC,qCAAqC,GACtC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,eAAe,MAAM,oCAAoC,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,8BAA8B,GAA0B;IAC5D,wBAAwB;IACxB,0BAA0B;IAC1B,4BAA4B;IAC5B,6BAA6B;IAC7B,6BAA6B;IAC7B,0BAA0B;IAC1B,6BAA6B;IAC7B,+BAA+B;IAC/B,kCAAkC;IAClC,yBAAyB;IACzB,2BAA2B;IAC3B,8BAA8B;IAC9B,gCAAgC;IAChC,kCAAkC;IAClC,sCAAsC;IACtC,0BAA0B;IAC1B,+BAA+B;IAC/B,kCAAkC;CACnC,CAAC;AAEF,MAAM,sBAAsB,GAA0B;IACpD,wBAAwB;CACzB,CAAC;AA+EF,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC;;;;;;;;;;OAUG;IACI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAG7B;QACC,MAAM,aAAa,GAAW,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAExD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,QAAQ,GAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,aAAa,CAAC,WAAW,EAAE,EAAE,CAAC;QAEvF,MAAM,MAAM,GACV,2BAA2B,CAAC,cAAc,CACxC,QAAQ,CACT,CAAC;QAEJ,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,GAAG,mBAAmB,EAAE,CAAC;YACjE;;;;eAIG;YACH,IACE,MAAM,CAAC,MAAM;gBACb,CAAC,MAAM,2BAA2B,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EACnE,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QAED,MAAM,MAAM,GAAmC,MAAM,IAAI,CAAC,UAAU,CAAC;YACnE,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,aAAa,EAAE,aAAa;SAC7B,CAAC,CAAC;QAEH,2BAA2B,CAAC,cAAc,CACxC,QAAQ,EACR,MAAM,CACP,CAAC;QAEF,IACE,MAAM;YACN,CAAC,MAAM,2BAA2B,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EACnE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAG/B;QACC,MAAM,OAAO,GAAmB,MAAM,cAAc,CAAC,SAAS,CAAC;YAC7D,KAAK,EAAE;gBACL,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;aAC/B;YACD,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,OAAO,EAAE,EAAE,sBAAsB,CAAC;YAC/D,KAAK,EAAE;gBACL,MAAM,EAAE,IAAI;aACb;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GACf,OAA8C,CAAC;QAEjD,MAAM,gBAAgB,GACpB,WAAW,CAAC,wBAAwB,CAAC,KAAK,IAAI,CAAC;QAEjD,IAAI,GAAG,GAA0B,MAAM,qBAAqB,CAAC,SAAS,CAAC;YACrE,KAAK,EAAE;gBACL,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,aAAa,EAAE,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC;aAChE;YACD,MAAM,EAAE,IAAI,CAAC,WAAW,CACtB,IAAI,cAAc,EAAE,EACpB,8BAA8B,CAC/B;YACD,KAAK,EAAE;gBACL,MAAM,EAAE,IAAI;aACb;SACF,CAAC,CAAC;QAEH;;;;;;;;;;;;;WAaG;QACH,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,qBAAqB,CAAC,2BAA2B,CAAC;gBACtD,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,aAAa,EAAE,IAAI,CAAC,aAAa;aAClC,CAAC,CAAC;YAEH,GAAG,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC;gBAC1C,KAAK,EAAE;oBACL,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,aAAa,EAAE,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC;iBAChE;gBACD,MAAM,EAAE,IAAI,CAAC,WAAW,CACtB,IAAI,cAAc,EAAE,EACpB,8BAA8B,CAC/B;gBACD,KAAK,EAAE;oBACL,MAAM,EAAE,IAAI;iBACb;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GACX,GAA0C,CAAC;QAE7C,MAAM,YAAY,GAAY,OAAO,CAAC,wBAAwB,CAAC,KAAK,IAAI,CAAC;QAEzE;;;;WAIG;QACH,IAAI,CAAC,gBAAgB,IAAI,CAAC,YAAY,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,sBAAsB,GAAW,IAAI,CAAC,UAAU,CACpD,OAAO,CAAC,8BAA8B,CAAC,EACvC,wCAAwC,CACzC,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,gBAAgB,EAAE,GAAG,CAAC,EAAE;YACxB,gBAAgB,EAAE,IAAI;YACtB,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI,CAAC,eAAe,CAClC,OAAO,CAAC,6BAA6B,CAAC,CACvC;YACD,WAAW,EAAE,6BAA6B,CACxC,OAAO,CAAC,0BAA0B,CAAC,CACpC;YACD,WAAW,EACT,OAAO,CAAC,0BAA0B,CAAC;gBACnC,wBAAwB,CAAC,WAAW;gBAClC,CAAC,CAAC,wBAAwB,CAAC,WAAW;gBACtC,CAAC,CAAC,wBAAwB,CAAC,eAAe;YAC9C,cAAc,EACZ,OAAO,CAAC,6BAA6B,CAAC;gBACtC,2BAA2B,CAAC,MAAM;gBAChC,CAAC,CAAC,2BAA2B,CAAC,MAAM;gBACpC,CAAC,CAAC,2BAA2B,CAAC,oBAAoB;YACtD,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAC/B,OAAO,CAAC,+BAA+B,CAAC,EACxC,CAAC,CACF;YACD,aAAa,EAAE,IAAI,CAAC,eAAe,CACjC,OAAO,CAAC,4BAA4B,CAAC,CACtC;YACD,cAAc,EAAE,IAAI,CAAC,eAAe,CAClC,OAAO,CAAC,6BAA6B,CAAC,CACvC;YACD,YAAY,EAAE,OAAO,CAAC,2BAA2B,CAAC,KAAK,IAAI;YAC3D,mBAAmB,EAAE,OAAO,CAAC,kCAAkC,CAAC,KAAK,IAAI;YACzE,UAAU,EAAE,OAAO,CAAC,yBAAyB,CAAC,KAAK,IAAI;YACvD,eAAe,EAAE,eAAe,CAAC,kBAAkB,CACjD,sBAAsB,EACtB,qCAAqC,EACrC,wCAAwC,CACzC;YACD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,CACxC,OAAO,CAAC,gCAAgC,CAAC,CAC1C;YACD,mBAAmB,EAAE,IAAI,CAAC,eAAe,CACvC,OAAO,CAAC,kCAAkC,CAAC,CAC5C;YACD,uBAAuB,EAAE,IAAI,CAAC,eAAe,CAC3C,OAAO,CAAC,sCAAsC,CAAC,CAChD;YACD,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;YACpE,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAC/B,OAAO,CAAC,+BAA+B,CAAC,EACxC,CAAC,CACF;YACD,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAClC,OAAO,CAAC,kCAAkC,CAAC,EAC3C,CAAC,CACF;YACD,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;SACtC,CAAC;IACJ,CAAC;IAED;;;;;;;;OAQG;IACI,MAAM,CAAC,eAAe,CAC3B,MAA+B,EAC/B,MAA0B;QAE1B;;;;;;;;;;;;;WAaG;QACH,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAED;;;;WAIG;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,gBAAgB,GAAW,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE7D,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC5C,MAAM,iBAAiB,GAAW,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAE/D,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,IAAI,iBAAiB,KAAK,gBAAgB,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,aAAa,GAAW,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAEjE,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;gBACzB,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAW,iBAAiB,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;YACzE,MAAM,MAAM,GAAW,iBAAiB,CAAC,SAAS,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;YAEtE;;;eAGG;YACH,IACE,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC;gBACnC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACjC,gBAAgB,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EACvD,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,SAAmB;QACzD,OAAO,MAAM,2BAA2B,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC1E,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAmB;QAC1D,OAAO,MAAM,2BAA2B,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC3E,CAAC;IAED,4DAA4D;IACrD,MAAM,CAAC,UAAU,CAAC,SAAgC;QACvD,2BAA2B,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,WAAW,CACxB,QAAgB,EAChB,eAAsC;QAEtC,MAAM,QAAQ,GAAgB,IAAI,GAAG,CAAS,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAErE;;;;;;;WAOG;QACH,MAAM,MAAM,GAA4B;YACtC,GAAG,EAAE,IAAI;SACV,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC;YACpE,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YACxB,CAAC;QACH,CAAC;QAED,OAAO,MAA+B,CAAC;IACzC,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,cAAc,CAAC,GAAmB;QAC/C,MAAM,SAAS,GAAqB,GAAG,CAAC,SAAS,CAAC;QAElD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,MAAM,GAAW,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAErD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,KAAc,EAAE,QAAgB;QACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC;YAErC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,MAAM,CAAC,kBAAkB,CAAC,KAAc;QAC9C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC;YAErC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,eAAe,CAAC,KAAc;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAkB,EAAE,CAAC;QAEjC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"SessionReplayGateCache.js","sourceRoot":"","sources":["../../../../../Server/Utils/SessionReplay/SessionReplayGateCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,223 @@
1
+ import Redis from "../../Infrastructure/Redis";
2
+ import logger from "../Logger";
3
+ import { isSessionReplayRefusalReason, } from "../../../Types/Rum/SessionReplayHealth";
4
+ /*
5
+ * Per-application counters of what the session replay ingest path did NOT
6
+ * keep, and why.
7
+ *
8
+ * The chunk gate answers every refusal with a reason string the recorder
9
+ * can log, but the person who has to explain "why are there no recordings?"
10
+ * is looking at the Dashboard, not at a visitor's browser console. These
11
+ * counters are the server-side memory of those answers: one Redis hash per
12
+ * (project, application, UTC day) with one field per reason, incremented by
13
+ * HINCRBY from the gate for every non-accepted request, and read back by
14
+ * the ingest-status endpoint summed over today and yesterday so the
15
+ * "last 24h" figure is stable across midnight.
16
+ *
17
+ * Two rules that every reader of this module relies on:
18
+ *
19
+ * 1. Writes never throw and never delay a response. A counter is
20
+ * bookkeeping; the chunk decision has already been made.
21
+ * 2. Reads return null - never 0, never [] - when Redis could not be
22
+ * consulted. "Nothing was refused" and "we cannot tell" are different
23
+ * facts, and the health copy renders the second as "unknown".
24
+ *
25
+ * Day buckets are UTC so every pod agrees on which hash a refusal lands in,
26
+ * and the 48h TTL is what bounds the keyspace: a day's hash lives long
27
+ * enough to be yesterday's half of a 24h window and no longer.
28
+ */
29
+ const REFUSAL_KEY_PREFIX = "replay:refusals:";
30
+ /*
31
+ * Worker-side drops are counted separately from gate refusals. A refusal
32
+ * was answered to the recorder (204 with a reason); a drop happened AFTER a
33
+ * 202, inside the queue consumer, and the recorder was never told. They
34
+ * are different explanations for the same missing recording and the
35
+ * Dashboard must not blur them: "212 refused: origin not allowed" tells the
36
+ * customer to fix a setting, "12 dropped: scrub incomplete" tells them the
37
+ * server chose not to store something it had already accepted.
38
+ */
39
+ const DROP_KEY_PREFIX = "replay:drops:";
40
+ export const SESSION_REPLAY_HEALTH_COUNTER_TTL_SECONDS = 48 * 60 * 60;
41
+ const DAY_MS = 24 * 60 * 60 * 1000;
42
+ /* Bounds a hostile or buggy caller: the reason is a Redis hash field. */
43
+ const MAX_REASON_LENGTH = 64;
44
+ export default class SessionReplayHealthCounters {
45
+ /* "YYYY-MM-DD" in UTC for the given instant. */
46
+ static getUtcDayBucket(unixMs) {
47
+ return new Date(unixMs).toISOString().substring(0, 10);
48
+ }
49
+ static getRefusalCounterKey(data) {
50
+ return `${REFUSAL_KEY_PREFIX}${this.buildScope(data)}:${data.utcDay}`;
51
+ }
52
+ static getDropCounterKey(data) {
53
+ return `${DROP_KEY_PREFIX}${this.buildScope(data)}:${data.utcDay}`;
54
+ }
55
+ /*
56
+ * Count one refused chunk request. Best-effort: a Redis failure is logged
57
+ * at debug (it would otherwise spam the log for the whole outage) and
58
+ * swallowed, because the gate has already decided and the response must
59
+ * not wait on bookkeeping.
60
+ */
61
+ static async recordRefusal(data) {
62
+ var _a;
63
+ await this.increment({
64
+ key: this.getRefusalCounterKey({
65
+ projectId: data.projectId,
66
+ appIdentifier: data.appIdentifier,
67
+ utcDay: this.getUtcDayBucket((_a = data.nowUnixMs) !== null && _a !== void 0 ? _a : Date.now()),
68
+ }),
69
+ reason: data.reason,
70
+ describe: "refusal",
71
+ });
72
+ }
73
+ /* Count one chunk the worker dropped after the route had answered 202. */
74
+ static async recordDrop(data) {
75
+ var _a;
76
+ await this.increment({
77
+ key: this.getDropCounterKey({
78
+ projectId: data.projectId,
79
+ appIdentifier: data.appIdentifier,
80
+ utcDay: this.getUtcDayBucket((_a = data.nowUnixMs) !== null && _a !== void 0 ? _a : Date.now()),
81
+ }),
82
+ reason: data.reason,
83
+ describe: "drop",
84
+ });
85
+ }
86
+ /*
87
+ * Refusals over the last 24 hours, summed over today's and yesterday's
88
+ * buckets, highest count first. Only the gate's closed vocabulary is
89
+ * returned: a field that is not a known reason (an older or newer build
90
+ * of the gate) is dropped rather than rendered as a bare string.
91
+ *
92
+ * null when Redis is unavailable or either read failed.
93
+ */
94
+ static async readRefusalsLast24h(data) {
95
+ var _a;
96
+ const nowUnixMs = (_a = data.nowUnixMs) !== null && _a !== void 0 ? _a : Date.now();
97
+ const totals = await this.readTwoDayTotals([
98
+ this.getRefusalCounterKey({
99
+ projectId: data.projectId,
100
+ appIdentifier: data.appIdentifier,
101
+ utcDay: this.getUtcDayBucket(nowUnixMs),
102
+ }),
103
+ this.getRefusalCounterKey({
104
+ projectId: data.projectId,
105
+ appIdentifier: data.appIdentifier,
106
+ utcDay: this.getUtcDayBucket(nowUnixMs - DAY_MS),
107
+ }),
108
+ ]);
109
+ if (totals === null) {
110
+ return null;
111
+ }
112
+ const refusals = [];
113
+ for (const [reason, count] of totals.entries()) {
114
+ if (isSessionReplayRefusalReason(reason) && count > 0) {
115
+ refusals.push({ reason: reason, count: count });
116
+ }
117
+ }
118
+ return this.sortByCountDescending(refusals);
119
+ }
120
+ /*
121
+ * Worker drops over the last 24 hours. The drop vocabulary is open (it is
122
+ * whatever recordDrop in the ingest service names), so every non-empty
123
+ * field is returned. null when Redis is unavailable.
124
+ */
125
+ static async readDropsLast24h(data) {
126
+ var _a;
127
+ const nowUnixMs = (_a = data.nowUnixMs) !== null && _a !== void 0 ? _a : Date.now();
128
+ const totals = await this.readTwoDayTotals([
129
+ this.getDropCounterKey({
130
+ projectId: data.projectId,
131
+ appIdentifier: data.appIdentifier,
132
+ utcDay: this.getUtcDayBucket(nowUnixMs),
133
+ }),
134
+ this.getDropCounterKey({
135
+ projectId: data.projectId,
136
+ appIdentifier: data.appIdentifier,
137
+ utcDay: this.getUtcDayBucket(nowUnixMs - DAY_MS),
138
+ }),
139
+ ]);
140
+ if (totals === null) {
141
+ return null;
142
+ }
143
+ const drops = [];
144
+ for (const [reason, count] of totals.entries()) {
145
+ if (reason && count > 0) {
146
+ drops.push({ reason: reason, count: count });
147
+ }
148
+ }
149
+ return this.sortByCountDescending(drops);
150
+ }
151
+ /*
152
+ * The application identifier is lower-cased because RumApplication lookup
153
+ * is case-insensitive (QueryHelper.findWithSameText): two recorders that
154
+ * spell the identifier differently are one application and must share one
155
+ * counter.
156
+ */
157
+ static buildScope(data) {
158
+ return `${data.projectId.toString()}:${data.appIdentifier.trim().toLowerCase()}`;
159
+ }
160
+ static async increment(data) {
161
+ const reason = data.reason.trim().substring(0, MAX_REASON_LENGTH);
162
+ if (!reason) {
163
+ return;
164
+ }
165
+ const client = Redis.getClient();
166
+ if (!client || !Redis.isConnected()) {
167
+ return;
168
+ }
169
+ try {
170
+ /*
171
+ * One round trip, not two. The EXPIRE is refreshed on every write
172
+ * rather than only on the first (HINCRBY cannot say whether it
173
+ * created the key), so pipelining is what keeps the cost of that
174
+ * choice at a single RTT - which matters because the gate counts a
175
+ * refusal for every refused request, including the cheap 204s a
176
+ * misconfigured site sends every 15 seconds.
177
+ */
178
+ await client
179
+ .pipeline()
180
+ .hincrby(data.key, reason, 1)
181
+ .expire(data.key, SESSION_REPLAY_HEALTH_COUNTER_TTL_SECONDS)
182
+ .exec();
183
+ }
184
+ catch (err) {
185
+ logger.debug(`SessionReplayHealthCounters: could not record a ${data.describe} at ${data.key}`);
186
+ logger.debug(err);
187
+ }
188
+ }
189
+ static async readTwoDayTotals(keys) {
190
+ const client = Redis.getClient();
191
+ if (!client || !Redis.isConnected()) {
192
+ return null;
193
+ }
194
+ const totals = new Map();
195
+ try {
196
+ for (const key of keys) {
197
+ const fields = await client.hgetall(key);
198
+ for (const reason of Object.keys(fields || {})) {
199
+ const parsed = parseInt(fields[reason], 10);
200
+ if (!Number.isFinite(parsed) || parsed <= 0) {
201
+ continue;
202
+ }
203
+ totals.set(reason, (totals.get(reason) || 0) + parsed);
204
+ }
205
+ }
206
+ }
207
+ catch (err) {
208
+ logger.warn("SessionReplayHealthCounters: could not read the replay health counters");
209
+ logger.warn(err);
210
+ return null;
211
+ }
212
+ return totals;
213
+ }
214
+ static sortByCountDescending(entries) {
215
+ return entries.sort((a, b) => {
216
+ if (b.count !== a.count) {
217
+ return b.count - a.count;
218
+ }
219
+ return a.reason < b.reason ? -1 : a.reason > b.reason ? 1 : 0;
220
+ });
221
+ }
222
+ }
223
+ //# sourceMappingURL=SessionReplayHealthCounters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionReplayHealthCounters.js","sourceRoot":"","sources":["../../../../../Server/Utils/SessionReplay/SessionReplayHealthCounters.ts"],"names":[],"mappings":"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"}