@oneuptime/common 11.0.1 → 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.
- package/Models/DatabaseModels/Alert.ts +110 -0
- package/Models/DatabaseModels/CephCluster.ts +964 -0
- package/Models/DatabaseModels/CephClusterLabelRule.ts +514 -0
- package/Models/DatabaseModels/CephClusterOwnerRule.ts +596 -0
- package/Models/DatabaseModels/CephClusterOwnerTeam.ts +487 -0
- package/Models/DatabaseModels/CephClusterOwnerUser.ts +486 -0
- package/Models/DatabaseModels/CephResource.ts +809 -0
- package/Models/DatabaseModels/Host.ts +64 -0
- package/Models/DatabaseModels/Incident.ts +110 -0
- package/Models/DatabaseModels/Index.ts +24 -0
- package/Models/DatabaseModels/ProxmoxCluster.ts +943 -0
- package/Models/DatabaseModels/ProxmoxClusterLabelRule.ts +514 -0
- package/Models/DatabaseModels/ProxmoxClusterOwnerRule.ts +596 -0
- package/Models/DatabaseModels/ProxmoxClusterOwnerTeam.ts +487 -0
- package/Models/DatabaseModels/ProxmoxClusterOwnerUser.ts +486 -0
- package/Models/DatabaseModels/ProxmoxResource.ts +726 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +110 -0
- package/Server/API/BillingInvoiceAPI.ts +47 -7
- package/Server/API/CephResourceAPI.ts +134 -0
- package/Server/API/DashboardAPI.ts +46 -0
- package/Server/API/ProjectAPI.ts +15 -0
- package/Server/API/ProxmoxResourceAPI.ts +132 -0
- package/Server/API/ResellerPlanAPI.ts +17 -0
- package/Server/Infrastructure/GlobalCache.ts +8 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.ts +163 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.ts +211 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.ts +590 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.ts +64 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Infrastructure/Redis.ts +40 -12
- package/Server/Services/AnalyticsDatabaseService.ts +1 -1
- package/Server/Services/BillingService.ts +109 -21
- package/Server/Services/CephClusterLabelRuleEngineService.ts +200 -0
- package/Server/Services/CephClusterLabelRuleService.ts +14 -0
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +218 -0
- package/Server/Services/CephClusterOwnerRuleService.ts +14 -0
- package/Server/Services/CephClusterOwnerTeamService.ts +10 -0
- package/Server/Services/CephClusterOwnerUserService.ts +10 -0
- package/Server/Services/CephClusterService.ts +401 -0
- package/Server/Services/CephResourceService.ts +383 -0
- package/Server/Services/CloudResourceService.ts +11 -3
- package/Server/Services/DockerHostService.ts +11 -3
- package/Server/Services/ExceptionAggregationService.ts +2 -0
- package/Server/Services/HostService.ts +11 -3
- package/Server/Services/Index.ts +24 -0
- package/Server/Services/KubernetesClusterService.ts +11 -3
- package/Server/Services/LogAggregationService.ts +2 -0
- package/Server/Services/MetricAggregationService.ts +2 -0
- package/Server/Services/OpenTelemetryIngestService.ts +36 -0
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +204 -0
- package/Server/Services/ProxmoxClusterLabelRuleService.ts +14 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +222 -0
- package/Server/Services/ProxmoxClusterOwnerRuleService.ts +14 -0
- package/Server/Services/ProxmoxClusterOwnerTeamService.ts +10 -0
- package/Server/Services/ProxmoxClusterOwnerUserService.ts +10 -0
- package/Server/Services/ProxmoxClusterService.ts +382 -0
- package/Server/Services/ProxmoxResourceService.ts +404 -0
- package/Server/Services/RumApplicationService.ts +11 -3
- package/Server/Services/ServerlessFunctionService.ts +11 -3
- package/Server/Services/TelemetryUsageBillingService.ts +41 -3
- package/Server/Services/TraceAggregationService.ts +2 -0
- package/Server/Types/AnalyticsDatabase/AggregateBy.ts +8 -23
- package/Server/Utils/Monitor/MonitorAlert.ts +45 -0
- package/Server/Utils/Monitor/MonitorClusterContext.ts +129 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +344 -4
- package/Server/Utils/Monitor/MonitorIncident.ts +130 -7
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +39 -6
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +3 -1
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +33 -0
- package/Server/Utils/Profiling.ts +37 -2
- package/Server/Utils/Telemetry/EntityRegistry.ts +4 -0
- package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +1096 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +85 -0
- package/Server/Utils/Telemetry.ts +8 -19
- package/Tests/Server/API/BillingInvoiceAPI.test.ts +194 -0
- package/Tests/Server/API/ProjectAPI.test.ts +91 -0
- package/Tests/Server/API/ResellerPlanAPI.test.ts +207 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +100 -0
- package/Tests/Server/Services/BillingService.test.ts +323 -0
- package/Tests/Server/Services/CephResourceService.test.ts +264 -0
- package/Tests/Server/Services/ProxmoxResourceService.test.ts +326 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +322 -0
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +13 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +879 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +196 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +1231 -0
- package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +732 -0
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +49 -0
- package/Tests/Utils/Telemetry/HeartbeatAvailability.test.ts +423 -0
- package/Types/BaseDatabase/AggregationIntervalUtil.ts +74 -0
- package/Types/Dashboard/DashboardComponentType.ts +4 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
- package/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.ts +14 -0
- package/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.ts +17 -0
- package/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.ts +16 -0
- package/Types/Dashboard/DashboardTemplates.ts +446 -0
- package/Types/Icon/IconProp.ts +2 -0
- package/Types/Monitor/CephAlertTemplates.ts +1647 -0
- package/Types/Monitor/CephMetricCatalog.ts +409 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +44 -0
- package/Types/Monitor/MonitorStep.ts +64 -0
- package/Types/Monitor/MonitorStepCephMonitor.ts +57 -0
- package/Types/Monitor/MonitorStepProxmoxMonitor.ts +81 -0
- package/Types/Monitor/MonitorType.ts +29 -1
- package/Types/Monitor/ProxmoxAlertTemplates.ts +899 -0
- package/Types/Monitor/ProxmoxMetricCatalog.ts +382 -0
- package/Types/Permission.ts +464 -0
- package/Types/Telemetry/EntityType.ts +11 -0
- package/Types/Telemetry/ServiceType.ts +2 -0
- package/UI/Components/Icon/Icon.tsx +84 -0
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +9 -5
- package/UI/Utils/Telemetry/Telemetry.ts +16 -21
- package/UI/Utils/TelemetryService.ts +7 -3
- package/Utils/Dashboard/Components/DashboardCephOsdListComponent.ts +63 -0
- package/Utils/Dashboard/Components/DashboardCephPoolListComponent.ts +32 -0
- package/Utils/Dashboard/Components/DashboardCephResourceListShared.ts +61 -0
- package/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.ts +69 -0
- package/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.ts +55 -0
- package/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.ts +61 -0
- package/Utils/Dashboard/Components/Index.ts +28 -0
- package/Utils/Telemetry/EntityKey.ts +35 -0
- package/Utils/Telemetry/EntityRelationship.ts +6 -0
- package/Utils/Telemetry/HeartbeatAvailability.ts +262 -0
- package/build/dist/Models/DatabaseModels/Alert.js +108 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js +992 -0
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CephResource.js +846 -0
- package/build/dist/Models/DatabaseModels/CephResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Host.js +63 -0
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +108 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +24 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +967 -0
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProxmoxResource.js +761 -0
- package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +108 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +35 -5
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/CephResourceAPI.js +98 -0
- package/build/dist/Server/API/CephResourceAPI.js.map +1 -0
- package/build/dist/Server/API/DashboardAPI.js +46 -0
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectAPI.js +11 -0
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ProxmoxResourceAPI.js +95 -0
- package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -0
- package/build/dist/Server/API/ResellerPlanAPI.js +17 -3
- package/build/dist/Server/API/ResellerPlanAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +7 -2
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.js +76 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.js +108 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000000-AddProxmoxCephV2Columns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.js +253 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781600000001-AddProxmoxCephActivityAndRules.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.js +43 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781700000000-AddProxmoxCephV3Columns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Redis.js +31 -8
- package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +85 -23
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +166 -0
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterLabelRuleService.js +13 -0
- package/build/dist/Server/Services/CephClusterLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +186 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/CephClusterOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterOwnerUserService.js +9 -0
- package/build/dist/Server/Services/CephClusterOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/CephClusterService.js +353 -0
- package/build/dist/Server/Services/CephClusterService.js.map +1 -0
- package/build/dist/Server/Services/CephResourceService.js +257 -0
- package/build/dist/Server/Services/CephResourceService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceService.js +10 -2
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +10 -2
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +2 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +10 -2
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +24 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +10 -2
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +2 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +2 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +37 -7
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +166 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleService.js +13 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +186 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js +9 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterService.js +337 -0
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxResourceService.js +285 -0
- package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationService.js +10 -2
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionService.js +10 -2
- package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +30 -3
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +2 -0
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +8 -25
- package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +36 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +90 -0
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +228 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +103 -8
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +23 -6
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +23 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Profiling.js +24 -3
- package/build/dist/Server/Utils/Profiling.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +4 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +854 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +62 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +8 -10
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +69 -0
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +4 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +394 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Icon/IconProp.js +2 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Monitor/CephAlertTemplates.js +1379 -0
- package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/CephMetricCatalog.js +353 -0
- package/build/dist/Types/Monitor/CephMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStep.js +46 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepCephMonitor.js +34 -0
- package/build/dist/Types/Monitor/MonitorStepCephMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepProxmoxMonitor.js +36 -0
- package/build/dist/Types/Monitor/MonitorStepProxmoxMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +27 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +743 -0
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/ProxmoxMetricCatalog.js +320 -0
- package/build/dist/Types/Monitor/ProxmoxMetricCatalog.js.map +1 -0
- package/build/dist/Types/Permission.js +408 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +11 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +2 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +33 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +5 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Utils/Telemetry/Telemetry.js +11 -10
- package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +5 -2
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardCephOsdListComponent.js +50 -0
- package/build/dist/Utils/Dashboard/Components/DashboardCephOsdListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardCephPoolListComponent.js +27 -0
- package/build/dist/Utils/Dashboard/Components/DashboardCephPoolListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardCephResourceListShared.js +46 -0
- package/build/dist/Utils/Dashboard/Components/DashboardCephResourceListShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.js +55 -0
- package/build/dist/Utils/Dashboard/Components/DashboardProxmoxGuestListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.js +42 -0
- package/build/dist/Utils/Dashboard/Components/DashboardProxmoxNodeListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.js +46 -0
- package/build/dist/Utils/Dashboard/Components/DashboardProxmoxResourceListShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityKey.js +27 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +3 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/build/dist/Utils/Telemetry/HeartbeatAvailability.js +174 -0
- package/build/dist/Utils/Telemetry/HeartbeatAvailability.js.map +1 -0
- package/package.json +29 -21
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import DatabaseService from "./DatabaseService";
|
|
11
|
+
import ProxmoxClusterLabelRuleEngineService from "./ProxmoxClusterLabelRuleEngineService";
|
|
12
|
+
import ProxmoxClusterOwnerRuleEngineService from "./ProxmoxClusterOwnerRuleEngineService";
|
|
13
|
+
import Model from "../../Models/DatabaseModels/ProxmoxCluster";
|
|
14
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
15
|
+
import ObjectID from "../../Types/ObjectID";
|
|
16
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
17
|
+
import OneUptimeDate from "../../Types/Date";
|
|
18
|
+
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
19
|
+
import GlobalCache from "../Infrastructure/GlobalCache";
|
|
20
|
+
import logger from "../Utils/Logger";
|
|
21
|
+
import crypto from "crypto";
|
|
22
|
+
const LAST_SEEN_CACHE_NAMESPACE = "proxmox-cluster-last-seen";
|
|
23
|
+
const LAST_SEEN_THROTTLE_SECONDS = 60;
|
|
24
|
+
const LABELS_APPLIED_CACHE_NAMESPACE = "proxmox-cluster-labels-applied";
|
|
25
|
+
const LABELS_APPLIED_CACHE_TTL_SECONDS = 60;
|
|
26
|
+
export class Service extends DatabaseService {
|
|
27
|
+
constructor() {
|
|
28
|
+
super(Model);
|
|
29
|
+
}
|
|
30
|
+
async onCreateSuccess(_onCreate, createdItem) {
|
|
31
|
+
/*
|
|
32
|
+
* Rules run once, on creation only — exact parity with
|
|
33
|
+
* KubernetesClusterService. Label engine first: it syncs the
|
|
34
|
+
* in-memory labels so the owner engine can match rule-added labels.
|
|
35
|
+
*/
|
|
36
|
+
if (createdItem.projectId && createdItem.id) {
|
|
37
|
+
Promise.resolve()
|
|
38
|
+
.then(async () => {
|
|
39
|
+
await ProxmoxClusterLabelRuleEngineService.applyRulesToProxmoxCluster(createdItem);
|
|
40
|
+
})
|
|
41
|
+
.then(async () => {
|
|
42
|
+
await ProxmoxClusterOwnerRuleEngineService.applyRulesToProxmoxCluster(createdItem);
|
|
43
|
+
})
|
|
44
|
+
.catch((error) => {
|
|
45
|
+
var _a, _b;
|
|
46
|
+
logger.error(`Error applying proxmox cluster rules in ProxmoxClusterService.onCreateSuccess: ${error}`, {
|
|
47
|
+
projectId: (_a = createdItem.projectId) === null || _a === void 0 ? void 0 : _a.toString(),
|
|
48
|
+
proxmoxClusterId: (_b = createdItem.id) === null || _b === void 0 ? void 0 : _b.toString(),
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return createdItem;
|
|
53
|
+
}
|
|
54
|
+
async findOrCreateByName(data) {
|
|
55
|
+
/*
|
|
56
|
+
* A Proxmox cluster is keyed by the `proxmox.cluster.name` OTel resource
|
|
57
|
+
* attribute, which the user configures on the agent. Look it up
|
|
58
|
+
* case-insensitively: the unique guard (checkUniqueColumnBy ->
|
|
59
|
+
* findWithSameText) compares case-insensitively, so a case-sensitive
|
|
60
|
+
* lookup would miss an existing row that differs only by case, then
|
|
61
|
+
* fail to create it — wedging ingest for that cluster. Unlike
|
|
62
|
+
* DockerHost.hostIdentifier (host.name casing is unstable on Windows)
|
|
63
|
+
* the configured cluster name's casing is stable, so we preserve the
|
|
64
|
+
* user's casing on create instead of canonicalizing to lowercase.
|
|
65
|
+
*/
|
|
66
|
+
const name = data.name.trim();
|
|
67
|
+
const existingCluster = await this.findOneBy({
|
|
68
|
+
query: {
|
|
69
|
+
projectId: data.projectId,
|
|
70
|
+
name: QueryHelper.findWithSameText(name),
|
|
71
|
+
},
|
|
72
|
+
select: {
|
|
73
|
+
_id: true,
|
|
74
|
+
projectId: true,
|
|
75
|
+
name: true,
|
|
76
|
+
},
|
|
77
|
+
props: {
|
|
78
|
+
isRoot: true,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
if (existingCluster) {
|
|
82
|
+
return existingCluster;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
// Create new cluster
|
|
86
|
+
const newCluster = new Model();
|
|
87
|
+
newCluster.projectId = data.projectId;
|
|
88
|
+
newCluster.name = name;
|
|
89
|
+
newCluster.otelCollectorStatus = "connected";
|
|
90
|
+
newCluster.lastSeenAt = OneUptimeDate.getCurrentDate();
|
|
91
|
+
const createdCluster = await this.create({
|
|
92
|
+
data: newCluster,
|
|
93
|
+
props: {
|
|
94
|
+
isRoot: true,
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
return createdCluster;
|
|
98
|
+
}
|
|
99
|
+
catch (_a) {
|
|
100
|
+
/*
|
|
101
|
+
* Either two ingest workers raced to create the same cluster, or a
|
|
102
|
+
* cluster with this name in a different case already existed and the
|
|
103
|
+
* unique guard rejected the insert. Re-resolve case-insensitively so
|
|
104
|
+
* the caller still gets the existing row instead of throwing.
|
|
105
|
+
*/
|
|
106
|
+
const reFetchedCluster = await this.findOneBy({
|
|
107
|
+
query: {
|
|
108
|
+
projectId: data.projectId,
|
|
109
|
+
name: QueryHelper.findWithSameText(name),
|
|
110
|
+
},
|
|
111
|
+
select: {
|
|
112
|
+
_id: true,
|
|
113
|
+
projectId: true,
|
|
114
|
+
name: true,
|
|
115
|
+
},
|
|
116
|
+
props: {
|
|
117
|
+
isRoot: true,
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
if (reFetchedCluster) {
|
|
121
|
+
return reFetchedCluster;
|
|
122
|
+
}
|
|
123
|
+
throw new Error("Failed to create or find Proxmox cluster: " + name);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/*
|
|
127
|
+
* Refresh lastSeenAt / connection status and (optionally) the
|
|
128
|
+
* snapshot columns the list page renders. Count columns ride this
|
|
129
|
+
* extras path with COALESCE-per-column semantics: a key that is
|
|
130
|
+
* undefined is simply not written, so a partial batch (one that
|
|
131
|
+
* lacked the matching *_info series) never zeroes a count. The
|
|
132
|
+
* 60-second extras fingerprint cache is the write throttle — the
|
|
133
|
+
* steady state (identical snapshot every scrape) costs one Redis
|
|
134
|
+
* read per batch and at most one Postgres UPDATE per minute.
|
|
135
|
+
*
|
|
136
|
+
* Two callers share this throttle with DISJOINT extras shapes: the
|
|
137
|
+
* metrics snapshot flush (pveVersion + counts, every batch) and the
|
|
138
|
+
* fenced autoDiscoverProxmoxCluster maintenance path (agentVersion
|
|
139
|
+
* only — and usually an all-null fingerprint, since the shipped
|
|
140
|
+
* agent config does not stamp oneuptime.agent.version). The single
|
|
141
|
+
* fingerprint covers the whole extras object, so each alternation
|
|
142
|
+
* between the two shapes busts the throttle: at most one extra
|
|
143
|
+
* Postgres UPDATE per maintenance-fence window (~5 min), which is
|
|
144
|
+
* accepted. Do NOT key the cache per-caller — that would let two
|
|
145
|
+
* callers each refresh lastSeenAt under their own throttle and is
|
|
146
|
+
* not worth the complexity for one UPDATE per 5 minutes.
|
|
147
|
+
*/
|
|
148
|
+
async updateLastSeen(clusterId, extra) {
|
|
149
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
150
|
+
const cacheKey = clusterId.toString();
|
|
151
|
+
const extrasFingerprint = crypto
|
|
152
|
+
.createHash("sha1")
|
|
153
|
+
.update(JSON.stringify({
|
|
154
|
+
pveVersion: (_a = extra === null || extra === void 0 ? void 0 : extra.pveVersion) !== null && _a !== void 0 ? _a : null,
|
|
155
|
+
agentVersion: (_b = extra === null || extra === void 0 ? void 0 : extra.agentVersion) !== null && _b !== void 0 ? _b : null,
|
|
156
|
+
nodeCount: (_c = extra === null || extra === void 0 ? void 0 : extra.nodeCount) !== null && _c !== void 0 ? _c : null,
|
|
157
|
+
onlineNodeCount: (_d = extra === null || extra === void 0 ? void 0 : extra.onlineNodeCount) !== null && _d !== void 0 ? _d : null,
|
|
158
|
+
guestCount: (_e = extra === null || extra === void 0 ? void 0 : extra.guestCount) !== null && _e !== void 0 ? _e : null,
|
|
159
|
+
storageCount: (_f = extra === null || extra === void 0 ? void 0 : extra.storageCount) !== null && _f !== void 0 ? _f : null,
|
|
160
|
+
guestsWithoutBackupCount: (_g = extra === null || extra === void 0 ? void 0 : extra.guestsWithoutBackupCount) !== null && _g !== void 0 ? _g : null,
|
|
161
|
+
}))
|
|
162
|
+
.digest("hex");
|
|
163
|
+
const cached = await GlobalCache.getString(LAST_SEEN_CACHE_NAMESPACE, cacheKey);
|
|
164
|
+
if (cached === extrasFingerprint) {
|
|
165
|
+
return; // same data was written recently
|
|
166
|
+
}
|
|
167
|
+
await GlobalCache.setString(LAST_SEEN_CACHE_NAMESPACE, cacheKey, extrasFingerprint, { expiresInSeconds: LAST_SEEN_THROTTLE_SECONDS });
|
|
168
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
169
|
+
const data = {
|
|
170
|
+
lastSeenAt: OneUptimeDate.getCurrentDate(),
|
|
171
|
+
otelCollectorStatus: "connected",
|
|
172
|
+
};
|
|
173
|
+
if (extra === null || extra === void 0 ? void 0 : extra.pveVersion) {
|
|
174
|
+
data.pveVersion = extra.pveVersion;
|
|
175
|
+
}
|
|
176
|
+
if (extra === null || extra === void 0 ? void 0 : extra.agentVersion) {
|
|
177
|
+
data.agentVersion = extra.agentVersion;
|
|
178
|
+
}
|
|
179
|
+
// Counts: 0 is a legitimate value — gate on undefined, not falsiness.
|
|
180
|
+
if ((extra === null || extra === void 0 ? void 0 : extra.nodeCount) !== undefined) {
|
|
181
|
+
data.nodeCount = extra.nodeCount;
|
|
182
|
+
}
|
|
183
|
+
if ((extra === null || extra === void 0 ? void 0 : extra.onlineNodeCount) !== undefined) {
|
|
184
|
+
data.onlineNodeCount = extra.onlineNodeCount;
|
|
185
|
+
}
|
|
186
|
+
if ((extra === null || extra === void 0 ? void 0 : extra.guestCount) !== undefined) {
|
|
187
|
+
data.guestCount = extra.guestCount;
|
|
188
|
+
}
|
|
189
|
+
if ((extra === null || extra === void 0 ? void 0 : extra.storageCount) !== undefined) {
|
|
190
|
+
data.storageCount = extra.storageCount;
|
|
191
|
+
}
|
|
192
|
+
if ((extra === null || extra === void 0 ? void 0 : extra.guestsWithoutBackupCount) !== undefined) {
|
|
193
|
+
data.guestsWithoutBackupCount = extra.guestsWithoutBackupCount;
|
|
194
|
+
}
|
|
195
|
+
await this.updateOneById({
|
|
196
|
+
id: clusterId,
|
|
197
|
+
data: data,
|
|
198
|
+
props: {
|
|
199
|
+
isRoot: true,
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Additively attach labels to a Proxmox cluster. Existing labels are
|
|
205
|
+
* never removed — manual labels set via the UI survive ingest. The
|
|
206
|
+
* set of labelIds passed in is fingerprinted and cached for 60s so
|
|
207
|
+
* the common case (steady-state collector pushing the same label
|
|
208
|
+
* set every batch) costs one in-memory lookup, not a join-table
|
|
209
|
+
* scan.
|
|
210
|
+
*/
|
|
211
|
+
async attachLabels(data) {
|
|
212
|
+
var _a;
|
|
213
|
+
if (!data.labelIds || data.labelIds.length === 0) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
const cacheKey = data.proxmoxClusterId.toString();
|
|
217
|
+
const fingerprint = fingerprintLabelIds(data.labelIds);
|
|
218
|
+
const cached = await GlobalCache.getString(LABELS_APPLIED_CACHE_NAMESPACE, cacheKey);
|
|
219
|
+
if (cached === fingerprint) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
const proxmoxClusterIdStr = data.proxmoxClusterId.toString();
|
|
224
|
+
const existingLabels = await this.getRepository()
|
|
225
|
+
.createQueryBuilder()
|
|
226
|
+
.relation(Model, "labels")
|
|
227
|
+
.of(proxmoxClusterIdStr)
|
|
228
|
+
.loadMany();
|
|
229
|
+
const existingIds = new Set();
|
|
230
|
+
for (const lbl of existingLabels) {
|
|
231
|
+
const idStr = (_a = lbl._id) === null || _a === void 0 ? void 0 : _a.toString();
|
|
232
|
+
if (idStr) {
|
|
233
|
+
existingIds.add(idStr);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const toAddIds = [];
|
|
237
|
+
const seen = new Set();
|
|
238
|
+
for (const id of data.labelIds) {
|
|
239
|
+
const idStr = id.toString();
|
|
240
|
+
if (existingIds.has(idStr) || seen.has(idStr)) {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
seen.add(idStr);
|
|
244
|
+
toAddIds.push(idStr);
|
|
245
|
+
}
|
|
246
|
+
if (toAddIds.length > 0) {
|
|
247
|
+
await this.getRepository()
|
|
248
|
+
.createQueryBuilder()
|
|
249
|
+
.relation(Model, "labels")
|
|
250
|
+
.of(proxmoxClusterIdStr)
|
|
251
|
+
.add(toAddIds);
|
|
252
|
+
}
|
|
253
|
+
await GlobalCache.setString(LABELS_APPLIED_CACHE_NAMESPACE, cacheKey, fingerprint, { expiresInSeconds: LABELS_APPLIED_CACHE_TTL_SECONDS });
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
logger.warn(`ProxmoxClusterService.attachLabels failed for proxmox cluster ${data.proxmoxClusterId.toString()}: ${err instanceof Error ? err.message : String(err)}`);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async markDisconnectedClusters() {
|
|
260
|
+
/*
|
|
261
|
+
* Threshold must stay well above the 5-minute OTel ingest
|
|
262
|
+
* maintenance fence (MAINTENANCE_FENCE_TTL_SECONDS in
|
|
263
|
+
* OtelIngestBaseService) — lastSeenAt is legitimately up to
|
|
264
|
+
* ~5 minutes stale during continuous telemetry, so a threshold
|
|
265
|
+
* equal to the fence TTL flaps healthy resources. 15 minutes
|
|
266
|
+
* gives 3x headroom.
|
|
267
|
+
*/
|
|
268
|
+
const fifteenMinutesAgo = OneUptimeDate.addRemoveMinutes(OneUptimeDate.getCurrentDate(), -15);
|
|
269
|
+
const connectedClusters = await this.findBy({
|
|
270
|
+
query: {
|
|
271
|
+
otelCollectorStatus: "connected",
|
|
272
|
+
lastSeenAt: QueryHelper.lessThan(fifteenMinutesAgo),
|
|
273
|
+
},
|
|
274
|
+
select: {
|
|
275
|
+
_id: true,
|
|
276
|
+
},
|
|
277
|
+
limit: LIMIT_MAX,
|
|
278
|
+
skip: 0,
|
|
279
|
+
props: {
|
|
280
|
+
isRoot: true,
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
for (const cluster of connectedClusters) {
|
|
284
|
+
if (cluster._id) {
|
|
285
|
+
await this.updateOneById({
|
|
286
|
+
id: new ObjectID(cluster._id.toString()),
|
|
287
|
+
data: {
|
|
288
|
+
otelCollectorStatus: "disconnected",
|
|
289
|
+
},
|
|
290
|
+
props: {
|
|
291
|
+
isRoot: true,
|
|
292
|
+
},
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
__decorate([
|
|
299
|
+
CaptureSpan(),
|
|
300
|
+
__metadata("design:type", Function),
|
|
301
|
+
__metadata("design:paramtypes", [Object, Model]),
|
|
302
|
+
__metadata("design:returntype", Promise)
|
|
303
|
+
], Service.prototype, "onCreateSuccess", null);
|
|
304
|
+
__decorate([
|
|
305
|
+
CaptureSpan(),
|
|
306
|
+
__metadata("design:type", Function),
|
|
307
|
+
__metadata("design:paramtypes", [Object]),
|
|
308
|
+
__metadata("design:returntype", Promise)
|
|
309
|
+
], Service.prototype, "findOrCreateByName", null);
|
|
310
|
+
__decorate([
|
|
311
|
+
CaptureSpan(),
|
|
312
|
+
__metadata("design:type", Function),
|
|
313
|
+
__metadata("design:paramtypes", [ObjectID, Object]),
|
|
314
|
+
__metadata("design:returntype", Promise)
|
|
315
|
+
], Service.prototype, "updateLastSeen", null);
|
|
316
|
+
__decorate([
|
|
317
|
+
CaptureSpan(),
|
|
318
|
+
__metadata("design:type", Function),
|
|
319
|
+
__metadata("design:paramtypes", [Object]),
|
|
320
|
+
__metadata("design:returntype", Promise)
|
|
321
|
+
], Service.prototype, "attachLabels", null);
|
|
322
|
+
__decorate([
|
|
323
|
+
CaptureSpan(),
|
|
324
|
+
__metadata("design:type", Function),
|
|
325
|
+
__metadata("design:paramtypes", []),
|
|
326
|
+
__metadata("design:returntype", Promise)
|
|
327
|
+
], Service.prototype, "markDisconnectedClusters", null);
|
|
328
|
+
function fingerprintLabelIds(labelIds) {
|
|
329
|
+
const sorted = labelIds
|
|
330
|
+
.map((id) => {
|
|
331
|
+
return id.toString();
|
|
332
|
+
})
|
|
333
|
+
.sort();
|
|
334
|
+
return crypto.createHash("sha1").update(sorted.join(",")).digest("hex");
|
|
335
|
+
}
|
|
336
|
+
export default new Service();
|
|
337
|
+
//# sourceMappingURL=ProxmoxClusterService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProxmoxClusterService.js","sourceRoot":"","sources":["../../../../Server/Services/ProxmoxClusterService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import DatabaseService from "./DatabaseService";
|
|
11
|
+
import Model from "../../Models/DatabaseModels/ProxmoxResource";
|
|
12
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
13
|
+
import OneUptimeDate from "../../Types/Date";
|
|
14
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
15
|
+
import logger from "../Utils/Logger";
|
|
16
|
+
const UPSERT_BATCH_SIZE = 500;
|
|
17
|
+
const STALE_DELETE_WARN_THRESHOLD = 100;
|
|
18
|
+
/*
|
|
19
|
+
* Column order used by bulkUpsert() and its generated parameter tuples.
|
|
20
|
+
* Keep this and the INSERT column list in perfect sync.
|
|
21
|
+
*/
|
|
22
|
+
const UPSERT_COLUMNS = [
|
|
23
|
+
"projectId",
|
|
24
|
+
"proxmoxClusterId",
|
|
25
|
+
"kind",
|
|
26
|
+
"externalId",
|
|
27
|
+
"name",
|
|
28
|
+
"vmid",
|
|
29
|
+
"guestType",
|
|
30
|
+
"parentNodeName",
|
|
31
|
+
"isUp",
|
|
32
|
+
"haState",
|
|
33
|
+
"onboot",
|
|
34
|
+
"isBackedUp",
|
|
35
|
+
"uptimeSeconds",
|
|
36
|
+
"lastSeenAt",
|
|
37
|
+
"version",
|
|
38
|
+
];
|
|
39
|
+
export class Service extends DatabaseService {
|
|
40
|
+
constructor() {
|
|
41
|
+
super(Model);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Upsert a batch of parsed resources for a single (project, cluster)
|
|
45
|
+
* pair. Uses ON CONFLICT on the UNIQUE (projectId, proxmoxClusterId,
|
|
46
|
+
* kind, externalId) index with a dominance guard on lastSeenAt so
|
|
47
|
+
* out-of-order ingest never regresses a newer snapshot.
|
|
48
|
+
*
|
|
49
|
+
* Identity/status columns COALESCE against the existing row (unlike
|
|
50
|
+
* the K8s upsert, which overwrites): a pve-exporter batch is usually
|
|
51
|
+
* a complete scrape, but a batch that happens to lack an info series
|
|
52
|
+
* (e.g. only pve_up made it through a pipeline filter) must not blank
|
|
53
|
+
* name/vmid/haState that an earlier batch already filled.
|
|
54
|
+
*/
|
|
55
|
+
async bulkUpsert(data) {
|
|
56
|
+
if (data.resources.length === 0) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Chunk to keep individual statement parameter counts reasonable.
|
|
60
|
+
for (let i = 0; i < data.resources.length; i += UPSERT_BATCH_SIZE) {
|
|
61
|
+
const chunk = data.resources.slice(i, i + UPSERT_BATCH_SIZE);
|
|
62
|
+
const valueFragments = [];
|
|
63
|
+
const params = [];
|
|
64
|
+
let paramIndex = 1;
|
|
65
|
+
for (const r of chunk) {
|
|
66
|
+
const placeholders = [];
|
|
67
|
+
for (let c = 0; c < UPSERT_COLUMNS.length; c++) {
|
|
68
|
+
placeholders.push(`$${paramIndex++}`);
|
|
69
|
+
}
|
|
70
|
+
valueFragments.push(`(${placeholders.join(", ")})`);
|
|
71
|
+
params.push(data.projectId.toString(), data.proxmoxClusterId.toString(), r.kind, r.externalId, r.name, r.vmid, r.guestType, r.parentNodeName, r.isUp, r.haState, r.onboot, r.isBackedUp, r.uptimeSeconds !== null ? Math.trunc(r.uptimeSeconds) : null, r.lastSeenAt, 0);
|
|
72
|
+
}
|
|
73
|
+
const sql = `
|
|
74
|
+
INSERT INTO "ProxmoxResource" (
|
|
75
|
+
"projectId", "proxmoxClusterId", "kind", "externalId",
|
|
76
|
+
"name", "vmid", "guestType", "parentNodeName",
|
|
77
|
+
"isUp", "haState", "onboot", "isBackedUp", "uptimeSeconds",
|
|
78
|
+
"lastSeenAt", "version"
|
|
79
|
+
)
|
|
80
|
+
VALUES ${valueFragments.join(", ")}
|
|
81
|
+
ON CONFLICT ("projectId", "proxmoxClusterId", "kind", "externalId")
|
|
82
|
+
DO UPDATE SET
|
|
83
|
+
"name" = COALESCE(EXCLUDED."name", "ProxmoxResource"."name"),
|
|
84
|
+
"vmid" = COALESCE(EXCLUDED."vmid", "ProxmoxResource"."vmid"),
|
|
85
|
+
"guestType" = COALESCE(EXCLUDED."guestType", "ProxmoxResource"."guestType"),
|
|
86
|
+
"parentNodeName" = COALESCE(EXCLUDED."parentNodeName", "ProxmoxResource"."parentNodeName"),
|
|
87
|
+
"isUp" = COALESCE(EXCLUDED."isUp", "ProxmoxResource"."isUp"),
|
|
88
|
+
"haState" = COALESCE(EXCLUDED."haState", "ProxmoxResource"."haState"),
|
|
89
|
+
"onboot" = COALESCE(EXCLUDED."onboot", "ProxmoxResource"."onboot"),
|
|
90
|
+
"isBackedUp" = COALESCE(EXCLUDED."isBackedUp", "ProxmoxResource"."isBackedUp"),
|
|
91
|
+
"uptimeSeconds" = COALESCE(EXCLUDED."uptimeSeconds", "ProxmoxResource"."uptimeSeconds"),
|
|
92
|
+
"lastSeenAt" = EXCLUDED."lastSeenAt",
|
|
93
|
+
"updatedAt" = now()
|
|
94
|
+
WHERE EXCLUDED."lastSeenAt" >= "ProxmoxResource"."lastSeenAt"
|
|
95
|
+
`;
|
|
96
|
+
await this.getRepository().manager.query(sql, params);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Update the latest-metric mirror columns for a batch of resources.
|
|
101
|
+
* Plain UPDATE: in practice the row always exists because bulkUpsert
|
|
102
|
+
* runs in the same flush; if it somehow doesn't, the write is
|
|
103
|
+
* silently skipped and the next flush catches up.
|
|
104
|
+
*
|
|
105
|
+
* Guarded by metricsUpdatedAt so out-of-order points don't regress a
|
|
106
|
+
* newer observation. COALESCE keeps the existing value when a batch
|
|
107
|
+
* lacks a series — notably latestDiskBytes stays NULL (never 0) for
|
|
108
|
+
* qemu guests without the QEMU guest agent.
|
|
109
|
+
*/
|
|
110
|
+
async bulkUpdateLatestMetrics(data) {
|
|
111
|
+
if (data.metrics.length === 0) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
for (let i = 0; i < data.metrics.length; i += UPSERT_BATCH_SIZE) {
|
|
115
|
+
const chunk = data.metrics.slice(i, i + UPSERT_BATCH_SIZE);
|
|
116
|
+
const valueFragments = [];
|
|
117
|
+
const params = [
|
|
118
|
+
data.projectId.toString(),
|
|
119
|
+
data.proxmoxClusterId.toString(),
|
|
120
|
+
];
|
|
121
|
+
let paramIndex = 3;
|
|
122
|
+
for (const m of chunk) {
|
|
123
|
+
valueFragments.push(`($${paramIndex++}, $${paramIndex++}, $${paramIndex++}::numeric, $${paramIndex++}::bigint, $${paramIndex++}::bigint, $${paramIndex++}::numeric, $${paramIndex++}::bigint, $${paramIndex++}::bigint, $${paramIndex++}::timestamptz)`);
|
|
124
|
+
params.push(m.kind, m.externalId, m.cpuPercent !== null && m.cpuPercent !== undefined
|
|
125
|
+
? m.cpuPercent
|
|
126
|
+
: null, m.memoryBytes !== null && m.memoryBytes !== undefined
|
|
127
|
+
? Math.trunc(m.memoryBytes).toString()
|
|
128
|
+
: null, m.maxMemoryBytes !== null && m.maxMemoryBytes !== undefined
|
|
129
|
+
? Math.trunc(m.maxMemoryBytes).toString()
|
|
130
|
+
: null, m.memoryPercent !== null && m.memoryPercent !== undefined
|
|
131
|
+
? m.memoryPercent
|
|
132
|
+
: null, m.diskBytes !== null && m.diskBytes !== undefined
|
|
133
|
+
? Math.trunc(m.diskBytes).toString()
|
|
134
|
+
: null, m.maxDiskBytes !== null && m.maxDiskBytes !== undefined
|
|
135
|
+
? Math.trunc(m.maxDiskBytes).toString()
|
|
136
|
+
: null, m.observedAt);
|
|
137
|
+
}
|
|
138
|
+
const sql = `
|
|
139
|
+
UPDATE "ProxmoxResource" AS p
|
|
140
|
+
SET
|
|
141
|
+
"latestCpuPercent" = COALESCE(v."cpu", p."latestCpuPercent"),
|
|
142
|
+
"latestMemoryBytes" = COALESCE(v."mem", p."latestMemoryBytes"),
|
|
143
|
+
"maxMemoryBytes" = COALESCE(v."maxMem", p."maxMemoryBytes"),
|
|
144
|
+
"latestMemoryPercent" = COALESCE(v."memPct", p."latestMemoryPercent"),
|
|
145
|
+
"latestDiskBytes" = COALESCE(v."disk", p."latestDiskBytes"),
|
|
146
|
+
"maxDiskBytes" = COALESCE(v."maxDisk", p."maxDiskBytes"),
|
|
147
|
+
"metricsUpdatedAt" = v."observedAt",
|
|
148
|
+
"updatedAt" = now()
|
|
149
|
+
FROM (VALUES ${valueFragments.join(", ")})
|
|
150
|
+
AS v("kind", "externalId", "cpu", "mem", "maxMem", "memPct", "disk", "maxDisk", "observedAt")
|
|
151
|
+
WHERE
|
|
152
|
+
p."projectId" = $1
|
|
153
|
+
AND p."proxmoxClusterId" = $2
|
|
154
|
+
AND p."kind" = v."kind"
|
|
155
|
+
AND p."externalId" = v."externalId"
|
|
156
|
+
AND (p."metricsUpdatedAt" IS NULL OR v."observedAt" >= p."metricsUpdatedAt")
|
|
157
|
+
`;
|
|
158
|
+
await this.getRepository().manager.query(sql, params);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Hard-delete all resources in a cluster whose last scrape is older
|
|
163
|
+
* than olderThan. Returns the number of deleted rows. Only called by
|
|
164
|
+
* the cleanup worker for clusters that are still connected — a
|
|
165
|
+
* disconnected cluster keeps its last-known inventory.
|
|
166
|
+
*/
|
|
167
|
+
async deleteStaleForCluster(data) {
|
|
168
|
+
const result = await this.getRepository().manager.query(`DELETE FROM "ProxmoxResource" WHERE "proxmoxClusterId" = $1 AND "lastSeenAt" < $2`, [data.proxmoxClusterId.toString(), data.olderThan]);
|
|
169
|
+
// Postgres driver returns [rows, affected] for DELETE — normalize.
|
|
170
|
+
let affected = 0;
|
|
171
|
+
if (Array.isArray(result) && result.length >= 2) {
|
|
172
|
+
const second = result[1];
|
|
173
|
+
if (typeof second === "number") {
|
|
174
|
+
affected = second;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (affected > STALE_DELETE_WARN_THRESHOLD) {
|
|
178
|
+
logger.warn(`ProxmoxResource cleanup deleted ${affected} stale rows for cluster ${data.proxmoxClusterId.toString()} — larger than expected; investigate agent health.`);
|
|
179
|
+
}
|
|
180
|
+
return affected;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Compute the sidebar/overview summary in Postgres: counts per kind
|
|
184
|
+
* plus the online/running breakdowns, in a single round-trip.
|
|
185
|
+
*/
|
|
186
|
+
async getInventorySummary(data) {
|
|
187
|
+
const rows = await this.getRepository().manager.query(`SELECT "kind",
|
|
188
|
+
COUNT(*)::text AS count,
|
|
189
|
+
COUNT(*) FILTER (WHERE "isUp" IS TRUE)::text AS "upCount"
|
|
190
|
+
FROM "ProxmoxResource"
|
|
191
|
+
WHERE "projectId" = $1 AND "proxmoxClusterId" = $2 AND "deletedAt" IS NULL
|
|
192
|
+
GROUP BY "kind"`, [data.projectId.toString(), data.proxmoxClusterId.toString()]);
|
|
193
|
+
const countsByKind = {};
|
|
194
|
+
let nodeOnlineCount = 0;
|
|
195
|
+
let guestRunningCount = 0;
|
|
196
|
+
for (const row of rows) {
|
|
197
|
+
countsByKind[row.kind] = parseInt(row.count, 10) || 0;
|
|
198
|
+
if (row.kind === "Node") {
|
|
199
|
+
nodeOnlineCount = parseInt(row.upCount, 10) || 0;
|
|
200
|
+
}
|
|
201
|
+
if (row.kind === "Guest") {
|
|
202
|
+
guestRunningCount = parseInt(row.upCount, 10) || 0;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
countsByKind,
|
|
207
|
+
nodeOnlineCount,
|
|
208
|
+
guestRunningCount,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Host cross-link heuristic (WI-17): resolve the cluster a guest
|
|
213
|
+
* with this name belongs to. Case-insensitive — host.name casing
|
|
214
|
+
* (canonicalized at ingest) rarely matches the PVE guest name's
|
|
215
|
+
* casing exactly. Returns null when no guest matches.
|
|
216
|
+
*/
|
|
217
|
+
async findGuestClusterIdByName(data) {
|
|
218
|
+
const guest = await this.findOneBy({
|
|
219
|
+
query: {
|
|
220
|
+
projectId: data.projectId,
|
|
221
|
+
kind: "Guest",
|
|
222
|
+
name: QueryHelper.findWithSameText(data.name),
|
|
223
|
+
},
|
|
224
|
+
select: {
|
|
225
|
+
_id: true,
|
|
226
|
+
proxmoxClusterId: true,
|
|
227
|
+
},
|
|
228
|
+
props: {
|
|
229
|
+
isRoot: true,
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
return (guest === null || guest === void 0 ? void 0 : guest.proxmoxClusterId) || null;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Helper for the cleanup worker: snapshot-interval aware cutoff.
|
|
236
|
+
* 3× the 5-minute scrape interval by default. Tune via
|
|
237
|
+
* PVE_INVENTORY_STALE_MINUTES (min 5).
|
|
238
|
+
*/
|
|
239
|
+
getStaleThresholdDate(nowOverride) {
|
|
240
|
+
const minutes = this.getStaleThresholdMinutes();
|
|
241
|
+
return OneUptimeDate.addRemoveMinutes(nowOverride || OneUptimeDate.getCurrentDate(), -minutes);
|
|
242
|
+
}
|
|
243
|
+
getStaleThresholdMinutes() {
|
|
244
|
+
const raw = process.env["PVE_INVENTORY_STALE_MINUTES"];
|
|
245
|
+
if (raw) {
|
|
246
|
+
const parsed = parseInt(raw, 10);
|
|
247
|
+
if (!isNaN(parsed) && parsed >= 5) {
|
|
248
|
+
return parsed;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return 15;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
__decorate([
|
|
255
|
+
CaptureSpan(),
|
|
256
|
+
__metadata("design:type", Function),
|
|
257
|
+
__metadata("design:paramtypes", [Object]),
|
|
258
|
+
__metadata("design:returntype", Promise)
|
|
259
|
+
], Service.prototype, "bulkUpsert", null);
|
|
260
|
+
__decorate([
|
|
261
|
+
CaptureSpan(),
|
|
262
|
+
__metadata("design:type", Function),
|
|
263
|
+
__metadata("design:paramtypes", [Object]),
|
|
264
|
+
__metadata("design:returntype", Promise)
|
|
265
|
+
], Service.prototype, "bulkUpdateLatestMetrics", null);
|
|
266
|
+
__decorate([
|
|
267
|
+
CaptureSpan(),
|
|
268
|
+
__metadata("design:type", Function),
|
|
269
|
+
__metadata("design:paramtypes", [Object]),
|
|
270
|
+
__metadata("design:returntype", Promise)
|
|
271
|
+
], Service.prototype, "deleteStaleForCluster", null);
|
|
272
|
+
__decorate([
|
|
273
|
+
CaptureSpan(),
|
|
274
|
+
__metadata("design:type", Function),
|
|
275
|
+
__metadata("design:paramtypes", [Object]),
|
|
276
|
+
__metadata("design:returntype", Promise)
|
|
277
|
+
], Service.prototype, "getInventorySummary", null);
|
|
278
|
+
__decorate([
|
|
279
|
+
CaptureSpan(),
|
|
280
|
+
__metadata("design:type", Function),
|
|
281
|
+
__metadata("design:paramtypes", [Object]),
|
|
282
|
+
__metadata("design:returntype", Promise)
|
|
283
|
+
], Service.prototype, "findGuestClusterIdByName", null);
|
|
284
|
+
export default new Service();
|
|
285
|
+
//# sourceMappingURL=ProxmoxResourceService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProxmoxResourceService.js","sourceRoot":"","sources":["../../../../Server/Services/ProxmoxResourceService.ts"],"names":[],"mappings":"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"}
|