@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
@@ -5,8 +5,15 @@ import {
5
5
  getCephAlertTemplateById,
6
6
  } from "../../../Types/Monitor/CephAlertTemplates";
7
7
  import { getCephMetricByMetricName } from "../../../Types/Monitor/CephMetricCatalog";
8
+ import { getRecoveryThreshold } from "../../../Types/Monitor/Recommendation/RecommendationCriteriaBuilder";
9
+ import {
10
+ getComplementFilterType,
11
+ hasRecoveryDeadBand,
12
+ } from "./Utils/RecommendationCriteriaAssertions";
8
13
  import MonitorStep from "../../../Types/Monitor/MonitorStep";
9
- import MonitorStepCephMonitor from "../../../Types/Monitor/MonitorStepCephMonitor";
14
+ import MonitorStepCephMonitor, {
15
+ CephResourceScope,
16
+ } from "../../../Types/Monitor/MonitorStepCephMonitor";
10
17
  import MonitorCriteriaInstance from "../../../Types/Monitor/MonitorCriteriaInstance";
11
18
  import FilterCondition from "../../../Types/Filter/FilterCondition";
12
19
  import {
@@ -35,10 +42,12 @@ import ObjectID from "../../../Types/ObjectID";
35
42
  *
36
43
  * 2. A per-template expectation table pins the spec'd v3 WI-26 rows
37
44
  * (severity / filter / Past1Minute exceptions / the
38
- * MON_DISK_CRIT-before-MON_DISK_LOW criteria ordering) and the v2
39
- * decisions (Sum/Sum same-receiver ratios; the pg-inactive
40
- * Sum-difference fix — Max/Max would hide inactive PGs in every
41
- * pool but the largest).
45
+ * MON_DISK_CRIT / MON_DISK_LOW severity split) and the
46
+ * aggregation decisions: Sum/Sum for same-receiver RATIOS, and
47
+ * grouped Max/Max for the pg-inactive DIFFERENCE a difference
48
+ * does not cancel the scrape multiple the way a ratio does, so
49
+ * ungrouped Sum reported a scrape-multiplied PG count and
50
+ * ungrouped Max would have hidden every pool but the largest.
42
51
  */
43
52
 
44
53
  interface ThresholdExpectation {
@@ -260,6 +269,11 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
260
269
  },
261
270
  },
262
271
  {
272
+ /*
273
+ * ceph_pg_degraded is a PER-POOL gauge (pool_id label). Grouped Max
274
+ * reports the pool's own degraded count and names the pool; ungrouped
275
+ * Max reported the largest pool's count as if it were a cluster total.
276
+ */
263
277
  id: "ceph-pg-degraded",
264
278
  category: "PG",
265
279
  severity: "Warning",
@@ -268,7 +282,7 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
268
282
  queries: [
269
283
  { alias: "pg_degraded", metricName: "ceph_pg_degraded", attributes: {} },
270
284
  ],
271
- groupBy: null,
285
+ groupBy: "pool_id",
272
286
  formula: null,
273
287
  fireCriteria: [
274
288
  [{ alias: "pg_degraded", filterType: FilterType.GreaterThan, value: 0 }],
@@ -282,6 +296,7 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
282
296
  },
283
297
  },
284
298
  {
299
+ // Per-pool gauge, same contract as ceph-pg-degraded above.
285
300
  id: "ceph-pg-undersized",
286
301
  category: "PG",
287
302
  severity: "Warning",
@@ -294,7 +309,7 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
294
309
  attributes: {},
295
310
  },
296
311
  ],
297
- groupBy: null,
312
+ groupBy: "pool_id",
298
313
  formula: null,
