@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,476 @@
1
+ import FilterCondition from "../../../../Types/Filter/FilterCondition";
2
+ import MonitorCriteriaInstance from "../../../../Types/Monitor/MonitorCriteriaInstance";
3
+ import ObjectID from "../../../../Types/ObjectID";
4
+ import {
5
+ CriteriaFilter,
6
+ EvaluateOverTimeType,
7
+ FilterType,
8
+ NoDataPolicy,
9
+ } from "../../../../Types/Monitor/CriteriaFilter";
10
+ import {
11
+ DefaultRecoveryMarginFraction,
12
+ SustainedEvaluation,
13
+ buildHealthyCriteriaInstance,
14
+ buildUnhealthyCriteriaInstance,
15
+ getRecoveryFilterType,
16
+ getRecoveryThreshold,
17
+ } from "../../../../Types/Monitor/Recommendation/RecommendationCriteriaBuilder";
18
+
19
+ /*
20
+ * Regression tests for the flapping defect behind
21
+ * https://github.com/OneUptime/oneuptime — a single Kubernetes monitor
22
+ * created from a recommendation produced 39 alert emails (19 open, 20
23
+ * resolve) in under two hours, one open/resolve pair roughly every five
24
+ * minutes, on a pod whose CPU was hovering either side of its limit.
25
+ *
26
+ * The two causes, both encoded as defaults in nine copy-pasted builders:
27
+ * - `AnyValue` on the FIRE side, so one sample anywhere in the rolling
28
+ * window opened an alert.
29
+ * - The identical threshold on both sides, so the metric could satisfy
30
+ * "> 90" and "<= 90" on consecutive evaluations forever.
31
+ */
32
+
33
+ const OFFLINE_STATUS_ID: ObjectID = new ObjectID("offline-status");
34
+ const ONLINE_STATUS_ID: ObjectID = new ObjectID("online-status");
35
+ const INCIDENT_SEVERITY_ID: ObjectID = new ObjectID("incident-severity");
36
+ const ALERT_SEVERITY_ID: ObjectID = new ObjectID("alert-severity");
37
+
38
+ // The exact window from the customer's ALT-113, in percent of CPU limit.
39
+ const PRODUCTION_WINDOW: Array<number> = [72.35, 81.54, 79.95, 91.53, 87.73];
40
+
41
+ function buildUnhealthy(
42
+ overrides?: Partial<Parameters<typeof buildUnhealthyCriteriaInstance>[0]>,
43
+ ): MonitorCriteriaInstance {
44
+ return buildUnhealthyCriteriaInstance({
45
+ offlineMonitorStatusId: OFFLINE_STATUS_ID,
46
+ incidentSeverityId: INCIDENT_SEVERITY_ID,
47
+ alertSeverityId: ALERT_SEVERITY_ID,
48
+ monitorName: "prod-cluster - Pod CPU Saturating Container Limit",
49
+ metricAlias: "pod_cpu_limit_saturation",
50
+ filterType: FilterType.GreaterThan,
51
+ value: 90,
52
+ ...overrides,
53
+ });
54
+ }
55
+
56
+ function buildHealthy(
57
+ overrides?: Partial<Parameters<typeof buildHealthyCriteriaInstance>[0]>,
58
+ ): MonitorCriteriaInstance {
59
+ return buildHealthyCriteriaInstance({
60
+ onlineMonitorStatusId: ONLINE_STATUS_ID,
61
+ metricAlias: "pod_cpu_limit_saturation",
62
+ filterType: FilterType.LessThanOrEqualTo,
63
+ value: 90,
64
+ ...overrides,
65
+ });
66
+ }
67
+
68
+ function firstFilter(instance: MonitorCriteriaInstance): CriteriaFilter {
69
+ return (instance.data?.filters as Array<CriteriaFilter>)[0]!;
70
+ }
71
+
72
+ describe("RecommendationCriteriaBuilder", () => {
73
+ describe("sustained evaluation replaces AnyValue on both sides", () => {
74
+ test("the firing criteria requires the condition to hold for the whole window", () => {
75
+ expect(
76
+ firstFilter(buildUnhealthy()).metricMonitorOptions
77
+ ?.metricAggregationType,
78
+ ).toBe(EvaluateOverTimeType.AllValues);
79
+ });
80
+
81
+ test("the healthy criteria is sustained too", () => {
82
+ expect(
83
+ firstFilter(buildHealthy()).metricMonitorOptions?.metricAggregationType,
84
+ ).toBe(EvaluateOverTimeType.AllValues);
85
+ });
86
+
87
+ test("neither side ships AnyValue, which is what made rollingTime meaningless", () => {
88
+ for (const instance of [buildUnhealthy(), buildHealthy()]) {
89
+ for (const filter of instance.data?.filters as Array<CriteriaFilter>) {
90
+ expect(filter.metricMonitorOptions?.metricAggregationType).not.toBe(
91
+ EvaluateOverTimeType.AnyValue,
92
+ );
93
+ }
94
+ }
95
+ });
96
+
97
+ test("SustainedEvaluation is AllValues", () => {
98
+ expect(SustainedEvaluation).toBe(EvaluateOverTimeType.AllValues);
99
+ });
100
+
101
+ test("a template may opt out explicitly for genuinely event-shaped signals", () => {
102
+ expect(
103
+ firstFilter(
104
+ buildUnhealthy({
105
+ metricAggregationType: EvaluateOverTimeType.MaximumValue,
106
+ }),
107
+ ).metricMonitorOptions?.metricAggregationType,
108
+ ).toBe(EvaluateOverTimeType.MaximumValue);
109
+ });
110
+ });
111
+
112
+ describe("hysteresis: the recovery threshold sits inside the firing one", () => {
113
+ test("a ceiling recovers strictly below where it fires", () => {
114
+ const recoveryValue: number = firstFilter(buildHealthy()).value as number;
115
+
116
+ expect(recoveryValue).toBe(90 - 90 * DefaultRecoveryMarginFraction);
117
+ expect(recoveryValue).toBeLessThan(90);
118
+ });
119
+
120
+ test("a floor recovers strictly above where it fires", () => {
121
+ // Low battery: fire at "< 20", recover at "> 20 + margin".
122
+ const recoveryValue: number = firstFilter(
123
+ buildHealthy({
124
+ filterType: FilterType.GreaterThanOrEqualTo,
125
+ value: 20,
126
+ }),
127
+ ).value as number;
128
+
129
+ expect(recoveryValue).toBe(20 + 20 * DefaultRecoveryMarginFraction);
130
+ expect(recoveryValue).toBeGreaterThan(20);
131
+ });
132
+
133
+ test("a negative threshold widens away from zero, not toward it", () => {
134
+ // Weak signal: fire at "< -100 dBm", recover at "-90 dBm".
135
+ const recoveryValue: number = firstFilter(
136
+ buildHealthy({
137
+ filterType: FilterType.GreaterThanOrEqualTo,
138
+ value: -100,
139
+ }),
140
+ ).value as number;
141
+
142
+ expect(recoveryValue).toBe(-90);
143
+ expect(recoveryValue).toBeGreaterThan(-100);
144
+ });
145
+
146
+ /*
147
+ * A regression the dead band itself introduced, caught after it shipped.
148
+ *
149
+ * A boolean signal is conventionally written as a threshold of ONE —
150
+ * "up < 1" fires, "up >= 1" recovers — so the `value === 0` carve-out
151
+ * below does not catch it. Widening by 10% put recovery at ">= 1.1",
152
+ * which a gauge that only ever emits 0 or 1 can never satisfy: the
153
+ * healthy criteria never matched, and a device that came back up never
154
+ * produced an Online transition. It affected iot-device-offline,
155
+ * pve-node-offline and pve-guest-down.
156
+ */
157
+ test("a binary metric gets no dead band, so 0/1 gauges can recover at 1", () => {
158
+ expect(
159
+ firstFilter(
160
+ buildHealthy({
161
+ filterType: FilterType.GreaterThanOrEqualTo,
162
+ value: 1,
163
+ isBinaryMetric: true,
164
+ }),
165
+ ).value,
166
+ ).toBe(1);
167
+ });
168
+
169
+ test("without the flag, a threshold of 1 is widened to an unreachable 1.1", () => {
170
+ // Pins the mechanism, so the carve-out cannot be quietly removed.
171
+ expect(
172
+ firstFilter(
173
+ buildHealthy({
174
+ filterType: FilterType.GreaterThanOrEqualTo,
175
+ value: 1,
176
+ }),
177
+ ).value,
178
+ ).toBe(1.1);
179
+ });
180
+
181
+ test("the binary flag reaches additional filters too", () => {
182
+ const instance: MonitorCriteriaInstance = buildHealthy({
183
+ filterType: FilterType.GreaterThanOrEqualTo,
184
+ value: 1,
185
+ isBinaryMetric: true,
186
+ additionalFilters: [
187
+ {
188
+ metricAlias: "other_up",
189
+ filterType: FilterType.GreaterThanOrEqualTo,
190
+ value: 1,
191
+ },
192
+ ],
193
+ });
194
+
195
+ for (const filter of instance.data?.filters as Array<CriteriaFilter>) {
196
+ expect(filter.value).toBe(1);
197
+ }
198
+ });
199
+
200
+ test("getRecoveryThreshold reports no band for a binary metric", () => {
201
+ expect(
202
+ getRecoveryThreshold({
203
+ filterType: FilterType.LessThan,
204
+ value: 1,
205
+ isBinaryMetric: true,
206
+ }),
207
+ ).toBeUndefined();
208
+ });
209
+
210
+ test("a zero threshold gets no dead band, so count criteria still recover at zero", () => {
211
+ expect(
212
+ firstFilter(buildHealthy({ filterType: FilterType.EqualTo, value: 0 }))
213
+ .value,
214
+ ).toBe(0);
215
+ });
216
+
217
+ test("an explicit recoveryValue overrides the derived dead band", () => {
218
+ expect(firstFilter(buildHealthy({ recoveryValue: 75 })).value).toBe(75);
219
+ });
220
+
221
+ test("marginFraction widens the band", () => {
222
+ expect(firstFilter(buildHealthy({ marginFraction: 0.25 })).value).toBe(
223
+ 67.5,
224
+ );
225
+ });
226
+
227
+ test("the fire and recover bands do not overlap", () => {
228
+ const fire: CriteriaFilter = firstFilter(buildUnhealthy());
229
+ const recover: CriteriaFilter = firstFilter(buildHealthy());
230
+
231
+ // Fire above 90, recover at or below 81 — 81 < x <= 90 is neither.
232
+ expect(fire.value).toBe(90);
233
+ expect(recover.value).toBe(81);
234
+ expect(recover.value as number).toBeLessThan(fire.value as number);
235
+ });
236
+ });
237
+
238
+ describe("getRecoveryThreshold", () => {
239
+ test.each([
240
+ [FilterType.GreaterThan, 90, 81],
241
+ [FilterType.GreaterThanOrEqualTo, 90, 81],
242
+ [FilterType.LessThan, 20, 22],
243
+ [FilterType.LessThanOrEqualTo, 20, 22],
244
+ ])(
245
+ "%s at %s recovers at %s",
246
+ (filterType: FilterType, value: number, expected: number) => {
247
+ expect(
248
+ getRecoveryThreshold({ filterType: filterType, value: value }),
249
+ ).toBe(expected);
250
+ },
251
+ );
252
+
253
+ test.each([
254
+ [FilterType.EqualTo, 5],
255
+ [FilterType.NotEqualTo, 5],
256
+ [FilterType.GreaterThan, 0],
257
+ [FilterType.LessThan, 0],
258
+ ])(
259
+ "%s at %s has no meaningful dead band",
260
+ (filterType: FilterType, value: number) => {
261
+ expect(
262
+ getRecoveryThreshold({ filterType: filterType, value: value }),
263
+ ).toBeUndefined();
264
+ },
265
+ );
266
+
267
+ test("a non-finite threshold is left alone rather than producing NaN", () => {
268
+ expect(
269
+ getRecoveryThreshold({
270
+ filterType: FilterType.GreaterThan,
271
+ value: Number.POSITIVE_INFINITY,
272
+ }),
273
+ ).toBeUndefined();
274
+ });
275
+ });
276
+
277
+ describe("getRecoveryFilterType", () => {
278
+ test.each([
279
+ [FilterType.GreaterThan, FilterType.LessThanOrEqualTo],
280
+ [FilterType.GreaterThanOrEqualTo, FilterType.LessThan],
281
+ [FilterType.LessThan, FilterType.GreaterThanOrEqualTo],
282
+ [FilterType.LessThanOrEqualTo, FilterType.GreaterThan],
283
+ [FilterType.EqualTo, FilterType.NotEqualTo],
284
+ [FilterType.NotEqualTo, FilterType.EqualTo],
285
+ ])("%s complements to %s", (input: FilterType, expected: FilterType) => {
286
+ expect(getRecoveryFilterType(input)).toBe(expected);
287
+ });
288
+
289
+ test("complementing twice is the identity for ordered comparisons", () => {
290
+ for (const filterType of [
291
+ FilterType.GreaterThan,
292
+ FilterType.GreaterThanOrEqualTo,
293
+ FilterType.LessThan,
294
+ FilterType.LessThanOrEqualTo,
295
+ ]) {
296
+ expect(getRecoveryFilterType(getRecoveryFilterType(filterType))).toBe(
297
+ filterType,
298
+ );
299
+ }
300
+ });
301
+
302
+ test("a filter type with no complement is returned unchanged", () => {
303
+ expect(getRecoveryFilterType(FilterType.Contains)).toBe(
304
+ FilterType.Contains,
305
+ );
306
+ });
307
+ });
308
+
309
+ describe("additional filters inherit the same defaults", () => {
310
+ test("an OR'd firing filter is sustained too", () => {
311
+ const instance: MonitorCriteriaInstance = buildUnhealthy({
312
+ additionalFilters: [
313
+ {
314
+ metricAlias: "osd_scrub_errors",
315
+ filterType: FilterType.GreaterThan,
316
+ value: 0,
317
+ },
318
+ ],
319
+ });
320
+
321
+ const filters: Array<CriteriaFilter> = instance.data
322
+ ?.filters as Array<CriteriaFilter>;
323
+
324
+ expect(filters).toHaveLength(2);
325
+ for (const filter of filters) {
326
+ expect(filter.metricMonitorOptions?.metricAggregationType).toBe(
327
+ EvaluateOverTimeType.AllValues,
328
+ );
329
+ }
330
+ });
331
+
332
+ test("an additional recovery filter gets its own dead band", () => {
333
+ const instance: MonitorCriteriaInstance = buildHealthy({
334
+ value: 90,
335
+ additionalFilters: [
336
+ {
337
+ metricAlias: "pool_near_full",
338
+ filterType: FilterType.LessThanOrEqualTo,
339
+ value: 80,
340
+ },
341
+ ],
342
+ });
343
+
344
+ const filters: Array<CriteriaFilter> = instance.data
345
+ ?.filters as Array<CriteriaFilter>;
346
+
347
+ expect(filters[0]!.value).toBe(81);
348
+ expect(filters[1]!.value).toBe(72);
349
+ });
350
+
351
+ test("treatNoDataAsZero reaches every filter, primary and additional", () => {
352
+ const instance: MonitorCriteriaInstance = buildHealthy({
353
+ treatNoDataAsZero: true,
354
+ additionalFilters: [
355
+ {
356
+ metricAlias: "osd_scrub_errors",
357
+ filterType: FilterType.EqualTo,
358
+ value: 0,
359
+ },
360
+ ],
361
+ });
362
+
363
+ for (const filter of instance.data?.filters as Array<CriteriaFilter>) {
364
+ expect(filter.metricMonitorOptions?.onNoDataPolicy).toBe(
365
+ NoDataPolicy.TreatAsZero,
366
+ );
367
+ }
368
+ });
369
+
370
+ test("no no-data policy is set unless asked for", () => {
371
+ expect(
372
+ firstFilter(buildHealthy()).metricMonitorOptions?.onNoDataPolicy,
373
+ ).toBeUndefined();
374
+ });
375
+
376
+ test("filterCondition is overridable so multi-alias recovery can require ALL", () => {
377
+ expect(
378
+ buildHealthy({ filterCondition: FilterCondition.All }).data
379
+ ?.filterCondition,
380
+ ).toBe(FilterCondition.All);
381
+ });
382
+
383
+ test("filterCondition defaults to Any", () => {
384
+ expect(buildUnhealthy().data?.filterCondition).toBe(FilterCondition.Any);
385
+ });
386
+ });
387
+
388
+ describe("the production window that produced 39 emails", () => {
389
+ /*
390
+ * The whole point. Under the old AnyValue default this window opened an
391
+ * alert; under sustained evaluation it does not, because the pod was
392
+ * only over its limit for one of five samples.
393
+ */
394
+ test("sustained evaluation does not fire on a single breaching sample", () => {
395
+ const allAbove: boolean = PRODUCTION_WINDOW.every((value: number) => {
396
+ return value > 90;
397
+ });
398
+ const anyAbove: boolean = PRODUCTION_WINDOW.some((value: number) => {
399
+ return value > 90;
400
+ });
401
+
402
+ expect(anyAbove).toBe(true);
403
+ expect(allAbove).toBe(false);
404
+ });
405
+
406
+ test("and the window does not satisfy the recovery band either, so it cannot flap", () => {
407
+ const recoveryValue: number = firstFilter(buildHealthy()).value as number;
408
+
409
+ // Under the old config every sample <= 90 satisfied "healthy".
410
+ expect(
411
+ PRODUCTION_WINDOW.every((value: number) => {
412
+ return value <= 90;
413
+ }),
414
+ ).toBe(false);
415
+
416
+ // Under the dead band it is even further from satisfying it.
417
+ expect(
418
+ PRODUCTION_WINDOW.every((value: number) => {
419
+ return value <= recoveryValue;
420
+ }),
421
+ ).toBe(false);
422
+ });
423
+ });
424
+
425
+ describe("criteria instances stay well-formed", () => {
426
+ test("the unhealthy instance creates both an incident and an alert", () => {
427
+ const instance: MonitorCriteriaInstance = buildUnhealthy();
428
+
429
+ expect(instance.data?.createIncidents).toBe(true);
430
+ expect(instance.data?.createAlerts).toBe(true);
431
+ expect(instance.data?.incidents).toHaveLength(1);
432
+ expect(instance.data?.alerts).toHaveLength(1);
433
+ expect(instance.data?.incidents?.[0]?.incidentSeverityId).toBe(
434
+ INCIDENT_SEVERITY_ID,
435
+ );
436
+ expect(instance.data?.alerts?.[0]?.alertSeverityId).toBe(
437
+ ALERT_SEVERITY_ID,
438
+ );
439
+ });
440
+
441
+ test("the healthy instance creates neither", () => {
442
+ const instance: MonitorCriteriaInstance = buildHealthy();
443
+
444
+ expect(instance.data?.createIncidents).toBe(false);
445
+ expect(instance.data?.createAlerts).toBe(false);
446
+ expect(instance.data?.incidents).toHaveLength(0);
447
+ expect(instance.data?.alerts).toHaveLength(0);
448
+ });
449
+
450
+ test("resourceNoun only changes the fallback description", () => {
451
+ const instance: MonitorCriteriaInstance = buildUnhealthy({
452
+ incidentDescription: undefined,
453
+ resourceNoun: "Ceph cluster",
454
+ });
455
+
456
+ expect(instance.data?.incidents?.[0]?.description).toContain(
457
+ "detailed Ceph cluster information",
458
+ );
459
+ });
460
+
461
+ test("an explicit incidentDescription wins over the fallback", () => {
462
+ const instance: MonitorCriteriaInstance = buildUnhealthy({
463
+ incidentDescription: "Specific description.",
464
+ resourceNoun: "Ceph cluster",
465
+ });
466
+
467
+ expect(instance.data?.incidents?.[0]?.description).toBe(
468
+ "Specific description.",
469
+ );
470
+ });
471
+
472
+ test("each build produces fresh ids", () => {
473
+ expect(buildUnhealthy().data?.id).not.toBe(buildUnhealthy().data?.id);
474
+ });
475
+ });
476
+ });
@@ -21,6 +21,10 @@ import MonitorStepMetricMonitor from "../../../Types/Monitor/MonitorStepMetricMo
21
21
  import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
