@oneuptime/common 11.0.1 → 11.0.3

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 (577) hide show
  1. package/Models/DatabaseModels/Alert.ts +276 -0
  2. package/Models/DatabaseModels/AlertLabelRule.ts +38 -0
  3. package/Models/DatabaseModels/AlertOwnerRule.ts +38 -0
  4. package/Models/DatabaseModels/CephCluster.ts +964 -0
  5. package/Models/DatabaseModels/CephClusterLabelRule.ts +514 -0
  6. package/Models/DatabaseModels/CephClusterOwnerRule.ts +596 -0
  7. package/Models/DatabaseModels/CephClusterOwnerTeam.ts +487 -0
  8. package/Models/DatabaseModels/CephClusterOwnerUser.ts +486 -0
  9. package/Models/DatabaseModels/CephResource.ts +809 -0
  10. package/Models/DatabaseModels/DockerSwarmCluster.ts +989 -0
  11. package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +514 -0
  12. package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +596 -0
  13. package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +487 -0
  14. package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +486 -0
  15. package/Models/DatabaseModels/DockerSwarmResource.ts +750 -0
  16. package/Models/DatabaseModels/Host.ts +64 -0
  17. package/Models/DatabaseModels/Incident.ts +276 -0
  18. package/Models/DatabaseModels/IncidentLabelRule.ts +38 -0
  19. package/Models/DatabaseModels/IncidentOwnerRule.ts +38 -0
  20. package/Models/DatabaseModels/IncidentTemplate.ts +56 -0
  21. package/Models/DatabaseModels/Index.ts +48 -0
  22. package/Models/DatabaseModels/PodmanHost.ts +859 -0
  23. package/Models/DatabaseModels/PodmanHostLabelRule.ts +514 -0
  24. package/Models/DatabaseModels/PodmanHostOwnerRule.ts +596 -0
  25. package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +487 -0
  26. package/Models/DatabaseModels/PodmanHostOwnerUser.ts +486 -0
  27. package/Models/DatabaseModels/PodmanResource.ts +498 -0
  28. package/Models/DatabaseModels/ProxmoxCluster.ts +943 -0
  29. package/Models/DatabaseModels/ProxmoxClusterLabelRule.ts +514 -0
  30. package/Models/DatabaseModels/ProxmoxClusterOwnerRule.ts +596 -0
  31. package/Models/DatabaseModels/ProxmoxClusterOwnerTeam.ts +487 -0
  32. package/Models/DatabaseModels/ProxmoxClusterOwnerUser.ts +486 -0
  33. package/Models/DatabaseModels/ProxmoxResource.ts +726 -0
  34. package/Models/DatabaseModels/ScheduledMaintenance.ts +220 -0
  35. package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +38 -0
  36. package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +38 -0
  37. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +56 -0
  38. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  39. package/Server/API/BillingInvoiceAPI.ts +47 -7
  40. package/Server/API/CephResourceAPI.ts +134 -0
  41. package/Server/API/DashboardAPI.ts +135 -0
  42. package/Server/API/DockerSwarmResourceAPI.ts +137 -0
  43. package/Server/API/ProjectAPI.ts +15 -0
  44. package/Server/API/ProxmoxResourceAPI.ts +132 -0
  45. package/Server/API/ResellerPlanAPI.ts +17 -0
  46. package/Server/API/TelemetryAPI.ts +8 -1
  47. package/Server/Infrastructure/GlobalCache.ts +8 -2
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.ts +163 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1781587937032-MigrationName.ts +3199 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.ts +211 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.ts +590 -0
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.ts +64 -0
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  54. package/Server/Infrastructure/Redis.ts +40 -12
  55. package/Server/Services/AlertLabelRuleEngineService.ts +29 -0
  56. package/Server/Services/AlertOwnerRuleEngineService.ts +67 -0
  57. package/Server/Services/AnalyticsDatabaseService.ts +1 -1
  58. package/Server/Services/BillingService.ts +109 -21
  59. package/Server/Services/CephClusterLabelRuleEngineService.ts +200 -0
  60. package/Server/Services/CephClusterLabelRuleService.ts +14 -0
  61. package/Server/Services/CephClusterOwnerRuleEngineService.ts +218 -0
  62. package/Server/Services/CephClusterOwnerRuleService.ts +14 -0
  63. package/Server/Services/CephClusterOwnerTeamService.ts +10 -0
  64. package/Server/Services/CephClusterOwnerUserService.ts +10 -0
  65. package/Server/Services/CephClusterService.ts +401 -0
  66. package/Server/Services/CephResourceService.ts +383 -0
  67. package/Server/Services/CloudResourceService.ts +11 -3
  68. package/Server/Services/DockerHostService.ts +11 -3
  69. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +214 -0
  70. package/Server/Services/DockerSwarmClusterLabelRuleService.ts +14 -0
  71. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +232 -0
  72. package/Server/Services/DockerSwarmClusterOwnerRuleService.ts +14 -0
  73. package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +10 -0
  74. package/Server/Services/DockerSwarmClusterOwnerUserService.ts +10 -0
  75. package/Server/Services/DockerSwarmClusterService.ts +404 -0
  76. package/Server/Services/DockerSwarmResourceService.ts +381 -0
  77. package/Server/Services/ExceptionAggregationService.ts +3 -0
  78. package/Server/Services/HostService.ts +11 -3
  79. package/Server/Services/IncidentLabelRuleEngineService.ts +27 -0
  80. package/Server/Services/IncidentOwnerRuleEngineService.ts +67 -0
  81. package/Server/Services/IncidentService.ts +11 -0
  82. package/Server/Services/Index.ts +38 -0
  83. package/Server/Services/KubernetesClusterService.ts +11 -3
  84. package/Server/Services/LogAggregationService.ts +3 -0
  85. package/Server/Services/MetricAggregationService.ts +3 -0
  86. package/Server/Services/OpenTelemetryIngestService.ts +73 -0
  87. package/Server/Services/PodmanHostLabelRuleEngineService.ts +198 -0
  88. package/Server/Services/PodmanHostLabelRuleService.ts +14 -0
  89. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +216 -0
  90. package/Server/Services/PodmanHostOwnerRuleService.ts +14 -0
  91. package/Server/Services/PodmanHostOwnerTeamService.ts +10 -0
  92. package/Server/Services/PodmanHostOwnerUserService.ts +10 -0
  93. package/Server/Services/PodmanHostService.ts +368 -0
  94. package/Server/Services/PodmanResourceService.ts +310 -0
  95. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +204 -0
  96. package/Server/Services/ProxmoxClusterLabelRuleService.ts +14 -0
  97. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +222 -0
  98. package/Server/Services/ProxmoxClusterOwnerRuleService.ts +14 -0
  99. package/Server/Services/ProxmoxClusterOwnerTeamService.ts +10 -0
  100. package/Server/Services/ProxmoxClusterOwnerUserService.ts +10 -0
  101. package/Server/Services/ProxmoxClusterService.ts +382 -0
  102. package/Server/Services/ProxmoxResourceService.ts +404 -0
  103. package/Server/Services/RumApplicationService.ts +11 -3
  104. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +29 -0
  105. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +67 -0
  106. package/Server/Services/ServerlessFunctionService.ts +11 -3
  107. package/Server/Services/TelemetryUsageBillingService.ts +59 -3
  108. package/Server/Services/TraceAggregationService.ts +3 -0
  109. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +8 -23
  110. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +13 -0
  111. package/Server/Utils/Monitor/MonitorAlert.ts +55 -0
  112. package/Server/Utils/Monitor/MonitorClusterContext.ts +158 -0
  113. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +650 -4
  114. package/Server/Utils/Monitor/MonitorIncident.ts +175 -7
  115. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +56 -6
  116. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +6 -1
  117. package/Server/Utils/Monitor/SeriesResourceLabels.ts +59 -0
  118. package/Server/Utils/Profiling.ts +37 -2
  119. package/Server/Utils/Telemetry/EntityRegistry.ts +4 -0
  120. package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +1096 -0
  121. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +49 -0
  122. package/Server/Utils/Telemetry/Telemetry.ts +10 -0
  123. package/Server/Utils/Telemetry/TelemetryEntity.ts +107 -0
  124. package/Server/Utils/Telemetry.ts +8 -19
  125. package/Tests/Server/API/BillingInvoiceAPI.test.ts +194 -0
  126. package/Tests/Server/API/ProjectAPI.test.ts +91 -0
  127. package/Tests/Server/API/ResellerPlanAPI.test.ts +207 -0
  128. package/Tests/Server/Infrastructure/GlobalCache.test.ts +100 -0
  129. package/Tests/Server/Services/BillingService.test.ts +323 -0
  130. package/Tests/Server/Services/CephResourceService.test.ts +264 -0
  131. package/Tests/Server/Services/ProxmoxResourceService.test.ts +326 -0
  132. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +322 -0
  133. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +14 -0
  134. package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +879 -0
  135. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +196 -0
  136. package/Tests/Types/DockerSwarm/DockerSwarmInventoryExtractor.test.ts +667 -0
  137. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +1231 -0
  138. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +528 -0
  139. package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +732 -0
  140. package/Tests/Utils/Telemetry/EntityRelationship.test.ts +49 -0
  141. package/Tests/Utils/Telemetry/HeartbeatAvailability.test.ts +423 -0
  142. package/Types/BaseDatabase/AggregationIntervalUtil.ts +74 -0
  143. package/Types/Dashboard/DashboardComponentType.ts +11 -0
  144. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +4 -0
  145. package/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.ts +15 -0
  146. package/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.ts +14 -0
  147. package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.ts +17 -0
  148. package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.ts +17 -0
  149. package/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.ts +16 -0
  150. package/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.ts +15 -0
  151. package/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.ts +16 -0
  152. package/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.ts +15 -0
  153. package/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.ts +15 -0
  154. package/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.ts +17 -0
  155. package/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.ts +16 -0
  156. package/Types/Dashboard/DashboardTemplates.ts +640 -0
  157. package/Types/DockerSwarm/DockerSwarmInventoryExtractor.ts +452 -0
  158. package/Types/Icon/IconProp.ts +3 -0
  159. package/Types/Monitor/CephAlertTemplates.ts +1647 -0
  160. package/Types/Monitor/CephMetricCatalog.ts +409 -0
  161. package/Types/Monitor/DockerSwarmAlertTemplates.ts +461 -0
  162. package/Types/Monitor/DockerSwarmMetricCatalog.ts +139 -0
  163. package/Types/Monitor/HostAlertTemplates.ts +455 -0
  164. package/Types/Monitor/HostMetricCatalog.ts +177 -0
  165. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +65 -0
  166. package/Types/Monitor/MonitorStep.ts +163 -0
  167. package/Types/Monitor/MonitorStepCephMonitor.ts +57 -0
  168. package/Types/Monitor/MonitorStepDockerSwarmMonitor.ts +74 -0
  169. package/Types/Monitor/MonitorStepHostMonitor.ts +30 -0
  170. package/Types/Monitor/MonitorStepPodmanMonitor.ts +38 -0
  171. package/Types/Monitor/MonitorStepProxmoxMonitor.ts +81 -0
  172. package/Types/Monitor/MonitorType.ts +71 -1
  173. package/Types/Monitor/PodmanAlertTemplates.ts +507 -0
  174. package/Types/Monitor/PodmanMetricCatalog.ts +226 -0
  175. package/Types/Monitor/ProxmoxAlertTemplates.ts +899 -0
  176. package/Types/Monitor/ProxmoxMetricCatalog.ts +382 -0
  177. package/Types/Permission.ts +1029 -104
  178. package/Types/Podman/PodmanInventoryExtractor.ts +343 -0
  179. package/Types/Telemetry/EntityType.ts +23 -0
  180. package/Types/Telemetry/ServiceType.ts +4 -0
  181. package/UI/Components/Icon/Icon.tsx +141 -0
  182. package/UI/Components/LogsViewer/LogsViewer.tsx +44 -1
  183. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +28 -0
  184. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +15 -5
  185. package/UI/Utils/Telemetry/Telemetry.ts +16 -21
  186. package/UI/Utils/TelemetryService.ts +8 -3
  187. package/Utils/Dashboard/Components/DashboardCephOsdListComponent.ts +63 -0
  188. package/Utils/Dashboard/Components/DashboardCephPoolListComponent.ts +32 -0
  189. package/Utils/Dashboard/Components/DashboardCephResourceListShared.ts +61 -0
  190. package/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.ts +70 -0
  191. package/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.ts +61 -0
  192. package/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.ts +71 -0
  193. package/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.ts +100 -0
  194. package/Utils/Dashboard/Components/DashboardPodmanHostListComponent.ts +88 -0
  195. package/Utils/Dashboard/Components/DashboardPodmanImageListComponent.ts +97 -0
  196. package/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.ts +87 -0
  197. package/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.ts +87 -0
  198. package/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.ts +69 -0
  199. package/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.ts +55 -0
  200. package/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.ts +61 -0
  201. package/Utils/Dashboard/Components/Index.ts +79 -0
  202. package/Utils/Telemetry/EntityKey.ts +53 -0
  203. package/Utils/Telemetry/EntityRelationship.ts +6 -0
  204. package/Utils/Telemetry/HeartbeatAvailability.ts +262 -0
  205. package/build/dist/Models/DatabaseModels/Alert.js +270 -0
  206. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  207. package/build/dist/Models/DatabaseModels/AlertLabelRule.js +39 -0
  208. package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
  209. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +39 -0
  210. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
  211. package/build/dist/Models/DatabaseModels/CephCluster.js +992 -0
  212. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -0
  213. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js +522 -0
  214. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js.map +1 -0
  215. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js +603 -0
  216. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js.map +1 -0
  217. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js +503 -0
  218. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js.map +1 -0
  219. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js +502 -0
  220. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js.map +1 -0
  221. package/build/dist/Models/DatabaseModels/CephResource.js +846 -0
  222. package/build/dist/Models/DatabaseModels/CephResource.js.map +1 -0
  223. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +1018 -0
  224. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -0
  225. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +522 -0
  226. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -0
  227. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +603 -0
  228. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -0
  229. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +503 -0
  230. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -0
  231. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +502 -0
  232. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -0
  233. package/build/dist/Models/DatabaseModels/DockerSwarmResource.js +787 -0
  234. package/build/dist/Models/DatabaseModels/DockerSwarmResource.js.map +1 -0
  235. package/build/dist/Models/DatabaseModels/Host.js +63 -0
  236. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  237. package/build/dist/Models/DatabaseModels/Incident.js +270 -0
  238. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  239. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +39 -0
  240. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
  241. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +39 -0
  242. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
  243. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +54 -0
  244. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  245. package/build/dist/Models/DatabaseModels/Index.js +48 -0
  246. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  247. package/build/dist/Models/DatabaseModels/PodmanHost.js +885 -0
  248. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -0
  249. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +522 -0
  250. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -0
  251. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +603 -0
  252. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -0
  253. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +503 -0
  254. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -0
  255. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +502 -0
  256. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -0
  257. package/build/dist/Models/DatabaseModels/PodmanResource.js +526 -0
  258. package/build/dist/Models/DatabaseModels/PodmanResource.js.map +1 -0
  259. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +967 -0
  260. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -0
  261. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js +522 -0
  262. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js.map +1 -0
  263. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js +603 -0
  264. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js.map +1 -0
  265. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js +503 -0
  266. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js.map +1 -0
  267. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js +502 -0
  268. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js.map +1 -0
  269. package/build/dist/Models/DatabaseModels/ProxmoxResource.js +761 -0
  270. package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -0
  271. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +216 -0
  272. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  273. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +39 -0
  274. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
  275. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +39 -0
  276. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
  277. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +54 -0
  278. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  279. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  280. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  281. package/build/dist/Server/API/BillingInvoiceAPI.js +35 -5
  282. package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
  283. package/build/dist/Server/API/CephResourceAPI.js +98 -0
  284. package/build/dist/Server/API/CephResourceAPI.js.map +1 -0
  285. package/build/dist/Server/API/DashboardAPI.js +135 -0
  286. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  287. package/build/dist/Server/API/DockerSwarmResourceAPI.js +100 -0
  288. package/build/dist/Server/API/DockerSwarmResourceAPI.js.map +1 -0
  289. package/build/dist/Server/API/ProjectAPI.js +11 -0
  290. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  291. package/build/dist/Server/API/ProxmoxResourceAPI.js +95 -0
  292. package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -0
  293. package/build/dist/Server/API/ResellerPlanAPI.js +17 -3
  294. package/build/dist/Server/API/ResellerPlanAPI.js.map +1 -1
  295. package/build/dist/Server/API/TelemetryAPI.js +8 -1
  296. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  297. package/build/dist/Server/Infrastructure/GlobalCache.js +7 -2
  298. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  299. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.js +76 -0
  300. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.js.map +1 -0
  301. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781587937032-MigrationName.js +1100 -0
  302. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781587937032-MigrationName.js.map +1 -0
  303. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.js +108 -0
  304. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.js.map +1 -0
  305. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.js +253 -0
  306. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.js.map +1 -0
  307. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.js +43 -0
  308. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.js.map +1 -0
  309. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  310. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  311. package/build/dist/Server/Infrastructure/Redis.js +31 -8
  312. package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
  313. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +30 -4
  314. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  315. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +62 -5
  316. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  317. package/build/dist/Server/Services/AnalyticsDatabaseService.js +1 -1
  318. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  319. package/build/dist/Server/Services/BillingService.js +85 -23
  320. package/build/dist/Server/Services/BillingService.js.map +1 -1
  321. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +166 -0
  322. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -0
  323. package/build/dist/Server/Services/CephClusterLabelRuleService.js +13 -0
  324. package/build/dist/Server/Services/CephClusterLabelRuleService.js.map +1 -0
  325. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +186 -0
  326. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -0
  327. package/build/dist/Server/Services/CephClusterOwnerRuleService.js +13 -0
  328. package/build/dist/Server/Services/CephClusterOwnerRuleService.js.map +1 -0
  329. package/build/dist/Server/Services/CephClusterOwnerTeamService.js +9 -0
  330. package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -0
  331. package/build/dist/Server/Services/CephClusterOwnerUserService.js +9 -0
  332. package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -0
  333. package/build/dist/Server/Services/CephClusterService.js +353 -0
  334. package/build/dist/Server/Services/CephClusterService.js.map +1 -0
  335. package/build/dist/Server/Services/CephResourceService.js +257 -0
  336. package/build/dist/Server/Services/CephResourceService.js.map +1 -0
  337. package/build/dist/Server/Services/CloudResourceService.js +10 -2
  338. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  339. package/build/dist/Server/Services/DockerHostService.js +10 -2
  340. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  341. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +168 -0
  342. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -0
  343. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js +13 -0
  344. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js.map +1 -0
  345. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +188 -0
  346. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -0
  347. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js +13 -0
  348. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js.map +1 -0
  349. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +9 -0
  350. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -0
  351. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +9 -0
  352. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -0
  353. package/build/dist/Server/Services/DockerSwarmClusterService.js +353 -0
  354. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -0
  355. package/build/dist/Server/Services/DockerSwarmResourceService.js +258 -0
  356. package/build/dist/Server/Services/DockerSwarmResourceService.js.map +1 -0
  357. package/build/dist/Server/Services/ExceptionAggregationService.js +3 -0
  358. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  359. package/build/dist/Server/Services/HostService.js +10 -2
  360. package/build/dist/Server/Services/HostService.js.map +1 -1
  361. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +28 -4
  362. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  363. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +62 -5
  364. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  365. package/build/dist/Server/Services/IncidentService.js +8 -0
  366. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  367. package/build/dist/Server/Services/Index.js +38 -0
  368. package/build/dist/Server/Services/Index.js.map +1 -1
  369. package/build/dist/Server/Services/KubernetesClusterService.js +10 -2
  370. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  371. package/build/dist/Server/Services/LogAggregationService.js +3 -0
  372. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  373. package/build/dist/Server/Services/MetricAggregationService.js +3 -0
  374. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  375. package/build/dist/Server/Services/OpenTelemetryIngestService.js +69 -9
  376. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  377. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +166 -0
  378. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -0
  379. package/build/dist/Server/Services/PodmanHostLabelRuleService.js +13 -0
  380. package/build/dist/Server/Services/PodmanHostLabelRuleService.js.map +1 -0
  381. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +186 -0
  382. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -0
  383. package/build/dist/Server/Services/PodmanHostOwnerRuleService.js +13 -0
  384. package/build/dist/Server/Services/PodmanHostOwnerRuleService.js.map +1 -0
  385. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +9 -0
  386. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -0
  387. package/build/dist/Server/Services/PodmanHostOwnerUserService.js +9 -0
  388. package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -0
  389. package/build/dist/Server/Services/PodmanHostService.js +319 -0
  390. package/build/dist/Server/Services/PodmanHostService.js.map +1 -0
  391. package/build/dist/Server/Services/PodmanResourceService.js +196 -0
  392. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -0
  393. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +166 -0
  394. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -0
  395. package/build/dist/Server/Services/ProxmoxClusterLabelRuleService.js +13 -0
  396. package/build/dist/Server/Services/ProxmoxClusterLabelRuleService.js.map +1 -0
  397. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +186 -0
  398. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -0
  399. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleService.js +13 -0
  400. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleService.js.map +1 -0
  401. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +9 -0
  402. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -0
  403. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +9 -0
  404. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -0
  405. package/build/dist/Server/Services/ProxmoxClusterService.js +337 -0
  406. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -0
  407. package/build/dist/Server/Services/ProxmoxResourceService.js +285 -0
  408. package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -0
  409. package/build/dist/Server/Services/RumApplicationService.js +10 -2
  410. package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
  411. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +30 -4
  412. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +62 -5
  414. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  415. package/build/dist/Server/Services/ServerlessFunctionService.js +10 -2
  416. package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
  417. package/build/dist/Server/Services/TelemetryUsageBillingService.js +43 -3
  418. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  419. package/build/dist/Server/Services/TraceAggregationService.js +3 -0
  420. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  421. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +8 -25
  422. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  423. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +13 -0
  424. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  425. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +44 -0
  426. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  427. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +118 -0
  428. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +1 -0
  429. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +422 -4
  430. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  431. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +137 -8
  432. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  433. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +32 -6
  434. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  435. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +6 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  437. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +39 -0
  438. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  439. package/build/dist/Server/Utils/Profiling.js +24 -3
  440. package/build/dist/Server/Utils/Profiling.js.map +1 -1
  441. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -0
  442. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  443. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +854 -0
  444. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -0
  445. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +30 -0
  446. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  447. package/build/dist/Server/Utils/Telemetry/Telemetry.js +6 -0
  448. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  449. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +80 -0
  450. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  451. package/build/dist/Server/Utils/Telemetry.js +8 -10
  452. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  453. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +69 -0
  454. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -0
  455. package/build/dist/Types/Dashboard/DashboardComponentType.js +11 -0
  456. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  457. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +4 -0
  458. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  459. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.js +2 -0
  460. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.js.map +1 -0
  461. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.js +2 -0
  462. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.js.map +1 -0
  463. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.js +2 -0
  464. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.js.map +1 -0
  465. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js +2 -0
  466. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js.map +1 -0
  467. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js +2 -0
  468. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js.map +1 -0
  469. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js +2 -0
  470. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js.map +1 -0
  471. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js +2 -0
  472. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js.map +1 -0
  473. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js +2 -0
  474. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js.map +1 -0
  475. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.js +2 -0
  476. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.js.map +1 -0
  477. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.js +2 -0
  478. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.js.map +1 -0
  479. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.js +2 -0
  480. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.js.map +1 -0
  481. package/build/dist/Types/Dashboard/DashboardTemplates.js +562 -0
  482. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  483. package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js +359 -0
  484. package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js.map +1 -0
  485. package/build/dist/Types/Icon/IconProp.js +3 -0
  486. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  487. package/build/dist/Types/Monitor/CephAlertTemplates.js +1379 -0
  488. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -0
  489. package/build/dist/Types/Monitor/CephMetricCatalog.js +353 -0
  490. package/build/dist/Types/Monitor/CephMetricCatalog.js.map +1 -0
  491. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +358 -0
  492. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -0
  493. package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js +103 -0
  494. package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js.map +1 -0
  495. package/build/dist/Types/Monitor/HostAlertTemplates.js +365 -0
  496. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -0
  497. package/build/dist/Types/Monitor/HostMetricCatalog.js +138 -0
  498. package/build/dist/Types/Monitor/HostMetricCatalog.js.map +1 -0
  499. package/build/dist/Types/Monitor/MonitorStep.js +115 -0
  500. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  501. package/build/dist/Types/Monitor/MonitorStepCephMonitor.js +34 -0
  502. package/build/dist/Types/Monitor/MonitorStepCephMonitor.js.map +1 -0
  503. package/build/dist/Types/Monitor/MonitorStepDockerSwarmMonitor.js +21 -0
  504. package/build/dist/Types/Monitor/MonitorStepDockerSwarmMonitor.js.map +1 -0
  505. package/build/dist/Types/Monitor/MonitorStepHostMonitor.js +20 -0
  506. package/build/dist/Types/Monitor/MonitorStepHostMonitor.js.map +1 -0
  507. package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.js +21 -0
  508. package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.js.map +1 -0
  509. package/build/dist/Types/Monitor/MonitorStepProxmoxMonitor.js +36 -0
  510. package/build/dist/Types/Monitor/MonitorStepProxmoxMonitor.js.map +1 -0
  511. package/build/dist/Types/Monitor/MonitorType.js +66 -1
  512. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  513. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +410 -0
  514. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -0
  515. package/build/dist/Types/Monitor/PodmanMetricCatalog.js +192 -0
  516. package/build/dist/Types/Monitor/PodmanMetricCatalog.js.map +1 -0
  517. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +743 -0
  518. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -0
  519. package/build/dist/Types/Monitor/ProxmoxMetricCatalog.js +320 -0
  520. package/build/dist/Types/Monitor/ProxmoxMetricCatalog.js.map +1 -0
  521. package/build/dist/Types/Permission.js +824 -0
  522. package/build/dist/Types/Permission.js.map +1 -1
  523. package/build/dist/Types/Podman/PodmanInventoryExtractor.js +293 -0
  524. package/build/dist/Types/Podman/PodmanInventoryExtractor.js.map +1 -0
  525. package/build/dist/Types/Telemetry/EntityType.js +23 -0
  526. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  527. package/build/dist/Types/Telemetry/ServiceType.js +4 -0
  528. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  529. package/build/dist/UI/Components/Icon/Icon.js +49 -0
  530. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  531. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +30 -2
  532. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  533. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +22 -0
  534. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  535. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +11 -1
  536. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  537. package/build/dist/UI/Utils/Telemetry/Telemetry.js +11 -10
  538. package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
  539. package/build/dist/UI/Utils/TelemetryService.js +6 -2
  540. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  541. package/build/dist/Utils/Dashboard/Components/DashboardCephOsdListComponent.js +50 -0
  542. package/build/dist/Utils/Dashboard/Components/DashboardCephOsdListComponent.js.map +1 -0
  543. package/build/dist/Utils/Dashboard/Components/DashboardCephPoolListComponent.js +27 -0
  544. package/build/dist/Utils/Dashboard/Components/DashboardCephPoolListComponent.js.map +1 -0
  545. package/build/dist/Utils/Dashboard/Components/DashboardCephResourceListShared.js +46 -0
  546. package/build/dist/Utils/Dashboard/Components/DashboardCephResourceListShared.js.map +1 -0
  547. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.js +55 -0
  548. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.js.map +1 -0
  549. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js +46 -0
  550. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js.map +1 -0
  551. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js +55 -0
  552. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js.map +1 -0
  553. package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js +77 -0
  554. package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js.map +1 -0
  555. package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js +71 -0
  556. package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js.map +1 -0
  557. package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js +77 -0
  558. package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js.map +1 -0
  559. package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js +68 -0
  560. package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js.map +1 -0
  561. package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.js +68 -0
  562. package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.js.map +1 -0
  563. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.js +55 -0
  564. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.js.map +1 -0
  565. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.js +42 -0
  566. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.js.map +1 -0
  567. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.js +46 -0
  568. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.js.map +1 -0
  569. package/build/dist/Utils/Dashboard/Components/Index.js +44 -0
  570. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  571. package/build/dist/Utils/Telemetry/EntityKey.js +41 -0
  572. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  573. package/build/dist/Utils/Telemetry/EntityRelationship.js +3 -0
  574. package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
  575. package/build/dist/Utils/Telemetry/HeartbeatAvailability.js +174 -0
  576. package/build/dist/Utils/Telemetry/HeartbeatAvailability.js.map +1 -0
  577. package/package.json +29 -21