299
314
  fireCriteria: [
300
315
  [
@@ -315,22 +330,26 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
315
330
  },
316
331
  {
317
332
  /*
318
- * Sum/Sum difference ceph_pg_total / ceph_pg_active are PER-POOL
319
- * series; Sum folds every pool into a cluster count and the scrape
320
- * multiple scales both terms equally. Max would collapse each side
321
- * to the largest pool and this Critical alert would never fire for
322
- * inactive PGs in any other pool.
333
+ * GROUPED Max/Max difference. ceph_pg_total / ceph_pg_active are
334
+ * PER-POOL series, and a difference does not cancel the scrape
335
+ * multiple the way a ratio does: ungrouped Sum/Sum folded both the
336
+ * pools AND the two 30s scrapes inside each one-minute bucket into the
337
+ * value, so a cluster with 3 inactive PGs was alerted as "6". Grouped
338
+ * Max de-duplicates the scrapes per (pool, minute) and yields that
339
+ * pool's exact inactive count. Ungrouped Max would be wrong for the
340
+ * opposite reason — each side collapses to the largest pool — so the
341
+ * group-by and the aggregation belong together.
323
342
  */
324
343
  id: "ceph-pg-inactive",
325
344
  category: "PG",
326
345
  severity: "Critical",
327
346
  rollingTime: RollingTime.Past5Minutes,
328
- aggregation: MetricsAggregationType.Sum,
347
+ aggregation: MetricsAggregationType.Max,
329
348
  queries: [
330
349
  { alias: "pg_total", metricName: "ceph_pg_total", attributes: {} },
331
350
  { alias: "pg_active", metricName: "ceph_pg_active", attributes: {} },
332
351
  ],
333
- groupBy: null,
352
+ groupBy: "pool_id",
334
353
  formula: "pg_total - pg_active",
335
354
  fireCriteria: [
336
355
  [{ alias: "pg_inactive", filterType: FilterType.GreaterThan, value: 0 }],
@@ -721,9 +740,10 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
721
740
  },
722
741
  {
723
742
  /*
724
- * Two-tier template: MON_DISK_CRIT (Critical) is evaluated BEFORE
725
- * MON_DISK_LOW (Warning) criteria are first-match-wins, so the
726
- * worst tier must come first or it could never fire.
743
+ * MON_DISK_CRIT and MON_DISK_LOW are two SEPARATE templates, not two
744
+ * tiers of one. The create flow stamps every criteria instance in a step
745
+ * with the recommendation's single declared severity, so a Warning tier
746
+ * riding along inside this Critical template paged at Critical.
727
747
  */
728
748
  id: "ceph-mon-disk-space",
729
749
  category: "Cluster Health",
@@ -736,11 +756,6 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
736
756
  metricName: "ceph_health_detail",
737
757
  attributes: { name: "MON_DISK_CRIT" },
738
758
  },
739
- {
740
- alias: "mon_disk_low",
741
- metricName: "ceph_health_detail",
742
- attributes: { name: "MON_DISK_LOW" },
743
- },
744
759
  ],
745
760
  groupBy: null,
746
761
  formula: null,
@@ -752,14 +767,38 @@ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
752
767
  value: 0,
753
768
  },
754
769
  ],
755
- [{ alias: "mon_disk_low", filterType: FilterType.GreaterThan, value: 0 }],
756
770
  ],
757
771
  recover: {
758
772
  filters: [
759
773
  { alias: "mon_disk_crit", filterType: FilterType.EqualTo, value: 0 },
774
+ ],
775
+ condition: FilterCondition.Any,
776
+ treatNoDataAsZero: true,
777
+ },
778
+ },
779
+ {
780
+ id: "ceph-mon-disk-low",
781
+ category: "Cluster Health",
782
+ severity: "Warning",
783
+ rollingTime: RollingTime.Past5Minutes,
784
+ aggregation: MetricsAggregationType.Max,
785
+ queries: [
786
+ {
787
+ alias: "mon_disk_low",
788
+ metricName: "ceph_health_detail",
789
+ attributes: { name: "MON_DISK_LOW" },
790
+ },
791
+ ],
792
+ groupBy: null,
793
+ formula: null,
794
+ fireCriteria: [
795
+ [{ alias: "mon_disk_low", filterType: FilterType.GreaterThan, value: 0 }],
796
+ ],
797
+ recover: {
798
+ filters: [
760
799
  { alias: "mon_disk_low", filterType: FilterType.EqualTo, value: 0 },
761
800
  ],
762
- condition: FilterCondition.All,
801
+ condition: FilterCondition.Any,
763
802
  treatNoDataAsZero: true,
764
803
  },
765
804
  },
@@ -841,28 +880,18 @@ function getReferencableAliases(monitor: MonitorStepCephMonitor): Set<string> {
841
880
  return aliases;
842
881
  }
843
882
 
