@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
@@ -0,0 +1,238 @@
1
+ /*
2
+ * Recording health for one RUM application: the answer to "why are there
3
+ * no recordings?" as data rather than as silence.
4
+ *
5
+ * Two shapes live here. SessionReplayIngestStatusResponseDto is the JSON
6
+ * that POST /telemetry/rum/session-replay/ingest-status answers today
7
+ * plus its additive fields, every new one optional. RecordingHealthStatus
8
+ * is the normalised object the Dashboard builds from it (see
9
+ * parseRecordingHealthStatus in Common/Utils/Rum/SessionReplayHealth.ts)
10
+ * and the only input diagnoseRecordingHealth takes. Keeping the two apart
11
+ * is what lets the diagnosis be exhaustively tested against a stable
12
+ * shape while the wire grows a field at a time.
13
+ *
14
+ * One rule runs through both: a counter that could not be read is null,
15
+ * never 0. "0 refusals" and "the refusal counter is unreachable" are
16
+ * different facts and the UI says "unknown" for the second.
17
+ */
18
+
19
+ /*
20
+ * WHY the ingest gate refused a chunk. This is the gate's EXISTING closed
21
+ * vocabulary (SessionReplayIngestService.gateChunkRequest), copied rather
22
+ * than invented: the refusal counters are keyed on the reason string the
23
+ * gate already puts on the chunk response, so a customer's support ticket,
24
+ * the recorder's debug log and this list all quote the same word.
25
+ */
26
+ export type SessionReplayRefusalReason =
27
+ /* SESSION_REPLAY_INGEST_ENABLED=false on this deployment. */
28
+ | "ingest-disabled"
29
+ /* No recorder artifact is published, so nothing should be posting. */
30
+ | "instance-not-offering-replay"
31
+ /* The policy lookup threw; failed closed. */
32
+ | "policy-unavailable"
33
+ /* Project or application switched off, or an unknown identifier. */
34
+ | "not-enabled"
35
+ /* The Origin header is not in the application's allowed origins. */
36
+ | "origin-not-allowed"
37
+ /* The session already holds MAX_SESSION_REPLAY_CHUNKS_PER_SESSION. */
38
+ | "session-chunk-cap"
39
+ /* The server's sampling draw disagrees with the recorder's. */
40
+ | "not-sampled"
41
+ | "rate-limited"
42
+ /* The rate counter (Redis) was unreachable; failed closed. */
43
+ | "rate-counter-unavailable"
44
+ /* The project's daily byte budget is spent. */
45
+ | "budget-exhausted"
46
+ /* The budget counter (Redis) was unreachable; failed closed. */
47
+ | "budget-counter-unavailable"
48
+ /* The application's own monthly budget is spent. */
49
+ | "app-monthly-budget-exhausted"
50
+ /*
51
+ * Every frame in the request asserted consent Unknown while the
52
+ * application requires explicit consent. The recorder is told to keep
53
+ * recording (directive continue): the page simply has not called
54
+ * grantConsent() yet, and this is the count that tells the customer so.
55
+ */
56
+ | "consent-required";
57
+
58
+ export const SESSION_REPLAY_REFUSAL_REASONS: ReadonlyArray<SessionReplayRefusalReason> =
59
+ [
60
+ "ingest-disabled",
61
+ "instance-not-offering-replay",
62
+ "policy-unavailable",
63
+ "not-enabled",
64
+ "origin-not-allowed",
65
+ "session-chunk-cap",
66
+ "not-sampled",
67
+ "rate-limited",
68
+ "rate-counter-unavailable",
69
+ "budget-exhausted",
70
+ "budget-counter-unavailable",
71
+ "app-monthly-budget-exhausted",
72
+ "consent-required",
73
+ ];
74
+
75
+ export function isSessionReplayRefusalReason(
76
+ value: unknown,
77
+ ): value is SessionReplayRefusalReason {
78
+ return (
79
+ typeof value === "string" &&
80
+ (SESSION_REPLAY_REFUSAL_REASONS as ReadonlyArray<string>).includes(value)
81
+ );
82
+ }
83
+
84
+ export interface SessionReplayRefusalCount {
85
+ reason: SessionReplayRefusalReason;
86
+ count: number;
87
+ }
88
+
89
+ /*
90
+ * The wire response of /ingest-status. The first block is what the route
91
+ * has always answered; everything after it is additive and optional.
92
+ */
93
+ export interface SessionReplayIngestStatusResponseDto {
94
+ isProjectAllowed: boolean;
95
+ isApplicationEnabled: boolean;
96
+ appIdentifier: string;
97
+ allowedOrigins: Array<string>;
98
+ samplePercentage: number;
99
+ captureTrigger: string;
100
+ /* ISO-8601 or null. */
101
+ lastChunkReceivedAt: string | null;
102
+ budgetExceededAt: string | null;
103
+ /* null = counter unreachable. */
104
+ projectBytesUsedToday: number | null;
105
+ dailyByteLimit: number;
106
+ applicationBytesUsedThisMonth: number | null;
107
+ monthlyBudgetInGB: number | null;
108
+
109
+ /* ---- Additive. ---- */
110
+ consentMode?: string;
111
+ maskingMode?: string;
112
+ retentionInDays?: number;
113
+ /* The recorder artifact version the /config route hands out; null when none is built. */
114
+ publishedRecorderVersion?: string | null;
115
+ /* RumApplication.lastSeenAt: the /config route stamps it on every fetch. */
116
+ lastConfigFetchAt?: string | null;
117
+ lastSessionStartedAt?: string | null;
118
+ sessionsLast24h?: number | null;
119
+ playableSessionsLast24h?: number | null;
120
+ /* null when the counter store is unreachable; [] when nothing was refused. */
121
+ refusalsLast24h?: Array<{ reason: string; count: number }> | null;
122
+ /*
123
+ * Chunks the server ACCEPTED (202) and then dropped in the ingest worker,
124
+ * by reason. Kept apart from refusals because the recorder was told these
125
+ * landed; an open vocabulary (scrub-incomplete, over-cap, erased, ...)
126
+ * because the worker's drop reasons are operational, not a contract.
127
+ */
128
+ dropsLast24h?: Array<{ reason: string; count: number }> | null;
129
+ /*
130
+ * What the recorder that most recently uploaded announced it can
131
+ * capture (SESSION_REPLAY_RECORDER_CAPABILITIES on the chunk envelope,
132
+ * the same vocabulary the manifest header carries). The setup guide and
133
+ * the health card show it so "no clicks in the rail" can be answered
134
+ * with "this recorder does not send click events" rather than left as a
135
+ * mystery. null = not reported (an older server, or no chunk yet);
136
+ * [] = a recorder uploaded and announced nothing, which is a different
137
+ * fact and reads as "unknown capabilities" on purpose.
138
+ */
139
+ recorderCapabilities?: Array<string> | null;
140
+ }
141
+
142
+ /* The policy half of the status, as the recorder would see it. */
143
+ export interface RecordingHealthPolicy {
144
+ isProjectEnabled: boolean;
145
+ isApplicationEnabled: boolean;
146
+ /* SessionReplayCaptureTrigger value; "" when the server did not say. */
147
+ captureTrigger: string;
148
+ samplePercentage: number;
149
+ /* SessionReplayConsentMode value; "" when the server did not say. */
150
+ consentMode: string;
151
+ /* SessionReplayMaskingMode value; "" when the server did not say. */
152
+ maskingMode: string;
153
+ /* null when the server did not say. */
154
+ retentionInDays: number | null;
155
+ }
156
+
157
+ /*
158
+ * Normalised health status. Timestamps stay ISO strings (null when the
159
+ * event never happened); the diagnosis converts them against `now` so it
160
+ * remains a pure function of its inputs.
161
+ */
162
+ export interface RecordingHealthStatus {
163
+ appIdentifier: string;
164
+ allowedOrigins: Array<string>;
165
+ policy: RecordingHealthPolicy;
166
+ /* null when no recorder artifact is published or the server did not say. */
167
+ publishedRecorderVersion: string | null;
168
+ lastConfigFetchAt: string | null;
169
+ lastChunkReceivedAt: string | null;
170
+ lastSessionStartedAt: string | null;
171
+ budgetExceededAt: string | null;
172
+ sessionsLast24h: number | null;
173
+ playableSessionsLast24h: number | null;
174
+ refusalsLast24h: Array<SessionReplayRefusalCount> | null;
175
+ /*
176
+ * Open vocabulary; see SessionReplayIngestStatusResponseDto.dropsLast24h.
177
+ * Optional as well as nullable: it was added after the surfaces that
178
+ * build this object, and absent means the same as null (unknown).
179
+ */
180
+ dropsLast24h?: Array<{ reason: string; count: number }> | null;
181
+ /*
182
+ * See SessionReplayIngestStatusResponseDto.recorderCapabilities. Carried
183
+ * through parseRecordingHealthStatus so the surfaces that already hold a
184
+ * RecordingHealthStatus do not have to keep a second parse of the same
185
+ * body alive. Optional as well as nullable for the same reason
186
+ * dropsLast24h is: it postdates the objects that build this shape.
187
+ */
188
+ recorderCapabilities?: Array<string> | null;
189
+ projectBytesUsedToday: number | null;
190
+ dailyByteLimit: number;
191
+ applicationBytesUsedThisMonth: number | null;
192
+ monthlyBudgetInGB: number | null;
193
+ }
194
+
195
+ /*
196
+ * In strict priority order. The diagnosis returns the FIRST state whose
197
+ * condition holds, so a project that is switched off is reported as
198
+ * switched off even when its refusal counters are also climbing.
199
+ */
200
+ export type RecordingHealthState =
201
+ | "disabled-project"
202
+ | "disabled-app"
203
+ | "budget-paused"
204
+ | "refusing"
205
+ | "never-loaded"
206
+ | "loaded-never-uploaded"
207
+ | "stale"
208
+ | "healthy-quiet"
209
+ | "healthy"
210
+ | "unknown";
211
+
212
+ export type RecordingHealthSeverity = "ok" | "info" | "warning" | "error";
213
+
214
+ /* Where the one offered action takes the viewer. */
215
+ export type RecordingHealthActionTarget =
216
+ | "app-settings"
217
+ | "project-settings"
218
+ | "setup-guide"
219
+ | "docs-consent"
220
+ | "docs-csp"
221
+ | "budget"
222
+ | "allowed-origins";
223
+
224
+ export interface RecordingHealthAction {
225
+ label: string;
226
+ target: RecordingHealthActionTarget;
227
+ }
228
+
229
+ export interface RecordingHealthDiagnosis {
230
+ state: RecordingHealthState;
231
+ severity: RecordingHealthSeverity;
232
+ /* One line: names the cause. */
233
+ title: string;
234
+ /* One or two sentences: quantifies it. */
235
+ detail: string;
236
+ /* At most one. Absent when nothing in the product fixes the state. */
237
+ action?: RecordingHealthAction;
238
+ }
@@ -0,0 +1,95 @@
1
+ /*
2
+ * Every distinct endpoint family that accepts a TelemetryIngestionKey.
3
+ *
4
+ * This enum exists so the "may this key write here?" decision is made in ONE
5
+ * place against a closed vocabulary, rather than each route inventing its own
6
+ * ad-hoc check. Each ingest route names the surface it is, the shared guard
7
+ * answers yes or no, and adding a new route becomes a conscious decision about
8
+ * whether a public browser key may reach it (the Record below will not compile
9
+ * until the new member is given a readable name).
10
+ *
11
+ * The string values are the wire/log form and are deliberately stable: they
12
+ * appear in refusal messages and in ingest logs, so renaming one changes what
13
+ * an operator greps for.
14
+ */
15
+ enum TelemetryIngestSurface {
16
+ OtelTraces = "otel-traces",
17
+ OtelLogs = "otel-logs",
18
+ OtelMetrics = "otel-metrics",
19
+ OtelProfiles = "otel-profiles",
20
+ SessionReplay = "session-replay",
21
+ SourceMap = "source-map",
22
+ Syslog = "syslog",
23
+ Fluent = "fluent",
24
+ Pyroscope = "pyroscope",
25
+ KubernetesCost = "kubernetes-cost",
26
+ ChangeEvents = "change-events",
27
+ SecurityEvents = "security-events",
28
+ Grpc = "grpc",
29
+ Mqtt = "mqtt",
30
+ }
31
+
32
+ /*
33
+ * The only surfaces a Browser key may write to. This is an ALLOWLIST, not a
34
+ * denylist, on purpose: a surface added later is refused to browser keys until
35
+ * someone deliberately adds it here, so the failure mode of forgetting is
36
+ * "browser keys cannot reach a new endpoint" rather than "a key scraped off a
37
+ * public page can reach it".
38
+ *
39
+ * The four members are exactly what a real browser agent emits: OTLP traces,
40
+ * logs and metrics from the web SDKs, plus session replay chunks. Everything
41
+ * else is a server-side or infrastructure pipe that no page has any business
42
+ * calling - profiles, syslog, Fluent, Pyroscope, Kubernetes cost, gRPC, MQTT -
43
+ * or is a build-time artifact upload (source maps) that belongs in CI with a
44
+ * server key, not in the browser bundle, which would otherwise be able to
45
+ * overwrite the maps used to de-obfuscate everyone else's stack traces.
46
+ */
47
+ export const BROWSER_ALLOWED_INGEST_SURFACES: ReadonlySet<TelemetryIngestSurface> =
48
+ new Set<TelemetryIngestSurface>([
49
+ TelemetryIngestSurface.OtelTraces,
50
+ TelemetryIngestSurface.OtelLogs,
51
+ TelemetryIngestSurface.OtelMetrics,
52
+ TelemetryIngestSurface.SessionReplay,
53
+ ]);
54
+
55
+ /*
56
+ * Typed as a total Record rather than a partial lookup so that adding a member
57
+ * to the enum without naming it is a compile error, not a surface that
58
+ * silently reports itself by its raw slug in a customer-facing error.
59
+ */
60
+ const INGEST_SURFACE_READABLE_NAMES: Record<TelemetryIngestSurface, string> = {
61
+ [TelemetryIngestSurface.OtelTraces]: "OTLP trace ingest",
62
+ [TelemetryIngestSurface.OtelLogs]: "OTLP log ingest",
63
+ [TelemetryIngestSurface.OtelMetrics]: "OTLP metric ingest",
64
+ [TelemetryIngestSurface.OtelProfiles]: "OTLP profile ingest",
65
+ [TelemetryIngestSurface.SessionReplay]: "session replay ingest",
66
+ [TelemetryIngestSurface.SourceMap]: "source map upload",
67
+ [TelemetryIngestSurface.Syslog]: "syslog ingest",
68
+ [TelemetryIngestSurface.Fluent]: "Fluentd / Fluent Bit ingest",
69
+ [TelemetryIngestSurface.Pyroscope]: "Pyroscope profile ingest",
70
+ [TelemetryIngestSurface.KubernetesCost]: "Kubernetes cost ingest",
71
+ [TelemetryIngestSurface.ChangeEvents]: "change event ingest",
72
+ [TelemetryIngestSurface.SecurityEvents]: "security event ingest",
73
+ [TelemetryIngestSurface.Grpc]: "gRPC ingest",
74
+ [TelemetryIngestSurface.Mqtt]: "MQTT ingest",
75
+ };
76
+
77
+ type GetIngestSurfaceReadableNameFunction = (
78
+ surface: TelemetryIngestSurface,
79
+ ) => string;
80
+
81
+ export const getIngestSurfaceReadableName: GetIngestSurfaceReadableNameFunction =
82
+ (surface: TelemetryIngestSurface): string => {
83
+ /*
84
+ * The fallback guards the one case the type system cannot: a surface
85
+ * string that came off the wire, or out of an older row, and was cast
86
+ * into the enum. Echoing the raw slug beats rendering "undefined" in a
87
+ * refusal message.
88
+ */
89
+ const readableName: string | undefined =
90
+ INGEST_SURFACE_READABLE_NAMES[surface];
91
+
92
+ return readableName || String(surface);
93
+ };
94
+
95
+ export default TelemetryIngestSurface;
@@ -0,0 +1,75 @@
1
+ import ObjectID from "../ObjectID";
2
+ import TelemetryIngestionKeyType from "./TelemetryIngestionKeyType";
3
+
4
+ /*
5
+ * The resolved, ingest-time view of one TelemetryIngestionKey: everything the
6
+ * guard needs to decide whether to accept a request, and nothing else.
7
+ *
8
+ * It is a plain type rather than the model itself so the hot path can cache it
9
+ * (and so nothing downstream is tempted to reach for the model's other
10
+ * columns, or to write through it). Note what is deliberately ABSENT: the
11
+ * secret. Once a request has been authenticated the secret has done its job,
12
+ * and a value that must never be logged is safest in a shape that never
13
+ * carries it.
14
+ *
15
+ * Every field is non-optional - null is spelled out - because these are
16
+ * decisions, and "the caller forgot to set it" must not be indistinguishable
17
+ * from "there is deliberately no limit here".
18
+ */
19
+ export default interface TelemetryIngestionKeyPolicy {
20
+ ingestionKeyId: ObjectID;
21
+ projectId: ObjectID;
22
+
23
+ keyType: TelemetryIngestionKeyType;
24
+
25
+ /*
26
+ * Origins this key may be used from. REQUIRED and strictly enforced on a
27
+ * Browser key (empty means the key cannot be used at all, since a public
28
+ * key with no origin binding is just a key anyone may write with); IGNORED
29
+ * on a Server key, which has no Origin header to check in the first place.
30
+ *
31
+ * Note this is the opposite polarity from
32
+ * RumApplication.sessionReplayAllowedOrigins, where empty means "any
33
+ * origin". That column is an optional hardening control on an existing
34
+ * feature and could not be tightened without breaking live installations;
35
+ * this one is on a key type that did not exist before, so it can start
36
+ * closed.
37
+ */
38
+ allowedOrigins: Array<string>;
39
+
40
+ /*
41
+ * When set, every OTLP resource ingested with this key has its service.name
42
+ * REPLACED with this value. Null means the payload's own service.name is
43
+ * kept (the historical behaviour, and the only sane one for a server key
44
+ * that legitimately reports for many services).
45
+ */
46
+ pinnedServiceName: string | null;
47
+
48
+ /* Kill switch. False refuses everything, immediately, without deleting. */
49
+ isEnabled: boolean;
50
+
51
+ /* Null means never expires - the historical behaviour of every key. */
52
+ expiresAt: Date | null;
53
+
54
+ /*
55
+ * Null means "no explicit limit configured", which resolves differently per
56
+ * key type: a Browser key falls back to
57
+ * DEFAULT_BROWSER_KEY_REQUESTS_PER_MINUTE, a Server key is unlimited.
58
+ */
59
+ requestsPerMinuteLimit: number | null;
60
+ }
61
+
62
+ /*
63
+ * Shipped ceiling for a Browser key that has not set its own limit.
64
+ *
65
+ * Sized to be irrelevant to honest traffic and material to an abuser: 6000
66
+ * requests/minute is 100/second sustained, which a real page cannot approach
67
+ * (browser SDKs batch and flush on an interval, so one visitor generates
68
+ * single-digit requests per minute), while a scraped key driven from a script
69
+ * hits it in seconds. The limit is per KEY, not per visitor, so it must clear
70
+ * the whole legitimate fleet behind one key - hence a headroom this generous
71
+ * rather than a tight per-client number.
72
+ *
73
+ * A customer who genuinely needs more sets requestsPerMinuteLimit explicitly.
74
+ */
75
+ export const DEFAULT_BROWSER_KEY_REQUESTS_PER_MINUTE: number = 6000;
@@ -0,0 +1,29 @@
1
+ /*
2
+ * What kind of credential a TelemetryIngestionKey is, and therefore what the
3
+ * ingest side is willing to let it do.
4
+ *
5
+ * The distinction exists because these two are NOT the same secret class, even
6
+ * though today they are the same column:
7
+ *
8
+ * - Server keys live in a backend process, an OTel collector config, or a CI
9
+ * secret. Nobody outside the customer's infrastructure ever sees them, so
10
+ * they get the full ingest surface with no origin binding. This is the
11
+ * historical behaviour and the DEFAULT, so every key that already exists
12
+ * keeps working exactly as before.
13
+ * - Browser keys are pasted into a public web page - the session-replay
14
+ * snippet, a browser OTLP exporter - which means "secret" is a fiction:
15
+ * anyone who views source has it. They are therefore treated as PUBLIC
16
+ * write-only credentials and are constrained on every axis that can be
17
+ * enforced server-side: a required origin allowlist, a pinned service.name,
18
+ * a per-key rate limit, an expiry, a kill switch, and a reduced set of
19
+ * ingest surfaces (see BROWSER_ALLOWED_INGEST_SURFACES).
20
+ *
21
+ * The type of a key is immutable after creation - see the keyType column on
22
+ * TelemetryIngestionKey for why.
23
+ */
24
+ enum TelemetryIngestionKeyType {
25
+ Server = "Server",
26
+ Browser = "Browser",
27
+ }
28
+
29
+ export default TelemetryIngestionKeyType;
@@ -3,6 +3,9 @@ import Headers from "./API/Headers";
3
3
  import URL from "./API/URL";
