@oneuptime/common 11.0.2 → 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 (344) hide show
  1. package/Models/DatabaseModels/Alert.ts +166 -0
  2. package/Models/DatabaseModels/AlertLabelRule.ts +38 -0
  3. package/Models/DatabaseModels/AlertOwnerRule.ts +38 -0
  4. package/Models/DatabaseModels/DockerSwarmCluster.ts +989 -0
  5. package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +514 -0
  6. package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +596 -0
  7. package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +487 -0
  8. package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +486 -0
  9. package/Models/DatabaseModels/DockerSwarmResource.ts +750 -0
  10. package/Models/DatabaseModels/Incident.ts +166 -0
  11. package/Models/DatabaseModels/IncidentLabelRule.ts +38 -0
  12. package/Models/DatabaseModels/IncidentOwnerRule.ts +38 -0
  13. package/Models/DatabaseModels/IncidentTemplate.ts +56 -0
  14. package/Models/DatabaseModels/Index.ts +24 -0
  15. package/Models/DatabaseModels/PodmanHost.ts +859 -0
  16. package/Models/DatabaseModels/PodmanHostLabelRule.ts +514 -0
  17. package/Models/DatabaseModels/PodmanHostOwnerRule.ts +596 -0
  18. package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +487 -0
  19. package/Models/DatabaseModels/PodmanHostOwnerUser.ts +486 -0
  20. package/Models/DatabaseModels/PodmanResource.ts +498 -0
  21. package/Models/DatabaseModels/ScheduledMaintenance.ts +110 -0
  22. package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +38 -0
  23. package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +38 -0
  24. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +56 -0
  25. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  26. package/Server/API/DashboardAPI.ts +89 -0
  27. package/Server/API/DockerSwarmResourceAPI.ts +137 -0
  28. package/Server/API/TelemetryAPI.ts +8 -1
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1781587937032-MigrationName.ts +3199 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  31. package/Server/Services/AlertLabelRuleEngineService.ts +29 -0
  32. package/Server/Services/AlertOwnerRuleEngineService.ts +67 -0
  33. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +214 -0
  34. package/Server/Services/DockerSwarmClusterLabelRuleService.ts +14 -0
  35. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +232 -0
  36. package/Server/Services/DockerSwarmClusterOwnerRuleService.ts +14 -0
  37. package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +10 -0
  38. package/Server/Services/DockerSwarmClusterOwnerUserService.ts +10 -0
  39. package/Server/Services/DockerSwarmClusterService.ts +404 -0
  40. package/Server/Services/DockerSwarmResourceService.ts +381 -0
  41. package/Server/Services/ExceptionAggregationService.ts +1 -0
  42. package/Server/Services/IncidentLabelRuleEngineService.ts +27 -0
  43. package/Server/Services/IncidentOwnerRuleEngineService.ts +67 -0
  44. package/Server/Services/IncidentService.ts +11 -0
  45. package/Server/Services/Index.ts +14 -0
  46. package/Server/Services/LogAggregationService.ts +1 -0
  47. package/Server/Services/MetricAggregationService.ts +1 -0
  48. package/Server/Services/OpenTelemetryIngestService.ts +37 -0
  49. package/Server/Services/PodmanHostLabelRuleEngineService.ts +198 -0
  50. package/Server/Services/PodmanHostLabelRuleService.ts +14 -0
  51. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +216 -0
  52. package/Server/Services/PodmanHostOwnerRuleService.ts +14 -0
  53. package/Server/Services/PodmanHostOwnerTeamService.ts +10 -0
  54. package/Server/Services/PodmanHostOwnerUserService.ts +10 -0
  55. package/Server/Services/PodmanHostService.ts +368 -0
  56. package/Server/Services/PodmanResourceService.ts +310 -0
  57. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +29 -0
  58. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +67 -0
  59. package/Server/Services/TelemetryUsageBillingService.ts +18 -0
  60. package/Server/Services/TraceAggregationService.ts +1 -0
  61. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +13 -0
  62. package/Server/Utils/Monitor/MonitorAlert.ts +10 -0
  63. package/Server/Utils/Monitor/MonitorClusterContext.ts +35 -6
  64. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +306 -0
  65. package/Server/Utils/Monitor/MonitorIncident.ts +45 -0
  66. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +17 -0
  67. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +3 -0
  68. package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
  69. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +49 -0
  70. package/Server/Utils/Telemetry/Telemetry.ts +10 -0
  71. package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -0
  72. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +1 -0
  73. package/Tests/Types/DockerSwarm/DockerSwarmInventoryExtractor.test.ts +667 -0
  74. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +528 -0
  75. package/Types/Dashboard/DashboardComponentType.ts +7 -0
  76. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
  77. package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.ts +17 -0
  78. package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.ts +17 -0
  79. package/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.ts +16 -0
  80. package/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.ts +15 -0
  81. package/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.ts +16 -0
  82. package/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.ts +15 -0
  83. package/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.ts +15 -0
  84. package/Types/Dashboard/DashboardTemplates.ts +194 -0
  85. package/Types/DockerSwarm/DockerSwarmInventoryExtractor.ts +452 -0
  86. package/Types/Icon/IconProp.ts +1 -0
  87. package/Types/Monitor/DockerSwarmAlertTemplates.ts +461 -0
  88. package/Types/Monitor/DockerSwarmMetricCatalog.ts +139 -0
  89. package/Types/Monitor/HostAlertTemplates.ts +455 -0
  90. package/Types/Monitor/HostMetricCatalog.ts +177 -0
  91. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +21 -0
  92. package/Types/Monitor/MonitorStep.ts +99 -0
  93. package/Types/Monitor/MonitorStepDockerSwarmMonitor.ts +74 -0
  94. package/Types/Monitor/MonitorStepHostMonitor.ts +30 -0
  95. package/Types/Monitor/MonitorStepPodmanMonitor.ts +38 -0
  96. package/Types/Monitor/MonitorType.ts +42 -0
  97. package/Types/Monitor/PodmanAlertTemplates.ts +507 -0
  98. package/Types/Monitor/PodmanMetricCatalog.ts +226 -0
  99. package/Types/Permission.ts +465 -4
  100. package/Types/Podman/PodmanInventoryExtractor.ts +343 -0
  101. package/Types/Telemetry/EntityType.ts +12 -0
  102. package/Types/Telemetry/ServiceType.ts +2 -0
  103. package/UI/Components/Icon/Icon.tsx +57 -0
  104. package/UI/Components/LogsViewer/LogsViewer.tsx +44 -1
  105. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +28 -0
  106. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +6 -0
  107. package/UI/Utils/TelemetryService.ts +1 -0
  108. package/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.ts +70 -0
  109. package/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.ts +61 -0
  110. package/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.ts +71 -0
  111. package/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.ts +100 -0
  112. package/Utils/Dashboard/Components/DashboardPodmanHostListComponent.ts +88 -0
  113. package/Utils/Dashboard/Components/DashboardPodmanImageListComponent.ts +97 -0
  114. package/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.ts +87 -0
  115. package/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.ts +87 -0
  116. package/Utils/Dashboard/Components/Index.ts +51 -0
  117. package/Utils/Telemetry/EntityKey.ts +18 -0
  118. package/build/dist/Models/DatabaseModels/Alert.js +162 -0
  119. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  120. package/build/dist/Models/DatabaseModels/AlertLabelRule.js +39 -0
  121. package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
  122. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +39 -0
  123. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
  124. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +1018 -0
  125. package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -0
  126. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +522 -0
  127. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -0
  128. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +603 -0
  129. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -0
  130. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +503 -0
  131. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -0
  132. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +502 -0
  133. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -0
  134. package/build/dist/Models/DatabaseModels/DockerSwarmResource.js +787 -0
  135. package/build/dist/Models/DatabaseModels/DockerSwarmResource.js.map +1 -0
  136. package/build/dist/Models/DatabaseModels/Incident.js +162 -0
  137. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  138. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +39 -0
  139. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
  140. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +39 -0
  141. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
  142. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +54 -0
  143. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  144. package/build/dist/Models/DatabaseModels/Index.js +24 -0
  145. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  146. package/build/dist/Models/DatabaseModels/PodmanHost.js +885 -0
  147. package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -0
  148. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +522 -0
  149. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -0
  150. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +603 -0
  151. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -0
  152. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +503 -0
  153. package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -0
  154. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +502 -0
  155. package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -0
  156. package/build/dist/Models/DatabaseModels/PodmanResource.js +526 -0
  157. package/build/dist/Models/DatabaseModels/PodmanResource.js.map +1 -0
  158. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +108 -0
  159. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  160. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +39 -0
  161. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
  162. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +39 -0
  163. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
  164. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +54 -0
  165. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  166. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  167. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  168. package/build/dist/Server/API/DashboardAPI.js +89 -0
  169. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  170. package/build/dist/Server/API/DockerSwarmResourceAPI.js +100 -0
  171. package/build/dist/Server/API/DockerSwarmResourceAPI.js.map +1 -0
  172. package/build/dist/Server/API/TelemetryAPI.js +8 -1
  173. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  174. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781587937032-MigrationName.js +1100 -0
  175. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781587937032-MigrationName.js.map +1 -0
  176. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  177. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  178. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +30 -4
  179. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  180. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +62 -5
  181. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  182. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +168 -0
  183. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -0
  184. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js +13 -0
  185. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js.map +1 -0
  186. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +188 -0
  187. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -0
  188. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js +13 -0
  189. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js.map +1 -0
  190. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +9 -0
  191. package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -0
  192. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +9 -0
  193. package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -0
  194. package/build/dist/Server/Services/DockerSwarmClusterService.js +353 -0
  195. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -0
  196. package/build/dist/Server/Services/DockerSwarmResourceService.js +258 -0
  197. package/build/dist/Server/Services/DockerSwarmResourceService.js.map +1 -0
  198. package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
  199. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  200. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +28 -4
  201. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  202. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +62 -5
  203. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  204. package/build/dist/Server/Services/IncidentService.js +8 -0
  205. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  206. package/build/dist/Server/Services/Index.js +14 -0
  207. package/build/dist/Server/Services/Index.js.map +1 -1
  208. package/build/dist/Server/Services/LogAggregationService.js +1 -0
  209. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  210. package/build/dist/Server/Services/MetricAggregationService.js +1 -0
  211. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  212. package/build/dist/Server/Services/OpenTelemetryIngestService.js +43 -13
  213. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  214. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +166 -0
  215. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -0
  216. package/build/dist/Server/Services/PodmanHostLabelRuleService.js +13 -0
  217. package/build/dist/Server/Services/PodmanHostLabelRuleService.js.map +1 -0
  218. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +186 -0
  219. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -0
  220. package/build/dist/Server/Services/PodmanHostOwnerRuleService.js +13 -0
  221. package/build/dist/Server/Services/PodmanHostOwnerRuleService.js.map +1 -0
  222. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +9 -0
  223. package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -0
  224. package/build/dist/Server/Services/PodmanHostOwnerUserService.js +9 -0
  225. package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -0
  226. package/build/dist/Server/Services/PodmanHostService.js +319 -0
  227. package/build/dist/Server/Services/PodmanHostService.js.map +1 -0
  228. package/build/dist/Server/Services/PodmanResourceService.js +196 -0
  229. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -0
  230. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +30 -4
  231. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  232. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +62 -5
  233. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  234. package/build/dist/Server/Services/TelemetryUsageBillingService.js +13 -0
  235. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  236. package/build/dist/Server/Services/TraceAggregationService.js +1 -0
  237. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  238. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +13 -0
  239. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  240. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +8 -0
  241. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  242. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +35 -7
  243. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +1 -1
  244. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +194 -0
  245. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  246. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +35 -1
  247. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  248. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +9 -0
  249. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  250. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +3 -0
  251. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  252. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +16 -0
  253. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  254. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +30 -0
  255. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  256. package/build/dist/Server/Utils/Telemetry/Telemetry.js +6 -0
  257. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  258. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +18 -0
  259. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  260. package/build/dist/Types/Dashboard/DashboardComponentType.js +7 -0
  261. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  262. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
  263. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  264. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.js +2 -0
  265. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.js.map +1 -0
  266. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js +2 -0
  267. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js.map +1 -0
  268. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js +2 -0
  269. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js.map +1 -0
  270. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js +2 -0
  271. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js.map +1 -0
  272. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js +2 -0
  273. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js.map +1 -0
  274. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js +2 -0
  275. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js.map +1 -0
  276. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.js +2 -0
  277. package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.js.map +1 -0
  278. package/build/dist/Types/Dashboard/DashboardTemplates.js +168 -0
  279. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  280. package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js +359 -0
  281. package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js.map +1 -0
  282. package/build/dist/Types/Icon/IconProp.js +1 -0
  283. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  284. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +358 -0
  285. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -0
  286. package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js +103 -0
  287. package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js.map +1 -0
  288. package/build/dist/Types/Monitor/HostAlertTemplates.js +365 -0
  289. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -0
  290. package/build/dist/Types/Monitor/HostMetricCatalog.js +138 -0
  291. package/build/dist/Types/Monitor/HostMetricCatalog.js.map +1 -0
  292. package/build/dist/Types/Monitor/MonitorStep.js +69 -0
  293. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  294. package/build/dist/Types/Monitor/MonitorStepDockerSwarmMonitor.js +21 -0
  295. package/build/dist/Types/Monitor/MonitorStepDockerSwarmMonitor.js.map +1 -0
  296. package/build/dist/Types/Monitor/MonitorStepHostMonitor.js +20 -0
  297. package/build/dist/Types/Monitor/MonitorStepHostMonitor.js.map +1 -0
  298. package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.js +21 -0
  299. package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.js.map +1 -0
  300. package/build/dist/Types/Monitor/MonitorType.js +39 -0
  301. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  302. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +410 -0
  303. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -0
  304. package/build/dist/Types/Monitor/PodmanMetricCatalog.js +192 -0
  305. package/build/dist/Types/Monitor/PodmanMetricCatalog.js.map +1 -0
  306. package/build/dist/Types/Permission.js +420 -4
  307. package/build/dist/Types/Permission.js.map +1 -1
  308. package/build/dist/Types/Podman/PodmanInventoryExtractor.js +293 -0
  309. package/build/dist/Types/Podman/PodmanInventoryExtractor.js.map +1 -0
  310. package/build/dist/Types/Telemetry/EntityType.js +12 -0
  311. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  312. package/build/dist/Types/Telemetry/ServiceType.js +2 -0
  313. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  314. package/build/dist/UI/Components/Icon/Icon.js +16 -0
  315. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  316. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +30 -2
  317. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  318. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +22 -0
  319. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  320. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +6 -0
  321. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  322. package/build/dist/UI/Utils/TelemetryService.js +1 -0
  323. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  324. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.js +55 -0
  325. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.js.map +1 -0
  326. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js +46 -0
  327. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js.map +1 -0
  328. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js +55 -0
  329. package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js.map +1 -0
  330. package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js +77 -0
  331. package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js.map +1 -0
  332. package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js +71 -0
  333. package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js.map +1 -0
  334. package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js +77 -0
  335. package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js.map +1 -0
  336. package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js +68 -0
  337. package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js.map +1 -0
  338. package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.js +68 -0
  339. package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.js.map +1 -0
  340. package/build/dist/Utils/Dashboard/Components/Index.js +28 -0
  341. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  342. package/build/dist/Utils/Telemetry/EntityKey.js +14 -0
  343. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  344. package/package.json +1 -1