883
+ /*
884
+ * Delegates to the shared assertion so all eight recommendation suites
885
+ * agree on what a correct fire/recover pair looks like. This function used
886
+ * to require `fire.value === recover.value` — see the comment in
887
+ * RecommendationCriteriaAssertions for why that was the bug rather than
888
+ * the invariant.
889
+ */
844
890
  function isDisjointComplement(
845
891
  fire: { filterType: FilterType; value: number },
846
892
  recover: { filterType: FilterType; value: number },
847
893
  ): boolean {
848
- if (fire.value !== recover.value) {
849
- return false;
850
- }
851
- switch (fire.filterType) {
852
- case FilterType.GreaterThan:
853
- return (
854
- recover.filterType === FilterType.LessThanOrEqualTo ||
855
- (fire.value === 0 && recover.filterType === FilterType.EqualTo)
856
- );
857
- case FilterType.GreaterThanOrEqualTo:
858
- return recover.filterType === FilterType.LessThan;
859
- case FilterType.LessThan:
860
- return recover.filterType === FilterType.GreaterThanOrEqualTo;
861
- case FilterType.LessThanOrEqualTo:
862
- return recover.filterType === FilterType.GreaterThan;
863
- default:
864
- return false;
865
- }
894
+ return hasRecoveryDeadBand(fire, recover);
866
895
  }
867
896
 
868
897
  // Health-check series exist only while their check is active.
