@oneuptime/common 11.0.0 → 11.0.2

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 (357) hide show
  1. package/Models/DatabaseModels/Alert.ts +110 -0
  2. package/Models/DatabaseModels/CephCluster.ts +964 -0
  3. package/Models/DatabaseModels/CephClusterLabelRule.ts +514 -0
  4. package/Models/DatabaseModels/CephClusterOwnerRule.ts +596 -0
  5. package/Models/DatabaseModels/CephClusterOwnerTeam.ts +487 -0
  6. package/Models/DatabaseModels/CephClusterOwnerUser.ts +486 -0
  7. package/Models/DatabaseModels/CephResource.ts +809 -0
  8. package/Models/DatabaseModels/Host.ts +64 -0
  9. package/Models/DatabaseModels/Incident.ts +110 -0
  10. package/Models/DatabaseModels/Index.ts +24 -0
  11. package/Models/DatabaseModels/ProxmoxCluster.ts +943 -0
  12. package/Models/DatabaseModels/ProxmoxClusterLabelRule.ts +514 -0
  13. package/Models/DatabaseModels/ProxmoxClusterOwnerRule.ts +596 -0
  14. package/Models/DatabaseModels/ProxmoxClusterOwnerTeam.ts +487 -0
  15. package/Models/DatabaseModels/ProxmoxClusterOwnerUser.ts +486 -0
  16. package/Models/DatabaseModels/ProxmoxResource.ts +726 -0
  17. package/Models/DatabaseModels/ScheduledMaintenance.ts +110 -0
  18. package/Server/API/BillingInvoiceAPI.ts +47 -7
  19. package/Server/API/CephResourceAPI.ts +134 -0
  20. package/Server/API/DashboardAPI.ts +46 -0
  21. package/Server/API/ProjectAPI.ts +15 -0
  22. package/Server/API/ProxmoxResourceAPI.ts +132 -0
  23. package/Server/API/ResellerPlanAPI.ts +17 -0
  24. package/Server/Infrastructure/GlobalCache.ts +8 -2
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.ts +163 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.ts +211 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.ts +590 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.ts +64 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  30. package/Server/Infrastructure/Redis.ts +40 -12
  31. package/Server/Services/AnalyticsDatabaseService.ts +1 -1
  32. package/Server/Services/BillingService.ts +109 -21
  33. package/Server/Services/CephClusterLabelRuleEngineService.ts +200 -0
  34. package/Server/Services/CephClusterLabelRuleService.ts +14 -0
  35. package/Server/Services/CephClusterOwnerRuleEngineService.ts +218 -0
  36. package/Server/Services/CephClusterOwnerRuleService.ts +14 -0
  37. package/Server/Services/CephClusterOwnerTeamService.ts +10 -0
  38. package/Server/Services/CephClusterOwnerUserService.ts +10 -0
  39. package/Server/Services/CephClusterService.ts +401 -0
  40. package/Server/Services/CephResourceService.ts +383 -0
  41. package/Server/Services/CloudResourceService.ts +11 -3
  42. package/Server/Services/DockerHostService.ts +11 -3
  43. package/Server/Services/ExceptionAggregationService.ts +2 -0
  44. package/Server/Services/HostService.ts +11 -3
  45. package/Server/Services/Index.ts +24 -0
  46. package/Server/Services/KubernetesClusterService.ts +11 -3
  47. package/Server/Services/LogAggregationService.ts +2 -0
  48. package/Server/Services/MetricAggregationService.ts +2 -0
  49. package/Server/Services/OpenTelemetryIngestService.ts +36 -0
  50. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +204 -0
  51. package/Server/Services/ProxmoxClusterLabelRuleService.ts +14 -0
  52. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +222 -0
  53. package/Server/Services/ProxmoxClusterOwnerRuleService.ts +14 -0
  54. package/Server/Services/ProxmoxClusterOwnerTeamService.ts +10 -0
  55. package/Server/Services/ProxmoxClusterOwnerUserService.ts +10 -0
  56. package/Server/Services/ProxmoxClusterService.ts +382 -0
  57. package/Server/Services/ProxmoxResourceService.ts +404 -0
  58. package/Server/Services/RumApplicationService.ts +11 -3
  59. package/Server/Services/ServerlessFunctionService.ts +11 -3
  60. package/Server/Services/TelemetryUsageBillingService.ts +41 -3
  61. package/Server/Services/TraceAggregationService.ts +2 -0
  62. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +8 -23
  63. package/Server/Utils/Monitor/MonitorAlert.ts +45 -0
  64. package/Server/Utils/Monitor/MonitorClusterContext.ts +129 -0
  65. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +344 -4
  66. package/Server/Utils/Monitor/MonitorIncident.ts +130 -7
  67. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +39 -6
  68. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +3 -1
  69. package/Server/Utils/Monitor/SeriesResourceLabels.ts +33 -0
  70. package/Server/Utils/Profiling.ts +37 -2
  71. package/Server/Utils/Telemetry/EntityRegistry.ts +4 -0
  72. package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +1096 -0
  73. package/Server/Utils/Telemetry/TelemetryEntity.ts +85 -0
  74. package/Server/Utils/Telemetry.ts +8 -19
  75. package/Tests/Server/API/BillingInvoiceAPI.test.ts +194 -0
  76. package/Tests/Server/API/ProjectAPI.test.ts +91 -0
  77. package/Tests/Server/API/ResellerPlanAPI.test.ts +207 -0
  78. package/Tests/Server/Infrastructure/GlobalCache.test.ts +100 -0
  79. package/Tests/Server/Services/BillingService.test.ts +323 -0
  80. package/Tests/Server/Services/CephResourceService.test.ts +264 -0
  81. package/Tests/Server/Services/ProxmoxResourceService.test.ts +326 -0
  82. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +322 -0
  83. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +13 -0
  84. package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +879 -0
  85. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +196 -0
  86. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +1231 -0
  87. package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +732 -0
  88. package/Tests/Utils/ModelImportExport.test.ts +366 -0
  89. package/Tests/Utils/Telemetry/EntityRelationship.test.ts +49 -0
  90. package/Tests/Utils/Telemetry/HeartbeatAvailability.test.ts +423 -0
  91. package/Types/BaseDatabase/AggregationIntervalUtil.ts +74 -0
  92. package/Types/Dashboard/DashboardComponentType.ts +4 -0
  93. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
  94. package/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.ts +15 -0
  95. package/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.ts +14 -0
  96. package/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.ts +17 -0
  97. package/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.ts +16 -0
  98. package/Types/Dashboard/DashboardTemplates.ts +446 -0
  99. package/Types/Icon/IconProp.ts +2 -0
  100. package/Types/Monitor/CephAlertTemplates.ts +1647 -0
  101. package/Types/Monitor/CephMetricCatalog.ts +409 -0
  102. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +44 -0
  103. package/Types/Monitor/MonitorStep.ts +64 -0
  104. package/Types/Monitor/MonitorStepCephMonitor.ts +57 -0
  105. package/Types/Monitor/MonitorStepProxmoxMonitor.ts +81 -0
  106. package/Types/Monitor/MonitorType.ts +29 -1
  107. package/Types/Monitor/ProxmoxAlertTemplates.ts +899 -0
  108. package/Types/Monitor/ProxmoxMetricCatalog.ts +382 -0
  109. package/Types/Permission.ts +464 -0
  110. package/Types/Telemetry/EntityType.ts +11 -0
  111. package/Types/Telemetry/ServiceType.ts +2 -0
  112. package/UI/Components/Icon/Icon.tsx +84 -0
  113. package/UI/Components/ImportExport/ExportModelCard.tsx +90 -0
  114. package/UI/Components/ImportExport/ImportModelsModal.tsx +239 -0
  115. package/UI/Components/ModelTable/ModelTable.tsx +294 -143
  116. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +9 -5
  117. package/UI/Utils/ModelImportExport.ts +207 -0
  118. package/UI/Utils/Telemetry/Telemetry.ts +16 -21
  119. package/UI/Utils/TelemetryService.ts +7 -3
  120. package/Utils/Dashboard/Components/DashboardCephOsdListComponent.ts +63 -0
  121. package/Utils/Dashboard/Components/DashboardCephPoolListComponent.ts +32 -0
  122. package/Utils/Dashboard/Components/DashboardCephResourceListShared.ts +61 -0
  123. package/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.ts +69 -0
  124. package/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.ts +55 -0
  125. package/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.ts +61 -0
  126. package/Utils/Dashboard/Components/Index.ts +28 -0
  127. package/Utils/ModelImportExport.ts +369 -0
  128. package/Utils/Telemetry/EntityKey.ts +35 -0
  129. package/Utils/Telemetry/EntityRelationship.ts +6 -0
  130. package/Utils/Telemetry/HeartbeatAvailability.ts +262 -0
  131. package/build/dist/Models/DatabaseModels/Alert.js +108 -0
  132. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  133. package/build/dist/Models/DatabaseModels/CephCluster.js +992 -0
  134. package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -0
  135. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js +522 -0
  136. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js.map +1 -0
  137. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js +603 -0
  138. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js.map +1 -0
  139. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js +503 -0
  140. package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js.map +1 -0
  141. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js +502 -0
  142. package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js.map +1 -0
  143. package/build/dist/Models/DatabaseModels/CephResource.js +846 -0
  144. package/build/dist/Models/DatabaseModels/CephResource.js.map +1 -0
  145. package/build/dist/Models/DatabaseModels/Host.js +63 -0
  146. package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
  147. package/build/dist/Models/DatabaseModels/Incident.js +108 -0
  148. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  149. package/build/dist/Models/DatabaseModels/Index.js +24 -0
  150. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  151. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +967 -0
  152. package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -0
  153. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js +522 -0
  154. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js.map +1 -0
  155. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js +603 -0
  156. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js.map +1 -0
  157. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js +503 -0
  158. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js.map +1 -0
  159. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js +502 -0
  160. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js.map +1 -0
  161. package/build/dist/Models/DatabaseModels/ProxmoxResource.js +761 -0
  162. package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -0
  163. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +108 -0
  164. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  165. package/build/dist/Server/API/BillingInvoiceAPI.js +35 -5
  166. package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
  167. package/build/dist/Server/API/CephResourceAPI.js +98 -0
  168. package/build/dist/Server/API/CephResourceAPI.js.map +1 -0
  169. package/build/dist/Server/API/DashboardAPI.js +46 -0
  170. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  171. package/build/dist/Server/API/ProjectAPI.js +11 -0
  172. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  173. package/build/dist/Server/API/ProxmoxResourceAPI.js +95 -0
  174. package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -0
  175. package/build/dist/Server/API/ResellerPlanAPI.js +17 -3
  176. package/build/dist/Server/API/ResellerPlanAPI.js.map +1 -1
  177. package/build/dist/Server/Infrastructure/GlobalCache.js +7 -2
  178. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  179. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.js +76 -0
  180. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.js.map +1 -0
  181. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.js +108 -0
  182. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.js.map +1 -0
  183. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.js +253 -0
  184. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.js.map +1 -0
  185. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.js +43 -0
  186. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.js.map +1 -0
  187. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  188. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  189. package/build/dist/Server/Infrastructure/Redis.js +31 -8
  190. package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
  191. package/build/dist/Server/Services/AnalyticsDatabaseService.js +1 -1
  192. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  193. package/build/dist/Server/Services/BillingService.js +85 -23
  194. package/build/dist/Server/Services/BillingService.js.map +1 -1
  195. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +166 -0
  196. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -0
  197. package/build/dist/Server/Services/CephClusterLabelRuleService.js +13 -0
  198. package/build/dist/Server/Services/CephClusterLabelRuleService.js.map +1 -0
  199. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +186 -0
  200. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -0
  201. package/build/dist/Server/Services/CephClusterOwnerRuleService.js +13 -0
  202. package/build/dist/Server/Services/CephClusterOwnerRuleService.js.map +1 -0
  203. package/build/dist/Server/Services/CephClusterOwnerTeamService.js +9 -0
  204. package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -0
  205. package/build/dist/Server/Services/CephClusterOwnerUserService.js +9 -0
  206. package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -0
  207. package/build/dist/Server/Services/CephClusterService.js +353 -0
  208. package/build/dist/Server/Services/CephClusterService.js.map +1 -0
  209. package/build/dist/Server/Services/CephResourceService.js +257 -0
  210. package/build/dist/Server/Services/CephResourceService.js.map +1 -0
  211. package/build/dist/Server/Services/CloudResourceService.js +10 -2
  212. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  213. package/build/dist/Server/Services/DockerHostService.js +10 -2
  214. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  215. package/build/dist/Server/Services/ExceptionAggregationService.js +2 -0
  216. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  217. package/build/dist/Server/Services/HostService.js +10 -2
  218. package/build/dist/Server/Services/HostService.js.map +1 -1
  219. package/build/dist/Server/Services/Index.js +24 -0
  220. package/build/dist/Server/Services/Index.js.map +1 -1
  221. package/build/dist/Server/Services/KubernetesClusterService.js +10 -2
  222. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  223. package/build/dist/Server/Services/LogAggregationService.js +2 -0
  224. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  225. package/build/dist/Server/Services/MetricAggregationService.js +2 -0
  226. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  227. package/build/dist/Server/Services/OpenTelemetryIngestService.js +37 -7
  228. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  229. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +166 -0
  230. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -0
  231. package/build/dist/Server/Services/ProxmoxClusterLabelRuleService.js +13 -0
  232. package/build/dist/Server/Services/ProxmoxClusterLabelRuleService.js.map +1 -0
  233. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +186 -0
  234. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -0
  235. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleService.js +13 -0
  236. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleService.js.map +1 -0
  237. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +9 -0
  238. package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -0
  239. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +9 -0
  240. package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -0
  241. package/build/dist/Server/Services/ProxmoxClusterService.js +337 -0
  242. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -0
  243. package/build/dist/Server/Services/ProxmoxResourceService.js +285 -0
  244. package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -0
  245. package/build/dist/Server/Services/RumApplicationService.js +10 -2
  246. package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
  247. package/build/dist/Server/Services/ServerlessFunctionService.js +10 -2
  248. package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
  249. package/build/dist/Server/Services/TelemetryUsageBillingService.js +30 -3
  250. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  251. package/build/dist/Server/Services/TraceAggregationService.js +2 -0
  252. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  253. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +8 -25
  254. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  255. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +36 -0
  256. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  257. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +90 -0
  258. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +1 -0
  259. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +228 -4
  260. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  261. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +103 -8
  262. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  263. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +23 -6
  264. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  265. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +3 -1
  266. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  267. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +23 -0
  268. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  269. package/build/dist/Server/Utils/Profiling.js +24 -3
  270. package/build/dist/Server/Utils/Profiling.js.map +1 -1
  271. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -0
  272. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  273. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +854 -0
  274. package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -0
  275. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +62 -0
  276. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  277. package/build/dist/Server/Utils/Telemetry.js +8 -10
  278. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  279. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +69 -0
  280. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -0
  281. package/build/dist/Types/Dashboard/DashboardComponentType.js +4 -0
  282. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  283. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
  284. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  285. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.js +2 -0
  286. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.js.map +1 -0
  287. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.js +2 -0
  288. package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.js.map +1 -0
  289. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.js +2 -0
  290. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.js.map +1 -0
  291. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.js +2 -0
  292. package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.js.map +1 -0
  293. package/build/dist/Types/Dashboard/DashboardTemplates.js +394 -0
  294. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  295. package/build/dist/Types/Icon/IconProp.js +2 -0
  296. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  297. package/build/dist/Types/Monitor/CephAlertTemplates.js +1379 -0
  298. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -0
  299. package/build/dist/Types/Monitor/CephMetricCatalog.js +353 -0
  300. package/build/dist/Types/Monitor/CephMetricCatalog.js.map +1 -0
  301. package/build/dist/Types/Monitor/MonitorStep.js +46 -0
  302. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  303. package/build/dist/Types/Monitor/MonitorStepCephMonitor.js +34 -0
  304. package/build/dist/Types/Monitor/MonitorStepCephMonitor.js.map +1 -0
  305. package/build/dist/Types/Monitor/MonitorStepProxmoxMonitor.js +36 -0
  306. package/build/dist/Types/Monitor/MonitorStepProxmoxMonitor.js.map +1 -0
  307. package/build/dist/Types/Monitor/MonitorType.js +27 -1
  308. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  309. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +743 -0
  310. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -0
  311. package/build/dist/Types/Monitor/ProxmoxMetricCatalog.js +320 -0
  312. package/build/dist/Types/Monitor/ProxmoxMetricCatalog.js.map +1 -0
  313. package/build/dist/Types/Permission.js +408 -0
  314. package/build/dist/Types/Permission.js.map +1 -1
  315. package/build/dist/Types/Telemetry/EntityType.js +11 -0
  316. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  317. package/build/dist/Types/Telemetry/ServiceType.js +2 -0
  318. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  319. package/build/dist/UI/Components/Icon/Icon.js +33 -0
  320. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  321. package/build/dist/UI/Components/ImportExport/ExportModelCard.js +50 -0
  322. package/build/dist/UI/Components/ImportExport/ExportModelCard.js.map +1 -0
  323. package/build/dist/UI/Components/ImportExport/ImportModelsModal.js +115 -0
  324. package/build/dist/UI/Components/ImportExport/ImportModelsModal.js.map +1 -0
  325. package/build/dist/UI/Components/ModelTable/ModelTable.js +166 -74
  326. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  327. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +5 -1
  328. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  329. package/build/dist/UI/Utils/ModelImportExport.js +142 -0
  330. package/build/dist/UI/Utils/ModelImportExport.js.map +1 -0
  331. package/build/dist/UI/Utils/Telemetry/Telemetry.js +11 -10
  332. package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
  333. package/build/dist/UI/Utils/TelemetryService.js +5 -2
  334. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  335. package/build/dist/Utils/Dashboard/Components/DashboardCephOsdListComponent.js +50 -0
  336. package/build/dist/Utils/Dashboard/Components/DashboardCephOsdListComponent.js.map +1 -0
  337. package/build/dist/Utils/Dashboard/Components/DashboardCephPoolListComponent.js +27 -0
  338. package/build/dist/Utils/Dashboard/Components/DashboardCephPoolListComponent.js.map +1 -0
  339. package/build/dist/Utils/Dashboard/Components/DashboardCephResourceListShared.js +46 -0
  340. package/build/dist/Utils/Dashboard/Components/DashboardCephResourceListShared.js.map +1 -0
  341. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.js +55 -0
  342. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.js.map +1 -0
  343. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.js +42 -0
  344. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.js.map +1 -0
  345. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.js +46 -0
  346. package/build/dist/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.js.map +1 -0
  347. package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
  348. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  349. package/build/dist/Utils/ModelImportExport.js +257 -0
  350. package/build/dist/Utils/ModelImportExport.js.map +1 -0
  351. package/build/dist/Utils/Telemetry/EntityKey.js +27 -0
  352. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  353. package/build/dist/Utils/Telemetry/EntityRelationship.js +3 -0
  354. package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
  355. package/build/dist/Utils/Telemetry/HeartbeatAvailability.js +174 -0
  356. package/build/dist/Utils/Telemetry/HeartbeatAvailability.js.map +1 -0
  357. package/package.json +29 -21