4
4
  import Dictionary from "./Dictionary";
5
5
  import HTML from "./Html";
6
+ import HTTPResponseBodyReader, {
7
+ HTTPResponseBodyBudget,
8
+ } from "../Utils/HTTPResponseBodyReader";
6
9
  import axios, { AxiosRequestConfig, AxiosResponse } from "axios";
7
10
  import type { Agent as HttpAgent } from "http";
8
11
  import type { Agent as HttpsAgent } from "https";
@@ -24,6 +27,17 @@ export default class WebsiteRequest {
24
27
  timeout?: number | undefined;
25
28
  isHeadRequest?: boolean | undefined;
26
29
  doNotFollowRedirects?: boolean | undefined;
30
+ doNotFallbackFromHead?: boolean | undefined;
31
+ acceptRedirectResponses?: boolean | undefined;
32
+ maxContentLength?: number | undefined;
33
+ maxBodyLength?: number | undefined;
34
+ disableProxy?: boolean | undefined;
35
+ signal?: AbortSignal | undefined;
36
+ responseBodyBudget?: HTTPResponseBodyBudget | undefined;
37
+ limitRedirectResponseBody?: boolean | undefined;
38
+ maximumResponseBytes?: number | undefined;
39
+ /** @internal Already-validated href used only for the Axios dispatch. */
40
+ dispatchUrl?: string | undefined;
27
41
  httpAgent?: HttpAgent | undefined; // per-request HTTP proxy agent
28
42
  httpsAgent?: HttpsAgent | undefined; // per-request HTTPS proxy agent
29
43
  },