@@ -908,8 +937,10 @@ describe("CephAlertTemplates - enumerated invariants (every template)", () => {
908
937
  const instances: Array<MonitorCriteriaInstance> =
909
938
  getCriteriaInstances(step);
910
939
  /*
911
- * ceph-mon-disk-space carries a third (Warning-tier) instance
912
- * assert at-least-2, never exactly-2.
940
+ * One unhealthy instance plus the Healthy recovery. Asserted as
941
+ * at-least-2 rather than exactly-2 so a future template may add an extra
942
+ * unhealthy tier — but only where every tier means the SAME severity,
943
+ * because the create flow stamps one severity across the whole step.
913
944
  */
914
945
  expect(instances.length).toBeGreaterThanOrEqual(2);
915
946
 
@@ -995,6 +1026,135 @@ describe("CephAlertTemplates - enumerated invariants (every template)", () => {
995
1026
  },
996
1027
  );
997
1028
 
1029
+ test.each(
1030
+ ALL_TEMPLATES.map((t: CephAlertTemplate) => {
1031
+ return [t.id, t];
1032
+ }),
1033
+ )(
1034
+ "%s groups every per-pool metric by pool_id",
1035
+ (_id: unknown, template: unknown) => {
1036
+ /*
1037
+ * REGRESSION (ceph-pg-degraded / ceph-pg-undersized / ceph-pg-inactive):
1038
+ * every ceph_pg_* and ceph_pool_* series is exported PER POOL with a
1039
+ * `pool_id` datapoint label — there is no cluster-wide gauge. Without a
1040
+ * group-by the whole pool fan-out collapses into ONE number: the
1041
+ * ungrouped aggregation folds every pool together, so the alert printed
1042
+ * the worst single pool's count (Max) or a scrape-multiplied sum (Sum)
1043
+ * and presented it as a cluster total, and the evaluator never produced
1044
+ * seriesLabels, so the incident could not name the pool the operator has
1045
+ * to go look at.
1046
+ *
1047
+ * Driven off the catalog's own defaultResourceScope so any FUTURE
1048
+ * per-pool template inherits the rule instead of repeating the mistake.
1049
+ */
1050
+ const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
1051
+ buildArgs(),
1052
+ );
1053
+ const monitor: MonitorStepCephMonitor = getCephMonitor(step);
1054
+
1055
+ for (const queryConfig of monitor.metricViewConfig
1056
+ .queryConfigs as Array<any>) {
1057
+ const metricName: string =
1058
+ queryConfig.metricQueryData.filterData.metricName;
1059
+
1060
+ if (
1061
+ getCephMetricByMetricName(metricName)?.defaultResourceScope !==
1062
+ CephResourceScope.Pool
1063
+ ) {
1064
+ continue;
1065
+ }
1066
+
1067
+ expect(queryConfig.metricQueryData.groupByAttributeKeys || []).toEqual([
1068
+ "pool_id",
1069
+ ]);
1070
+ }
1071
+ },
1072
+ );
1073
+
1074
+ test.each(
1075
+ ALL_TEMPLATES.map((t: CephAlertTemplate) => {
1076
+ return [t.id, t];
1077
+ }),
1078
+ )(
1079
+ "%s groups every per-daemon metric by ceph_daemon",
1080
+ (_id: unknown, template: unknown) => {
1081
+ /*
1082
+ * The mirror of the pool rule: OSD- and Mon-scoped series carry a
1083
+ * `ceph_daemon` label, so one incident must fire per daemon. This locks
1084
+ * in the existing osd-down / osd-out / osd-high-latency / mon-quorum /
1085
+ * daemon-slow-ops choices against the same collapse.
1086
+ */
1087
+ const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
1088
+ buildArgs(),
1089
+ );
1090
+ const monitor: MonitorStepCephMonitor = getCephMonitor(step);
1091
+
1092
+ for (const queryConfig of monitor.metricViewConfig
1093
+ .queryConfigs as Array<any>) {
1094
+ const metricName: string =
1095
+ queryConfig.metricQueryData.filterData.metricName;
1096
+ const scope: CephResourceScope | undefined =
1097
+ getCephMetricByMetricName(metricName)?.defaultResourceScope;
1098
+
1099
+ if (
1100
+ scope !== CephResourceScope.Osd &&
1101
+ scope !== CephResourceScope.Mon
1102
+ ) {
1103
+ continue;
1104
+ }
1105
+
1106
+ expect(queryConfig.metricQueryData.groupByAttributeKeys || []).toEqual([
1107
+ "ceph_daemon",
1108
+ ]);
1109
+ }
1110
+ },
1111
+ );
1112
+
1113
+ test.each(
1114
+ ALL_TEMPLATES.map((t: CephAlertTemplate) => {
1115
+ return [t.id, t];
1116
+ }),
1117
+ )(
1118
+ "%s never subtracts two ungrouped per-series metrics",
1119
+ (_id: unknown, template: unknown) => {
1120
+ /*
1121
+ * REGRESSION (ceph-pg-inactive): an UNGROUPED difference has no correct
1122
+ * aggregation at all, which is why this is asserted as its own
1123
+ * invariant rather than left to the aggregation rule above.
1124
+ *
1125
+ * A one-minute bucket holds one row per (series, scrape) and the shipped
1126
+ * agent scrapes every 30s, so ungrouped Sum returns 2·Σpools — a cluster
1127
+ * with 3 inactive PGs was alerted as "6", and as a different multiple in
1128
+ * each bucket of the window because the bucket boundaries do not divide
1129
+ * the scrape train evenly. Ungrouped Max is worse: it collapses each
1130
+ * side to the largest pool and the difference stops meaning anything.
1131
+ * Only grouping makes the subtraction well-defined.
1132
+ */
1133
+ const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
1134
+ buildArgs(),
1135
+ );
1136
+ const monitor: MonitorStepCephMonitor = getCephMonitor(step);
1137
+ const formulaConfigs: Array<any> = (monitor.metricViewConfig
1138
+ .formulaConfigs || []) as Array<any>;
1139
+
1140
+ for (const formulaConfig of formulaConfigs) {
1141
+ const formula: string =
1142
+ formulaConfig.metricFormulaData.metricFormula || "";
1143
+
1144
+ if (!formula.includes("-")) {
1145
+ continue;
1146
+ }
1147
+
1148
+ for (const queryConfig of monitor.metricViewConfig
1149
+ .queryConfigs as Array<any>) {
1150
+ expect(
1151
+ (queryConfig.metricQueryData.groupByAttributeKeys || []).length,
1152
+ ).toBeGreaterThan(0);
1153
+ }
1154
+ }
1155
+ },
1156
+ );
1157
+
998
1158
  test.each(
999
1159
  ALL_TEMPLATES.map((t: CephAlertTemplate) => {
1000
1160
  return [t.id, t];
@@ -1087,7 +1247,7 @@ describe("CephAlertTemplates - enumerated invariants (every template)", () => {
1087
1247
  return [t.id, t];
1088
1248
  }),
1089
1249
  )(
1090
- "%s ratio/formula queries use Sum on both sides (same-receiver contract)",
1250
+ "%s formula queries share one aggregation, chosen by formula shape",
1091
1251
  (_id: unknown, template: unknown) => {
1092
1252
  const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
1093
1253
  buildArgs(),
@@ -1102,17 +1262,37 @@ describe("CephAlertTemplates - enumerated invariants (every template)", () => {
1102
1262
  return;
1103
1263
  }
1104
1264
 
1265
+ expect(formulaConfigs).toHaveLength(1);
1266
+
1267
+ const formula: string =
1268
+ formulaConfigs[0].metricFormulaData.metricFormula || "";
1269
+ const isDifference: boolean = formula.includes("-");
1270
+ const isGrouped: boolean =
1271
+ (queryConfigs[0].metricQueryData.groupByAttributeKeys || []).length > 0;
1272
+
1105
1273
  /*
1106
- * Every Ceph metric rides ONE receiver (the active mgr scrape),
1107
- * so every formula ratio or difference must aggregate Sum on
1108
- * every side: the scrape multiple cancels (ratios) or scales both
1109
- * terms equally (differences). Max/Max would collapse ungrouped
1110
- * per-pool series to the largest pool and hide every other pool.
1274
+ * Every Ceph metric rides ONE receiver (the active mgr scrape), so
1275
+ * both sides of a formula must share ONE aggregation. WHICH one is a
1276
+ * function of the shape:
1277
+ *
1278
+ * - RATIO: Sum. The per-bucket scrape multiple cancels between the
1279
+ * numerator and the denominator, so the percentage is exact.
1280
+ * - grouped DIFFERENCE: Max. Nothing cancels, so Sum would add the
1281
+ * identical scrapes inside one (series, minute) bucket and
1282
+ * multiply the reported count. Max de-duplicates them.
1283
+ * - ungrouped DIFFERENCE: there is NO correct aggregation — Sum
1284
+ * multiplies by the scrape count, Max collapses each side to the
1285
+ * largest series. The separate "difference formulas must be
1286
+ * grouped" invariant below rejects that shape outright.
1111
1287
  */
1112
- expect(formulaConfigs).toHaveLength(1);
1288
+ const expectedAggregation: MetricsAggregationType =
1289
+ isGrouped && isDifference
1290
+ ? MetricsAggregationType.Max
1291
+ : MetricsAggregationType.Sum;
1292
+
1113
1293
  for (const queryConfig of queryConfigs) {
1114
1294
  expect(queryConfig.metricQueryData.filterData.aggegationType).toBe(
1115
- MetricsAggregationType.Sum,
1295
+ expectedAggregation,
1116
1296
  );
1117
1297
  }
1118
1298
 
@@ -1215,7 +1395,19 @@ describe("CephAlertTemplates - spec table expectations", () => {
1215
1395
  expectedFilter.alias,
1216
1396
  );
1217
1397
  expect(onlineFilters[j].filterType).toBe(expectedFilter.filterType);
1218
- expect(onlineFilters[j].value).toBe(expectedFilter.value);
1398
+ /*
1399
+ * The spec table states the FIRING threshold. The recovery
1400
+ * threshold is derived from it, so the table does not have to
1401
+ * restate every dead-banded number — and so a change to the dead
1402
+ * band shows up as a behaviour change in one place rather than as
1403
+ * a diff across nine spec tables.
1404
+ */
1405
+ expect(onlineFilters[j].value).toBe(
1406
+ getRecoveryThreshold({
1407
+ filterType: getComplementFilterType(expectedFilter.filterType)!,
1408
+ value: expectedFilter.value,
1409
+ }) ?? expectedFilter.value,
1410
+ );
1219
1411
  if (tc.recover.treatNoDataAsZero) {
1220
1412
  expect(onlineFilters[j].metricMonitorOptions.onNoDataPolicy).toBe(
1221
1413
  NoDataPolicy.TreatAsZero,
@@ -1229,3 +1421,180 @@ describe("CephAlertTemplates - spec table expectations", () => {
1229
1421
  },
1230
1422
  );
1231
1423
  });
1424
+
1425
+ describe("CephAlertTemplates - per-pool PG accounting regressions", () => {
1426
+ /*
1427
+ * These three templates read ceph_pg_* series, which the mgr exports once
1428
+ * per pool. They all shipped UNGROUPED, which is what produced the
1429
+ * "the values do not make any sense at all" reports: with no group-by the
1430
+ * whole pool fan-out is folded into one number before the threshold is
1431
+ * ever compared, and no seriesLabels are produced so the incident cannot
1432
+ * say which pool it is about.
1433
+ *
1434
+ * The spec table above already pins the resulting config; these tests
1435
+ * restate the defect by name so a revert fails with a sentence that
1436
+ * explains itself rather than with an opaque table mismatch.
1437
+ */
1438
+
1439
+ function getQueryConfigs(templateId: string): Array<any> {
1440
+ const template: CephAlertTemplate | undefined =
1441
+ getCephAlertTemplateById(templateId);
1442
+ expect(template).toBeDefined();
1443
+
1444
+ const monitor: MonitorStepCephMonitor = getCephMonitor(
1445
+ template!.getMonitorStep(buildArgs()),
1446
+ );
1447
+
1448
+ return monitor.metricViewConfig.queryConfigs as Array<any>;
1449
+ }
1450
+
1451
+ test.each([
1452
+ ["ceph-pg-degraded", "ceph_pg_degraded"],
1453
+ ["ceph-pg-undersized", "ceph_pg_undersized"],
1454
+ ])(
1455
+ "%s counts one pool's PGs, not the largest pool's presented as a cluster total",
1456
+ (templateId: string, metricName: string) => {
1457
+ // The catalog is the source of truth for the scope this rule keys off.
1458
+ expect(getCephMetricByMetricName(metricName)?.defaultResourceScope).toBe(
1459
+ CephResourceScope.Pool,
1460
+ );
1461
+
1462
+ const queryConfigs: Array<any> = getQueryConfigs(templateId);
1463
+ expect(queryConfigs).toHaveLength(1);
1464
+
1465
+ /*
1466
+ * Grouped: one incident per pool, and the pool_id reaches the alert.
1467
+ * Ungrouped Max — what this shipped as — reported max-across-pools as
1468
+ * if it were a cluster-wide degraded/undersized count.
1469
+ */
1470
+ expect(queryConfigs[0].metricQueryData.groupByAttributeKeys).toEqual([
1471
+ "pool_id",
1472
+ ]);
1473
+
1474
+ /*
1475
+ * Max, not Sum, is the correct reduction WITHIN a (pool, minute)
1476
+ * bucket: the agent scrapes every 30s and buckets are one minute
1477
+ * wide, so the bucket holds two identical samples of the same gauge.
1478
+ */
1479
+ expect(queryConfigs[0].metricQueryData.filterData.aggegationType).toBe(
1480
+ MetricsAggregationType.Max,
1481
+ );
1482
+ },
1483
+ );
1484
+
1485
+ test("ceph-pg-inactive reports a pool's exact inactive count, not a scrape-multiplied one", () => {
1486
+ const queryConfigs: Array<any> = getQueryConfigs("ceph-pg-inactive");
1487
+
1488
+ // pg_total and pg_active — both per-pool, both on the same mgr scrape.
1489
+ expect(queryConfigs).toHaveLength(2);
1490
+
1491
+ for (const queryConfig of queryConfigs) {
1492
+ expect(
1493
+ getCephMetricByMetricName(
1494
+ queryConfig.metricQueryData.filterData.metricName,
1495
+ )?.defaultResourceScope,
1496
+ ).toBe(CephResourceScope.Pool);
1497
+
1498
+ /*
1499
+ * Both sides must be grouped identically or the per-series join has
1500
+ * nothing to line up on, and the difference stops being a difference.
1501
+ */
1502
+ expect(queryConfig.metricQueryData.groupByAttributeKeys).toEqual([
1503
+ "pool_id",
1504
+ ]);
1505
+
1506
+ /*
1507
+ * THE DEFECT: this shipped as ungrouped Sum/Sum. Sum preserves the
1508
+ * SIGN of the difference (k·Total - k·Active = k·Inactive), so the
1509
+ * "> 0" threshold still tripped correctly and no test caught it — but
1510
+ * the VALUE handed to the alert body was multiplied by the number of
1511
+ * scrapes in the bucket, so a cluster with 3 inactive PGs was paged as
1512
+ * 6. Grouped Max de-duplicates those scrapes.
1513
+ */
1514
+ expect(queryConfig.metricQueryData.filterData.aggegationType).toBe(
1515
+ MetricsAggregationType.Max,
1516
+ );
1517
+ expect(queryConfig.metricQueryData.filterData.aggegationType).not.toBe(
1518
+ MetricsAggregationType.Sum,
1519
+ );
1520
+ }
1521
+ });
1522
+
1523
+ test("ratio formulas keep Sum on both sides — only differences moved to Max", () => {
1524
+ /*
1525
+ * The fix is scoped to DIFFERENCES. A ratio's scrape multiple cancels
1526
+ * between numerator and denominator, so Sum stays exactly right there;
1527
+ * flipping the capacity templates to Max would silently change them
1528
+ * from "the pool's share of its writable capacity" to "the largest
1529
+ * sample in the bucket".
1530
+ */
1531
+ for (const templateId of [
1532
+ "ceph-cluster-near-full",
1533
+ "ceph-cluster-full",
1534
+ "ceph-pool-near-full",
1535
+ ]) {
1536
+ for (const queryConfig of getQueryConfigs(templateId)) {
1537
+ expect(queryConfig.metricQueryData.filterData.aggegationType).toBe(
1538
+ MetricsAggregationType.Sum,
1539
+ );
1540
+ }
1541
+ }
1542
+ });
1543
+ });
1544
+
1545
+ describe("CephAlertTemplates - mon-disk severity split regression", () => {
1546
+ test("the two mon-disk tiers are separate templates with different severities", () => {
1547
+ /*
1548
+ * THE DEFECT: MON_DISK_CRIT and MON_DISK_LOW used to be two criteria
1549
+ * tiers inside ONE template declared "Critical".
1550
+ *
1551
+ * Severity is per-RECOMMENDATION, not per-criteria: the create flow
1552
+ * resolves one severity from the recommendation and stamps it onto every
1553
+ * criteria instance in the step
1554
+ * (MonitorRecommendationUtil.applyNotificationSettingsToMonitorStep), so
1555
+ * the MON_DISK_LOW tier — a mon disk merely below 30% free, with days of
1556
+ * headroom — opened incidents at the project's top severity and paged
1557
+ * whatever on-call policy is attached to Critical, while the
1558
+ * recommendation card promised Warning. Threading a second severity id
1559
+ * through the template args cannot fix it; two severities need two
1560
+ * templates.
1561
+ */
1562
+ const critical: CephAlertTemplate | undefined = getCephAlertTemplateById(
1563
+ "ceph-mon-disk-space",
1564
+ );
1565
+ const warning: CephAlertTemplate | undefined =
1566
+ getCephAlertTemplateById("ceph-mon-disk-low");
1567
+
1568
+ expect(critical).toBeDefined();
1569
+ expect(warning).toBeDefined();
1570
+ expect(critical!.severity).toBe("Critical");
1571
+ expect(warning!.severity).toBe("Warning");
1572
+
1573
+ // Each watches exactly its own health check, and only its own.
1574
+ const readWatchedCheckNames: (
1575
+ template: CephAlertTemplate,
1576
+ ) => Array<string> = (template: CephAlertTemplate): Array<string> => {
1577
+ const monitor: MonitorStepCephMonitor = getCephMonitor(
1578
+ template.getMonitorStep(buildArgs()),
1579
+ );
1580
+
1581
+ return (monitor.metricViewConfig.queryConfigs as Array<any>).map(
1582
+ (queryConfig: any) => {
1583
+ return queryConfig.metricQueryData.filterData.attributes["name"];
1584
+ },
1585
+ );
1586
+ };
1587
+
1588
+ expect(readWatchedCheckNames(critical!)).toEqual(["MON_DISK_CRIT"]);
1589
+ expect(readWatchedCheckNames(warning!)).toEqual(["MON_DISK_LOW"]);
1590
+ });
1591
+
1592
+ /*
1593
+ * The GENERAL form of this rule — "every recommendation ships exactly one
1594
+ * unhealthy criteria, because one severity is stamped across the whole
1595
+ * step" — is enumerated over the entire catalog in
1596
+ * MonitorRecommendationNotificationMode.test.ts, so it is not repeated per
1597
+ * resource type here. The test above pins the Ceph-specific instance of the
1598
+ * defect by name.
1599
+ */
1600
+ });