@@ -0,0 +1,353 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import DatabaseService from "./DatabaseService";
11
+ import DockerSwarmClusterLabelRuleEngineService from "./DockerSwarmClusterLabelRuleEngineService";
12
+ import DockerSwarmClusterOwnerRuleEngineService from "./DockerSwarmClusterOwnerRuleEngineService";
13
+ import Model from "../../Models/DatabaseModels/DockerSwarmCluster";
14
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
15
+ import ObjectID from "../../Types/ObjectID";
16
+ import QueryHelper from "../Types/Database/QueryHelper";
17
+ import OneUptimeDate from "../../Types/Date";
18
+ import LIMIT_MAX from "../../Types/Database/LimitMax";
19
+ import GlobalCache from "../Infrastructure/GlobalCache";
20
+ import logger from "../Utils/Logger";
21
+ import crypto from "crypto";
22
+ const LAST_SEEN_CACHE_NAMESPACE = "docker-swarm-cluster-last-seen";
23
+ const LAST_SEEN_THROTTLE_SECONDS = 60;
24
+ const LABELS_APPLIED_CACHE_NAMESPACE = "docker-swarm-cluster-labels-applied";
25
+ const LABELS_APPLIED_CACHE_TTL_SECONDS = 60;
26
+ export class Service extends DatabaseService {
27
+ constructor() {
28
+ super(Model);
29
+ }
30
+ async onCreateSuccess(_onCreate, createdItem) {
31
+ /*
32
+ * Rules run once, on creation only — exact parity with
33
+ * KubernetesClusterService. Label engine first: it syncs the
34
+ * in-memory labels so the owner engine can match rule-added labels.
35
+ */
36
+ if (createdItem.projectId && createdItem.id) {
37
+ Promise.resolve()
38
+ .then(async () => {
39
+ await DockerSwarmClusterLabelRuleEngineService.applyRulesToDockerSwarmCluster(createdItem);
40
+ })
41
+ .then(async () => {
42
+ await DockerSwarmClusterOwnerRuleEngineService.applyRulesToDockerSwarmCluster(createdItem);
43
+ })
44
+ .catch((error) => {
45
+ var _a, _b;
46
+ logger.error(`Error applying dockerSwarm cluster rules in DockerSwarmClusterService.onCreateSuccess: ${error}`, {
47
+ projectId: (_a = createdItem.projectId) === null || _a === void 0 ? void 0 : _a.toString(),
48
+ dockerSwarmClusterId: (_b = createdItem.id) === null || _b === void 0 ? void 0 : _b.toString(),
49
+ });
50
+ });
51
+ }
52
+ return createdItem;
53
+ }
54
+ async findOrCreateByName(data) {
55
+ /*
56
+ * A DockerSwarm cluster is keyed by the `docker.swarm.cluster.name` OTel resource
57
+ * attribute, which the user configures on the agent. Look it up
58
+ * case-insensitively: the unique guard (checkUniqueColumnBy ->
59
+ * findWithSameText) compares case-insensitively, so a case-sensitive
60
+ * lookup would miss an existing row that differs only by case, then
61
+ * fail to create it — wedging ingest for that cluster. Unlike
62
+ * DockerHost.hostIdentifier (host.name casing is unstable on Windows)
63
+ * the configured cluster name's casing is stable, so we preserve the
64
+ * user's casing on create instead of canonicalizing to lowercase.
65
+ */
66
+ const name = data.name.trim();
67
+ const existingCluster = await this.findOneBy({
68
+ query: {
69
+ projectId: data.projectId,
70
+ name: QueryHelper.findWithSameText(name),
71
+ },
72
+ select: {
73
+ _id: true,
74
+ projectId: true,
75
+ name: true,
76
+ },
77
+ props: {
78
+ isRoot: true,
79
+ },
80
+ });
81
+ if (existingCluster) {
82
+ return existingCluster;
83
+ }
84
+ try {
85
+ // Create new cluster
86
+ const newCluster = new Model();
87
+ newCluster.projectId = data.projectId;
88
+ newCluster.name = name;
89
+ newCluster.otelCollectorStatus = "connected";
90
+ newCluster.lastSeenAt = OneUptimeDate.getCurrentDate();
91
+ const createdCluster = await this.create({
92
+ data: newCluster,
93
+ props: {
94
+ isRoot: true,
95
+ },
96
+ });
97
+ return createdCluster;
98
+ }
99
+ catch (_a) {
100
+ /*
101
+ * Either two ingest workers raced to create the same cluster, or a
102
+ * cluster with this name in a different case already existed and the
103
+ * unique guard rejected the insert. Re-resolve case-insensitively so
104
+ * the caller still gets the existing row instead of throwing.
105
+ */
106
+ const reFetchedCluster = await this.findOneBy({
107
+ query: {
108
+ projectId: data.projectId,
109
+ name: QueryHelper.findWithSameText(name),
110
+ },
111
+ select: {
112
+ _id: true,
113
+ projectId: true,
114
+ name: true,
115
+ },
116
+ props: {
117
+ isRoot: true,
118
+ },
119
+ });
120
+ if (reFetchedCluster) {
121
+ return reFetchedCluster;
122
+ }
123
+ throw new Error("Failed to create or find DockerSwarm cluster: " + name);
124
+ }
125
+ }
126
+ /*
127
+ * Refresh lastSeenAt / connection status and (optionally) the
128
+ * snapshot columns the list page renders. Count columns ride this
129
+ * extras path with COALESCE-per-column semantics: a key that is
130
+ * undefined is simply not written, so a partial batch (one that
131
+ * lacked the matching *_info series) never zeroes a count. The
132
+ * 60-second extras fingerprint cache is the write throttle — the
133
+ * steady state (identical snapshot every scrape) costs one Redis
134
+ * read per batch and at most one Postgres UPDATE per minute.
135
+ *
136
+ * Two callers share this throttle with DISJOINT extras shapes: the
137
+ * metrics snapshot flush (pveVersion + counts, every batch) and the
138
+ * fenced autoDiscoverDockerSwarmCluster maintenance path (agentVersion
139
+ * only — and usually an all-null fingerprint, since the shipped
140
+ * agent config does not stamp oneuptime.agent.version). The single
141
+ * fingerprint covers the whole extras object, so each alternation
142
+ * between the two shapes busts the throttle: at most one extra
143
+ * Postgres UPDATE per maintenance-fence window (~5 min), which is
144
+ * accepted. Do NOT key the cache per-caller — that would let two
145
+ * callers each refresh lastSeenAt under their own throttle and is
146
+ * not worth the complexity for one UPDATE per 5 minutes.
147
+ */
148
+ async updateLastSeen(clusterId, extra) {
149
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
150
+ const cacheKey = clusterId.toString();
151
+ const extrasFingerprint = crypto
152
+ .createHash("sha1")
153
+ .update(JSON.stringify({
154
+ dockerVersion: (_a = extra === null || extra === void 0 ? void 0 : extra.dockerVersion) !== null && _a !== void 0 ? _a : null,
155
+ swarmId: (_b = extra === null || extra === void 0 ? void 0 : extra.swarmId) !== null && _b !== void 0 ? _b : null,
156
+ agentVersion: (_c = extra === null || extra === void 0 ? void 0 : extra.agentVersion) !== null && _c !== void 0 ? _c : null,
157
+ nodeCount: (_d = extra === null || extra === void 0 ? void 0 : extra.nodeCount) !== null && _d !== void 0 ? _d : null,
158
+ readyNodeCount: (_e = extra === null || extra === void 0 ? void 0 : extra.readyNodeCount) !== null && _e !== void 0 ? _e : null,
159
+ managerNodeCount: (_f = extra === null || extra === void 0 ? void 0 : extra.managerNodeCount) !== null && _f !== void 0 ? _f : null,
160
+ serviceCount: (_g = extra === null || extra === void 0 ? void 0 : extra.serviceCount) !== null && _g !== void 0 ? _g : null,
161
+ taskCount: (_h = extra === null || extra === void 0 ? void 0 : extra.taskCount) !== null && _h !== void 0 ? _h : null,
162
+ runningTaskCount: (_j = extra === null || extra === void 0 ? void 0 : extra.runningTaskCount) !== null && _j !== void 0 ? _j : null,
163
+ stackCount: (_k = extra === null || extra === void 0 ? void 0 : extra.stackCount) !== null && _k !== void 0 ? _k : null,
164
+ networkCount: (_l = extra === null || extra === void 0 ? void 0 : extra.networkCount) !== null && _l !== void 0 ? _l : null,
165
+ }))
166
+ .digest("hex");
167
+ const cached = await GlobalCache.getString(LAST_SEEN_CACHE_NAMESPACE, cacheKey);
168
+ if (cached === extrasFingerprint) {
169
+ return; // same data was written recently
170
+ }
171
+ await GlobalCache.setString(LAST_SEEN_CACHE_NAMESPACE, cacheKey, extrasFingerprint, { expiresInSeconds: LAST_SEEN_THROTTLE_SECONDS });
172
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
173
+ const data = {
174
+ lastSeenAt: OneUptimeDate.getCurrentDate(),
175
+ otelCollectorStatus: "connected",
176
+ };
177
+ if (extra === null || extra === void 0 ? void 0 : extra.dockerVersion) {
178
+ data.dockerVersion = extra.dockerVersion;
179
+ }
180
+ if (extra === null || extra === void 0 ? void 0 : extra.swarmId) {
181
+ data.swarmId = extra.swarmId;
182
+ }
183
+ if (extra === null || extra === void 0 ? void 0 : extra.agentVersion) {
184
+ data.agentVersion = extra.agentVersion;
185
+ }
186
+ // Counts: 0 is a legitimate value — gate on undefined, not falsiness.
187
+ if ((extra === null || extra === void 0 ? void 0 : extra.nodeCount) !== undefined) {
188
+ data.nodeCount = extra.nodeCount;
189
+ }
190
+ if ((extra === null || extra === void 0 ? void 0 : extra.readyNodeCount) !== undefined) {
191
+ data.readyNodeCount = extra.readyNodeCount;
192
+ }
193
+ if ((extra === null || extra === void 0 ? void 0 : extra.managerNodeCount) !== undefined) {
194
+ data.managerNodeCount = extra.managerNodeCount;
195
+ }
196
+ if ((extra === null || extra === void 0 ? void 0 : extra.serviceCount) !== undefined) {
197
+ data.serviceCount = extra.serviceCount;
198
+ }
199
+ if ((extra === null || extra === void 0 ? void 0 : extra.taskCount) !== undefined) {
200
+ data.taskCount = extra.taskCount;
201
+ }
202
+ if ((extra === null || extra === void 0 ? void 0 : extra.runningTaskCount) !== undefined) {
203
+ data.runningTaskCount = extra.runningTaskCount;
204
+ }
205
+ if ((extra === null || extra === void 0 ? void 0 : extra.stackCount) !== undefined) {
206
+ data.stackCount = extra.stackCount;
207
+ }
208
+ if ((extra === null || extra === void 0 ? void 0 : extra.networkCount) !== undefined) {
209
+ data.networkCount = extra.networkCount;
210
+ }
211
+ await this.updateOneById({
212
+ id: clusterId,
213
+ data: data,
214
+ props: {
215
+ isRoot: true,
216
+ },
217
+ });
218
+ }
219
+ /**
220
+ * Additively attach labels to a DockerSwarm cluster. Existing labels are
221
+ * never removed — manual labels set via the UI survive ingest. The
222
+ * set of labelIds passed in is fingerprinted and cached for 60s so
223
+ * the common case (steady-state collector pushing the same label
224
+ * set every batch) costs one in-memory lookup, not a join-table
225
+ * scan.
226
+ */
227
+ async attachLabels(data) {
228
+ var _a;
229
+ if (!data.labelIds || data.labelIds.length === 0) {
230
+ return;
231
+ }
232
+ const cacheKey = data.dockerSwarmClusterId.toString();
233
+ const fingerprint = fingerprintLabelIds(data.labelIds);
234
+ const cached = await GlobalCache.getString(LABELS_APPLIED_CACHE_NAMESPACE, cacheKey);
235
+ if (cached === fingerprint) {
236
+ return;
237
+ }
238
+ try {
239
+ const dockerSwarmClusterIdStr = data.dockerSwarmClusterId.toString();
240
+ const existingLabels = await this.getRepository()
241
+ .createQueryBuilder()
242
+ .relation(Model, "labels")
243
+ .of(dockerSwarmClusterIdStr)
244
+ .loadMany();
245
+ const existingIds = new Set();
246
+ for (const lbl of existingLabels) {
247
+ const idStr = (_a = lbl._id) === null || _a === void 0 ? void 0 : _a.toString();
248
+ if (idStr) {
249
+ existingIds.add(idStr);
250
+ }
251
+ }
252
+ const toAddIds = [];
253
+ const seen = new Set();
254
+ for (const id of data.labelIds) {
255
+ const idStr = id.toString();
256
+ if (existingIds.has(idStr) || seen.has(idStr)) {
257
+ continue;
258
+ }
259
+ seen.add(idStr);
260
+ toAddIds.push(idStr);
261
+ }
262
+ if (toAddIds.length > 0) {
263
+ await this.getRepository()
264
+ .createQueryBuilder()
265
+ .relation(Model, "labels")
266
+ .of(dockerSwarmClusterIdStr)
267
+ .add(toAddIds);
268
+ }
269
+ await GlobalCache.setString(LABELS_APPLIED_CACHE_NAMESPACE, cacheKey, fingerprint, { expiresInSeconds: LABELS_APPLIED_CACHE_TTL_SECONDS });
270
+ }
271
+ catch (err) {
272
+ logger.warn(`DockerSwarmClusterService.attachLabels failed for dockerSwarm cluster ${data.dockerSwarmClusterId.toString()}: ${err instanceof Error ? err.message : String(err)}`);
273
+ }
274
+ }
275
+ async markDisconnectedClusters() {
276
+ /*
277
+ * Threshold must stay well above the 5-minute OTel ingest
278
+ * maintenance fence (MAINTENANCE_FENCE_TTL_SECONDS in
279
+ * OtelIngestBaseService) — lastSeenAt is legitimately up to
280
+ * ~5 minutes stale during continuous telemetry, so a threshold
281
+ * equal to the fence TTL flaps healthy resources. 15 minutes
282
+ * gives 3x headroom.
283
+ */
284
+ const fifteenMinutesAgo = OneUptimeDate.addRemoveMinutes(OneUptimeDate.getCurrentDate(), -15);
285
+ const connectedClusters = await this.findBy({
286
+ query: {
287
+ otelCollectorStatus: "connected",
288
+ lastSeenAt: QueryHelper.lessThan(fifteenMinutesAgo),
289
+ },
290
+ select: {
291
+ _id: true,
292
+ },
293
+ limit: LIMIT_MAX,
294
+ skip: 0,
295
+ props: {
296
+ isRoot: true,
297
+ },
298
+ });
299
+ for (const cluster of connectedClusters) {
300
+ if (cluster._id) {
301
+ await this.updateOneById({
302
+ id: new ObjectID(cluster._id.toString()),
303
+ data: {
304
+ otelCollectorStatus: "disconnected",
305
+ },
306
+ props: {
307
+ isRoot: true,
308
+ },
309
+ });
310
+ }
311
+ }
312
+ }
313
+ }
314
+ __decorate([
315
+ CaptureSpan(),
316
+ __metadata("design:type", Function),
317
+ __metadata("design:paramtypes", [Object, Model]),
318
+ __metadata("design:returntype", Promise)
319
+ ], Service.prototype, "onCreateSuccess", null);
320
+ __decorate([
321
+ CaptureSpan(),
322
+ __metadata("design:type", Function),
323
+ __metadata("design:paramtypes", [Object]),
324
+ __metadata("design:returntype", Promise)
325
+ ], Service.prototype, "findOrCreateByName", null);
326
+ __decorate([
327
+ CaptureSpan(),
328
+ __metadata("design:type", Function),
329
+ __metadata("design:paramtypes", [ObjectID, Object]),
330
+ __metadata("design:returntype", Promise)
331
+ ], Service.prototype, "updateLastSeen", null);
332
+ __decorate([
333
+ CaptureSpan(),
334
+ __metadata("design:type", Function),
335
+ __metadata("design:paramtypes", [Object]),
336
+ __metadata("design:returntype", Promise)
337
+ ], Service.prototype, "attachLabels", null);
338
+ __decorate([
339
+ CaptureSpan(),
340
+ __metadata("design:type", Function),
341
+ __metadata("design:paramtypes", []),
342
+ __metadata("design:returntype", Promise)
343
+ ], Service.prototype, "markDisconnectedClusters", null);
344
+ function fingerprintLabelIds(labelIds) {
345
+ const sorted = labelIds
346
+ .map((id) => {
347
+ return id.toString();
348
+ })
349
+ .sort();
350
+ return crypto.createHash("sha1").update(sorted.join(",")).digest("hex");
351
+ }
352
+ export default new Service();
353
+ //# sourceMappingURL=DockerSwarmClusterService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DockerSwarmClusterService.js","sourceRoot":"","sources":["../../../../Server/Services/DockerSwarmClusterService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,258 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import DatabaseService from "./DatabaseService";
11
+ import Model from "../../Models/DatabaseModels/DockerSwarmResource";
12
+ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
13
+ import OneUptimeDate from "../../Types/Date";
14
+ import logger from "../Utils/Logger";
15
+ const UPSERT_BATCH_SIZE = 500;
16
+ const STALE_DELETE_WARN_THRESHOLD = 100;
17
+ /*
18
+ * Column order used by bulkUpsert() and its generated parameter tuples.
19
+ * Keep this and the INSERT column list in perfect sync. The `attributes`
20
+ * column is jsonb (ColumnType.JSON) — its placeholder is cast ::jsonb.
21
+ */
22
+ const UPSERT_COLUMNS = [
23
+ "projectId",
24
+ "dockerSwarmClusterId",
25
+ "kind",
26
+ "externalId",
27
+ "name",
28
+ "state",
29
+ "role",
30
+ "serviceMode",
31
+ "desiredReplicas",
32
+ "runningReplicas",
33
+ "image",
34
+ "stackName",
35
+ "serviceName",
36
+ "nodeHostname",
37
+ "driver",
38
+ "isReady",
39
+ "attributes",
40
+ "lastSeenAt",
41
+ "version",
42
+ ];
43
+ export class Service extends DatabaseService {
44
+ constructor() {
45
+ super(Model);
46
+ }
47
+ /**
48
+ * Upsert a batch of parsed resources for a single (project, cluster)
49
+ * pair. Uses ON CONFLICT on the UNIQUE (projectId, dockerSwarmClusterId,
50
+ * kind, externalId) index with a dominance guard on lastSeenAt so
51
+ * out-of-order ingest never regresses a newer snapshot.
52
+ *
53
+ * Identity columns COALESCE against the existing row: a snapshot is
54
+ * usually complete, but a partial batch must not blank a field an
55
+ * earlier batch already filled.
56
+ */
57
+ async bulkUpsert(data) {
58
+ if (data.resources.length === 0) {
59
+ return;
60
+ }
61
+ for (let i = 0; i < data.resources.length; i += UPSERT_BATCH_SIZE) {
62
+ const chunk = data.resources.slice(i, i + UPSERT_BATCH_SIZE);
63
+ const valueFragments = [];
64
+ const params = [];
65
+ let paramIndex = 1;
66
+ for (const r of chunk) {
67
+ const placeholders = [];
68
+ for (const col of UPSERT_COLUMNS) {
69
+ if (col === "attributes") {
70
+ placeholders.push(`$${paramIndex++}::jsonb`);
71
+ }
72
+ else {
73
+ placeholders.push(`$${paramIndex++}`);
74
+ }
75
+ }
76
+ valueFragments.push(`(${placeholders.join(", ")})`);
77
+ params.push(data.projectId.toString(), data.dockerSwarmClusterId.toString(), r.kind, r.externalId, r.name, r.state, r.role, r.serviceMode, r.desiredReplicas !== null ? Math.trunc(r.desiredReplicas) : null, r.runningReplicas !== null ? Math.trunc(r.runningReplicas) : null, r.image, r.stackName, r.serviceName, r.nodeHostname, r.driver, r.isReady, r.attributes ? JSON.stringify(r.attributes) : null, r.lastSeenAt, 0);
78
+ }
79
+ const sql = `
80
+ INSERT INTO "DockerSwarmResource" (
81
+ "projectId", "dockerSwarmClusterId", "kind", "externalId",
82
+ "name", "state", "role", "serviceMode",
83
+ "desiredReplicas", "runningReplicas", "image", "stackName",
84
+ "serviceName", "nodeHostname", "driver", "isReady",
85
+ "attributes", "lastSeenAt", "version"
86
+ )
87
+ VALUES ${valueFragments.join(", ")}
88
+ ON CONFLICT ("projectId", "dockerSwarmClusterId", "kind", "externalId")
89
+ DO UPDATE SET
90
+ "name" = COALESCE(EXCLUDED."name", "DockerSwarmResource"."name"),
91
+ "state" = COALESCE(EXCLUDED."state", "DockerSwarmResource"."state"),
92
+ "role" = COALESCE(EXCLUDED."role", "DockerSwarmResource"."role"),
93
+ "serviceMode" = COALESCE(EXCLUDED."serviceMode", "DockerSwarmResource"."serviceMode"),
94
+ "desiredReplicas" = COALESCE(EXCLUDED."desiredReplicas", "DockerSwarmResource"."desiredReplicas"),
95
+ "runningReplicas" = COALESCE(EXCLUDED."runningReplicas", "DockerSwarmResource"."runningReplicas"),
96
+ "image" = COALESCE(EXCLUDED."image", "DockerSwarmResource"."image"),
97
+ "stackName" = COALESCE(EXCLUDED."stackName", "DockerSwarmResource"."stackName"),
98
+ "serviceName" = COALESCE(EXCLUDED."serviceName", "DockerSwarmResource"."serviceName"),
99
+ "nodeHostname" = COALESCE(EXCLUDED."nodeHostname", "DockerSwarmResource"."nodeHostname"),
100
+ "driver" = COALESCE(EXCLUDED."driver", "DockerSwarmResource"."driver"),
101
+ "isReady" = COALESCE(EXCLUDED."isReady", "DockerSwarmResource"."isReady"),
102
+ "attributes" = COALESCE(EXCLUDED."attributes", "DockerSwarmResource"."attributes"),
103
+ "lastSeenAt" = EXCLUDED."lastSeenAt",
104
+ "updatedAt" = now()
105
+ WHERE EXCLUDED."lastSeenAt" >= "DockerSwarmResource"."lastSeenAt"
106
+ `;
107
+ await this.getRepository().manager.query(sql, params);
108
+ }
109
+ }
110
+ /**
111
+ * Update the latest-metric mirror columns for a batch of resources
112
+ * (Tasks and Services — the kinds that map to running containers).
113
+ * Plain UPDATE guarded by metricsUpdatedAt so out-of-order points
114
+ * don't regress a newer observation. COALESCE keeps the existing
115
+ * value when a batch lacks a series.
116
+ */
117
+ async bulkUpdateLatestMetrics(data) {
118
+ if (data.metrics.length === 0) {
119
+ return;
120
+ }
121
+ for (let i = 0; i < data.metrics.length; i += UPSERT_BATCH_SIZE) {
122
+ const chunk = data.metrics.slice(i, i + UPSERT_BATCH_SIZE);
123
+ const valueFragments = [];
124
+ const params = [
125
+ data.projectId.toString(),
126
+ data.dockerSwarmClusterId.toString(),
127
+ ];
128
+ let paramIndex = 3;
129
+ for (const m of chunk) {
130
+ valueFragments.push(`($${paramIndex++}, $${paramIndex++}, $${paramIndex++}::numeric, $${paramIndex++}::bigint, $${paramIndex++}::bigint, $${paramIndex++}::numeric, $${paramIndex++}::timestamptz)`);
131
+ params.push(m.kind, m.externalId, m.cpuPercent !== null && m.cpuPercent !== undefined
132
+ ? m.cpuPercent
133
+ : null, m.memoryBytes !== null && m.memoryBytes !== undefined
134
+ ? Math.trunc(m.memoryBytes).toString()
135
+ : null, m.maxMemoryBytes !== null && m.maxMemoryBytes !== undefined
136
+ ? Math.trunc(m.maxMemoryBytes).toString()
137
+ : null, m.memoryPercent !== null && m.memoryPercent !== undefined
138
+ ? m.memoryPercent
139
+ : null, m.observedAt);
140
+ }
141
+ const sql = `
142
+ UPDATE "DockerSwarmResource" AS p
143
+ SET
144
+ "latestCpuPercent" = COALESCE(v."cpu", p."latestCpuPercent"),
145
+ "latestMemoryBytes" = COALESCE(v."mem", p."latestMemoryBytes"),
146
+ "maxMemoryBytes" = COALESCE(v."maxMem", p."maxMemoryBytes"),
147
+ "latestMemoryPercent" = COALESCE(v."memPct", p."latestMemoryPercent"),
148
+ "metricsUpdatedAt" = v."observedAt",
149
+ "updatedAt" = now()
150
+ FROM (VALUES ${valueFragments.join(", ")})
151
+ AS v("kind", "externalId", "cpu", "mem", "maxMem", "memPct", "observedAt")
152
+ WHERE
153
+ p."projectId" = $1
154
+ AND p."dockerSwarmClusterId" = $2
155
+ AND p."kind" = v."kind"
156
+ AND p."externalId" = v."externalId"
157
+ AND (p."metricsUpdatedAt" IS NULL OR v."observedAt" >= p."metricsUpdatedAt")
158
+ `;
159
+ await this.getRepository().manager.query(sql, params);
160
+ }
161
+ }
162
+ /**
163
+ * Hard-delete all resources in a cluster whose last snapshot is older
164
+ * than olderThan. Returns the number of deleted rows. Only called by
165
+ * the cleanup worker for clusters that are still connected — a
166
+ * disconnected cluster keeps its last-known inventory.
167
+ */
168
+ async deleteStaleForCluster(data) {
169
+ const result = await this.getRepository().manager.query(`DELETE FROM "DockerSwarmResource" WHERE "dockerSwarmClusterId" = $1 AND "lastSeenAt" < $2`, [data.dockerSwarmClusterId.toString(), data.olderThan]);
170
+ // Postgres driver returns [rows, affected] for DELETE — normalize.
171
+ let affected = 0;
172
+ if (Array.isArray(result) && result.length >= 2) {
173
+ const second = result[1];
174
+ if (typeof second === "number") {
175
+ affected = second;
176
+ }
177
+ }
178
+ if (affected > STALE_DELETE_WARN_THRESHOLD) {
179
+ logger.warn(`DockerSwarmResource cleanup deleted ${affected} stale rows for cluster ${data.dockerSwarmClusterId.toString()} — larger than expected; investigate agent health.`);
180
+ }
181
+ return affected;
182
+ }
183
+ /**
184
+ * Compute the sidebar/overview summary in Postgres: counts per kind
185
+ * plus the node-ready and task-running breakdowns, in a single
186
+ * round-trip.
187
+ */
188
+ async getInventorySummary(data) {
189
+ const rows = await this.getRepository().manager.query(`SELECT "kind",
190
+ COUNT(*)::text AS count,
191
+ COUNT(*) FILTER (WHERE "isReady" IS TRUE)::text AS "readyCount"
192
+ FROM "DockerSwarmResource"
193
+ WHERE "projectId" = $1 AND "dockerSwarmClusterId" = $2 AND "deletedAt" IS NULL
194
+ GROUP BY "kind"`, [data.projectId.toString(), data.dockerSwarmClusterId.toString()]);
195
+ const countsByKind = {};
196
+ let nodeReadyCount = 0;
197
+ let taskRunningCount = 0;
198
+ for (const row of rows) {
199
+ countsByKind[row.kind] = parseInt(row.count, 10) || 0;
200
+ if (row.kind === "Node") {
201
+ nodeReadyCount = parseInt(row.readyCount, 10) || 0;
202
+ }
203
+ if (row.kind === "Task") {
204
+ taskRunningCount = parseInt(row.readyCount, 10) || 0;
205
+ }
206
+ }
207
+ return {
208
+ countsByKind,
209
+ nodeReadyCount,
210
+ taskRunningCount,
211
+ };
212
+ }
213
+ /**
214
+ * Helper for the cleanup worker: snapshot-interval aware cutoff.
215
+ * 3× the 5-minute snapshot interval by default. Tune via
216
+ * DOCKER_SWARM_INVENTORY_STALE_MINUTES (min 5).
217
+ */
218
+ getStaleThresholdDate(nowOverride) {
219
+ const minutes = this.getStaleThresholdMinutes();
220
+ return OneUptimeDate.addRemoveMinutes(nowOverride || OneUptimeDate.getCurrentDate(), -minutes);
221
+ }
222
+ getStaleThresholdMinutes() {
223
+ const raw = process.env["DOCKER_SWARM_INVENTORY_STALE_MINUTES"];
224
+ if (raw) {
225
+ const parsed = parseInt(raw, 10);
226
+ if (!isNaN(parsed) && parsed >= 5) {
227
+ return parsed;
228
+ }
229
+ }
230
+ return 15;
231
+ }
232
+ }
233
+ __decorate([
234
+ CaptureSpan(),
235
+ __metadata("design:type", Function),
236
+ __metadata("design:paramtypes", [Object]),
237
+ __metadata("design:returntype", Promise)
238
+ ], Service.prototype, "bulkUpsert", null);
239
+ __decorate([
240
+ CaptureSpan(),
241
+ __metadata("design:type", Function),
242
+ __metadata("design:paramtypes", [Object]),
243
+ __metadata("design:returntype", Promise)
244
+ ], Service.prototype, "bulkUpdateLatestMetrics", null);
245
+ __decorate([
246
+ CaptureSpan(),
247
+ __metadata("design:type", Function),
248
+ __metadata("design:paramtypes", [Object]),
249
+ __metadata("design:returntype", Promise)
250
+ ], Service.prototype, "deleteStaleForCluster", null);
251
+ __decorate([
252
+ CaptureSpan(),
253
+ __metadata("design:type", Function),
254
+ __metadata("design:paramtypes", [Object]),
255
+ __metadata("design:returntype", Promise)
256
+ ], Service.prototype, "getInventorySummary", null);
257
+ export default new Service();
258
+ //# sourceMappingURL=DockerSwarmResourceService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DockerSwarmResourceService.js","sourceRoot":"","sources":["../../../../Server/Services/DockerSwarmResourceService.ts"],"names":[],"mappings":"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"}
@@ -264,6 +264,7 @@ ExceptionAggregationService.TOP_LEVEL_COLUMNS = new Set([
264
264
  ExceptionAggregationService.RESOURCE_FACET_KEYS = new Map([
265
265
  ["hostId", ServiceType.Host],
266
266
  ["dockerHostId", ServiceType.DockerHost],
267
+ ["podmanHostId", ServiceType.PodmanHost],
267
268
  ["kubernetesClusterId", ServiceType.KubernetesCluster],
268
269
  ["proxmoxClusterId", ServiceType.ProxmoxCluster],
269
270
  ["cephClusterId", ServiceType.CephCluster],