@@ -45,6 +59,38 @@ export default class WebsiteRequest {
45
59
  axiosOptions.maxRedirects = 0;
46
60
  }
47
61
 
62
+ if (options.acceptRedirectResponses) {
63
+ axiosOptions.validateStatus = (status: number): boolean => {
64
+ return status >= 200 && status < 400;
65
+ };
66
+ }
67
+
68
+ if (options.maxContentLength !== undefined) {
69
+ axiosOptions.maxContentLength = options.maxContentLength;
70
+ }
71
+
72
+ if (options.maxBodyLength !== undefined) {
73
+ axiosOptions.maxBodyLength = options.maxBodyLength;
74
+ }
75
+
76
+ if (options.disableProxy) {
77
+ axiosOptions.proxy = false;
78
+ }
79
+
80
+ if (options.signal) {
81
+ axiosOptions.signal = options.signal;
82
+ }
83
+
84
+ if (options.responseBodyBudget) {
85
+ axiosOptions.responseType = "stream";
86
+ /*
87
+ * Let the shared streamed reader own this limit. Axios otherwise throws
88
+ * before yielding the over-limit chunk, so bytes already received on a
89
+ * failed attempt would never be charged to the cumulative budget.
90
+ */
91
+ axiosOptions.maxContentLength = -1;
92
+ }
93
+
48
94
  if (options.httpAgent) {
49
95
  (axiosOptions as AxiosRequestConfig).httpAgent = options.httpAgent;
50
96
  }
