@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
@@ -28,6 +28,7 @@ export enum DashboardTemplateType {
28
28
  Host = "Host",
29
29
  Proxmox = "Proxmox",
30
30
  Ceph = "Ceph",
31
+ DockerSwarm = "DockerSwarm",
31
32
  Metrics = "Metrics",
32
33
  }
33
34
 
@@ -87,6 +88,13 @@ export const DashboardTemplates: Array<DashboardTemplate> = [
87
88
  "OSD wall and pool capacity lists, health and capacity stats, degraded-PG trends, client throughput, and cluster logs.",
88
89
  icon: IconProp.Database,
89
90
  },
91
+ {
92
+ type: DashboardTemplateType.DockerSwarm,
93
+ name: "Docker Swarm Dashboard",
94
+ description:
95
+ "Live node and service inventories with role/status, container CPU and memory trends, PID counts, and cluster logs.",
96
+ icon: IconProp.Cube,
97
+ },
90
98
  {
91
99
  type: DashboardTemplateType.Metrics,
92
100
  name: "Metrics Dashboard",
@@ -523,6 +531,64 @@ function createProxmoxGuestListComponent(data: {
523
531
  };
524
532
  }
525
533
 
534
+ function createDockerSwarmNodeListComponent(data: {
535
+ title: string;
536
+ top: number;
537
+ left: number;
538
+ width: number;
539
+ height: number;
540
+ maxRows?: number;
541
+ roleFilter?: string;
542
+ statusFilter?: string;
543
+ }): DashboardBaseComponent {
544
+ return {
545
+ _type: ObjectType.DashboardComponent,
546
+ componentType: DashboardComponentType.DockerSwarmNodeList,
547
+ componentId: ObjectID.generate(),
548
+ topInDashboardUnits: data.top,
549
+ leftInDashboardUnits: data.left,
550
+ widthInDashboardUnits: data.width,
551
+ heightInDashboardUnits: data.height,
552
+ minHeightInDashboardUnits: 3,
553
+ minWidthInDashboardUnits: 4,
554
+ arguments: {
555
+ title: data.title,
556
+ maxRows: data.maxRows ?? 20,
557
+ roleFilter: data.roleFilter,
558
+ statusFilter: data.statusFilter,
559
+ },
560
+ };
561
+ }
562
+
563
+ function createDockerSwarmServiceListComponent(data: {
564
+ title: string;
565
+ top: number;
566
+ left: number;
567
+ width: number;
568
+ height: number;
569
+ maxRows?: number;
570
+ serviceModeFilter?: string;
571
+ statusFilter?: string;
572
+ }): DashboardBaseComponent {
573
+ return {
574
+ _type: ObjectType.DashboardComponent,
575
+ componentType: DashboardComponentType.DockerSwarmServiceList,
576
+ componentId: ObjectID.generate(),
577
+ topInDashboardUnits: data.top,
578
+ leftInDashboardUnits: data.left,
579
+ widthInDashboardUnits: data.width,
580
+ heightInDashboardUnits: data.height,
581
+ minHeightInDashboardUnits: 3,
582
+ minWidthInDashboardUnits: 4,
583
+ arguments: {
584
+ title: data.title,
585
+ maxRows: data.maxRows ?? 20,
586
+ serviceModeFilter: data.serviceModeFilter,
587
+ statusFilter: data.statusFilter,
588
+ },
589
+ };
590
+ }
591
+
526
592
  function createCephOsdListComponent(data: {
527
593
  title: string;
528
594
  top: number;
@@ -2056,6 +2122,132 @@ function createProxmoxDashboardConfig(): DashboardViewConfig {
2056
2122
  };
2057
2123
  }
2058
2124
 
2125
+ function createDockerSwarmDashboardConfig(): DashboardViewConfig {
2126
+ /*
2127
+ * Layout notes:
2128
+ *
2129
+ * - Node / service counts come from the Postgres inventory list widgets
2130
+ * (DockerSwarmResource), never from Sum-of-gauge Value widgets — the
2131
+ * same multiply-by-scrapes failure the Kubernetes/Proxmox templates
2132
+ * document. The list-widget headers show the true current counts.
2133
+ *
2134
+ * - The only metrics that actually arrive are the docker_stats
2135
+ * receiver's per-container metrics (container.cpu.utilization,
2136
+ * container.memory.usage.total, container.pids.count, …). There are
2137
+ * NO docker_swarm_* / pve_* metrics, so the charts average those
2138
+ * per-container metrics across every task that reports them — a
2139
+ * useful temperature signal for a wall dashboard. container.cpu
2140
+ * .utilization is a ratio (0..1 per core); the chart leaves it raw.
2141
+ *
2142
+ * - The cluster variable scopes telemetry by the only resource
2143
+ * attribute the agent stamps: resource.docker.swarm.cluster.name.
2144
+ */
2145
+ const components: Array<DashboardBaseComponent> = [
2146
+ // Row 0: Title
2147
+ createTextComponent({
2148
+ text: "Docker Swarm Dashboard",
2149
+ top: 0,
2150
+ left: 0,
2151
+ width: 12,
2152
+ height: 1,
2153
+ isBold: true,
2154
+ }),
2155
+
2156
+ // Rows 1-4: Live inventory from the Postgres snapshot
2157
+ createDockerSwarmNodeListComponent({
2158
+ title: "Nodes",
2159
+ top: 1,
2160
+ left: 0,
2161
+ width: 6,
2162
+ height: 4,
2163
+ maxRows: 25,
2164
+ }),
2165
+ createDockerSwarmServiceListComponent({
2166
+ title: "Services",
2167
+ top: 1,
2168
+ left: 6,
2169
+ width: 6,
2170
+ height: 4,
2171
+ maxRows: 25,
2172
+ }),
2173
+
2174
+ // Row 5: Section header
2175
+ createTextComponent({
2176
+ text: "Container Resource Usage",
2177
+ top: 5,
2178
+ left: 0,
2179
+ width: 12,
2180
+ height: 1,
2181
+ isBold: true,
2182
+ }),
2183
+
2184
+ // Rows 6-8: CPU and memory trends (docker_stats per-container metrics)
2185
+ createChartComponent({
2186
+ title: "CPU Utilization (avg across containers)",
2187
+ chartType: DashboardChartType.Line,
2188
+ top: 6,
2189
+ left: 0,
2190
+ width: 6,
2191
+ height: 3,
2192
+ metricConfig: {
2193
+ metricName: "container.cpu.utilization",
2194
+ aggregationType: MetricsAggregationType.Avg,
2195
+ legend: "CPU utilization",
2196
+ },
2197
+ }),
2198
+ createChartComponent({
2199
+ title: "Memory Usage (avg across containers)",
2200
+ chartType: DashboardChartType.Area,
2201
+ top: 6,
2202
+ left: 6,
2203
+ width: 6,
2204
+ height: 3,
2205
+ metricConfig: {
2206
+ metricName: "container.memory.usage.total",
2207
+ aggregationType: MetricsAggregationType.Avg,
2208
+ legend: "Memory used",
2209
+ },
2210
+ }),
2211
+
2212
+ // Rows 9-11: PID counts + logs
2213
+ createChartComponent({
2214
+ title: "Process Count (sum across containers)",
2215
+ chartType: DashboardChartType.Line,
2216
+ top: 9,
2217
+ left: 0,
2218
+ width: 6,
2219
+ height: 3,
2220
+ metricConfig: {
2221
+ metricName: "container.pids.count",
2222
+ aggregationType: MetricsAggregationType.Sum,
2223
+ legend: "PIDs",
2224
+ },
2225
+ }),
2226
+ createLogStreamComponent({
2227
+ title: "Cluster Logs",
2228
+ top: 9,
2229
+ left: 6,
2230
+ width: 6,
2231
+ height: 3,
2232
+ }),
2233
+ ];
2234
+
2235
+ const variables: Array<DashboardVariable> = [
2236
+ createTelemetryAttributeVariable({
2237
+ name: "cluster",
2238
+ label: "Cluster",
2239
+ attributeKey: "resource.docker.swarm.cluster.name",
2240
+ }),
2241
+ ];
2242
+
2243
+ return {
2244
+ _type: ObjectType.DashboardViewConfig,
2245
+ components,
2246
+ variables,
2247
+ heightInDashboardUnits: Math.max(DashboardSize.heightInDashboardUnits, 12),
2248
+ };
2249
+ }
2250
+
2059
2251
  function createCephDashboardConfig(): DashboardViewConfig {
2060
2252
  /*
2061
2253
  * Layout notes:
@@ -2243,6 +2435,8 @@ export function getTemplateConfig(
2243
2435
  return createProxmoxDashboardConfig();
2244
2436
  case DashboardTemplateType.Ceph:
2245
2437
  return createCephDashboardConfig();
2438
+ case DashboardTemplateType.DockerSwarm:
2439
+ return createDockerSwarmDashboardConfig();
2246
2440
  case DashboardTemplateType.Metrics:
2247
2441
  return createMetricsDashboardConfig();
2248
2442
  case DashboardTemplateType.Blank:
@@ -0,0 +1,452 @@
1
+ import { JSONObject } from "../JSON";
2
+ import { ParsedDockerSwarmResource } from "../../Server/Services/DockerSwarmResourceService";
3
+
4
+ /*
5
+ * ------------------------------------------------------------------
6
+ * DockerSwarmInventoryExtractor
7
+ * ------------------------------------------------------------------
8
+ *
9
+ * Parses a single inventory log record emitted by the OneUptime Docker
10
+ * Swarm Agent's snapshot script. The script runs on a manager node and
11
+ * polls the Swarm API every 5 minutes (`docker node ls`,
12
+ * `docker service ls`, `docker service ps`, `docker stack ls`,
13
+ * `docker network ls`, `docker secret ls`, `docker config ls`,
14
+ * `docker volume ls` — all `--format json`) and emits one JSON object
15
+ * per line into a log file the OTel filelog receiver forwards as OTLP.
16
+ *
17
+ * The wire format is a JSON envelope:
18
+ *
19
+ * { "kind": "Node" | "Service" | "Task" | "Stack" | "Network"
20
+ * | "Secret" | "Config" | "Volume",
21
+ * "data": { ...native `docker ... ls --format json` payload... } }
22
+ *
23
+ * The kind discriminator is also set as the `oneuptime.dockerswarm.kind`
24
+ * log record attribute by the agent's filelog operator chain.
25
+ *
26
+ * Each kind has a dedicated parser that pulls the fields promoted to
27
+ * first-class columns on DockerSwarmResource; everything else goes in
28
+ * the `attributes` JSON column. The raw blob is not persisted here — it
29
+ * lives on the original log record in ClickHouse.
30
+ *
31
+ * ------------------------------------------------------------------
32
+ */
33
+
34
+ export const INVENTORY_KIND_ATTRIBUTE: string = "oneuptime.dockerswarm.kind";
35
+
36
+ export const INVENTORIED_DOCKER_SWARM_KINDS: ReadonlyArray<string> = [
37
+ "Node",
38
+ "Service",
39
+ "Task",
40
+ "Stack",
41
+ "Network",
42
+ "Secret",
43
+ "Config",
44
+ "Volume",
45
+ ];
46
+
47
+ const CANONICAL_MAP: Record<string, string> = {
48
+ node: "Node",
49
+ nodes: "Node",
50
+ service: "Service",
51
+ services: "Service",
52
+ task: "Task",
53
+ tasks: "Task",
54
+ stack: "Stack",
55
+ stacks: "Stack",
56
+ network: "Network",
57
+ networks: "Network",
58
+ secret: "Secret",
59
+ secrets: "Secret",
60
+ config: "Config",
61
+ configs: "Config",
62
+ volume: "Volume",
63
+ volumes: "Volume",
64
+ };
65
+
66
+ export function canonicalDockerSwarmKind(raw: string): string | null {
67
+ const trimmed: string = (raw || "").trim().toLowerCase();
68
+ if (!trimmed) {
69
+ return null;
70
+ }
71
+ return CANONICAL_MAP[trimmed] || null;
72
+ }
73
+
74
+ export function isInventoriedDockerSwarmKind(kind: string): boolean {
75
+ return canonicalDockerSwarmKind(kind) !== null;
76
+ }
77
+
78
+ function parseLogBody(logBody: string): JSONObject | null {
79
+ try {
80
+ const parsed: unknown = JSON.parse(logBody);
81
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
82
+ return parsed as JSONObject;
83
+ }
84
+ return null;
85
+ } catch {
86
+ return null;
87
+ }
88
+ }
89
+
90
+ function readString(obj: JSONObject, key: string): string | null {
91
+ const v: unknown = obj[key];
92
+ if (typeof v === "string" && v.trim().length > 0) {
93
+ return v.trim();
94
+ }
95
+ if (typeof v === "number") {
96
+ return String(v);
97
+ }
98
+ return null;
99
+ }
100
+
101
+ function readJSONObject(obj: JSONObject, key: string): JSONObject | null {
102
+ const v: unknown = obj[key];
103
+ if (v && typeof v === "object" && !Array.isArray(v)) {
104
+ return v as JSONObject;
105
+ }
106
+ return null;
107
+ }
108
+
109
+ // Parse a Docker "X/Y" replica string into [running, desired].
110
+ function parseReplicas(raw: string | null): {
111
+ running: number | null;
112
+ desired: number | null;
113
+ } {
114
+ if (!raw) {
115
+ return { running: null, desired: null };
116
+ }
117
+ // Replicated: "3/5". Global: "5/5" too. Strip any trailing text.
118
+ const m: RegExpMatchArray | null = raw.match(/(\d+)\s*\/\s*(\d+)/);
119
+ if (!m) {
120
+ return { running: null, desired: null };
121
+ }
122
+ return {
123
+ running: parseInt(m[1]!, 10),
124
+ desired: parseInt(m[2]!, 10),
125
+ };
126
+ }
127
+
128
+ function emptyResource(
129
+ kind: string,
130
+ externalId: string,
131
+ lastSeenAt: Date,
132
+ ): ParsedDockerSwarmResource {
133
+ return {
134
+ kind,
135
+ externalId,
136
+ name: null,
137
+ state: null,
138
+ role: null,
139
+ serviceMode: null,
140
+ desiredReplicas: null,
141
+ runningReplicas: null,
142
+ image: null,
143
+ stackName: null,
144
+ serviceName: null,
145
+ nodeHostname: null,
146
+ driver: null,
147
+ isReady: null,
148
+ attributes: null,
149
+ lastSeenAt,
150
+ };
151
+ }
152
+
153
+ /*
154
+ * `docker node ls --format json`:
155
+ * { ID, Hostname, Status, Availability, ManagerStatus, EngineVersion,
156
+ * TLSStatus, Self }
157
+ */
158
+ function parseNode(
159
+ data: JSONObject,
160
+ lastSeenAt: Date,
161
+ ): ParsedDockerSwarmResource | null {
162
+ const id: string | null = readString(data, "ID") || readString(data, "Id");
163
+ if (!id) {
164
+ return null;
165
+ }
166
+ const r: ParsedDockerSwarmResource = emptyResource(
167
+ "Node",
168
+ `node/${id}`,
169
+ lastSeenAt,
170
+ );
171
+ r.name = readString(data, "Hostname");
172
+ r.state = readString(data, "Status"); // Ready | Down | Unknown
173
+ r.isReady = r.state ? r.state.toLowerCase() === "ready" : null;
174
+ const managerStatus: string | null = readString(data, "ManagerStatus");
175
+ r.role = managerStatus ? "manager" : "worker";
176
+ r.attributes = {
177
+ availability: readString(data, "Availability"),
178
+ managerStatus: managerStatus,
179
+ engineVersion: readString(data, "EngineVersion"),
180
+ tlsStatus: readString(data, "TLSStatus"),
181
+ isLeader: managerStatus ? managerStatus.toLowerCase() === "leader" : false,
182
+ };
183
+ return r;
184
+ }
185
+
186
+ /*
187
+ * `docker service ls --format json`:
188
+ * { ID, Name, Mode, Replicas, Image, Ports }
189
+ */
190
+ function parseService(
191
+ data: JSONObject,
192
+ lastSeenAt: Date,
193
+ ): ParsedDockerSwarmResource | null {
194
+ const id: string | null = readString(data, "ID") || readString(data, "Id");
195
+ if (!id) {
196
+ return null;
197
+ }
198
+ const r: ParsedDockerSwarmResource = emptyResource(
199
+ "Service",
200
+ `service/${id}`,
201
+ lastSeenAt,
202
+ );
203
+ r.name = readString(data, "Name");
204
+ r.serviceMode = readString(data, "Mode"); // replicated | global
205
+ r.image = readString(data, "Image");
206
+ const replicas: { running: number | null; desired: number | null } =
207
+ parseReplicas(readString(data, "Replicas"));
208
+ r.runningReplicas = replicas.running;
209
+ r.desiredReplicas = replicas.desired;
210
+ r.state =
211
+ replicas.running !== null && replicas.desired !== null
212
+ ? `${replicas.running}/${replicas.desired}`
213
+ : null;
214
+ r.isReady =
215
+ replicas.running !== null && replicas.desired !== null
216
+ ? replicas.running >= replicas.desired && replicas.desired > 0
217
+ : null;
218
+ // Stack namespace: services deployed via a stack are named "<stack>_<svc>".
219
+ if (r.name && r.name.includes("_")) {
220
+ r.stackName = r.name.split("_")[0] || null;
221
+ }
222
+ r.attributes = {
223
+ ports: readString(data, "Ports"),
224
+ };
225
+ return r;
226
+ }
227
+
228
+ /*
229
+ * `docker service ps <svc> --format json` / `docker node ps`:
230
+ * { ID, Name, Image, Node, DesiredState, CurrentState, Error, Ports }
231
+ */
232
+ function parseTask(
233
+ data: JSONObject,
234
+ lastSeenAt: Date,
235
+ ): ParsedDockerSwarmResource | null {
236
+ const id: string | null = readString(data, "ID") || readString(data, "Id");
237
+ if (!id) {
238
+ return null;
239
+ }
240
+ const r: ParsedDockerSwarmResource = emptyResource(
241
+ "Task",
242
+ `task/${id}`,
243
+ lastSeenAt,
244
+ );
245
+ r.name = readString(data, "Name"); // <service>.<slot> or <service>.<nodeId>
246
+ r.image = readString(data, "Image");
247
+ r.nodeHostname = readString(data, "Node");
248
+ // CurrentState is e.g. "Running 2 hours ago" / "Shutdown 3 minutes ago".
249
+ const currentState: string | null = readString(data, "CurrentState");
250
+ r.state = currentState ? currentState.split(/\s+/)[0]!.toLowerCase() : null;
251
+ r.isReady = r.state ? r.state === "running" : null;
252
+ if (r.name && r.name.includes(".")) {
253
+ r.serviceName = r.name.split(".")[0] || null;
254
+ }
255
+ if (r.serviceName && r.serviceName.includes("_")) {
256
+ r.stackName = r.serviceName.split("_")[0] || null;
257
+ }
258
+ r.attributes = {
259
+ desiredState: readString(data, "DesiredState"),
260
+ currentState: currentState,
261
+ error: readString(data, "Error"),
262
+ };
263
+ return r;
264
+ }
265
+
266
+ /*
267
+ * `docker stack ls --format json`:
268
+ * { Name, Services, Orchestrator }
269
+ */
270
+ function parseStack(
271
+ data: JSONObject,
272
+ lastSeenAt: Date,
273
+ ): ParsedDockerSwarmResource | null {
274
+ const name: string | null = readString(data, "Name");
275
+ if (!name) {
276
+ return null;
277
+ }
278
+ const r: ParsedDockerSwarmResource = emptyResource(
279
+ "Stack",
280
+ `stack/${name}`,
281
+ lastSeenAt,
282
+ );
283
+ r.name = name;
284
+ r.stackName = name;
285
+ const servicesRaw: string | null = readString(data, "Services");
286
+ const serviceCount: number | null = servicesRaw
287
+ ? parseInt(servicesRaw, 10)
288
+ : null;
289
+ r.state = serviceCount !== null ? `${serviceCount} services` : null;
290
+ r.attributes = {
291
+ serviceCount:
292
+ serviceCount !== null && !isNaN(serviceCount) ? serviceCount : null,
293
+ orchestrator: readString(data, "Orchestrator"),
294
+ };
295
+ return r;
296
+ }
297
+
298
+ /*
299
+ * `docker network ls --format json`:
300
+ * { ID, Name, Driver, Scope }
301
+ */
302
+ function parseNetwork(
303
+ data: JSONObject,
304
+ lastSeenAt: Date,
305
+ ): ParsedDockerSwarmResource | null {
306
+ const id: string | null = readString(data, "ID") || readString(data, "Id");
307
+ const name: string | null = readString(data, "Name");
308
+ if (!id && !name) {
309
+ return null;
310
+ }
311
+ const r: ParsedDockerSwarmResource = emptyResource(
312
+ "Network",
313
+ `network/${id || name}`,
314
+ lastSeenAt,
315
+ );
316
+ r.name = name;
317
+ r.driver = readString(data, "Driver");
318
+ const scope: string | null = readString(data, "Scope");
319
+ r.state = scope;
320
+ r.attributes = {
321
+ scope: scope,
322
+ internal: readString(data, "Internal"),
323
+ ipv6: readString(data, "IPv6"),
324
+ };
325
+ return r;
326
+ }
327
+
328
+ /*
329
+ * `docker secret ls` / `docker config ls --format json`:
330
+ * { ID, Name, CreatedAt, UpdatedAt }
331
+ */
332
+ function parseSecretOrConfig(
333
+ kind: string,
334
+ data: JSONObject,
335
+ lastSeenAt: Date,
336
+ ): ParsedDockerSwarmResource | null {
337
+ const id: string | null = readString(data, "ID") || readString(data, "Id");
338
+ const name: string | null = readString(data, "Name");
339
+ if (!id && !name) {
340
+ return null;
341
+ }
342
+ const r: ParsedDockerSwarmResource = emptyResource(
343
+ kind,
344
+ `${kind.toLowerCase()}/${id || name}`,
345
+ lastSeenAt,
346
+ );
347
+ r.name = name;
348
+ r.attributes = {
349
+ createdAt: readString(data, "CreatedAt"),
350
+ updatedAt: readString(data, "UpdatedAt"),
351
+ };
352
+ return r;
353
+ }
354
+
355
+ /*
356
+ * `docker volume ls --format json`:
357
+ * { Name, Driver, Scope, Mountpoint } — per node, so the agent stamps
358
+ * the node hostname onto the envelope.
359
+ */
360
+ function parseVolume(
361
+ data: JSONObject,
362
+ lastSeenAt: Date,
363
+ ): ParsedDockerSwarmResource | null {
364
+ const name: string | null = readString(data, "Name");
365
+ if (!name) {
366
+ return null;
367
+ }
368
+ const nodeHostname: string | null =
369
+ readString(data, "Node") || readString(data, "NodeHostname");
370
+ // Volumes are per-node; suffix the node so two nodes' volumes don't collide.
371
+ const externalId: string = nodeHostname
372
+ ? `volume/${name}@${nodeHostname}`
373
+ : `volume/${name}`;
374
+ const r: ParsedDockerSwarmResource = emptyResource(
375
+ "Volume",
376
+ externalId,
377
+ lastSeenAt,
378
+ );
379
+ r.name = name;
380
+ r.driver = readString(data, "Driver");
381
+ r.nodeHostname = nodeHostname;
382
+ r.state = readString(data, "Scope");
383
+ r.attributes = {
384
+ scope: readString(data, "Scope"),
385
+ mountpoint: readString(data, "Mountpoint"),
386
+ };
387
+ return r;
388
+ }
389
+
390
+ export interface ExtractedDockerSwarmInventoryRecord {
391
+ resource: ParsedDockerSwarmResource;
392
+ }
393
+
394
+ /**
395
+ * Parse a single inventory log line. Returns null when the body is
396
+ * malformed or the kind is not modeled — callers swallow nulls silently
397
+ * rather than fail the whole batch.
398
+ */
399
+ export function extractDockerSwarmInventoryResource(data: {
400
+ kind: string;
401
+ logBody: string;
402
+ lastSeenAt: Date;
403
+ }): ExtractedDockerSwarmInventoryRecord | null {
404
+ const canonical: string | null = canonicalDockerSwarmKind(data.kind);
405
+ if (!canonical) {
406
+ return null;
407
+ }
408
+
409
+ const body: JSONObject | null = parseLogBody(data.logBody);
410
+ if (!body) {
411
+ return null;
412
+ }
413
+
414
+ const inner: JSONObject =
415
+ (readJSONObject(body, "data") as JSONObject) || body;
416
+
417
+ let parsed: ParsedDockerSwarmResource | null = null;
418
+ switch (canonical) {
419
+ case "Node":
420
+ parsed = parseNode(inner, data.lastSeenAt);
421
+ break;
422
+ case "Service":
423
+ parsed = parseService(inner, data.lastSeenAt);
424
+ break;
425
+ case "Task":
426
+ parsed = parseTask(inner, data.lastSeenAt);
427
+ break;
428
+ case "Stack":
429
+ parsed = parseStack(inner, data.lastSeenAt);
430
+ break;
431
+ case "Network":
432
+ parsed = parseNetwork(inner, data.lastSeenAt);
433
+ break;
434
+ case "Secret":
435
+ parsed = parseSecretOrConfig("Secret", inner, data.lastSeenAt);
436
+ break;
437
+ case "Config":
438
+ parsed = parseSecretOrConfig("Config", inner, data.lastSeenAt);
439
+ break;
440
+ case "Volume":
441
+ parsed = parseVolume(inner, data.lastSeenAt);
442
+ break;
443
+ default:
444
+ parsed = null;
445
+ }
446
+
447
+ if (!parsed) {
448
+ return null;
449
+ }
450
+
451
+ return { resource: parsed };
452
+ }
@@ -324,6 +324,7 @@ enum IconProp {
324
324
  XCircle = "XCircle",
325
325
  Kubernetes = "Kubernetes",
326
326
  Docker = "Docker",
327
+ Podman = "Podman",
327
328
  Proxmox = "Proxmox",
328
329
  Ceph = "Ceph",
329
330
  Gauge = "Gauge",