@@ -0,0 +1,809 @@
1
+ import CephCluster from "./CephCluster";
2
+ import Project from "./Project";
3
+ import User from "./User";
4
+ import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
5
+ import Route from "../../Types/API/Route";
6
+ import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
7
+ import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
8
+ import ColumnLength from "../../Types/Database/ColumnLength";
9
+ import ColumnType from "../../Types/Database/ColumnType";
10
+ import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
11
+ import TableColumn from "../../Types/Database/TableColumn";
12
+ import TableColumnType from "../../Types/Database/TableColumnType";
13
+ import TableMetadata from "../../Types/Database/TableMetadata";
14
+ import TenantColumn from "../../Types/Database/TenantColumn";
15
+ import IconProp from "../../Types/Icon/IconProp";
16
+ import ObjectID from "../../Types/ObjectID";
17
+ import Permission from "../../Types/Permission";
18
+ import { Column, Entity, Index, JoinColumn, ManyToOne } from "typeorm";
19
+
20
+ /*
21
+ * ------------------------------------------------------------------
22
+ * CephResource
23
+ * ------------------------------------------------------------------
24
+ *
25
+ * Inventory snapshot of a single Ceph object (OSD, Pool, Mon, Mgr,
26
+ * Mds or Rgw) in a single cluster. Populated by the OTel metrics
27
+ * ingest path from the ceph-mgr prometheus module scrape stream —
28
+ * identity and status already arrive in every metric batch, so no
29
+ * separate object stream is needed.
30
+ *
31
+ * `externalId` is the `ceph_daemon` datapoint label for daemon kinds
32
+ * (e.g. osd.3, mon.a, mgr.x) or the `pool_id` label for Pool kinds —
33
+ * immutable and collision-free within a cluster.
34
+ *
35
+ * Pool I/O note: ceph_pool_rd / ceph_pool_wr are cumulative counters.
36
+ * readOpsCounter / writeOpsCounter store the latest raw counter values
37
+ * (rates are computed on read from the ClickHouse time series, like
38
+ * K8s network rates) — they are NOT per-second rates.
39
+ *
40
+ * The list/detail pages read this table instead of groupBy-ing over
41
+ * 24h of ClickHouse metric data. Rows are upserted per scrape and
42
+ * hard-deleted once lastSeenAt falls behind "now - 15min" for clusters
43
+ * that remain connected.
44
+ *
45
+ * Writes go through CephResourceService under isRoot; users never
46
+ * create/update/delete rows directly.
47
+ *
48
+ * ------------------------------------------------------------------
49
+ */
50
+
51
+ const READ_PERMISSIONS: Array<Permission> = [
52
+ Permission.ProjectOwner,
53
+ Permission.ProjectAdmin,
54
+ Permission.ProjectMember,
55
+ Permission.Viewer,
56
+ Permission.SettingsAdmin,
57
+ Permission.SettingsMember,
58
+ Permission.SettingsViewer,
59
+ Permission.ReadCephCluster,
60
+ ];
61
+
62
+ @TenantColumn("projectId")
63
+ @TableAccessControl({
64
+ create: [],
65
+ read: READ_PERMISSIONS,
66
+ update: [],
67
+ delete: [],
68
+ })
69
+ @CrudApiEndpoint(new Route("/ceph-resource"))
70
+ @TableMetadata({
71
+ tableName: "CephResource",
72
+ singularName: "Ceph Resource",
73
+ pluralName: "Ceph Resources",
74
+ icon: IconProp.Cube,
75
+ tableDescription:
76
+ "Snapshot of a Ceph object (OSD, pool, mon, mgr, mds, rgw) as last reported by the Ceph agent. Populated by the telemetry ingest pipeline; not user-editable.",
77
+ })
78
+ @Index(["projectId", "cephClusterId", "kind", "externalId"], {
79
+ unique: true,
80
+ })
81
+ @Entity({
82
+ name: "CephResource",
83
+ })
84
+ export default class CephResource extends BaseModel {
85
+ @ColumnAccessControl({
86
+ create: [],
87
+ read: READ_PERMISSIONS,
88
+ update: [],
89
+ })
90
+ @TableColumn({
91
+ manyToOneRelationColumn: "projectId",
92
+ type: TableColumnType.Entity,
93
+ modelType: Project,
94
+ title: "Project",
95
+ description: "Relation to Project this resource belongs to.",
96
+ })
97
+ @ManyToOne(
98
+ () => {
99
+ return Project;
100
+ },
101
+ {
102
+ eager: false,
103
+ nullable: true,
104
+ onDelete: "CASCADE",
105
+ orphanedRowAction: "nullify",
106
+ },
107
+ )
108
+ @JoinColumn({ name: "projectId" })
109
+ public project?: Project = undefined;
110
+
111
+ @ColumnAccessControl({
112
+ create: [],
113
+ read: READ_PERMISSIONS,
114
+ update: [],
115
+ })
116
+ @Index()
117
+ @TableColumn({
118
+ type: TableColumnType.ObjectID,
119
+ required: true,
120
+ canReadOnRelationQuery: true,
121
+ title: "Project ID",
122
+ description: "ID of the Project this resource belongs to.",
123
+ })
124
+ @Column({
125
+ type: ColumnType.ObjectID,
126
+ nullable: false,
127
+ transformer: ObjectID.getDatabaseTransformer(),
128
+ })
129
+ public projectId?: ObjectID = undefined;
130
+
131
+ @ColumnAccessControl({
132
+ create: [],
133
+ read: READ_PERMISSIONS,
134
+ update: [],
135
+ })
136
+ @TableColumn({
137
+ manyToOneRelationColumn: "cephClusterId",
138
+ type: TableColumnType.Entity,
139
+ modelType: CephCluster,
140
+ title: "Ceph Cluster",
141
+ description: "Cluster this resource lives in.",
142
+ })
143
+ @ManyToOne(
144
+ () => {
145
+ return CephCluster;
146
+ },
147
+ {
148
+ eager: false,
149
+ nullable: true,
150
+ onDelete: "CASCADE",
151
+ orphanedRowAction: "nullify",
152
+ },
153
+ )
154
+ @JoinColumn({ name: "cephClusterId" })
155
+ public cephCluster?: CephCluster = undefined;
156
+
157
+ @ColumnAccessControl({
158
+ create: [],
159
+ read: READ_PERMISSIONS,
160
+ update: [],
161
+ })
162
+ @Index()
163
+ @TableColumn({
164
+ type: TableColumnType.ObjectID,
165
+ required: true,
166
+ canReadOnRelationQuery: true,
167
+ title: "Ceph Cluster ID",
168
+ description: "ID of the Ceph Cluster this resource lives in.",
169
+ })
170
+ @Column({
171
+ type: ColumnType.ObjectID,
172
+ nullable: false,
173
+ transformer: ObjectID.getDatabaseTransformer(),
174
+ })
175
+ public cephClusterId?: ObjectID = undefined;
176
+
177
+ @ColumnAccessControl({
178
+ create: [],
179
+ read: READ_PERMISSIONS,
180
+ update: [],
181
+ })
182
+ @TableColumn({
183
+ required: true,
184
+ type: TableColumnType.ShortText,
185
+ canReadOnRelationQuery: true,
186
+ title: "Kind",
187
+ description:
188
+ "Ceph resource kind in singular PascalCase: Osd, Pool, Mon, Mgr, Mds or Rgw.",
189
+ })
190
+ @Column({
191
+ nullable: false,
192
+ type: ColumnType.ShortText,
193
+ length: ColumnLength.ShortText,
194
+ })
195
+ public kind?: string = undefined;
196
+
197
+ @ColumnAccessControl({
198
+ create: [],
199
+ read: READ_PERMISSIONS,
200
+ update: [],
201
+ })
202
+ @TableColumn({
203
+ required: true,
204
+ type: TableColumnType.ShortText,
205
+ canReadOnRelationQuery: true,
206
+ title: "External ID",
207
+ description:
208
+ "The `ceph_daemon` label for daemon kinds (e.g. osd.3, mon.a) or the `pool_id` label for Pool kinds. Immutable and collision-free within a cluster; also the detail-route param.",
209
+ })
210
+ @Column({
211
+ nullable: false,
212
+ type: ColumnType.ShortText,
213
+ length: ColumnLength.ShortText,
214
+ })
215
+ public externalId?: string = undefined;
216
+
217
+ @ColumnAccessControl({
218
+ create: [],
219
+ read: READ_PERMISSIONS,
220
+ update: [],
221
+ })
222
+ @TableColumn({
223
+ required: false,
224
+ type: TableColumnType.ShortText,
225
+ canReadOnRelationQuery: true,
226
+ title: "Name",
227
+ description:
228
+ "Human-friendly name — the pool name from ceph_pool_metadata for Pool kinds. Null for daemon kinds (externalId is already the daemon name).",
229
+ })
230
+ @Column({
231
+ nullable: true,
232
+ type: ColumnType.ShortText,
233
+ length: ColumnLength.ShortText,
234
+ })
235
+ public name?: string = undefined;
236
+
237
+ @ColumnAccessControl({
238
+ create: [],
239
+ read: READ_PERMISSIONS,
240
+ update: [],
241
+ })
242
+ @TableColumn({
243
+ required: false,
244
+ type: TableColumnType.ShortText,
245
+ canReadOnRelationQuery: true,
246
+ title: "Hostname",
247
+ description:
248
+ "Host this daemon runs on, from the *_metadata `hostname` label. Null for Pool kinds.",
249
+ })
250
+ @Column({
251
+ nullable: true,
252
+ type: ColumnType.ShortText,
253
+ length: ColumnLength.ShortText,
254
+ })
255
+ public hostname?: string = undefined;
256
+
257
+ @ColumnAccessControl({
258
+ create: [],
259
+ read: READ_PERMISSIONS,
260
+ update: [],
261
+ })
262
+ @TableColumn({
263
+ required: false,
264
+ type: TableColumnType.ShortText,
265
+ canReadOnRelationQuery: true,
266
+ title: "Daemon Version",
267
+ description:
268
+ "Daemon version from the *_metadata `ceph_version` label. Null for Pool kinds. (Named daemonVersion because BaseModel already owns the `version` column.)",
269
+ })
270
+ @Column({
271
+ nullable: true,
272
+ type: ColumnType.ShortText,
273
+ length: ColumnLength.ShortText,
274
+ })
275
+ public daemonVersion?: string = undefined;
276
+
277
+ @ColumnAccessControl({
278
+ create: [],
279
+ read: READ_PERMISSIONS,
280
+ update: [],
281
+ })
282
+ @TableColumn({
283
+ required: false,
284
+ type: TableColumnType.ShortText,
285
+ canReadOnRelationQuery: true,
286
+ title: "Device Class",
287
+ description:
288
+ "OSD device class (hdd / ssd / nvme) from ceph_osd_metadata. Null for non-Osd kinds.",
289
+ })
290
+ @Column({
291
+ nullable: true,
292
+ type: ColumnType.ShortText,
293
+ length: ColumnLength.ShortText,
294
+ })
295
+ public deviceClass?: string = undefined;
296
+
297
+ @ColumnAccessControl({
298
+ create: [],
299
+ read: READ_PERMISSIONS,
300
+ update: [],
301
+ })
302
+ @TableColumn({
303
+ required: false,
304
+ type: TableColumnType.Boolean,
305
+ canReadOnRelationQuery: true,
306
+ title: "Is Up",
307
+ description:
308
+ "True when the latest ceph_osd_up value is 1. Null for non-Osd kinds.",
309
+ })
310
+ @Column({
311
+ nullable: true,
312
+ type: ColumnType.Boolean,
313
+ })
314
+ public isUp?: boolean = undefined;
315
+
316
+ @ColumnAccessControl({
317
+ create: [],
318
+ read: READ_PERMISSIONS,
319
+ update: [],
320
+ })
321
+ @TableColumn({
322
+ required: false,
323
+ type: TableColumnType.Boolean,
324
+ canReadOnRelationQuery: true,
325
+ title: "Is In",
326
+ description:
327
+ "True when the latest ceph_osd_in value is 1. Null for non-Osd kinds.",
328
+ })
329
+ @Column({
330
+ nullable: true,
331
+ type: ColumnType.Boolean,
332
+ })
333
+ public isIn?: boolean = undefined;
334
+
335
+ @ColumnAccessControl({
336
+ create: [],
337
+ read: READ_PERMISSIONS,
338
+ update: [],
339
+ })
340
+ @TableColumn({
341
+ required: false,
342
+ type: TableColumnType.Boolean,
343
+ canReadOnRelationQuery: true,
344
+ title: "In Quorum",
345
+ description:
346
+ "True when the latest ceph_mon_quorum_status value is 1. Null for non-Mon kinds.",
347
+ })
348
+ @Column({
349
+ nullable: true,
350
+ type: ColumnType.Boolean,
351
+ })
352
+ public inQuorum?: boolean = undefined;
353
+
354
+ @ColumnAccessControl({
355
+ create: [],
356
+ read: READ_PERMISSIONS,
357
+ update: [],
358
+ })
359
+ @TableColumn({
360
+ required: false,
361
+ type: TableColumnType.BigPositiveNumber,
362
+ canReadOnRelationQuery: true,
363
+ title: "Stat Bytes",
364
+ description:
365
+ "OSD total capacity (ceph_osd_stat_bytes). Null for non-Osd kinds.",
366
+ })
367
+ @Column({
368
+ nullable: true,
369
+ type: ColumnType.BigPositiveNumber,
370
+ transformer: {
371
+ to: (value: number | null | undefined): string | null => {
372
+ if (value === null || value === undefined) {
373
+ return null;
374
+ }
375
+ return Math.trunc(value).toString();
376
+ },
377
+ from: (value: string | null | undefined): number | null => {
378
+ if (value === null || value === undefined) {
379
+ return null;
380
+ }
381
+ const parsed: number = parseInt(value, 10);
382
+ return isNaN(parsed) ? null : parsed;
383
+ },
384
+ },
385
+ })
386
+ public statBytes?: number = undefined;
387
+
388
+ @ColumnAccessControl({
389
+ create: [],
390
+ read: READ_PERMISSIONS,
391
+ update: [],
392
+ })
393
+ @TableColumn({
394
+ required: false,
395
+ type: TableColumnType.BigPositiveNumber,
396
+ canReadOnRelationQuery: true,
397
+ title: "Stat Bytes Used",
398
+ description:
399
+ "OSD used capacity (ceph_osd_stat_bytes_used). Null for non-Osd kinds.",
400
+ })
401
+ @Column({
402
+ nullable: true,
403
+ type: ColumnType.BigPositiveNumber,
404
+ transformer: {
405
+ to: (value: number | null | undefined): string | null => {
406
+ if (value === null || value === undefined) {
407
+ return null;
408
+ }
409
+ return Math.trunc(value).toString();
410
+ },
411
+ from: (value: string | null | undefined): number | null => {
412
+ if (value === null || value === undefined) {
413
+ return null;
414
+ }
415
+ const parsed: number = parseInt(value, 10);
416
+ return isNaN(parsed) ? null : parsed;
417
+ },
418
+ },
419
+ })
420
+ public statBytesUsed?: number = undefined;
421
+
422
+ @ColumnAccessControl({
423
+ create: [],
424
+ read: READ_PERMISSIONS,
425
+ update: [],
426
+ })
427
+ @TableColumn({
428
+ required: false,
429
+ type: TableColumnType.Number,
430
+ canReadOnRelationQuery: true,
431
+ title: "Apply Latency Ms",
432
+ description:
433
+ "Latest OSD apply latency in milliseconds (ceph_osd_apply_latency_ms). Stored as decimal. Null for non-Osd kinds.",
434
+ })
435
+ @Column({
436
+ nullable: true,
437
+ type: ColumnType.Decimal,
438
+ transformer: {
439
+ to: (value: number | null | undefined): number | null => {
440
+ if (value === null || value === undefined) {
441
+ return null;
442
+ }
443
+ return value;
444
+ },
445
+ from: (value: string | number | null | undefined): number | null => {
446
+ if (value === null || value === undefined) {
447
+ return null;
448
+ }
449
+ if (typeof value === "number") {
450
+ return value;
451
+ }
452
+ const parsed: number = parseFloat(value);
453
+ return isNaN(parsed) ? null : parsed;
454
+ },
455
+ },
456
+ })
457
+ public applyLatencyMs?: number = undefined;
458
+
459
+ @ColumnAccessControl({
460
+ create: [],
461
+ read: READ_PERMISSIONS,
462
+ update: [],
463
+ })
464
+ @TableColumn({
465
+ required: false,
466
+ type: TableColumnType.Number,
467
+ canReadOnRelationQuery: true,
468
+ title: "Commit Latency Ms",
469
+ description:
470
+ "Latest OSD commit latency in milliseconds (ceph_osd_commit_latency_ms). Stored as decimal. Null for non-Osd kinds.",
471
+ })
472
+ @Column({
473
+ nullable: true,
474
+ type: ColumnType.Decimal,
475
+ transformer: {
476
+ to: (value: number | null | undefined): number | null => {
477
+ if (value === null || value === undefined) {
478
+ return null;
479
+ }
480
+ return value;
481
+ },
482
+ from: (value: string | number | null | undefined): number | null => {
483
+ if (value === null || value === undefined) {
484
+ return null;
485
+ }
486
+ if (typeof value === "number") {
487
+ return value;
488
+ }
489
+ const parsed: number = parseFloat(value);
490
+ return isNaN(parsed) ? null : parsed;
491
+ },
492
+ },
493
+ })
494
+ public commitLatencyMs?: number = undefined;
495
+
496
+ @ColumnAccessControl({
497
+ create: [],
498
+ read: READ_PERMISSIONS,
499
+ update: [],
500
+ })
501
+ @TableColumn({
502
+ required: false,
503
+ type: TableColumnType.Number,
504
+ canReadOnRelationQuery: true,
505
+ title: "PG Count",
506
+ description:
507
+ "Number of placement groups on this OSD (ceph_osd_numpg). Null for non-Osd kinds.",
508
+ })
509
+ @Column({
510
+ nullable: true,
511
+ type: ColumnType.Number,
512
+ })
513
+ public pgCount?: number = undefined;
514
+
515
+ @ColumnAccessControl({
516
+ create: [],
517
+ read: READ_PERMISSIONS,
518
+ update: [],
519
+ })
520
+ @TableColumn({
521
+ required: false,
522
+ type: TableColumnType.BigPositiveNumber,
523
+ canReadOnRelationQuery: true,
524
+ title: "Stored Bytes",
525
+ description:
526
+ "Pool stored bytes (ceph_pool_stored). Null for non-Pool kinds.",
527
+ })
528
+ @Column({
529
+ nullable: true,
530
+ type: ColumnType.BigPositiveNumber,
531
+ transformer: {
532
+ to: (value: number | null | undefined): string | null => {
533
+ if (value === null || value === undefined) {
534
+ return null;
535
+ }
536
+ return Math.trunc(value).toString();
537
+ },
538
+ from: (value: string | null | undefined): number | null => {
539
+ if (value === null || value === undefined) {
540
+ return null;
541
+ }
542
+ const parsed: number = parseInt(value, 10);
543
+ return isNaN(parsed) ? null : parsed;
544
+ },
545
+ },
546
+ })
547
+ public storedBytes?: number = undefined;
548
+
549
+ @ColumnAccessControl({
550
+ create: [],
551
+ read: READ_PERMISSIONS,
552
+ update: [],
553
+ })
554
+ @TableColumn({
555
+ required: false,
556
+ type: TableColumnType.BigPositiveNumber,
557
+ canReadOnRelationQuery: true,
558
+ title: "Max Avail Bytes",
559
+ description:
560
+ "Pool max available bytes (ceph_pool_max_avail). Pool used percent = stored / (stored + max_avail) * 100. Null for non-Pool kinds.",
561
+ })
562
+ @Column({
563
+ nullable: true,
564
+ type: ColumnType.BigPositiveNumber,
565
+ transformer: {
566
+ to: (value: number | null | undefined): string | null => {
567
+ if (value === null || value === undefined) {
568
+ return null;
569
+ }
570
+ return Math.trunc(value).toString();
571
+ },
572
+ from: (value: string | null | undefined): number | null => {
573
+ if (value === null || value === undefined) {
574
+ return null;
575
+ }
576
+ const parsed: number = parseInt(value, 10);
577
+ return isNaN(parsed) ? null : parsed;
578
+ },
579
+ },
580
+ })
581
+ public maxAvailBytes?: number = undefined;
582
+
583
+ @ColumnAccessControl({
584
+ create: [],
585
+ read: READ_PERMISSIONS,
586
+ update: [],
587
+ })
588
+ @TableColumn({
589
+ required: false,
590
+ type: TableColumnType.BigPositiveNumber,
591
+ canReadOnRelationQuery: true,
592
+ title: "Objects",
593
+ description:
594
+ "Number of objects in this pool (ceph_pool_objects). Null for non-Pool kinds.",
595
+ })
596
+ @Column({
597
+ nullable: true,
598
+ type: ColumnType.BigPositiveNumber,
599
+ transformer: {
600
+ to: (value: number | null | undefined): string | null => {
601
+ if (value === null || value === undefined) {
602
+ return null;
603
+ }
604
+ return Math.trunc(value).toString();
605
+ },
606
+ from: (value: string | null | undefined): number | null => {
607
+ if (value === null || value === undefined) {
608
+ return null;
609
+ }
610
+ const parsed: number = parseInt(value, 10);
611
+ return isNaN(parsed) ? null : parsed;
612
+ },
613
+ },
614
+ })
615
+ public objects?: number = undefined;
616
+
617
+ @ColumnAccessControl({
618
+ create: [],
619
+ read: READ_PERMISSIONS,
620
+ update: [],
621
+ })
622
+ @TableColumn({
623
+ required: false,
624
+ type: TableColumnType.BigPositiveNumber,
625
+ canReadOnRelationQuery: true,
626
+ title: "Read Ops Counter",
627
+ description:
628
+ "Latest raw value of the cumulative ceph_pool_rd counter — NOT a per-second rate. Read IOPS are computed on read from the ClickHouse time series. Null for non-Pool kinds.",
629
+ })
630
+ @Column({
631
+ nullable: true,
632
+ type: ColumnType.BigPositiveNumber,
633
+ transformer: {
634
+ to: (value: number | null | undefined): string | null => {
635
+ if (value === null || value === undefined) {
636
+ return null;
637
+ }
638
+ return Math.trunc(value).toString();
639
+ },
640
+ from: (value: string | null | undefined): number | null => {
641
+ if (value === null || value === undefined) {
642
+ return null;
643
+ }
644
+ const parsed: number = parseInt(value, 10);
645
+ return isNaN(parsed) ? null : parsed;
646
+ },
647
+ },
648
+ })
649
+ public readOpsCounter?: number = undefined;
650
+
651
+ @ColumnAccessControl({
652
+ create: [],
653
+ read: READ_PERMISSIONS,
654
+ update: [],
655
+ })
656
+ @TableColumn({
657
+ required: false,
658
+ type: TableColumnType.BigPositiveNumber,
659
+ canReadOnRelationQuery: true,
660
+ title: "Write Ops Counter",
661
+ description:
662
+ "Latest raw value of the cumulative ceph_pool_wr counter — NOT a per-second rate. Write IOPS are computed on read from the ClickHouse time series. Null for non-Pool kinds.",
663
+ })
664
+ @Column({
665
+ nullable: true,
666
+ type: ColumnType.BigPositiveNumber,
667
+ transformer: {
668
+ to: (value: number | null | undefined): string | null => {
669
+ if (value === null || value === undefined) {
670
+ return null;
671
+ }
672
+ return Math.trunc(value).toString();
673
+ },
674
+ from: (value: string | null | undefined): number | null => {
675
+ if (value === null || value === undefined) {
676
+ return null;
677
+ }
678
+ const parsed: number = parseInt(value, 10);
679
+ return isNaN(parsed) ? null : parsed;
680
+ },
681
+ },
682
+ })
683
+ public writeOpsCounter?: number = undefined;
684
+
685
+ @ColumnAccessControl({
686
+ create: [],
687
+ read: READ_PERMISSIONS,
688
+ update: [],
689
+ })
690
+ @TableColumn({
691
+ required: false,
692
+ type: TableColumnType.Date,
693
+ canReadOnRelationQuery: true,
694
+ title: "Metrics Updated At",
695
+ description:
696
+ "Observed timestamp of the latest metric point. Acts as the monotonic guard for metric updates and the cutoff for staleness rendering.",
697
+ })
698
+ @Column({
699
+ nullable: true,
700
+ type: ColumnType.Date,
701
+ })
702
+ public metricsUpdatedAt?: Date = undefined;
703
+
704
+ @ColumnAccessControl({
705
+ create: [],
706
+ read: READ_PERMISSIONS,
707
+ update: [],
708
+ })
709
+ @TableColumn({
710
+ required: true,
711
+ type: TableColumnType.Date,
712
+ canReadOnRelationQuery: true,
713
+ title: "Last Seen At",
714
+ description:
715
+ "Agent-observed timestamp of the most recent scrape containing this resource. Also acts as the monotonic guard for upserts.",
716
+ })
717
+ @Column({
718
+ nullable: false,
719
+ type: ColumnType.Date,
720
+ })
721
+ public lastSeenAt?: Date = undefined;
722
+
723
+ @ColumnAccessControl({
724
+ create: [],
725
+ read: READ_PERMISSIONS,
726
+ update: [],
727
+ })
728
+ @TableColumn({
729
+ manyToOneRelationColumn: "createdByUserId",
730
+ type: TableColumnType.Entity,
731
+ modelType: User,
732
+ title: "Created By User",
733
+ description:
734
+ "Not user-facing; ingest writes as isRoot so this stays null in practice.",
735
+ })
736
+ @ManyToOne(
737
+ () => {
738
+ return User;
739
+ },
740
+ {
741
+ eager: false,
742
+ nullable: true,
743
+ onDelete: "SET NULL",
744
+ orphanedRowAction: "nullify",
745
+ },
746
+ )
747
+ @JoinColumn({ name: "createdByUserId" })
748
+ public createdByUser?: User = undefined;
749
+
750
+ @ColumnAccessControl({
751
+ create: [],
752
+ read: READ_PERMISSIONS,
753
+ update: [],
754
+ })
755
+ @TableColumn({
756
+ type: TableColumnType.ObjectID,
757
+ title: "Created By User ID",
758
+ description: "ID of the user who created this row.",
759
+ })
760
+ @Column({
761
+ type: ColumnType.ObjectID,
762
+ nullable: true,
763
+ transformer: ObjectID.getDatabaseTransformer(),
764
+ })
765
+ public createdByUserId?: ObjectID = undefined;
766
+
767
+ @ColumnAccessControl({
768
+ create: [],
769
+ read: READ_PERMISSIONS,
770
+ update: [],
771
+ })
772
+ @TableColumn({
773
+ manyToOneRelationColumn: "deletedByUserId",
774
+ type: TableColumnType.Entity,
775
+ modelType: User,
776
+ title: "Deleted By User",
777
+ description: "Relation to the user who deleted this row.",
778
+ })
779
+ @ManyToOne(
780
+ () => {
781
+ return User;
782
+ },
783
+ {
784
+ eager: false,
785
+ nullable: true,
786
+ onDelete: "SET NULL",
787
+ orphanedRowAction: "nullify",
788
+ },
789
+ )
790
+ @JoinColumn({ name: "deletedByUserId" })
791
+ public deletedByUser?: User = undefined;
792
+
793
+ @ColumnAccessControl({
794
+ create: [],
795
+ read: READ_PERMISSIONS,
796
+ update: [],
797
+ })
798
+ @TableColumn({
799
+ type: TableColumnType.ObjectID,
800
+ title: "Deleted By User ID",
801
+ description: "ID of the user who deleted this row.",
802
+ })
803
+ @Column({
804
+ type: ColumnType.ObjectID,
805
+ nullable: true,
806
+ transformer: ObjectID.getDatabaseTransformer(),
807
+ })
808
+ public deletedByUserId?: ObjectID = undefined;
809
+ }