@@ -54,13 +100,36 @@ export default class WebsiteRequest {
54
100
 
55
101
  // use axios to fetch an HTML page
56
102
  let response: AxiosResponse | null = null;
103
+ let responseIsForHeadRequest: boolean = Boolean(options.isHeadRequest);
57
104
 
58
105
  try {
59
- response = await axios(url.toString(), axiosOptions);
106
+ response = await axios(
107
+ options.dispatchUrl ?? url.toString(),
108
+ axiosOptions,
109
+ );
60
110
  } catch (err: unknown) {
61
- if (err && options.isHeadRequest) {
111
+ if (
112
+ options.responseBodyBudget &&
113
+ axios.isAxiosError(err) &&
114
+ err.response
115
+ ) {
116
+ err.response.data = HTTPResponseBodyReader.decodeUtf8(
117
+ await HTTPResponseBodyReader.read(err.response.data, {
118
+ budget: options.responseBodyBudget,
119
+ statusCode: err.response.status,
120
+ headers: err.response.headers,
121
+ limitRedirectResponseBody:
122
+ options.limitRedirectResponseBody || false,
123
+ isHeadResponse: responseIsForHeadRequest,
124
+ maximumResponseBytes: options.maximumResponseBytes,
125
+ }),
126
+ );
127
+ }
128
+
129
+ if (err && options.isHeadRequest && !options.doNotFallbackFromHead) {
62
130
  // 404 because of HEAD request. Retry with GET request.
63
- response = await axios(url.toString(), {
131
+ responseIsForHeadRequest = false;
132
+ response = await axios(options.dispatchUrl ?? url.toString(), {
64
133
  ...axiosOptions,
65
134
  method: HTTPMethod.GET,
66
135
  });
@@ -69,6 +138,19 @@ export default class WebsiteRequest {
69
138
  }
70
139
  }
71
140
 
141
+ if (options.responseBodyBudget) {
142
+ response!.data = HTTPResponseBodyReader.decodeUtf8(
143
+ await HTTPResponseBodyReader.read(response!.data, {
144
+ budget: options.responseBodyBudget,
145
+ statusCode: response!.status,
146
+ headers: response!.headers,
147
+ limitRedirectResponseBody: options.limitRedirectResponseBody || false,
148
+ isHeadResponse: responseIsForHeadRequest,
149
+ maximumResponseBytes: options.maximumResponseBytes,
150
+ }),
151
+ );
152
+ }
153
+
72
154
  // return the response
73
155
  return {
74
156
  url: url,
@@ -144,6 +144,13 @@ const AreaChartElement: FunctionComponent<AreaInternalProps> = (
144
144
  const formatter: (value: Date) => string = XAxisUtil.getFormatter({
145
145
  xAxisMax: props.xAxis.options.max,
146
146
  xAxisMin: props.xAxis.options.min,
147
+ /*
148
+ * Exemplars are placed by label with no index fallback, so they have
149
+ * to be formatted at the axis's own grid step — a pinned axis
150
+ * labelled at a different precision would put every exemplar on a
151
+ * category that does not exist, and they would silently vanish.
152
+ */
153
+ precision: props.xAxis.options.precision,
147
154
  });
148
155
 
149
156
  return props.exemplarPoints.map((exemplar: ExemplarPoint) => {
@@ -164,8 +171,10 @@ const AreaChartElement: FunctionComponent<AreaInternalProps> = (
164
171
  return TimeAnnotationUtil.formatTimeReferenceLines({
165
172
  timeReferenceLines: props.timeReferenceLines,
166
173
  xAxis: props.xAxis,
174
+ // Same series the rows were built from — keeps marker indexes aligned.
175
+ seriesPoints: props.data || [],
167
176
  });
168
- }, [props.timeReferenceLines, props.xAxis]);
177
+ }, [props.timeReferenceLines, props.xAxis, props.data]);
169
178
 
170
179
  const formattedReferenceRegions: Array<FormattedReferenceRegion> =
171
180
  useMemo(() => {
@@ -175,8 +184,10 @@ const AreaChartElement: FunctionComponent<AreaInternalProps> = (
175
184
  return TimeAnnotationUtil.formatReferenceRegions({
176
185
  referenceRegions: props.referenceRegions,
177
186
  xAxis: props.xAxis,
187
+ // Same series the rows were built from — keeps region indexes aligned.
188
+ seriesPoints: props.data || [],
178
189
  });
179
- }, [props.referenceRegions, props.xAxis]);
190
+ }, [props.referenceRegions, props.xAxis, props.data]);
180
191
 
181
192
  const hasNoData: boolean =
182
193
  !props.data ||
@@ -97,8 +97,10 @@ const BarChartElement: FunctionComponent<BarInternalProps> = (
97
97
  return TimeAnnotationUtil.formatTimeReferenceLines({
98
98
  timeReferenceLines: props.timeReferenceLines,
99
99
  xAxis: props.xAxis,
100
+ // Same series the rows were built from — keeps marker indexes aligned.
101
+ seriesPoints: props.data || [],
100
102
  });
101
- }, [props.timeReferenceLines, props.xAxis]);
103
+ }, [props.timeReferenceLines, props.xAxis, props.data]);
102
104
 
103
105
  const formattedReferenceRegions: Array<FormattedReferenceRegion> =
104
106
  useMemo(() => {
@@ -108,8 +110,10 @@ const BarChartElement: FunctionComponent<BarInternalProps> = (
108
110
  return TimeAnnotationUtil.formatReferenceRegions({
109
111
  referenceRegions: props.referenceRegions,
110
112
  xAxis: props.xAxis,
113
+ // Same series the rows were built from — keeps region indexes aligned.
114
+ seriesPoints: props.data || [],
111
115
  });
112
- }, [props.referenceRegions, props.xAxis]);
116
+ }, [props.referenceRegions, props.xAxis, props.data]);
113
117
 
114
118
  const hasNoData: boolean =
115
119
  !props.data ||
@@ -122,6 +122,13 @@ const LineChartElement: FunctionComponent<LineInternalProps> = (
122
122
  const formatter: (value: Date) => string = XAxisUtil.getFormatter({
123
123
  xAxisMax: props.xAxis.options.max,
124
124
  xAxisMin: props.xAxis.options.min,
125
+ /*
126
+ * Exemplars are placed by label with no index fallback, so they have
127
+ * to be formatted at the axis's own grid step — a pinned axis
128
+ * labelled at a different precision would put every exemplar on a
129
+ * category that does not exist, and they would silently vanish.
130
+ */
131
+ precision: props.xAxis.options.precision,
125
132
  });
126
133
 
127
134
  return props.exemplarPoints.map((exemplar: ExemplarPoint) => {
@@ -142,8 +149,10 @@ const LineChartElement: FunctionComponent<LineInternalProps> = (
142
149
  return TimeAnnotationUtil.formatTimeReferenceLines({
143
150
  timeReferenceLines: props.timeReferenceLines,
144
151
  xAxis: props.xAxis,
152
+ // Same series the rows were built from — keeps marker indexes aligned.
153
+ seriesPoints: props.data || [],
145
154
  });
146
- }, [props.timeReferenceLines, props.xAxis]);
155
+ }, [props.timeReferenceLines, props.xAxis, props.data]);
147
156
 
148
157
  const formattedReferenceRegions: Array<FormattedReferenceRegion> =
149
158
  useMemo(() => {
@@ -153,8 +162,10 @@ const LineChartElement: FunctionComponent<LineInternalProps> = (
153
162
  return TimeAnnotationUtil.formatReferenceRegions({
154
163
  referenceRegions: props.referenceRegions,
155
164
  xAxis: props.xAxis,
165
+ // Same series the rows were built from — keeps region indexes aligned.
166
+ seriesPoints: props.data || [],
156
167
  });
157
- }, [props.referenceRegions, props.xAxis]);
168
+ }, [props.referenceRegions, props.xAxis, props.data]);
158
169
 
159
170
  const hasNoData: boolean =
160
171
  !props.data ||