@@ -0,0 +1,1231 @@
1
+ import {
2
+ CephAlertTemplate,
3
+ CephAlertTemplateArgs,
4
+ getAllCephAlertTemplates,
5
+ getCephAlertTemplateById,
6
+ } from "../../../Types/Monitor/CephAlertTemplates";
7
+ import { getCephMetricByMetricName } from "../../../Types/Monitor/CephMetricCatalog";
8
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
9
+ import MonitorStepCephMonitor from "../../../Types/Monitor/MonitorStepCephMonitor";
10
+ import MonitorCriteriaInstance from "../../../Types/Monitor/MonitorCriteriaInstance";
11
+ import FilterCondition from "../../../Types/Filter/FilterCondition";
12
+ import {
13
+ FilterType,
14
+ NoDataPolicy,
15
+ } from "../../../Types/Monitor/CriteriaFilter";
16
+ import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
17
+ import RollingTime from "../../../Types/RollingTime/RollingTime";
18
+ import ObjectID from "../../../Types/ObjectID";
19
+
20
+ /*
21
+ * WI-20: lock in the Ceph alert-template contracts (v2 WI-9 + the v3
22
+ * WI-26 health-check additions). Same two-layer shape as the Proxmox
23
+ * twin:
24
+ *
25
+ * 1. ENUMERATED invariants over getAllCephAlertTemplates() — every
26
+ * template (current and future) must build a valid MonitorStep,
27
+ * reference only catalog metrics, resolve every criteria alias,
28
+ * group only by the raw `ceph_daemon` / `pool_id` datapoint labels,
29
+ * and use disjoint fire/recover thresholds. Health-check templates
30
+ * (ceph_health_detail / ceph_daemon_health_metrics) additionally
31
+ * MUST recover with NoDataPolicy.TreatAsZero: those series exist
32
+ * only while a check is active (Quincy+), so a bare "= 0" recover
33
+ * filter would never match after the series disappears and the
34
+ * monitor would wedge in the unhealthy state.
35
+ *
36
+ * 2. A per-template expectation table pins the spec'd v3 WI-26 rows
37
+ * (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).
42
+ */
43
+
44
+ interface ThresholdExpectation {
45
+ alias: string;
46
+ filterType: FilterType;
47
+ value: number;
48
+ }
49
+
50
+ interface CephQueryExpectation {
51
+ alias: string;
52
+ metricName: string;
53
+ attributes: Record<string, string>;
54
+ }
55
+
56
+ interface CephTemplateExpectation {
57
+ id: string;
58
+ category: string;
59
+ severity: string;
60
+ rollingTime: RollingTime;
61
+ // All queries of one template share an aggregation by construction.
62
+ aggregation: MetricsAggregationType;
63
+ queries: Array<CephQueryExpectation>;
64
+ groupBy: string | null;
65
+ formula: string | null;
66
+ /*
67
+ * One entry per unhealthy criteria instance, in evaluation order
68
+ * (first-match-wins, worst tier first). Inner filters are OR'd
69
+ * (FilterCondition.Any).
70
+ */
71
+ fireCriteria: Array<Array<ThresholdExpectation>>;
72
+ recover: {
73
+ filters: Array<ThresholdExpectation>;
74
+ condition: FilterCondition;
75
+ treatNoDataAsZero: boolean;
76
+ };
77
+ }
78
+
79
+ const EXPECTED_TEMPLATES: Array<CephTemplateExpectation> = [
80
+ {
81
+ id: "ceph-health-error",
82
+ category: "Cluster Health",
83
+ severity: "Critical",
84
+ rollingTime: RollingTime.Past1Minute,
85
+ aggregation: MetricsAggregationType.Max,
86
+ queries: [
87
+ {
88
+ alias: "ceph_health_error",
89
+ metricName: "ceph_health_status",
90
+ attributes: {},
91
+ },
92
+ ],
93
+ groupBy: null,
94
+ formula: null,
95
+ fireCriteria: [
96
+ [
97
+ {
98
+ alias: "ceph_health_error",
99
+ filterType: FilterType.GreaterThanOrEqualTo,
100
+ value: 2,
101
+ },
102
+ ],
103
+ ],
104
+ recover: {
105
+ filters: [
106
+ {
107
+ alias: "ceph_health_error",
108
+ filterType: FilterType.LessThan,
109
+ value: 2,
110
+ },
111
+ ],
112
+ condition: FilterCondition.Any,
113
+ treatNoDataAsZero: false,
114
+ },
115
+ },
116
+ {
117
+ id: "ceph-health-warn",
118
+ category: "Cluster Health",
119
+ severity: "Warning",
120
+ rollingTime: RollingTime.Past5Minutes,
121
+ aggregation: MetricsAggregationType.Max,
122
+ queries: [
123
+ {
124
+ alias: "ceph_health",
125
+ metricName: "ceph_health_status",
126
+ attributes: {},
127
+ },
128
+ ],
129
+ groupBy: null,
130
+ formula: null,
131
+ fireCriteria: [
132
+ [
133
+ {
134
+ alias: "ceph_health",
135
+ filterType: FilterType.GreaterThanOrEqualTo,
136
+ value: 1,
137
+ },
138
+ ],
139
+ ],
140
+ recover: {
141
+ filters: [
142
+ { alias: "ceph_health", filterType: FilterType.LessThan, value: 1 },
143
+ ],
144
+ condition: FilterCondition.Any,
145
+ treatNoDataAsZero: false,
146
+ },
147
+ },
148
+ {
149
+ id: "ceph-osd-down",
150
+ category: "OSD",
151
+ severity: "Critical",
152
+ rollingTime: RollingTime.Past5Minutes,
153
+ aggregation: MetricsAggregationType.Min,
154
+ queries: [{ alias: "osd_up", metricName: "ceph_osd_up", attributes: {} }],
155
+ groupBy: "ceph_daemon",
156
+ formula: null,
157
+ fireCriteria: [
158
+ [{ alias: "osd_up", filterType: FilterType.LessThan, value: 1 }],
159
+ ],
160
+ recover: {
161
+ filters: [
162
+ {
163
+ alias: "osd_up",
164
+ filterType: FilterType.GreaterThanOrEqualTo,
165
+ value: 1,
166
+ },
167
+ ],
168
+ condition: FilterCondition.Any,
169
+ treatNoDataAsZero: false,
170
+ },
171
+ },
172
+ {
173
+ id: "ceph-osd-out",
174
+ category: "OSD",
175
+ severity: "Warning",
176
+ rollingTime: RollingTime.Past5Minutes,
177
+ aggregation: MetricsAggregationType.Min,
178
+ queries: [{ alias: "osd_in", metricName: "ceph_osd_in", attributes: {} }],
179
+ groupBy: "ceph_daemon",
180
+ formula: null,
181
+ fireCriteria: [
182
+ [{ alias: "osd_in", filterType: FilterType.LessThan, value: 1 }],
183
+ ],
184
+ recover: {
185
+ filters: [
186
+ {
187
+ alias: "osd_in",
188
+ filterType: FilterType.GreaterThanOrEqualTo,
189
+ value: 1,
190
+ },
191
+ ],
192
+ condition: FilterCondition.Any,
193
+ treatNoDataAsZero: false,
194
+ },
195
+ },
196
+ {
197
+ id: "ceph-osd-high-latency",
198
+ category: "OSD",
199
+ severity: "Warning",
200
+ rollingTime: RollingTime.Past5Minutes,
201
+ aggregation: MetricsAggregationType.Avg,
202
+ queries: [
203
+ {
204
+ alias: "osd_apply_latency",
205
+ metricName: "ceph_osd_apply_latency_ms",
206
+ attributes: {},
207
+ },
208
+ ],
209
+ groupBy: "ceph_daemon",
210
+ formula: null,
211
+ fireCriteria: [
212
+ [
213
+ {
214
+ alias: "osd_apply_latency",
215
+ filterType: FilterType.GreaterThan,
216
+ value: 100,
217
+ },
218
+ ],
219
+ ],
220
+ recover: {
221
+ filters: [
222
+ {
223
+ alias: "osd_apply_latency",
224
+ filterType: FilterType.LessThanOrEqualTo,
225
+ value: 100,
226
+ },
227
+ ],
228
+ condition: FilterCondition.Any,
229
+ treatNoDataAsZero: false,
230
+ },
231
+ },
232
+ {
233
+ id: "ceph-mon-quorum-degraded",
234
+ category: "Cluster Health",
235
+ severity: "Critical",
236
+ rollingTime: RollingTime.Past1Minute,
237
+ aggregation: MetricsAggregationType.Min,
238
+ queries: [
239
+ {
240
+ alias: "mon_quorum",
241
+ metricName: "ceph_mon_quorum_status",
242
+ attributes: {},
243
+ },
244
+ ],
245
+ groupBy: "ceph_daemon",
246
+ formula: null,
247
+ fireCriteria: [
248
+ [{ alias: "mon_quorum", filterType: FilterType.LessThan, value: 1 }],
249
+ ],
250
+ recover: {
251
+ filters: [
252
+ {
253
+ alias: "mon_quorum",
254
+ filterType: FilterType.GreaterThanOrEqualTo,
255
+ value: 1,
256
+ },
257
+ ],
258
+ condition: FilterCondition.Any,
259
+ treatNoDataAsZero: false,
260
+ },
261
+ },
262
+ {
263
+ id: "ceph-pg-degraded",
264
+ category: "PG",
265
+ severity: "Warning",
266
+ rollingTime: RollingTime.Past5Minutes,
267
+ aggregation: MetricsAggregationType.Max,
268
+ queries: [
269
+ { alias: "pg_degraded", metricName: "ceph_pg_degraded", attributes: {} },
270
+ ],
271
+ groupBy: null,
272
+ formula: null,
273
+ fireCriteria: [
274
+ [{ alias: "pg_degraded", filterType: FilterType.GreaterThan, value: 0 }],
275
+ ],
276
+ recover: {
277
+ filters: [
278
+ { alias: "pg_degraded", filterType: FilterType.EqualTo, value: 0 },
279
+ ],
280
+ condition: FilterCondition.Any,
281
+ treatNoDataAsZero: false,
282
+ },
283
+ },
284
+ {
285
+ id: "ceph-pg-undersized",
286
+ category: "PG",
287
+ severity: "Warning",
288
+ rollingTime: RollingTime.Past5Minutes,
289
+ aggregation: MetricsAggregationType.Max,
290
+ queries: [
291
+ {
292
+ alias: "pg_undersized",
293
+ metricName: "ceph_pg_undersized",
294
+ attributes: {},
295
+ },
296
+ ],
297
+ groupBy: null,
298
+ formula: null,
299
+ fireCriteria: [
300
+ [
301
+ {
302
+ alias: "pg_undersized",
303
+ filterType: FilterType.GreaterThan,
304
+ value: 0,
305
+ },
306
+ ],
307
+ ],
308
+ recover: {
309
+ filters: [
310
+ { alias: "pg_undersized", filterType: FilterType.EqualTo, value: 0 },
311
+ ],
312
+ condition: FilterCondition.Any,
313
+ treatNoDataAsZero: false,
314
+ },
315
+ },
316
+ {
317
+ /*
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.
323
+ */
324
+ id: "ceph-pg-inactive",
325
+ category: "PG",
326
+ severity: "Critical",
327
+ rollingTime: RollingTime.Past5Minutes,
328
+ aggregation: MetricsAggregationType.Sum,
329
+ queries: [
330
+ { alias: "pg_total", metricName: "ceph_pg_total", attributes: {} },
331
+ { alias: "pg_active", metricName: "ceph_pg_active", attributes: {} },
332
+ ],
333
+ groupBy: null,
334
+ formula: "pg_total - pg_active",
335
+ fireCriteria: [
336
+ [{ alias: "pg_inactive", filterType: FilterType.GreaterThan, value: 0 }],
337
+ ],
338
+ recover: {
339
+ filters: [
340
+ { alias: "pg_inactive", filterType: FilterType.EqualTo, value: 0 },
341
+ ],
342
+ condition: FilterCondition.Any,
343
+ treatNoDataAsZero: false,
344
+ },
345
+ },
346
+ {
347
+ id: "ceph-cluster-near-full",
348
+ category: "Capacity",
349
+ severity: "Warning",
350
+ rollingTime: RollingTime.Past5Minutes,
351
+ aggregation: MetricsAggregationType.Sum,
352
+ queries: [
353
+ {
354
+ alias: "used_bytes",
355
+ metricName: "ceph_cluster_total_used_bytes",
356
+ attributes: {},
357
+ },
358
+ {
359
+ alias: "total_bytes",
360
+ metricName: "ceph_cluster_total_bytes",
361
+ attributes: {},
362
+ },
363
+ ],
364
+ groupBy: null,
365
+ formula: "(used_bytes / total_bytes) * 100",
366
+ fireCriteria: [
367
+ [
368
+ {
369
+ alias: "cluster_used_percent",
370
+ filterType: FilterType.GreaterThan,
371
+ value: 85,
372
+ },
373
+ ],
374
+ ],
375
+ recover: {
376
+ filters: [
377
+ {
378
+ alias: "cluster_used_percent",
379
+ filterType: FilterType.LessThanOrEqualTo,
380
+ value: 85,
381
+ },
382
+ ],
383
+ condition: FilterCondition.Any,
384
+ treatNoDataAsZero: false,
385
+ },
386
+ },
387
+ {
388
+ id: "ceph-cluster-full",
389
+ category: "Capacity",
390
+ severity: "Critical",
391
+ rollingTime: RollingTime.Past5Minutes,
392
+ aggregation: MetricsAggregationType.Sum,
393
+ queries: [
394
+ {
395
+ alias: "used_bytes",
396
+ metricName: "ceph_cluster_total_used_bytes",
397
+ attributes: {},
398
+ },
399
+ {
400
+ alias: "total_bytes",
401
+ metricName: "ceph_cluster_total_bytes",
402
+ attributes: {},
403
+ },
404
+ ],
405
+ groupBy: null,
406
+ formula: "(used_bytes / total_bytes) * 100",
407
+ fireCriteria: [
408
+ [
409
+ {
410
+ alias: "cluster_used_percent",
411
+ filterType: FilterType.GreaterThan,
412
+ value: 95,
413
+ },
414
+ ],
415
+ ],
416
+ recover: {
417
+ filters: [
418
+ {
419
+ alias: "cluster_used_percent",
420
+ filterType: FilterType.LessThanOrEqualTo,
421
+ value: 95,
422
+ },
423
+ ],
424
+ condition: FilterCondition.Any,
425
+ treatNoDataAsZero: false,
426
+ },
427
+ },
428
+ {
429
+ id: "ceph-pool-near-full",
430
+ category: "Capacity",
431
+ severity: "Warning",
432
+ rollingTime: RollingTime.Past5Minutes,
433
+ aggregation: MetricsAggregationType.Sum,
434
+ queries: [
435
+ { alias: "pool_stored", metricName: "ceph_pool_stored", attributes: {} },
436
+ {
437
+ alias: "pool_max_avail",
438
+ metricName: "ceph_pool_max_avail",
439
+ attributes: {},
440
+ },
441
+ ],
442
+ groupBy: "pool_id",
443
+ formula: "(pool_stored / (pool_stored + pool_max_avail)) * 100",
444
+ fireCriteria: [
445
+ [
446
+ {
447
+ alias: "pool_used_percent",
448
+ filterType: FilterType.GreaterThan,
449
+ value: 85,
450
+ },
451
+ ],
452
+ ],
453
+ recover: {
454
+ filters: [
455
+ {
456
+ alias: "pool_used_percent",
457
+ filterType: FilterType.LessThanOrEqualTo,
458
+ value: 85,
459
+ },
460
+ ],
461
+ condition: FilterCondition.Any,
462
+ treatNoDataAsZero: false,
463
+ },
464
+ },
465
+ {
466
+ id: "ceph-slow-ops",
467
+ category: "Cluster Health",
468
+ severity: "Warning",
469
+ rollingTime: RollingTime.Past5Minutes,
470
+ aggregation: MetricsAggregationType.Max,
471
+ queries: [
472
+ {
473
+ alias: "slow_ops",
474
+ metricName: "ceph_healthcheck_slow_ops",
475
+ attributes: {},
476
+ },
477
+ ],
478
+ groupBy: null,
479
+ formula: null,
480
+ fireCriteria: [
481
+ [{ alias: "slow_ops", filterType: FilterType.GreaterThan, value: 0 }],
482
+ ],
483
+ recover: {
484
+ filters: [
485
+ { alias: "slow_ops", filterType: FilterType.EqualTo, value: 0 },
486
+ ],
487
+ condition: FilterCondition.Any,
488
+ treatNoDataAsZero: false,
489
+ },
490
+ },
491
+ /*
492
+ * --- V3 WI-26 health-check templates ---
493
+ * Spec table (ProxmoxCephProductsV3.md §WI-26): all fire Max > 0 /
494
+ * recover = 0 (TreatAsZero), Past5Minutes unless noted.
495
+ */
496
+ {
497
+ /*
498
+ * PG_DAMAGED OR OSD_SCRUB_ERRORS — two queries, NO formula ("a + b"
499
+ * would yield nothing while one check is inactive).
500
+ */
501
+ id: "ceph-pg-damaged",
502
+ category: "PG",
503
+ severity: "Critical",
504
+ rollingTime: RollingTime.Past5Minutes,
505
+ aggregation: MetricsAggregationType.Max,
506
+ queries: [
507
+ {
508
+ alias: "pg_damaged",
509
+ metricName: "ceph_health_detail",
510
+ attributes: { name: "PG_DAMAGED" },
511
+ },
512
+ {
513
+ alias: "scrub_errors",
514
+ metricName: "ceph_health_detail",
515
+ attributes: { name: "OSD_SCRUB_ERRORS" },
516
+ },
517
+ ],
518
+ groupBy: null,
519
+ formula: null,
520
+ fireCriteria: [
521
+ [
522
+ { alias: "pg_damaged", filterType: FilterType.GreaterThan, value: 0 },
523
+ { alias: "scrub_errors", filterType: FilterType.GreaterThan, value: 0 },
524
+ ],
525
+ ],
526
+ recover: {
527
+ filters: [
528
+ { alias: "pg_damaged", filterType: FilterType.EqualTo, value: 0 },
529
+ { alias: "scrub_errors", filterType: FilterType.EqualTo, value: 0 },
530
+ ],
531
+ // Recovery requires BOTH checks clear — complement of the Any fire.
532
+ condition: FilterCondition.All,
533
+ treatNoDataAsZero: true,
534
+ },
535
+ },
536
+ {
537
+ id: "ceph-daemon-crash",
538
+ category: "Cluster Health",
539
+ severity: "Critical",
540
+ rollingTime: RollingTime.Past5Minutes,
541
+ aggregation: MetricsAggregationType.Max,
542
+ queries: [
543
+ {
544
+ alias: "recent_crash",
545
+ metricName: "ceph_health_detail",
546
+ attributes: { name: "RECENT_CRASH" },
547
+ },
548
+ ],
549
+ groupBy: null,
550
+ formula: null,
551
+ fireCriteria: [
552
+ [{ alias: "recent_crash", filterType: FilterType.GreaterThan, value: 0 }],
553
+ ],
554
+ recover: {
555
+ filters: [
556
+ { alias: "recent_crash", filterType: FilterType.EqualTo, value: 0 },
557
+ ],
558
+ condition: FilterCondition.Any,
559
+ treatNoDataAsZero: true,
560
+ },
561
+ },
562
+ {
563
+ id: "ceph-osd-slow-heartbeats",
564
+ category: "OSD",
565
+ severity: "Warning",
566
+ rollingTime: RollingTime.Past5Minutes,
567
+ aggregation: MetricsAggregationType.Max,
568
+ queries: [
569
+ {
570
+ alias: "slow_ping_front",
571
+ metricName: "ceph_health_detail",
572
+ attributes: { name: "OSD_SLOW_PING_TIME_FRONT" },
573
+ },
574
+ {
575
+ alias: "slow_ping_back",
576
+ metricName: "ceph_health_detail",
577
+ attributes: { name: "OSD_SLOW_PING_TIME_BACK" },
578
+ },
579
+ ],
580
+ groupBy: null,
581
+ formula: null,
582
+ fireCriteria: [
583
+ [
584
+ {
585
+ alias: "slow_ping_front",
586
+ filterType: FilterType.GreaterThan,
587
+ value: 0,
588
+ },
589
+ {
590
+ alias: "slow_ping_back",
591
+ filterType: FilterType.GreaterThan,
592
+ value: 0,
593
+ },
594
+ ],
595
+ ],
596
+ recover: {
597
+ filters: [
598
+ { alias: "slow_ping_front", filterType: FilterType.EqualTo, value: 0 },
599
+ { alias: "slow_ping_back", filterType: FilterType.EqualTo, value: 0 },
600
+ ],
601
+ condition: FilterCondition.All,
602
+ treatNoDataAsZero: true,
603
+ },
604
+ },
605
+ {
606
+ id: "ceph-mon-clock-skew",
607
+ category: "Cluster Health",
608
+ severity: "Warning",
609
+ rollingTime: RollingTime.Past5Minutes,
610
+ aggregation: MetricsAggregationType.Max,
611
+ queries: [
612
+ {
613
+ alias: "mon_clock_skew",
614
+ metricName: "ceph_health_detail",
615
+ attributes: { name: "MON_CLOCK_SKEW" },
616
+ },
617
+ ],
618
+ groupBy: null,
619
+ formula: null,
620
+ fireCriteria: [
621
+ [
622
+ {
623
+ alias: "mon_clock_skew",
624
+ filterType: FilterType.GreaterThan,
625
+ value: 0,
626
+ },
627
+ ],
628
+ ],
629
+ recover: {
630
+ filters: [
631
+ { alias: "mon_clock_skew", filterType: FilterType.EqualTo, value: 0 },
632
+ ],
633
+ condition: FilterCondition.Any,
634
+ treatNoDataAsZero: true,
635
+ },
636
+ },
637
+ {
638
+ id: "ceph-osd-nearfull",
639
+ category: "Capacity",
640
+ severity: "Warning",
641
+ rollingTime: RollingTime.Past5Minutes,
642
+ aggregation: MetricsAggregationType.Max,
643
+ queries: [
644
+ {
645
+ alias: "osd_nearfull",
646
+ metricName: "ceph_health_detail",
647
+ attributes: { name: "OSD_NEARFULL" },
648
+ },
649
+ ],
650
+ groupBy: null,
651
+ formula: null,
652
+ fireCriteria: [
653
+ [{ alias: "osd_nearfull", filterType: FilterType.GreaterThan, value: 0 }],
654
+ ],
655
+ recover: {
656
+ filters: [
657
+ { alias: "osd_nearfull", filterType: FilterType.EqualTo, value: 0 },
658
+ ],
659
+ condition: FilterCondition.Any,
660
+ treatNoDataAsZero: true,
661
+ },
662
+ },
663
+ {
664
+ id: "ceph-osd-backfillfull",
665
+ category: "Capacity",
666
+ severity: "Warning",
667
+ rollingTime: RollingTime.Past5Minutes,
668
+ aggregation: MetricsAggregationType.Max,
669
+ queries: [
670
+ {
671
+ alias: "osd_backfillfull",
672
+ metricName: "ceph_health_detail",
673
+ attributes: { name: "OSD_BACKFILLFULL" },
674
+ },
675
+ ],
676
+ groupBy: null,
677
+ formula: null,
678
+ fireCriteria: [
679
+ [
680
+ {
681
+ alias: "osd_backfillfull",
682
+ filterType: FilterType.GreaterThan,
683
+ value: 0,
684
+ },
685
+ ],
686
+ ],
687
+ recover: {
688
+ filters: [
689
+ { alias: "osd_backfillfull", filterType: FilterType.EqualTo, value: 0 },
690
+ ],
691
+ condition: FilterCondition.Any,
692
+ treatNoDataAsZero: true,
693
+ },
694
+ },
695
+ {
696
+ // Past1Minute per the spec table: writes are already blocked.
697
+ id: "ceph-osd-full",
698
+ category: "Capacity",
699
+ severity: "Critical",
700
+ rollingTime: RollingTime.Past1Minute,
701
+ aggregation: MetricsAggregationType.Max,
702
+ queries: [
703
+ {
704
+ alias: "osd_full",
705
+ metricName: "ceph_health_detail",
706
+ attributes: { name: "OSD_FULL" },
707
+ },
708
+ ],
709
+ groupBy: null,
710
+ formula: null,
711
+ fireCriteria: [
712
+ [{ alias: "osd_full", filterType: FilterType.GreaterThan, value: 0 }],
713
+ ],
714
+ recover: {
715
+ filters: [
716
+ { alias: "osd_full", filterType: FilterType.EqualTo, value: 0 },
717
+ ],
718
+ condition: FilterCondition.Any,
719
+ treatNoDataAsZero: true,
720
+ },
721
+ },
722
+ {
723
+ /*
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.
727
+ */
728
+ id: "ceph-mon-disk-space",
729
+ category: "Cluster Health",
730
+ severity: "Critical",
731
+ rollingTime: RollingTime.Past5Minutes,
732
+ aggregation: MetricsAggregationType.Max,
733
+ queries: [
734
+ {
735
+ alias: "mon_disk_crit",
736
+ metricName: "ceph_health_detail",
737
+ attributes: { name: "MON_DISK_CRIT" },
738
+ },
739
+ {
740
+ alias: "mon_disk_low",
741
+ metricName: "ceph_health_detail",
742
+ attributes: { name: "MON_DISK_LOW" },
743
+ },
744
+ ],
745
+ groupBy: null,
746
+ formula: null,
747
+ fireCriteria: [
748
+ [
749
+ {
750
+ alias: "mon_disk_crit",
751
+ filterType: FilterType.GreaterThan,
752
+ value: 0,
753
+ },
754
+ ],
755
+ [{ alias: "mon_disk_low", filterType: FilterType.GreaterThan, value: 0 }],
756
+ ],
757
+ recover: {
758
+ filters: [
759
+ { alias: "mon_disk_crit", filterType: FilterType.EqualTo, value: 0 },
760
+ { alias: "mon_disk_low", filterType: FilterType.EqualTo, value: 0 },
761
+ ],
762
+ condition: FilterCondition.All,
763
+ treatNoDataAsZero: true,
764
+ },
765
+ },
766
+ {
767
+ id: "ceph-daemon-slow-ops",
768
+ category: "Cluster Health",
769
+ severity: "Warning",
770
+ rollingTime: RollingTime.Past5Minutes,
771
+ aggregation: MetricsAggregationType.Max,
772
+ queries: [
773
+ {
774
+ alias: "daemon_slow_ops",
775
+ metricName: "ceph_daemon_health_metrics",
776
+ attributes: { type: "SLOW_OPS" },
777
+ },
778
+ ],
779
+ groupBy: "ceph_daemon",
780
+ formula: null,
781
+ fireCriteria: [
782
+ [
783
+ {
784
+ alias: "daemon_slow_ops",
785
+ filterType: FilterType.GreaterThan,
786
+ value: 0,
787
+ },
788
+ ],
789
+ ],
790
+ recover: {
791
+ filters: [
792
+ { alias: "daemon_slow_ops", filterType: FilterType.EqualTo, value: 0 },
793
+ ],
794
+ condition: FilterCondition.Any,
795
+ treatNoDataAsZero: true,
796
+ },
797
+ },
798
+ ];
799
+
800
+ function buildArgs(): CephAlertTemplateArgs {
801
+ return {
802
+ clusterIdentifier: "ceph-prod",
803
+ onlineMonitorStatusId: ObjectID.generate(),
804
+ offlineMonitorStatusId: ObjectID.generate(),
805
+ defaultIncidentSeverityId: ObjectID.generate(),
806
+ defaultAlertSeverityId: ObjectID.generate(),
807
+ monitorName: "Test Monitor",
808
+ };
809
+ }
810
+
811
+ function getCephMonitor(step: MonitorStep): MonitorStepCephMonitor {
812
+ const cephMonitor: MonitorStepCephMonitor | undefined =
813
+ step.data?.cephMonitor;
814
+ if (!cephMonitor) {
815
+ throw new Error("cephMonitor missing from monitor step");
816
+ }
817
+ return cephMonitor;
818
+ }
819
+
820
+ function getCriteriaInstances(
821
+ step: MonitorStep,
822
+ ): Array<MonitorCriteriaInstance> {
823
+ const instances: Array<MonitorCriteriaInstance> | undefined =
824
+ step.data?.monitorCriteria.data?.monitorCriteriaInstanceArray;
825
+ if (!instances || instances.length === 0) {
826
+ throw new Error("monitorCriteria missing from monitor step");
827
+ }
828
+ return instances;
829
+ }
830
+
831
+ function getReferencableAliases(monitor: MonitorStepCephMonitor): Set<string> {
832
+ const aliases: Set<string> = new Set<string>();
833
+ for (const queryConfig of monitor.metricViewConfig
834
+ .queryConfigs as Array<any>) {
835
+ aliases.add(queryConfig.metricAliasData.metricVariable);
836
+ }
837
+ for (const formulaConfig of (monitor.metricViewConfig.formulaConfigs ||
838
+ []) as Array<any>) {
839
+ aliases.add(formulaConfig.metricAliasData.metricVariable);
840
+ }
841
+ return aliases;
842
+ }
843
+
844
+ function isDisjointComplement(
845
+ fire: { filterType: FilterType; value: number },
846
+ recover: { filterType: FilterType; value: number },
847
+ ): 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
+ }
866
+ }
867
+
868
+ // Health-check series exist only while their check is active.
869
+ function isHealthCheckMetric(metricName: string): boolean {
870
+ return (
871
+ metricName === "ceph_health_detail" ||
872
+ metricName === "ceph_daemon_health_metrics"
873
+ );
874
+ }
875
+
876
+ const ALL_TEMPLATES: Array<CephAlertTemplate> = getAllCephAlertTemplates();
877
+
878
+ describe("CephAlertTemplates - registry", () => {
879
+ test("template ids are unique and match the expectation table exactly", () => {
880
+ const ids: Array<string> = ALL_TEMPLATES.map((t: CephAlertTemplate) => {
881
+ return t.id;
882
+ });
883
+ expect(new Set(ids).size).toBe(ids.length);
884
+ expect([...ids].sort()).toEqual(
885
+ EXPECTED_TEMPLATES.map((t: CephTemplateExpectation) => {
886
+ return t.id;
887
+ }).sort(),
888
+ );
889
+ });
890
+ });
891
+
892
+ describe("CephAlertTemplates - enumerated invariants (every template)", () => {
893
+ test.each(
894
+ ALL_TEMPLATES.map((t: CephAlertTemplate) => {
895
+ return [t.id, t];
896
+ }),
897
+ )("%s builds a valid MonitorStep", (_id: unknown, template: unknown) => {
898
+ const args: CephAlertTemplateArgs = buildArgs();
899
+ const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
900
+ args,
901
+ );
902
+ const monitor: MonitorStepCephMonitor = getCephMonitor(step);
903
+
904
+ // The cluster attribute is injected from the template args.
905
+ expect(monitor.clusterIdentifier).toBe(args.clusterIdentifier);
906
+ expect(monitor.metricViewConfig.queryConfigs.length).toBeGreaterThan(0);
907
+
908
+ const instances: Array<MonitorCriteriaInstance> =
909
+ getCriteriaInstances(step);
910
+ /*
911
+ * ceph-mon-disk-space carries a third (Warning-tier) instance —
912
+ * assert at-least-2, never exactly-2.
913
+ */
914
+ expect(instances.length).toBeGreaterThanOrEqual(2);
915
+
916
+ const offlineInstances: Array<MonitorCriteriaInstance> = instances.slice(
917
+ 0,
918
+ -1,
919
+ );
920
+ const onlineInstance: MonitorCriteriaInstance =
921
+ instances[instances.length - 1]!;
922
+
923
+ for (const offline of offlineInstances) {
924
+ expect(offline.data?.monitorStatusId).toBe(args.offlineMonitorStatusId);
925
+ expect(offline.data?.createIncidents).toBe(true);
926
+ expect(offline.data?.createAlerts).toBe(true);
927
+ expect(offline.data?.incidents).toHaveLength(1);
928
+ expect(offline.data?.alerts).toHaveLength(1);
929
+ expect(offline.data?.incidents?.[0]?.autoResolveIncident).toBe(true);
930
+ expect(offline.data?.alerts?.[0]?.autoResolveAlert).toBe(true);
931
+ }
932
+
933
+ expect(onlineInstance.data?.monitorStatusId).toBe(
934
+ args.onlineMonitorStatusId,
935
+ );
936
+ expect(onlineInstance.data?.createIncidents).toBe(false);
937
+ expect(onlineInstance.data?.createAlerts).toBe(false);
938
+ expect(onlineInstance.data?.name).toBe("Healthy");
939
+ });
940
+
941
+ test.each(
942
+ ALL_TEMPLATES.map((t: CephAlertTemplate) => {
943
+ return [t.id, t];
944
+ }),
945
+ )(
946
+ "%s references only catalog metrics and resolvable aliases",
947
+ (_id: unknown, template: unknown) => {
948
+ const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
949
+ buildArgs(),
950
+ );
951
+ const monitor: MonitorStepCephMonitor = getCephMonitor(step);
952
+
953
+ for (const queryConfig of monitor.metricViewConfig
954
+ .queryConfigs as Array<any>) {
955
+ const metricName: string =
956
+ queryConfig.metricQueryData.filterData.metricName;
957
+ expect(getCephMetricByMetricName(metricName)).toBeDefined();
958
+ }
959
+
960
+ const aliases: Set<string> = getReferencableAliases(monitor);
961
+ for (const instance of getCriteriaInstances(step)) {
962
+ for (const filter of instance.data?.filters || []) {
963
+ expect(aliases).toContain(
964
+ (filter as any).metricMonitorOptions.metricAlias,
965
+ );
966
+ }
967
+ }
968
+ },
969
+ );
970
+
971
+ test.each(
972
+ ALL_TEMPLATES.map((t: CephAlertTemplate) => {
973
+ return [t.id, t];
974
+ }),
975
+ )(
976
+ "%s groups by raw datapoint labels only (ceph_daemon / pool_id)",
977
+ (_id: unknown, template: unknown) => {
978
+ const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
979
+ buildArgs(),
980
+ );
981
+ const monitor: MonitorStepCephMonitor = getCephMonitor(step);
982
+
983
+ for (const queryConfig of monitor.metricViewConfig
984
+ .queryConfigs as Array<any>) {
985
+ const groupBys: Array<string> =
986
+ queryConfig.metricQueryData.groupByAttributeKeys || [];
987
+ for (const key of groupBys) {
988
+ /*
989
+ * ceph-mgr identity labels are datapoint labels — never
990
+ * `resource.`-prefixed in ClickHouse.
991
+ */
992
+ expect(["ceph_daemon", "pool_id"]).toContain(key);
993
+ }
994
+ }
995
+ },
996
+ );
997
+
998
+ test.each(
999
+ ALL_TEMPLATES.map((t: CephAlertTemplate) => {
1000
+ return [t.id, t];
1001
+ }),
1002
+ )(
1003
+ "%s has disjoint fire/recover thresholds on the same alias",
1004
+ (_id: unknown, template: unknown) => {
1005
+ const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
1006
+ buildArgs(),
1007
+ );
1008
+ const instances: Array<MonitorCriteriaInstance> =
1009
+ getCriteriaInstances(step);
1010
+ const onlineFilters: Array<any> = (instances[instances.length - 1]!.data
1011
+ ?.filters || []) as Array<any>;
1012
+
1013
+ for (const offline of instances.slice(0, -1)) {
1014
+ for (const fireFilter of (offline.data?.filters || []) as Array<any>) {
1015
+ const recoverFilter: any = onlineFilters.find((f: any) => {
1016
+ return (
1017
+ f.metricMonitorOptions.metricAlias ===
1018
+ fireFilter.metricMonitorOptions.metricAlias
1019
+ );
1020
+ });
1021
+ expect(recoverFilter).toBeDefined();
1022
+ expect(
1023
+ isDisjointComplement(
1024
+ {
1025
+ filterType: fireFilter.filterType,
1026
+ value: fireFilter.value as number,
1027
+ },
1028
+ {
1029
+ filterType: recoverFilter.filterType,
1030
+ value: recoverFilter.value as number,
1031
+ },
1032
+ ),
1033
+ ).toBe(true);
1034
+ }
1035
+ }
1036
+ },
1037
+ );
1038
+
1039
+ test.each(
1040
+ ALL_TEMPLATES.map((t: CephAlertTemplate) => {
1041
+ return [t.id, t];
1042
+ }),
1043
+ )(
1044
+ "%s health-check recovery treats missing series as zero",
1045
+ (_id: unknown, template: unknown) => {
1046
+ /*
1047
+ * ceph_health_detail / ceph_daemon_health_metrics series exist
1048
+ * ONLY while the check is active, and the evaluator's default
1049
+ * NoDataPolicy is Ignore — so a "= 0" recover filter without
1050
+ * TreatAsZero would never match after the series disappears and
1051
+ * the monitor would never return to Healthy. This invariant is
1052
+ * enumerated so any future health-check template inherits it.
1053
+ */
1054
+ const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
1055
+ buildArgs(),
1056
+ );
1057
+ const monitor: MonitorStepCephMonitor = getCephMonitor(step);
1058
+
1059
+ const usesHealthCheckSeries: boolean = (
1060
+ monitor.metricViewConfig.queryConfigs as Array<any>
1061
+ ).some((queryConfig: any) => {
1062
+ return isHealthCheckMetric(
1063
+ queryConfig.metricQueryData.filterData.metricName,
1064
+ );
1065
+ });
1066
+
1067
+ if (!usesHealthCheckSeries) {
1068
+ return;
1069
+ }
1070
+
1071
+ const instances: Array<MonitorCriteriaInstance> =
1072
+ getCriteriaInstances(step);
1073
+ const onlineFilters: Array<any> = (instances[instances.length - 1]!.data
1074
+ ?.filters || []) as Array<any>;
1075
+
1076
+ expect(onlineFilters.length).toBeGreaterThan(0);
1077
+ for (const filter of onlineFilters) {
1078
+ expect(filter.metricMonitorOptions.onNoDataPolicy).toBe(
1079
+ NoDataPolicy.TreatAsZero,
1080
+ );
1081
+ }
1082
+ },
1083
+ );
1084
+
1085
+ test.each(
1086
+ ALL_TEMPLATES.map((t: CephAlertTemplate) => {
1087
+ return [t.id, t];
1088
+ }),
1089
+ )(
1090
+ "%s ratio/formula queries use Sum on both sides (same-receiver contract)",
1091
+ (_id: unknown, template: unknown) => {
1092
+ const step: MonitorStep = (template as CephAlertTemplate).getMonitorStep(
1093
+ buildArgs(),
1094
+ );
1095
+ const monitor: MonitorStepCephMonitor = getCephMonitor(step);
1096
+ const queryConfigs: Array<any> = monitor.metricViewConfig
1097
+ .queryConfigs as Array<any>;
1098
+ const formulaConfigs: Array<any> = (monitor.metricViewConfig
1099
+ .formulaConfigs || []) as Array<any>;
1100
+
1101
+ if (formulaConfigs.length === 0) {
1102
+ return;
1103
+ }
1104
+
1105
+ /*
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.
1111
+ */
1112
+ expect(formulaConfigs).toHaveLength(1);
1113
+ for (const queryConfig of queryConfigs) {
1114
+ expect(queryConfig.metricQueryData.filterData.aggegationType).toBe(
1115
+ MetricsAggregationType.Sum,
1116
+ );
1117
+ }
1118
+
1119
+ // All sides must share the same groupBy so the join lines up.
1120
+ const firstGroupBy: Array<string> =
1121
+ queryConfigs[0].metricQueryData.groupByAttributeKeys || [];
1122
+ for (const queryConfig of queryConfigs) {
1123
+ expect(queryConfig.metricQueryData.groupByAttributeKeys || []).toEqual(
1124
+ firstGroupBy,
1125
+ );
1126
+ }
1127
+ },
1128
+ );
1129
+ });
1130
+
1131
+ describe("CephAlertTemplates - spec table expectations", () => {
1132
+ test.each(
1133
+ EXPECTED_TEMPLATES.map((t: CephTemplateExpectation) => {
1134
+ return [t.id, t];
1135
+ }),
1136
+ )(
1137
+ "%s matches the spec'd metric/aggregation/threshold contract",
1138
+ (_id: unknown, expected: unknown) => {
1139
+ const tc: CephTemplateExpectation = expected as CephTemplateExpectation;
1140
+ const template: CephAlertTemplate | undefined = getCephAlertTemplateById(
1141
+ tc.id,
1142
+ );
1143
+ expect(template).toBeDefined();
1144
+
1145
+ expect(template!.category).toBe(tc.category);
1146
+ expect(template!.severity).toBe(tc.severity);
1147
+
1148
+ const step: MonitorStep = template!.getMonitorStep(buildArgs());
1149
+ const monitor: MonitorStepCephMonitor = getCephMonitor(step);
1150
+
1151
+ expect(monitor.rollingTime).toBe(tc.rollingTime);
1152
+
1153
+ const queryConfigs: Array<any> = monitor.metricViewConfig
1154
+ .queryConfigs as Array<any>;
1155
+ expect(queryConfigs).toHaveLength(tc.queries.length);
1156
+
1157
+ for (let i: number = 0; i < tc.queries.length; i++) {
1158
+ const expectedQuery: CephQueryExpectation = tc.queries[i]!;
1159
+ expect(queryConfigs[i].metricAliasData.metricVariable).toBe(
1160
+ expectedQuery.alias,
1161
+ );
1162
+ const filterData: any = queryConfigs[i].metricQueryData.filterData;
1163
+ expect(filterData.metricName).toBe(expectedQuery.metricName);
1164
+ expect(filterData.aggegationType).toBe(tc.aggregation);
1165
+ expect(filterData.attributes).toEqual(expectedQuery.attributes);
1166
+
1167
+ const groupBys: Array<string> =
1168
+ queryConfigs[i].metricQueryData.groupByAttributeKeys || [];
1169
+ expect(groupBys).toEqual(tc.groupBy ? [tc.groupBy] : []);
1170
+ }
1171
+
1172
+ const formulaConfigs: Array<any> = (monitor.metricViewConfig
1173
+ .formulaConfigs || []) as Array<any>;
1174
+ if (tc.formula) {
1175
+ expect(formulaConfigs).toHaveLength(1);
1176
+ expect(formulaConfigs[0].metricFormulaData.metricFormula).toBe(
1177
+ tc.formula,
1178
+ );
1179
+ } else {
1180
+ // Multi-query health-check templates must NOT use a formula.
1181
+ expect(formulaConfigs).toHaveLength(0);
1182
+ }
1183
+
1184
+ const instances: Array<MonitorCriteriaInstance> =
1185
+ getCriteriaInstances(step);
1186
+ // Unhealthy tiers in spec order (worst first), then the recover.
1187
+ expect(instances).toHaveLength(tc.fireCriteria.length + 1);
1188
+
1189
+ for (let i: number = 0; i < tc.fireCriteria.length; i++) {
1190
+ const expectedFilters: Array<ThresholdExpectation> =
1191
+ tc.fireCriteria[i]!;
1192
+ const instance: MonitorCriteriaInstance = instances[i]!;
1193
+ // Multi-filter unhealthy instances are OR'd.
1194
+ expect(instance.data?.filterCondition).toBe(FilterCondition.Any);
1195
+ const filters: Array<any> = instance.data?.filters as Array<any>;
1196
+ expect(filters).toHaveLength(expectedFilters.length);
1197
+ for (let j: number = 0; j < expectedFilters.length; j++) {
1198
+ expect(filters[j].metricMonitorOptions.metricAlias).toBe(
1199
+ expectedFilters[j]!.alias,
1200
+ );
1201
+ expect(filters[j].filterType).toBe(expectedFilters[j]!.filterType);
1202
+ expect(filters[j].value).toBe(expectedFilters[j]!.value);
1203
+ }
1204
+ }
1205
+
1206
+ const onlineInstance: MonitorCriteriaInstance =
1207
+ instances[instances.length - 1]!;
1208
+ expect(onlineInstance.data?.filterCondition).toBe(tc.recover.condition);
1209
+ const onlineFilters: Array<any> = onlineInstance.data
1210
+ ?.filters as Array<any>;
1211
+ expect(onlineFilters).toHaveLength(tc.recover.filters.length);
1212
+ for (let j: number = 0; j < tc.recover.filters.length; j++) {
1213
+ const expectedFilter: ThresholdExpectation = tc.recover.filters[j]!;
1214
+ expect(onlineFilters[j].metricMonitorOptions.metricAlias).toBe(
1215
+ expectedFilter.alias,
1216
+ );
1217
+ expect(onlineFilters[j].filterType).toBe(expectedFilter.filterType);
1218
+ expect(onlineFilters[j].value).toBe(expectedFilter.value);
1219
+ if (tc.recover.treatNoDataAsZero) {
1220
+ expect(onlineFilters[j].metricMonitorOptions.onNoDataPolicy).toBe(
1221
+ NoDataPolicy.TreatAsZero,
1222
+ );
1223
+ } else {
1224
+ expect(
1225
+ onlineFilters[j].metricMonitorOptions.onNoDataPolicy,
1226
+ ).toBeUndefined();
1227
+ }
1228
+ }
1229
+ },
1230
+ );
1231
+ });