22
22
  import MonitorStepTraceMonitor from "../../../Types/Monitor/MonitorStepTraceMonitor";
23
23
  import MonitorStepExceptionMonitor from "../../../Types/Monitor/MonitorStepExceptionMonitor";
24
+ import {
25
+ ServiceAlertTemplate,
26
+ getAllServiceAlertTemplates,
27
+ } from "../../../Types/Monitor/ServiceAlertTemplates";
24
28
 
25
29
  const RUM_APPLICATION_ID: ObjectID = ObjectID.generate();
26
30
 
@@ -101,6 +105,74 @@ const WEB_VITAL_CASES: Array<WebVitalCase> = [
101
105
  },
102
106
  ];
103
107
 
108
+ /*
109
+ * The category and severity of every template, pinned in one place.
110
+ *
111
+ * Before this table only the five web vitals had their severity asserted, and
112
+ * that gap is exactly how `rum-failed-user-operations` came to page Critical
113
+ * on a bar — "more than zero error-status spans in five minutes" — that the
114
+ * Service catalog had already decided was a Warning for the identical signal.
115
+ * `severity` is not cosmetic: MonitorRecommendationSeverityMapper maps
116
+ * Critical onto the project's most severe incident/alert severity and Warning
117
+ * onto the next one down.
118
+ */
119
+ const SEVERITY_CASES: Array<{
120
+ id: string;
121
+ category: string;
122
+ severity: string;
123
+ }> = [
124
+ { id: "rum-poor-lcp", category: "Core Web Vitals", severity: "Critical" },
125
+ { id: "rum-poor-inp", category: "Core Web Vitals", severity: "Critical" },
126
+ { id: "rum-poor-cls", category: "Core Web Vitals", severity: "Critical" },
127
+ { id: "rum-slow-fcp", category: "Core Web Vitals", severity: "Warning" },
128
+ { id: "rum-slow-ttfb", category: "Core Web Vitals", severity: "Warning" },
129
+ {
130
+ id: "rum-failed-user-operations",
131
+ category: "Errors",
132
+ severity: "Warning",
133
+ },
134
+ {
135
+ id: "rum-unhandled-exceptions",
136
+ category: "Errors",
137
+ severity: "Critical",
138
+ },
139
+ ];
140
+
141
+ /*
142
+ * The community spellings `WEB_VITAL_DEFS` in telemetryMetrics.ts probes for,
143
+ * copied verbatim. The overview card tries all four and keeps whichever has
144
+ * data; a monitor holds exactly one name and matches it exactly, so a template
145
+ * pointed at `web_vital.*` is silent forever on an app emitting one of the
146
+ * others — with no error and nothing on screen to say why.
147
+ */
148
+ const WEB_VITAL_ALTERNATE_NAMES: Record<string, Array<string>> = {
149
+ "rum-poor-lcp": [
150
+ "browser.largest_contentful_paint",
151
+ "largest_contentful_paint",
152
+ "web.vitals.lcp",
153
+ ],
154
+ "rum-poor-inp": [
155
+ "browser.interaction_to_next_paint",
156
+ "interaction_to_next_paint",
157
+ "web.vitals.inp",
158
+ ],
159
+ "rum-poor-cls": [
160
+ "browser.cumulative_layout_shift",
161
+ "cumulative_layout_shift",
162
+ "web.vitals.cls",
163
+ ],
164
+ "rum-slow-fcp": [
165
+ "browser.first_contentful_paint",
166
+ "first_contentful_paint",
167
+ "web.vitals.fcp",
168
+ ],
169
+ "rum-slow-ttfb": [
170
+ "browser.time_to_first_byte",
171
+ "time_to_first_byte",
172
+ "web.vitals.ttfb",
173
+ ],
174
+ };
175
+
104
176
  describe("RumAlertTemplates", () => {
105
177
  test("registers every template exactly once", () => {
106
178
  const templates: Array<RumAlertTemplate> = getAllRumAlertTemplates();
@@ -272,6 +344,70 @@ describe("RumAlertTemplates", () => {
272
344
  }
273
345
  });
274
346
 
347
+ test.each(SEVERITY_CASES)(
348
+ "$id is a $severity in $category",
349
+ (item: { id: string; category: string; severity: string }) => {
350
+ const template: RumAlertTemplate = getTemplate(item.id);
351
+
352
+ expect(template.category).toBe(item.category);
353
+ expect(template.severity).toBe(item.severity);
354
+ },
355
+ );
356
+
357
+ test("covers every shipped template in the severity table", () => {
358
+ expect(
359
+ SEVERITY_CASES.map((item: { id: string }) => {
360
+ return item.id;
361
+ }).sort(),
362
+ ).toEqual(
363
+ getAllRumAlertTemplates()
364
+ .map((template: RumAlertTemplate) => {
365
+ return template.id;
366
+ })
367
+ .sort(),
368
+ );
369
+ });
370
+
371
+ /*
372
+ * The two catalogs ship the same signal — a trace monitor counting
373
+ * error-status spans with a threshold of zero — against different resource
374
+ * types. They differ only in window (five minutes here, ten there). If one
375
+ * pages and the other does not, a team gets woken by their frontend for
376
+ * something their backend deliberately downgrades, and browser spans are the
377
+ * noisier of the two.
378
+ */
379
+ test("does not page harder than the Service catalog does on the identical signal", () => {
380
+ const serviceEquivalent: ServiceAlertTemplate | undefined =
381
+ getAllServiceAlertTemplates().find((template: ServiceAlertTemplate) => {
382
+ return template.id === "service-failed-operations";
383
+ });
384
+
385
+ expect(serviceEquivalent).toBeDefined();
386
+ expect(getTemplate("rum-failed-user-operations").severity).toBe(
387
+ serviceEquivalent!.severity,
388
+ );
389
+ expect(serviceEquivalent!.severity).toBe("Warning");
390
+ });
391
+
392
+ /*
393
+ * A silent monitor is indistinguishable from a healthy application, so a
394
+ * template that can only read one of four live spellings has to say which
395
+ * one it reads and what the others are. Retargeting is then one visible
396
+ * edit rather than a mystery.
397
+ */
398
+ test.each(WEB_VITAL_CASES)(
399
+ "$id names the metric it reads and every spelling it does not",
400
+ (item: WebVitalCase) => {
401
+ const template: RumAlertTemplate = getTemplate(item.id);
402
+
403
+ expect(template.description).toContain(item.metricName);
404
+
405
+ for (const alternate of WEB_VITAL_ALTERNATE_NAMES[item.id]!) {
406
+ expect(template.description).toContain(alternate);
407
+ }
408
+ },
409
+ );
410
+
275
411
  test("metric monitor serialization preserves the RUM application scope", () => {
276
412
  const original: MonitorStep =
277
413
  getTemplate("rum-poor-lcp").getMonitorStep(buildArgs());