@oneuptime/common 11.0.1 → 11.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Alert.ts +276 -0
- package/Models/DatabaseModels/AlertLabelRule.ts +38 -0
- package/Models/DatabaseModels/AlertOwnerRule.ts +38 -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/DockerSwarmCluster.ts +989 -0
- package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +514 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +596 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +487 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +486 -0
- package/Models/DatabaseModels/DockerSwarmResource.ts +750 -0
- package/Models/DatabaseModels/Host.ts +64 -0
- package/Models/DatabaseModels/Incident.ts +276 -0
- package/Models/DatabaseModels/IncidentLabelRule.ts +38 -0
- package/Models/DatabaseModels/IncidentOwnerRule.ts +38 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +56 -0
- package/Models/DatabaseModels/Index.ts +48 -0
- package/Models/DatabaseModels/PodmanHost.ts +859 -0
- package/Models/DatabaseModels/PodmanHostLabelRule.ts +514 -0
- package/Models/DatabaseModels/PodmanHostOwnerRule.ts +596 -0
- package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +487 -0
- package/Models/DatabaseModels/PodmanHostOwnerUser.ts +486 -0
- package/Models/DatabaseModels/PodmanResource.ts +498 -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 +220 -0
- package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +38 -0
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +38 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +56 -0
- package/Models/DatabaseModels/TelemetryException.ts +2 -0
- package/Server/API/BillingInvoiceAPI.ts +47 -7
- package/Server/API/CephResourceAPI.ts +134 -0
- package/Server/API/DashboardAPI.ts +135 -0
- package/Server/API/DockerSwarmResourceAPI.ts +137 -0
- package/Server/API/ProjectAPI.ts +15 -0
- package/Server/API/ProxmoxResourceAPI.ts +132 -0
- package/Server/API/ResellerPlanAPI.ts +17 -0
- package/Server/API/TelemetryAPI.ts +8 -1
- package/Server/Infrastructure/GlobalCache.ts +8 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781500000000-AddProxmoxAndCephClusterTables.ts +163 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781587937032-MigrationName.ts +3199 -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 +10 -0
- package/Server/Infrastructure/Redis.ts +40 -12
- package/Server/Services/AlertLabelRuleEngineService.ts +29 -0
- package/Server/Services/AlertOwnerRuleEngineService.ts +67 -0
- 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/DockerSwarmClusterLabelRuleEngineService.ts +214 -0
- package/Server/Services/DockerSwarmClusterLabelRuleService.ts +14 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +232 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleService.ts +14 -0
- package/Server/Services/DockerSwarmClusterOwnerTeamService.ts +10 -0
- package/Server/Services/DockerSwarmClusterOwnerUserService.ts +10 -0
- package/Server/Services/DockerSwarmClusterService.ts +404 -0
- package/Server/Services/DockerSwarmResourceService.ts +381 -0
- package/Server/Services/ExceptionAggregationService.ts +3 -0
- package/Server/Services/HostService.ts +11 -3
- package/Server/Services/IncidentLabelRuleEngineService.ts +27 -0
- package/Server/Services/IncidentOwnerRuleEngineService.ts +67 -0
- package/Server/Services/IncidentService.ts +11 -0
- package/Server/Services/Index.ts +38 -0
- package/Server/Services/KubernetesClusterService.ts +11 -3
- package/Server/Services/LogAggregationService.ts +3 -0
- package/Server/Services/MetricAggregationService.ts +3 -0
- package/Server/Services/OpenTelemetryIngestService.ts +73 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +198 -0
- package/Server/Services/PodmanHostLabelRuleService.ts +14 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +216 -0
- package/Server/Services/PodmanHostOwnerRuleService.ts +14 -0
- package/Server/Services/PodmanHostOwnerTeamService.ts +10 -0
- package/Server/Services/PodmanHostOwnerUserService.ts +10 -0
- package/Server/Services/PodmanHostService.ts +368 -0
- package/Server/Services/PodmanResourceService.ts +310 -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/ScheduledMaintenanceLabelRuleEngineService.ts +29 -0
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +67 -0
- package/Server/Services/ServerlessFunctionService.ts +11 -3
- package/Server/Services/TelemetryUsageBillingService.ts +59 -3
- package/Server/Services/TraceAggregationService.ts +3 -0
- package/Server/Types/AnalyticsDatabase/AggregateBy.ts +8 -23
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +13 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +55 -0
- package/Server/Utils/Monitor/MonitorClusterContext.ts +158 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +650 -4
- package/Server/Utils/Monitor/MonitorIncident.ts +175 -7
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +56 -6
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +6 -1
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +59 -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/ResourceFacetResolver.ts +49 -0
- package/Server/Utils/Telemetry/Telemetry.ts +10 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +107 -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 +14 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +879 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +196 -0
- package/Tests/Types/DockerSwarm/DockerSwarmInventoryExtractor.test.ts +667 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +1231 -0
- package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +528 -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 +11 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +4 -0
- package/Types/Dashboard/DashboardComponents/DashboardCephOsdListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardCephPoolListComponent.ts +14 -0
- package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.ts +17 -0
- package/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.ts +17 -0
- package/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.ts +16 -0
- package/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.ts +16 -0
- package/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.ts +15 -0
- package/Types/Dashboard/DashboardComponents/DashboardProxmoxGuestListComponent.ts +17 -0
- package/Types/Dashboard/DashboardComponents/DashboardProxmoxNodeListComponent.ts +16 -0
- package/Types/Dashboard/DashboardTemplates.ts +640 -0
- package/Types/DockerSwarm/DockerSwarmInventoryExtractor.ts +452 -0
- package/Types/Icon/IconProp.ts +3 -0
- package/Types/Monitor/CephAlertTemplates.ts +1647 -0
- package/Types/Monitor/CephMetricCatalog.ts +409 -0
- package/Types/Monitor/DockerSwarmAlertTemplates.ts +461 -0
- package/Types/Monitor/DockerSwarmMetricCatalog.ts +139 -0
- package/Types/Monitor/HostAlertTemplates.ts +455 -0
- package/Types/Monitor/HostMetricCatalog.ts +177 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +65 -0
- package/Types/Monitor/MonitorStep.ts +163 -0
- package/Types/Monitor/MonitorStepCephMonitor.ts +57 -0
- package/Types/Monitor/MonitorStepDockerSwarmMonitor.ts +74 -0
- package/Types/Monitor/MonitorStepHostMonitor.ts +30 -0
- package/Types/Monitor/MonitorStepPodmanMonitor.ts +38 -0
- package/Types/Monitor/MonitorStepProxmoxMonitor.ts +81 -0
- package/Types/Monitor/MonitorType.ts +71 -1
- package/Types/Monitor/PodmanAlertTemplates.ts +507 -0
- package/Types/Monitor/PodmanMetricCatalog.ts +226 -0
- package/Types/Monitor/ProxmoxAlertTemplates.ts +899 -0
- package/Types/Monitor/ProxmoxMetricCatalog.ts +382 -0
- package/Types/Permission.ts +1029 -104
- package/Types/Podman/PodmanInventoryExtractor.ts +343 -0
- package/Types/Telemetry/EntityType.ts +23 -0
- package/Types/Telemetry/ServiceType.ts +4 -0
- package/UI/Components/Icon/Icon.tsx +141 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +44 -1
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +28 -0
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +15 -5
- package/UI/Utils/Telemetry/Telemetry.ts +16 -21
- package/UI/Utils/TelemetryService.ts +8 -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/DashboardDockerSwarmNodeListComponent.ts +70 -0
- package/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.ts +61 -0
- package/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.ts +71 -0
- package/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.ts +100 -0
- package/Utils/Dashboard/Components/DashboardPodmanHostListComponent.ts +88 -0
- package/Utils/Dashboard/Components/DashboardPodmanImageListComponent.ts +97 -0
- package/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.ts +87 -0
- package/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.ts +87 -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 +79 -0
- package/Utils/Telemetry/EntityKey.ts +53 -0
- package/Utils/Telemetry/EntityRelationship.ts +6 -0
- package/Utils/Telemetry/HeartbeatAvailability.ts +262 -0
- package/build/dist/Models/DatabaseModels/Alert.js +270 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js +39 -0
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +39 -0
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.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/DockerSwarmCluster.js +1018 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmResource.js +787 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmResource.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 +270 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +39 -0
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +39 -0
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +54 -0
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +48 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHost.js +885 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanResource.js +526 -0
- package/build/dist/Models/DatabaseModels/PodmanResource.js.map +1 -0
- 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 +216 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +39 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +39 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.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 +135 -0
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DockerSwarmResourceAPI.js +100 -0
- package/build/dist/Server/API/DockerSwarmResourceAPI.js.map +1 -0
- 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/API/TelemetryAPI.js +8 -1
- package/build/dist/Server/API/TelemetryAPI.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/1781587937032-MigrationName.js +1100 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781587937032-MigrationName.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 +10 -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/AlertLabelRuleEngineService.js +30 -4
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +62 -5
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.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/DockerSwarmClusterLabelRuleEngineService.js +168 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js +13 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +188 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js +9 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js +353 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -0
- package/build/dist/Server/Services/DockerSwarmResourceService.js +258 -0
- package/build/dist/Server/Services/DockerSwarmResourceService.js.map +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js +3 -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/IncidentLabelRuleEngineService.js +28 -4
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +62 -5
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +8 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +38 -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 +3 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +3 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +69 -9
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +166 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleService.js +13 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +186 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/PodmanHostOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js +9 -0
- package/build/dist/Server/Services/PodmanHostOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/PodmanHostService.js +319 -0
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -0
- package/build/dist/Server/Services/PodmanResourceService.js +196 -0
- package/build/dist/Server/Services/PodmanResourceService.js.map +1 -0
- 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/ScheduledMaintenanceLabelRuleEngineService.js +30 -4
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +62 -5
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.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 +43 -3
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +3 -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/Types/Database/Permissions/OwnerTableRegistry.js +13 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +44 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +118 -0
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +422 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +137 -8
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +32 -6
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +6 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +39 -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/ResourceFacetResolver.js +30 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +6 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +80 -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 +11 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +4 -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/DashboardDockerSwarmNodeListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmNodeListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardDockerSwarmServiceListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanContainerListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanHostListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanImageListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanNetworkListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardPodmanVolumeListComponent.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 +562 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js +359 -0
- package/build/dist/Types/DockerSwarm/DockerSwarmInventoryExtractor.js.map +1 -0
- package/build/dist/Types/Icon/IconProp.js +3 -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/DockerSwarmAlertTemplates.js +358 -0
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js +103 -0
- package/build/dist/Types/Monitor/DockerSwarmMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/HostAlertTemplates.js +365 -0
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/HostMetricCatalog.js +138 -0
- package/build/dist/Types/Monitor/HostMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStep.js +115 -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/MonitorStepDockerSwarmMonitor.js +21 -0
- package/build/dist/Types/Monitor/MonitorStepDockerSwarmMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepHostMonitor.js +20 -0
- package/build/dist/Types/Monitor/MonitorStepHostMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.js +21 -0
- package/build/dist/Types/Monitor/MonitorStepPodmanMonitor.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 +66 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +410 -0
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/PodmanMetricCatalog.js +192 -0
- package/build/dist/Types/Monitor/PodmanMetricCatalog.js.map +1 -0
- 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 +824 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Podman/PodmanInventoryExtractor.js +293 -0
- package/build/dist/Types/Podman/PodmanInventoryExtractor.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +23 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +4 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +49 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +30 -2
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +22 -0
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +11 -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 +6 -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/DashboardDockerSwarmNodeListComponent.js +55 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmNodeListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js +46 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmResourceListShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js +55 -0
- package/build/dist/Utils/Dashboard/Components/DashboardDockerSwarmServiceListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js +77 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanContainerListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js +71 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanHostListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js +77 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanImageListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js +68 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanNetworkListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.js +68 -0
- package/build/dist/Utils/Dashboard/Components/DashboardPodmanVolumeListComponent.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 +44 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityKey.js +41 -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
|
@@ -32,6 +32,18 @@ describe("inferRelationshipType", () => {
|
|
|
32
32
|
).toBe(EntityRelationshipType.InstanceOf);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
|
+
test("infers the proxmox topology (node → cluster, guest → node/cluster)", () => {
|
|
36
|
+
expect(
|
|
37
|
+
inferRelationshipType(EntityType.ProxmoxNode, EntityType.ProxmoxCluster),
|
|
38
|
+
).toBe(EntityRelationshipType.MemberOf);
|
|
39
|
+
expect(
|
|
40
|
+
inferRelationshipType(EntityType.ProxmoxGuest, EntityType.ProxmoxNode),
|
|
41
|
+
).toBe(EntityRelationshipType.RunsOn);
|
|
42
|
+
expect(
|
|
43
|
+
inferRelationshipType(EntityType.ProxmoxGuest, EntityType.ProxmoxCluster),
|
|
44
|
+
).toBe(EntityRelationshipType.MemberOf);
|
|
45
|
+
});
|
|
46
|
+
|
|
35
47
|
test("is directional (the reverse pair yields nothing)", () => {
|
|
36
48
|
expect(
|
|
37
49
|
inferRelationshipType(
|
|
@@ -42,6 +54,9 @@ describe("inferRelationshipType", () => {
|
|
|
42
54
|
expect(
|
|
43
55
|
inferRelationshipType(EntityType.Host, EntityType.Service),
|
|
44
56
|
).toBeNull();
|
|
57
|
+
expect(
|
|
58
|
+
inferRelationshipType(EntityType.ProxmoxCluster, EntityType.ProxmoxNode),
|
|
59
|
+
).toBeNull();
|
|
45
60
|
});
|
|
46
61
|
|
|
47
62
|
test("unrelated or self type pairs yield null", () => {
|
|
@@ -51,6 +66,17 @@ describe("inferRelationshipType", () => {
|
|
|
51
66
|
expect(
|
|
52
67
|
inferRelationshipType(EntityType.Service, EntityType.Service),
|
|
53
68
|
).toBeNull();
|
|
69
|
+
/*
|
|
70
|
+
* Deliberately absent (mirrors the missing host|k8s.cluster rule): a
|
|
71
|
+
* resource carrying both host.* and proxmox/ceph cluster attributes
|
|
72
|
+
* does not imply the host is a member of that cluster.
|
|
73
|
+
*/
|
|
74
|
+
expect(
|
|
75
|
+
inferRelationshipType(EntityType.Host, EntityType.ProxmoxCluster),
|
|
76
|
+
).toBeNull();
|
|
77
|
+
expect(
|
|
78
|
+
inferRelationshipType(EntityType.Host, EntityType.CephCluster),
|
|
79
|
+
).toBeNull();
|
|
54
80
|
});
|
|
55
81
|
|
|
56
82
|
test("depends-on is never inferred from co-occurrence (span-derived only)", () => {
|
|
@@ -127,6 +153,29 @@ describe("deriveRelationships", () => {
|
|
|
127
153
|
);
|
|
128
154
|
});
|
|
129
155
|
|
|
156
|
+
test("derives the full directed edge set for a proxmox resource", () => {
|
|
157
|
+
const edges: Array<EntityRelationshipEdge> = deriveRelationships([
|
|
158
|
+
{ entityType: EntityType.ProxmoxCluster, entityKey: "cluster" },
|
|
159
|
+
{ entityType: EntityType.ProxmoxNode, entityKey: "node" },
|
|
160
|
+
{ entityType: EntityType.ProxmoxGuest, entityKey: "guest" },
|
|
161
|
+
]);
|
|
162
|
+
|
|
163
|
+
expect(
|
|
164
|
+
hasEdge(edges, "node", "cluster", EntityRelationshipType.MemberOf),
|
|
165
|
+
).toBe(true);
|
|
166
|
+
expect(hasEdge(edges, "guest", "node", EntityRelationshipType.RunsOn)).toBe(
|
|
167
|
+
true,
|
|
168
|
+
);
|
|
169
|
+
expect(
|
|
170
|
+
hasEdge(edges, "guest", "cluster", EntityRelationshipType.MemberOf),
|
|
171
|
+
).toBe(true);
|
|
172
|
+
// No reverse edge.
|
|
173
|
+
expect(
|
|
174
|
+
hasEdge(edges, "cluster", "node", EntityRelationshipType.MemberOf),
|
|
175
|
+
).toBe(false);
|
|
176
|
+
expect(edges.length).toBe(3);
|
|
177
|
+
});
|
|
178
|
+
|
|
130
179
|
test("empty / single-entity sets produce no edges", () => {
|
|
131
180
|
expect(deriveRelationships([])).toEqual([]);
|
|
132
181
|
expect(
|
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import AggregatedModel from "../../../Types/BaseDatabase/AggregatedModel";
|
|
2
|
+
import HeartbeatAvailabilityUtil, {
|
|
3
|
+
HEARTBEAT_INGEST_LAG_MS,
|
|
4
|
+
HeartbeatAvailabilityResult,
|
|
5
|
+
} from "../../../Utils/Telemetry/HeartbeatAvailability";
|
|
6
|
+
import { describe, expect, test } from "@jest/globals";
|
|
7
|
+
|
|
8
|
+
const MINUTE: number = 60_000;
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* All scenarios use a fixed wall clock and a 30-minute window ending
|
|
12
|
+
* at `now` — the Host overview page's default — unless stated
|
|
13
|
+
* otherwise. The server grid for a <=3h window is 1-minute buckets
|
|
14
|
+
* aligned to minute boundaries, so rows are minute-aligned here too.
|
|
15
|
+
*/
|
|
16
|
+
const NOW: Date = new Date("2026-06-13T10:30:30.000Z");
|
|
17
|
+
const WINDOW_START: Date = new Date(NOW.getTime() - 30 * MINUTE);
|
|
18
|
+
|
|
19
|
+
function row(timestamp: Date, count: number = 2): AggregatedModel {
|
|
20
|
+
return { timestamp, value: count } as AggregatedModel;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function minuteRows(
|
|
24
|
+
from: Date,
|
|
25
|
+
minutes: Array<number>,
|
|
26
|
+
): Array<AggregatedModel> {
|
|
27
|
+
const base: number = Math.floor(from.getTime() / MINUTE) * MINUTE;
|
|
28
|
+
return minutes.map((m: number): AggregatedModel => {
|
|
29
|
+
return row(new Date(base + m * MINUTE));
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function build(
|
|
34
|
+
heartbeatData: Array<AggregatedModel>,
|
|
35
|
+
windowStart: Date = WINDOW_START,
|
|
36
|
+
windowEnd: Date = NOW,
|
|
37
|
+
now: Date = NOW,
|
|
38
|
+
): HeartbeatAvailabilityResult {
|
|
39
|
+
return HeartbeatAvailabilityUtil.buildAvailabilitySeries({
|
|
40
|
+
heartbeatData,
|
|
41
|
+
windowStart,
|
|
42
|
+
windowEnd,
|
|
43
|
+
now,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function downPoints(result: HeartbeatAvailabilityResult): Array<number> {
|
|
48
|
+
return result.points
|
|
49
|
+
.filter((p: { x: Date; y: number }) => {
|
|
50
|
+
return p.y === 0;
|
|
51
|
+
})
|
|
52
|
+
.map((p: { x: Date; y: number }) => {
|
|
53
|
+
return p.x.getTime();
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
describe("HeartbeatAvailabilityUtil.buildAvailabilitySeries", () => {
|
|
58
|
+
test("healthy host with a heartbeat in every complete bucket is 100% with no down points", () => {
|
|
59
|
+
/*
|
|
60
|
+
* Window start 10:00:30 → first complete bucket is 10:01. Evaluable
|
|
61
|
+
* end is 10:29:30 (now - lag) → last evaluable-complete bucket is
|
|
62
|
+
* 10:28. Provide rows for every minute bucket in range.
|
|
63
|
+
*/
|
|
64
|
+
const rows: Array<AggregatedModel> = minuteRows(
|
|
65
|
+
WINDOW_START,
|
|
66
|
+
Array.from({ length: 31 }, (_: unknown, i: number) => {
|
|
67
|
+
return i;
|
|
68
|
+
}),
|
|
69
|
+
);
|
|
70
|
+
const result: HeartbeatAvailabilityResult = build(rows);
|
|
71
|
+
expect(result.uptimePercent).toBe(100);
|
|
72
|
+
expect(downPoints(result)).toHaveLength(0);
|
|
73
|
+
expect(result.points.length).toBeGreaterThan(25);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("silent in-progress trailing bucket is excluded, not rendered as down", () => {
|
|
77
|
+
/*
|
|
78
|
+
* Rows for every bucket EXCEPT the in-progress one (10:30) and the
|
|
79
|
+
* lag-shadowed one (10:29). The old implementation rendered those
|
|
80
|
+
* as 0% and the uptime badge flapped to ~96% on every refresh.
|
|
81
|
+
*/
|
|
82
|
+
const rows: Array<AggregatedModel> = minuteRows(
|
|
83
|
+
WINDOW_START,
|
|
84
|
+
Array.from({ length: 29 }, (_: unknown, i: number) => {
|
|
85
|
+
return i;
|
|
86
|
+
}),
|
|
87
|
+
);
|
|
88
|
+
const result: HeartbeatAvailabilityResult = build(rows);
|
|
89
|
+
expect(result.uptimePercent).toBe(100);
|
|
90
|
+
expect(downPoints(result)).toHaveLength(0);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("present in-progress trailing bucket still proves UP", () => {
|
|
94
|
+
const allMinutes: Array<number> = Array.from(
|
|
95
|
+
{ length: 31 },
|
|
96
|
+
(_: unknown, i: number) => {
|
|
97
|
+
return i;
|
|
98
|
+
},
|
|
99
|
+
);
|
|
100
|
+
const rows: Array<AggregatedModel> = minuteRows(WINDOW_START, allMinutes);
|
|
101
|
+
const withPartial: HeartbeatAvailabilityResult = build(rows);
|
|
102
|
+
const withoutPartial: HeartbeatAvailabilityResult = build(
|
|
103
|
+
rows.slice(0, -2),
|
|
104
|
+
);
|
|
105
|
+
// The two partial-bucket rows add points to the series.
|
|
106
|
+
expect(withPartial.points.length).toBeGreaterThan(
|
|
107
|
+
withoutPartial.points.length,
|
|
108
|
+
);
|
|
109
|
+
expect(withPartial.uptimePercent).toBe(100);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("a single missing bucket (export jitter) is bridged to UP", () => {
|
|
113
|
+
const minutes: Array<number> = Array.from(
|
|
114
|
+
{ length: 31 },
|
|
115
|
+
(_: unknown, i: number) => {
|
|
116
|
+
return i;
|
|
117
|
+
},
|
|
118
|
+
).filter((m: number) => {
|
|
119
|
+
return m !== 15;
|
|
120
|
+
});
|
|
121
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
122
|
+
minuteRows(WINDOW_START, minutes),
|
|
123
|
+
);
|
|
124
|
+
expect(result.uptimePercent).toBe(100);
|
|
125
|
+
expect(downPoints(result)).toHaveLength(0);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test("two consecutive missing buckets render as downtime", () => {
|
|
129
|
+
const minutes: Array<number> = Array.from(
|
|
130
|
+
{ length: 31 },
|
|
131
|
+
(_: unknown, i: number) => {
|
|
132
|
+
return i;
|
|
133
|
+
},
|
|
134
|
+
).filter((m: number) => {
|
|
135
|
+
return m !== 15 && m !== 16;
|
|
136
|
+
});
|
|
137
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
138
|
+
minuteRows(WINDOW_START, minutes),
|
|
139
|
+
);
|
|
140
|
+
expect(downPoints(result)).toHaveLength(2);
|
|
141
|
+
expect(result.uptimePercent).not.toBeNull();
|
|
142
|
+
expect(result.uptimePercent!).toBeLessThan(100);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
test("a long outage in the middle of the window is fully reported", () => {
|
|
146
|
+
// Up 10:01-10:10, silent 10:11-10:20, up again 10:21-10:28.
|
|
147
|
+
const minutes: Array<number> = Array.from(
|
|
148
|
+
{ length: 31 },
|
|
149
|
+
(_: unknown, i: number) => {
|
|
150
|
+
return i;
|
|
151
|
+
},
|
|
152
|
+
).filter((m: number) => {
|
|
153
|
+
return m <= 10 || m >= 21;
|
|
154
|
+
});
|
|
155
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
156
|
+
minuteRows(WINDOW_START, minutes),
|
|
157
|
+
);
|
|
158
|
+
expect(downPoints(result)).toHaveLength(10);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test("host completely silent for the whole window reports ~0%", () => {
|
|
162
|
+
const result: HeartbeatAvailabilityResult = build([]);
|
|
163
|
+
expect(result.uptimePercent).toBe(0);
|
|
164
|
+
expect(result.points.length).toBeGreaterThan(25);
|
|
165
|
+
expect(
|
|
166
|
+
result.points.every((p: { x: Date; y: number }) => {
|
|
167
|
+
return p.y === 0;
|
|
168
|
+
}),
|
|
169
|
+
).toBe(true);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test("queue-lag scenario: bucket sizing comes from the window, not from data gaps", () => {
|
|
173
|
+
/*
|
|
174
|
+
* Heartbeats with a 2-minute hole (ingest backlog collapsed two
|
|
175
|
+
* batches into one minute). The old smallest-gap inference could
|
|
176
|
+
* derive a wrong bucket size from patterns like this and knock
|
|
177
|
+
* genuine rows off the reconstructed grid; with the canonical
|
|
178
|
+
* window-derived size the present rows all stay on-grid.
|
|
179
|
+
*/
|
|
180
|
+
const minutes: Array<number> = [
|
|
181
|
+
1, 2, 3, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28,
|
|
182
|
+
];
|
|
183
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
184
|
+
minuteRows(WINDOW_START, minutes),
|
|
185
|
+
);
|
|
186
|
+
/*
|
|
187
|
+
* Every provided row lands on the grid as UP (alternating gaps are
|
|
188
|
+
* all single-bucket → bridged), and minute 5's neighbors 4 and 6
|
|
189
|
+
* bridge it too.
|
|
190
|
+
*/
|
|
191
|
+
expect(result.uptimePercent).toBe(100);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test("rows snapped within half a bucket of a slot still register", () => {
|
|
195
|
+
/*
|
|
196
|
+
* Simulate a serialization offset: every row shifted +20s off the
|
|
197
|
+
* minute boundary. Exact-match would lose all of them.
|
|
198
|
+
*/
|
|
199
|
+
const base: number =
|
|
200
|
+
Math.floor(WINDOW_START.getTime() / MINUTE) * MINUTE + 20_000;
|
|
201
|
+
const rows: Array<AggregatedModel> = Array.from(
|
|
202
|
+
{ length: 31 },
|
|
203
|
+
(_: unknown, i: number): AggregatedModel => {
|
|
204
|
+
return row(new Date(base + i * MINUTE));
|
|
205
|
+
},
|
|
206
|
+
);
|
|
207
|
+
const result: HeartbeatAvailabilityResult = build(rows);
|
|
208
|
+
expect(result.uptimePercent).toBe(100);
|
|
209
|
+
expect(downPoints(result)).toHaveLength(0);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
test("historical window (end far in the past) has no lag exclusion", () => {
|
|
213
|
+
const windowEnd: Date = new Date(NOW.getTime() - 24 * 60 * MINUTE);
|
|
214
|
+
const windowStart: Date = new Date(windowEnd.getTime() - 30 * MINUTE);
|
|
215
|
+
const minutes: Array<number> = Array.from(
|
|
216
|
+
{ length: 31 },
|
|
217
|
+
(_: unknown, i: number) => {
|
|
218
|
+
return i;
|
|
219
|
+
},
|
|
220
|
+
).filter((m: number) => {
|
|
221
|
+
/*
|
|
222
|
+
* Silent for the final three buckets of the window — a real
|
|
223
|
+
* outage at the window's edge must not be masked by lag logic
|
|
224
|
+
* because the window closed long ago.
|
|
225
|
+
*/
|
|
226
|
+
return m < 28;
|
|
227
|
+
});
|
|
228
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
229
|
+
minuteRows(windowStart, minutes),
|
|
230
|
+
windowStart,
|
|
231
|
+
windowEnd,
|
|
232
|
+
NOW,
|
|
233
|
+
);
|
|
234
|
+
expect(downPoints(result).length).toBeGreaterThanOrEqual(2);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test("hour buckets are used for windows over 3 hours", () => {
|
|
238
|
+
const windowEnd: Date = NOW;
|
|
239
|
+
const windowStart: Date = new Date(NOW.getTime() - 24 * 60 * MINUTE);
|
|
240
|
+
const hourMs: number = 60 * MINUTE;
|
|
241
|
+
const base: number = Math.floor(windowStart.getTime() / hourMs) * hourMs;
|
|
242
|
+
const rows: Array<AggregatedModel> = Array.from(
|
|
243
|
+
{ length: 25 },
|
|
244
|
+
(_: unknown, i: number): AggregatedModel => {
|
|
245
|
+
return row(new Date(base + i * hourMs));
|
|
246
|
+
},
|
|
247
|
+
);
|
|
248
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
249
|
+
rows,
|
|
250
|
+
windowStart,
|
|
251
|
+
windowEnd,
|
|
252
|
+
NOW,
|
|
253
|
+
);
|
|
254
|
+
expect(result.uptimePercent).toBe(100);
|
|
255
|
+
// ~24 hour buckets, not ~1440 minute buckets.
|
|
256
|
+
expect(result.points.length).toBeLessThanOrEqual(26);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test("returns null uptime when nothing is evaluable", () => {
|
|
260
|
+
/*
|
|
261
|
+
* Window entirely inside the lag shadow: started one lag-width
|
|
262
|
+
* ago and ends now, with no heartbeat rows.
|
|
263
|
+
*/
|
|
264
|
+
const windowStart: Date = new Date(NOW.getTime() - HEARTBEAT_INGEST_LAG_MS);
|
|
265
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
266
|
+
[],
|
|
267
|
+
windowStart,
|
|
268
|
+
NOW,
|
|
269
|
+
NOW,
|
|
270
|
+
);
|
|
271
|
+
expect(result.uptimePercent).toBeNull();
|
|
272
|
+
expect(result.points).toHaveLength(0);
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
test("invalid window returns empty result", () => {
|
|
276
|
+
const result: HeartbeatAvailabilityResult = build([], NOW, NOW, NOW);
|
|
277
|
+
expect(result.uptimePercent).toBeNull();
|
|
278
|
+
expect(result.points).toHaveLength(0);
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
test("rows with zero count are ignored", () => {
|
|
282
|
+
const zeroRows: Array<AggregatedModel> = minuteRows(
|
|
283
|
+
WINDOW_START,
|
|
284
|
+
Array.from({ length: 31 }, (_: unknown, i: number) => {
|
|
285
|
+
return i;
|
|
286
|
+
}),
|
|
287
|
+
).map((r: AggregatedModel): AggregatedModel => {
|
|
288
|
+
return { ...r, value: 0 } as AggregatedModel;
|
|
289
|
+
});
|
|
290
|
+
const result: HeartbeatAvailabilityResult = build(zeroRows);
|
|
291
|
+
expect(result.uptimePercent).toBe(0);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
test("reads MV-aliased `time` field when `timestamp` is absent", () => {
|
|
295
|
+
const base: number = Math.floor(WINDOW_START.getTime() / MINUTE) * MINUTE;
|
|
296
|
+
const rows: Array<AggregatedModel> = Array.from(
|
|
297
|
+
{ length: 31 },
|
|
298
|
+
(_: unknown, i: number): AggregatedModel => {
|
|
299
|
+
return {
|
|
300
|
+
time: new Date(base + i * MINUTE).toISOString(),
|
|
301
|
+
value: 1,
|
|
302
|
+
} as unknown as AggregatedModel;
|
|
303
|
+
},
|
|
304
|
+
);
|
|
305
|
+
const result: HeartbeatAvailabilityResult = build(rows);
|
|
306
|
+
expect(result.uptimePercent).toBe(100);
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
test("no bridging at Day buckets: one fully missing day is real downtime", () => {
|
|
310
|
+
/*
|
|
311
|
+
* 10-day window → Day buckets. A whole day of silence is dozens
|
|
312
|
+
* of missed heartbeats — bridging it away (as the Minute-grid
|
|
313
|
+
* hysteresis would) must not happen at coarse widths.
|
|
314
|
+
*/
|
|
315
|
+
const DAY: number = 24 * 60 * MINUTE;
|
|
316
|
+
const windowStart: Date = new Date(NOW.getTime() - 10 * DAY);
|
|
317
|
+
const base: number = Math.floor(windowStart.getTime() / DAY) * DAY;
|
|
318
|
+
const rows: Array<AggregatedModel> = Array.from(
|
|
319
|
+
{ length: 11 },
|
|
320
|
+
(_: unknown, i: number): AggregatedModel => {
|
|
321
|
+
return row(new Date(base + i * DAY));
|
|
322
|
+
},
|
|
323
|
+
).filter((_: AggregatedModel, i: number) => {
|
|
324
|
+
// Day index 5 is mid-window with up neighbors on both sides.
|
|
325
|
+
return i !== 5;
|
|
326
|
+
});
|
|
327
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
328
|
+
rows,
|
|
329
|
+
windowStart,
|
|
330
|
+
NOW,
|
|
331
|
+
NOW,
|
|
332
|
+
);
|
|
333
|
+
expect(downPoints(result)).toHaveLength(1);
|
|
334
|
+
expect(result.uptimePercent).not.toBeNull();
|
|
335
|
+
expect(result.uptimePercent!).toBeLessThan(100);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
test("jitter miss in the first complete bucket bridges off the excluded leading bucket", () => {
|
|
339
|
+
/*
|
|
340
|
+
* The leading partial bucket can never return a row (the query
|
|
341
|
+
* filters time >= windowStart), so the first complete bucket has
|
|
342
|
+
* no up neighbor on its left. A single jitter miss there must
|
|
343
|
+
* still bridge — otherwise every missed beat produces a ~1-minute
|
|
344
|
+
* false-down dip as it transits this position on the sliding
|
|
345
|
+
* auto-refresh window.
|
|
346
|
+
*/
|
|
347
|
+
const minutes: Array<number> = Array.from(
|
|
348
|
+
{ length: 29 },
|
|
349
|
+
(_: unknown, i: number) => {
|
|
350
|
+
return i + 2;
|
|
351
|
+
},
|
|
352
|
+
);
|
|
353
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
354
|
+
minuteRows(WINDOW_START, minutes),
|
|
355
|
+
);
|
|
356
|
+
expect(downPoints(result)).toHaveLength(0);
|
|
357
|
+
expect(result.uptimePercent).toBe(100);
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
test("jitter miss adjacent to the trailing lag shadow bridges off its single up neighbor", () => {
|
|
361
|
+
/*
|
|
362
|
+
* Rows for minutes 1-27; miss at 28; 29/30 still in the ingest
|
|
363
|
+
* queue (excluded). The miss has up on the left and unknown on the
|
|
364
|
+
* right — bridge, don't flap.
|
|
365
|
+
*/
|
|
366
|
+
const minutes: Array<number> = Array.from(
|
|
367
|
+
{ length: 27 },
|
|
368
|
+
(_: unknown, i: number) => {
|
|
369
|
+
return i + 1;
|
|
370
|
+
},
|
|
371
|
+
);
|
|
372
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
373
|
+
minuteRows(WINDOW_START, minutes),
|
|
374
|
+
);
|
|
375
|
+
expect(downPoints(result)).toHaveLength(0);
|
|
376
|
+
expect(result.uptimePercent).toBe(100);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
test("a silent bucket with no up witness on either side stays down", () => {
|
|
380
|
+
/*
|
|
381
|
+
* 2-minute window ending now with no rows: the single evaluable
|
|
382
|
+
* bucket sits between the excluded leading and trailing buckets.
|
|
383
|
+
* Excluded neighbors are wildcards, not witnesses — with no up
|
|
384
|
+
* neighbor at all the bucket must render down.
|
|
385
|
+
*/
|
|
386
|
+
const windowStart: Date = new Date(NOW.getTime() - 2 * MINUTE);
|
|
387
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
388
|
+
[],
|
|
389
|
+
windowStart,
|
|
390
|
+
NOW,
|
|
391
|
+
NOW,
|
|
392
|
+
);
|
|
393
|
+
expect(result.uptimePercent).toBe(0);
|
|
394
|
+
expect(downPoints(result).length).toBeGreaterThanOrEqual(1);
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
test("bucket-aligned window start: first-bucket jitter miss still bridges", () => {
|
|
398
|
+
/*
|
|
399
|
+
* When windowStart lands exactly on a bucket boundary the grid has
|
|
400
|
+
* no excluded leading slot — the first slot's left neighbor is
|
|
401
|
+
* simply out of grid. Out-of-grid must count as a wildcard (like
|
|
402
|
+
* excluded), so a single jitter miss in slot 0 with an up
|
|
403
|
+
* right-neighbor bridges instead of rendering a false down.
|
|
404
|
+
*/
|
|
405
|
+
const windowStart: Date = new Date(
|
|
406
|
+
Math.floor((NOW.getTime() - 30 * MINUTE) / MINUTE) * MINUTE,
|
|
407
|
+
);
|
|
408
|
+
const minutes: Array<number> = Array.from(
|
|
409
|
+
{ length: 30 },
|
|
410
|
+
(_: unknown, i: number) => {
|
|
411
|
+
return i + 1;
|
|
412
|
+
},
|
|
413
|
+
);
|
|
414
|
+
const result: HeartbeatAvailabilityResult = build(
|
|
415
|
+
minuteRows(windowStart, minutes),
|
|
416
|
+
windowStart,
|
|
417
|
+
NOW,
|
|
418
|
+
NOW,
|
|
419
|
+
);
|
|
420
|
+
expect(downPoints(result)).toHaveLength(0);
|
|
421
|
+
expect(result.uptimePercent).toBe(100);
|
|
422
|
+
});
|
|
423
|
+
});
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import AggregationInterval from "./AggregationInterval";
|
|
2
|
+
import OneUptimeDate from "../Date";
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* Single source of truth for "which time-bucket size does the
|
|
6
|
+
* analytics aggregate API use for a given query window". The server
|
|
7
|
+
* statement generator (AggregateUtil in
|
|
8
|
+
* Common/Server/Types/AnalyticsDatabase/AggregateBy.ts) delegates
|
|
9
|
+
* here when compiling `toStartOfInterval(...)`, and browser code that
|
|
10
|
+
* needs to reconstruct the server's bucket grid client-side (e.g. the
|
|
11
|
+
* heartbeat availability charts, which must synthesize the empty
|
|
12
|
+
* buckets ClickHouse never returns rows for) imports the same
|
|
13
|
+
* function — so the two sides can never drift apart.
|
|
14
|
+
*/
|
|
15
|
+
export class AggregationIntervalUtil {
|
|
16
|
+
public static getAggregationIntervalForWindow(data: {
|
|
17
|
+
startDate: Date;
|
|
18
|
+
endDate: Date;
|
|
19
|
+
}): AggregationInterval {
|
|
20
|
+
const startDate: Date = OneUptimeDate.fromString(data.startDate);
|
|
21
|
+
const endDate: Date = OneUptimeDate.fromString(data.endDate);
|
|
22
|
+
|
|
23
|
+
const diff: number = endDate.getTime() - startDate.getTime();
|
|
24
|
+
|
|
25
|
+
if (diff <= 1000 * 60 * 60 * 3) {
|
|
26
|
+
// if less than 3 hours, then get minute precision
|
|
27
|
+
return AggregationInterval.Minute;
|
|
28
|
+
} else if (diff <= 1000 * 60 * 60 * 24 * 7) {
|
|
29
|
+
// 7 days
|
|
30
|
+
return AggregationInterval.Hour;
|
|
31
|
+
} else if (diff <= 1000 * 60 * 60 * 24 * 7 * 6) {
|
|
32
|
+
// 6 weeks
|
|
33
|
+
return AggregationInterval.Day;
|
|
34
|
+
} else if (diff <= 1000 * 60 * 60 * 24 * 30 * 6) {
|
|
35
|
+
// 6 months
|
|
36
|
+
return AggregationInterval.Week;
|
|
37
|
+
} else if (diff <= 1000 * 60 * 60 * 24 * 365 * 6) {
|
|
38
|
+
// 6 years
|
|
39
|
+
return AggregationInterval.Month;
|
|
40
|
+
}
|
|
41
|
+
return AggregationInterval.Year;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* Nominal bucket width in milliseconds. Month and Year are
|
|
46
|
+
* calendar-variable in ClickHouse (`toStartOfInterval` snaps to
|
|
47
|
+
* calendar boundaries), so their values here are approximations —
|
|
48
|
+
* callers that walk a fixed-step grid at those widths must match
|
|
49
|
+
* rows to grid slots with tolerance (nearest slot), not by exact
|
|
50
|
+
* timestamp equality.
|
|
51
|
+
*/
|
|
52
|
+
public static getAggregationIntervalMs(
|
|
53
|
+
interval: AggregationInterval,
|
|
54
|
+
): number {
|
|
55
|
+
switch (interval) {
|
|
56
|
+
case AggregationInterval.Minute:
|
|
57
|
+
return 1000 * 60;
|
|
58
|
+
case AggregationInterval.Hour:
|
|
59
|
+
return 1000 * 60 * 60;
|
|
60
|
+
case AggregationInterval.Day:
|
|
61
|
+
return 1000 * 60 * 60 * 24;
|
|
62
|
+
case AggregationInterval.Week:
|
|
63
|
+
return 1000 * 60 * 60 * 24 * 7;
|
|
64
|
+
case AggregationInterval.Month:
|
|
65
|
+
return 1000 * 60 * 60 * 24 * 30;
|
|
66
|
+
case AggregationInterval.Year:
|
|
67
|
+
return 1000 * 60 * 60 * 24 * 365;
|
|
68
|
+
default:
|
|
69
|
+
return 1000 * 60;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export default AggregationIntervalUtil;
|
|
@@ -23,7 +23,18 @@ enum DashboardComponentType {
|
|
|
23
23
|
DockerImageList = `DockerImageList`,
|
|
24
24
|
DockerNetworkList = `DockerNetworkList`,
|
|
25
25
|
DockerVolumeList = `DockerVolumeList`,
|
|
26
|
+
PodmanHostList = `PodmanHostList`,
|
|
27
|
+
PodmanContainerList = `PodmanContainerList`,
|
|
28
|
+
PodmanImageList = `PodmanImageList`,
|
|
29
|
+
PodmanNetworkList = `PodmanNetworkList`,
|
|
30
|
+
PodmanVolumeList = `PodmanVolumeList`,
|
|
26
31
|
HostList = `HostList`,
|
|
32
|
+
ProxmoxNodeList = `ProxmoxNodeList`,
|
|
33
|
+
ProxmoxGuestList = `ProxmoxGuestList`,
|
|
34
|
+
DockerSwarmNodeList = `DockerSwarmNodeList`,
|
|
35
|
+
DockerSwarmServiceList = `DockerSwarmServiceList`,
|
|
36
|
+
CephOsdList = `CephOsdList`,
|
|
37
|
+
CephPoolList = `CephPoolList`,
|
|
27
38
|
}
|
|
28
39
|
|
|
29
40
|
export default DashboardComponentType;
|
|
@@ -30,6 +30,10 @@ export enum EntityFilterModelType {
|
|
|
30
30
|
Label = "Label",
|
|
31
31
|
KubernetesCluster = "KubernetesCluster",
|
|
32
32
|
DockerHost = "DockerHost",
|
|
33
|
+
PodmanHost = "PodmanHost",
|
|
34
|
+
ProxmoxCluster = "ProxmoxCluster",
|
|
35
|
+
CephCluster = "CephCluster",
|
|
36
|
+
DockerSwarmCluster = "DockerSwarmCluster",
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
export interface ComponentArgumentSection {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import ObjectID from "../../ObjectID";
|
|
2
|
+
import DashboardComponentType from "../DashboardComponentType";
|
|
3
|
+
import BaseComponent from "./DashboardBaseComponent";
|
|
4
|
+
|
|
5
|
+
export default interface DashboardCephOsdListComponent extends BaseComponent {
|
|
6
|
+
componentType: DashboardComponentType.CephOsdList;
|
|
7
|
+
componentId: ObjectID;
|
|
8
|
+
arguments: {
|
|
9
|
+
title?: string | undefined;
|
|
10
|
+
maxRows?: number | undefined;
|
|
11
|
+
viewMode?: "list" | "honeycomb" | undefined;
|
|
12
|
+
cephClusterIds?: Array<string> | undefined;
|
|
13
|
+
stateFilter?: string | undefined;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import ObjectID from "../../ObjectID";
|
|
2
|
+
import DashboardComponentType from "../DashboardComponentType";
|
|
3
|
+
import BaseComponent from "./DashboardBaseComponent";
|
|
4
|
+
|
|
5
|
+
export default interface DashboardCephPoolListComponent extends BaseComponent {
|
|
6
|
+
componentType: DashboardComponentType.CephPoolList;
|
|
7
|
+
componentId: ObjectID;
|
|
8
|
+
arguments: {
|
|
9
|
+
title?: string | undefined;
|
|
10
|
+
maxRows?: number | undefined;
|
|
11
|
+
viewMode?: "list" | "honeycomb" | undefined;
|
|
12
|
+
cephClusterIds?: Array<string> | undefined;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import ObjectID from "../../ObjectID";
|
|
2
|
+
import DashboardComponentType from "../DashboardComponentType";
|
|
3
|
+
import BaseComponent from "./DashboardBaseComponent";
|
|
4
|
+
|
|
5
|
+
export default interface DashboardDockerSwarmNodeListComponent
|
|
6
|
+
extends BaseComponent {
|
|
7
|
+
componentType: DashboardComponentType.DockerSwarmNodeList;
|
|
8
|
+
componentId: ObjectID;
|
|
9
|
+
arguments: {
|
|
10
|
+
title?: string | undefined;
|
|
11
|
+
maxRows?: number | undefined;
|
|
12
|
+
viewMode?: "list" | "honeycomb" | undefined;
|
|
13
|
+
dockerSwarmClusterIds?: Array<string> | undefined;
|
|
14
|
+
roleFilter?: string | undefined;
|
|
15
|
+
statusFilter?: string | undefined;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import ObjectID from "../../ObjectID";
|
|
2
|
+
import DashboardComponentType from "../DashboardComponentType";
|
|
3
|
+
import BaseComponent from "./DashboardBaseComponent";
|
|
4
|
+
|
|
5
|
+
export default interface DashboardDockerSwarmServiceListComponent
|
|
6
|
+
extends BaseComponent {
|
|
7
|
+
componentType: DashboardComponentType.DockerSwarmServiceList;
|
|
8
|
+
componentId: ObjectID;
|
|
9
|
+
arguments: {
|
|
10
|
+
title?: string | undefined;
|
|
11
|
+
maxRows?: number | undefined;
|
|
12
|
+
viewMode?: "list" | "honeycomb" | undefined;
|
|
13
|
+
dockerSwarmClusterIds?: Array<string> | undefined;
|
|
14
|
+
serviceModeFilter?: string | undefined;
|
|
15
|
+
statusFilter?: string | undefined;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import ObjectID from "../../ObjectID";
|
|
2
|
+
import DashboardComponentType from "../DashboardComponentType";
|
|
3
|
+
import BaseComponent from "./DashboardBaseComponent";
|
|
4
|
+
|
|
5
|
+
export default interface DashboardPodmanContainerListComponent
|
|
6
|
+
extends BaseComponent {
|
|
7
|
+
componentType: DashboardComponentType.PodmanContainerList;
|
|
8
|
+
componentId: ObjectID;
|
|
9
|
+
arguments: {
|
|
10
|
+
title?: string | undefined;
|
|
11
|
+
maxRows?: number | undefined;
|
|
12
|
+
viewMode?: "list" | "honeycomb" | undefined;
|
|
13
|
+
podmanHostIds?: Array<string> | undefined;
|
|
14
|
+
imageName?: string | undefined;
|
|
15
|
+
};
|
|
16
|
+
}
|