@oneuptime/common 11.0.2 → 11.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Alert.ts +166 -0
- package/Models/DatabaseModels/AlertLabelRule.ts +38 -0
- package/Models/DatabaseModels/AlertOwnerRule.ts +38 -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/Incident.ts +166 -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 +24 -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/ScheduledMaintenance.ts +110 -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/DashboardAPI.ts +89 -0
- package/Server/API/DockerSwarmResourceAPI.ts +137 -0
- package/Server/API/TelemetryAPI.ts +8 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781587937032-MigrationName.ts +3199 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Services/AlertLabelRuleEngineService.ts +29 -0
- package/Server/Services/AlertOwnerRuleEngineService.ts +67 -0
- 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 +1 -0
- 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 +14 -0
- package/Server/Services/LogAggregationService.ts +1 -0
- package/Server/Services/MetricAggregationService.ts +1 -0
- package/Server/Services/OpenTelemetryIngestService.ts +37 -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/ScheduledMaintenanceLabelRuleEngineService.ts +29 -0
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +67 -0
- package/Server/Services/TelemetryUsageBillingService.ts +18 -0
- package/Server/Services/TraceAggregationService.ts +1 -0
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +13 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +10 -0
- package/Server/Utils/Monitor/MonitorClusterContext.ts +35 -6
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +306 -0
- package/Server/Utils/Monitor/MonitorIncident.ts +45 -0
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +17 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +3 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +49 -0
- package/Server/Utils/Telemetry/Telemetry.ts +10 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -0
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +1 -0
- package/Tests/Types/DockerSwarm/DockerSwarmInventoryExtractor.test.ts +667 -0
- package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +528 -0
- package/Types/Dashboard/DashboardComponentType.ts +7 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -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/DashboardTemplates.ts +194 -0
- package/Types/DockerSwarm/DockerSwarmInventoryExtractor.ts +452 -0
- package/Types/Icon/IconProp.ts +1 -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 +21 -0
- package/Types/Monitor/MonitorStep.ts +99 -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/MonitorType.ts +42 -0
- package/Types/Monitor/PodmanAlertTemplates.ts +507 -0
- package/Types/Monitor/PodmanMetricCatalog.ts +226 -0
- package/Types/Permission.ts +465 -4
- package/Types/Podman/PodmanInventoryExtractor.ts +343 -0
- package/Types/Telemetry/EntityType.ts +12 -0
- package/Types/Telemetry/ServiceType.ts +2 -0
- package/UI/Components/Icon/Icon.tsx +57 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +44 -1
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +28 -0
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +6 -0
- package/UI/Utils/TelemetryService.ts +1 -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/Index.ts +51 -0
- package/Utils/Telemetry/EntityKey.ts +18 -0
- package/build/dist/Models/DatabaseModels/Alert.js +162 -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/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/Incident.js +162 -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 +24 -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/ScheduledMaintenance.js +108 -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/DashboardAPI.js +89 -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/TelemetryAPI.js +8 -1
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- 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/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.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/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 +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.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 +14 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +1 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +1 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +43 -13
- 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/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/TelemetryUsageBillingService.js +13 -0
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +1 -0
- package/build/dist/Server/Services/TraceAggregationService.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 +8 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +35 -7
- package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +194 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +35 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +3 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +16 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- 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 +18 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +7 -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/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/DashboardTemplates.js +168 -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 +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- 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 +69 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- 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/MonitorType.js +39 -0
- 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/Permission.js +420 -4
- 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 +12 -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 +16 -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 +6 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +1 -0
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- 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/Index.js +28 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityKey.js +14 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DockerSwarmAlertTemplate,
|
|
3
|
+
DockerSwarmAlertTemplateArgs,
|
|
4
|
+
getAllDockerSwarmAlertTemplates,
|
|
5
|
+
getDockerSwarmAlertTemplateById,
|
|
6
|
+
getDockerSwarmAlertTemplatesByCategory,
|
|
7
|
+
} from "../../../Types/Monitor/DockerSwarmAlertTemplates";
|
|
8
|
+
import { getDockerSwarmMetricByMetricName } from "../../../Types/Monitor/DockerSwarmMetricCatalog";
|
|
9
|
+
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
10
|
+
import MonitorStepDockerSwarmMonitor from "../../../Types/Monitor/MonitorStepDockerSwarmMonitor";
|
|
11
|
+
import MonitorCriteriaInstance from "../../../Types/Monitor/MonitorCriteriaInstance";
|
|
12
|
+
import { FilterType } from "../../../Types/Monitor/CriteriaFilter";
|
|
13
|
+
import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
|
|
14
|
+
import RollingTime from "../../../Types/RollingTime/RollingTime";
|
|
15
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* Lock in the Docker Swarm alert-template contracts (mirrors the Proxmox/Ceph
|
|
19
|
+
* precedents). Two layers:
|
|
20
|
+
*
|
|
21
|
+
* 1. ENUMERATED invariants run over getAllDockerSwarmAlertTemplates(), so a
|
|
22
|
+
* newly added template is automatically covered: it must build a valid
|
|
23
|
+
* MonitorStep, reference only catalog metrics, resolve every criteria
|
|
24
|
+
* alias, group by the raw `container.name` datapoint label (docker_stats
|
|
25
|
+
* container identity lives in datapoint labels — NEVER `resource.`
|
|
26
|
+
* -prefixed), and use disjoint fire/recover thresholds on the same alias.
|
|
27
|
+
*
|
|
28
|
+
* 2. A per-template expectation table pins the spec'd metric / aggregation /
|
|
29
|
+
* threshold / rolling-time decisions. The table is exhaustive both ways —
|
|
30
|
+
* adding a template without a row here fails loudly, which is the point.
|
|
31
|
+
*
|
|
32
|
+
* Telemetry contract: the Docker Swarm agent stamps ONLY the resource
|
|
33
|
+
* attribute `docker.swarm.cluster.name` (no container.runtime, no host.name).
|
|
34
|
+
* Metrics come from the docker_stats receiver as standard `container.*`
|
|
35
|
+
* series, with container identity (`container.name` =
|
|
36
|
+
* `<service>.<slot>.<taskid>`) in datapoint labels. Templates group by
|
|
37
|
+
* `container.name` so one incident fires per task; the worker injects the
|
|
38
|
+
* cluster scope from clusterIdentifier.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
interface QueryExpectation {
|
|
42
|
+
metricName: string;
|
|
43
|
+
aggregation: MetricsAggregationType;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface ThresholdExpectation {
|
|
47
|
+
alias: string;
|
|
48
|
+
filterType: FilterType;
|
|
49
|
+
value: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface TemplateExpectation {
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
category: string;
|
|
56
|
+
severity: string;
|
|
57
|
+
rollingTime: RollingTime;
|
|
58
|
+
query: QueryExpectation;
|
|
59
|
+
groupBy: string;
|
|
60
|
+
fire: ThresholdExpectation;
|
|
61
|
+
recover: ThresholdExpectation;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const EXPECTED_TEMPLATES: Array<TemplateExpectation> = [
|
|
65
|
+
{
|
|
66
|
+
/*
|
|
67
|
+
* Min per task over Past1Minute so a single zero-uptime scrape (a fresh
|
|
68
|
+
* restart) trips it instead of being masked by a longer-running window.
|
|
69
|
+
*/
|
|
70
|
+
id: "docker-swarm-task-down",
|
|
71
|
+
name: "Task Down (Low Uptime)",
|
|
72
|
+
category: "Availability",
|
|
73
|
+
severity: "Critical",
|
|
74
|
+
rollingTime: RollingTime.Past1Minute,
|
|
75
|
+
query: {
|
|
76
|
+
metricName: "container.uptime",
|
|
77
|
+
aggregation: MetricsAggregationType.Min,
|
|
78
|
+
},
|
|
79
|
+
groupBy: "container.name",
|
|
80
|
+
fire: {
|
|
81
|
+
alias: "container_uptime",
|
|
82
|
+
filterType: FilterType.EqualTo,
|
|
83
|
+
value: 0,
|
|
84
|
+
},
|
|
85
|
+
recover: {
|
|
86
|
+
alias: "container_uptime",
|
|
87
|
+
filterType: FilterType.GreaterThan,
|
|
88
|
+
value: 0,
|
|
89
|
+
},
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
/*
|
|
93
|
+
* container.cpu.utilization is already a percentage per container, so the
|
|
94
|
+
* per-minute Avg is the sustained utilization regardless of scrape count.
|
|
95
|
+
*/
|
|
96
|
+
id: "docker-swarm-high-cpu",
|
|
97
|
+
name: "High Task CPU Usage",
|
|
98
|
+
category: "Resource",
|
|
99
|
+
severity: "Warning",
|
|
100
|
+
rollingTime: RollingTime.Past5Minutes,
|
|
101
|
+
query: {
|
|
102
|
+
metricName: "container.cpu.utilization",
|
|
103
|
+
aggregation: MetricsAggregationType.Avg,
|
|
104
|
+
},
|
|
105
|
+
groupBy: "container.name",
|
|
106
|
+
fire: {
|
|
107
|
+
alias: "container_cpu",
|
|
108
|
+
filterType: FilterType.GreaterThan,
|
|
109
|
+
value: 80,
|
|
110
|
+
},
|
|
111
|
+
recover: {
|
|
112
|
+
alias: "container_cpu",
|
|
113
|
+
filterType: FilterType.LessThanOrEqualTo,
|
|
114
|
+
value: 80,
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
// container.memory.percent is a true percentage per container -> Avg.
|
|
119
|
+
id: "docker-swarm-high-memory",
|
|
120
|
+
name: "High Task Memory Usage",
|
|
121
|
+
category: "Resource",
|
|
122
|
+
severity: "Warning",
|
|
123
|
+
rollingTime: RollingTime.Past5Minutes,
|
|
124
|
+
query: {
|
|
125
|
+
metricName: "container.memory.percent",
|
|
126
|
+
aggregation: MetricsAggregationType.Avg,
|
|
127
|
+
},
|
|
128
|
+
groupBy: "container.name",
|
|
129
|
+
fire: {
|
|
130
|
+
alias: "container_memory",
|
|
131
|
+
filterType: FilterType.GreaterThan,
|
|
132
|
+
value: 85,
|
|
133
|
+
},
|
|
134
|
+
recover: {
|
|
135
|
+
alias: "container_memory",
|
|
136
|
+
filterType: FilterType.LessThanOrEqualTo,
|
|
137
|
+
value: 85,
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
// Max per task — any scrape over the threshold trips it (fork bomb/leak).
|
|
142
|
+
id: "docker-swarm-high-pids",
|
|
143
|
+
name: "High Task Process Count",
|
|
144
|
+
category: "Container",
|
|
145
|
+
severity: "Warning",
|
|
146
|
+
rollingTime: RollingTime.Past5Minutes,
|
|
147
|
+
query: {
|
|
148
|
+
metricName: "container.pids.count",
|
|
149
|
+
aggregation: MetricsAggregationType.Max,
|
|
150
|
+
},
|
|
151
|
+
groupBy: "container.name",
|
|
152
|
+
fire: {
|
|
153
|
+
alias: "container_pids",
|
|
154
|
+
filterType: FilterType.GreaterThan,
|
|
155
|
+
value: 500,
|
|
156
|
+
},
|
|
157
|
+
recover: {
|
|
158
|
+
alias: "container_pids",
|
|
159
|
+
filterType: FilterType.LessThanOrEqualTo,
|
|
160
|
+
value: 500,
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
];
|
|
164
|
+
|
|
165
|
+
function buildArgs(): DockerSwarmAlertTemplateArgs {
|
|
166
|
+
return {
|
|
167
|
+
clusterIdentifier: "swarm-prod",
|
|
168
|
+
onlineMonitorStatusId: ObjectID.generate(),
|
|
169
|
+
offlineMonitorStatusId: ObjectID.generate(),
|
|
170
|
+
defaultIncidentSeverityId: ObjectID.generate(),
|
|
171
|
+
defaultAlertSeverityId: ObjectID.generate(),
|
|
172
|
+
monitorName: "Test Monitor",
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function getDockerSwarmMonitor(
|
|
177
|
+
step: MonitorStep,
|
|
178
|
+
): MonitorStepDockerSwarmMonitor {
|
|
179
|
+
const dockerSwarmMonitor: MonitorStepDockerSwarmMonitor | undefined =
|
|
180
|
+
step.data?.dockerSwarmMonitor;
|
|
181
|
+
if (!dockerSwarmMonitor) {
|
|
182
|
+
throw new Error("dockerSwarmMonitor missing from monitor step");
|
|
183
|
+
}
|
|
184
|
+
return dockerSwarmMonitor;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function getCriteriaInstances(
|
|
188
|
+
step: MonitorStep,
|
|
189
|
+
): Array<MonitorCriteriaInstance> {
|
|
190
|
+
const instances: Array<MonitorCriteriaInstance> | undefined =
|
|
191
|
+
step.data?.monitorCriteria.data?.monitorCriteriaInstanceArray;
|
|
192
|
+
if (!instances || instances.length === 0) {
|
|
193
|
+
throw new Error("monitorCriteria missing from monitor step");
|
|
194
|
+
}
|
|
195
|
+
return instances;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Aliases a criteria filter may legally reference: query + formula variables.
|
|
199
|
+
function getReferencableAliases(
|
|
200
|
+
monitor: MonitorStepDockerSwarmMonitor,
|
|
201
|
+
): Set<string> {
|
|
202
|
+
const aliases: Set<string> = new Set<string>();
|
|
203
|
+
for (const queryConfig of monitor.metricViewConfig
|
|
204
|
+
.queryConfigs as Array<any>) {
|
|
205
|
+
aliases.add(queryConfig.metricAliasData.metricVariable);
|
|
206
|
+
}
|
|
207
|
+
for (const formulaConfig of (monitor.metricViewConfig.formulaConfigs ||
|
|
208
|
+
[]) as Array<any>) {
|
|
209
|
+
aliases.add(formulaConfig.metricAliasData.metricVariable);
|
|
210
|
+
}
|
|
211
|
+
return aliases;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/*
|
|
215
|
+
* Fire and recover must be disjoint complements on the same alias —
|
|
216
|
+
* otherwise the monitor either flaps (overlap) or wedges (gap).
|
|
217
|
+
*/
|
|
218
|
+
function isDisjointComplement(
|
|
219
|
+
fire: { filterType: FilterType; value: number },
|
|
220
|
+
recover: { filterType: FilterType; value: number },
|
|
221
|
+
): boolean {
|
|
222
|
+
if (fire.value !== recover.value) {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
switch (fire.filterType) {
|
|
226
|
+
case FilterType.GreaterThan:
|
|
227
|
+
return (
|
|
228
|
+
recover.filterType === FilterType.LessThanOrEqualTo ||
|
|
229
|
+
(fire.value === 0 && recover.filterType === FilterType.EqualTo)
|
|
230
|
+
);
|
|
231
|
+
case FilterType.GreaterThanOrEqualTo:
|
|
232
|
+
return recover.filterType === FilterType.LessThan;
|
|
233
|
+
case FilterType.LessThan:
|
|
234
|
+
return recover.filterType === FilterType.GreaterThanOrEqualTo;
|
|
235
|
+
case FilterType.LessThanOrEqualTo:
|
|
236
|
+
return recover.filterType === FilterType.GreaterThan;
|
|
237
|
+
case FilterType.EqualTo:
|
|
238
|
+
// Task-down: fire when uptime == 0, recover when uptime > 0.
|
|
239
|
+
return fire.value === 0 && recover.filterType === FilterType.GreaterThan;
|
|
240
|
+
default:
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const ALL_TEMPLATES: Array<DockerSwarmAlertTemplate> =
|
|
246
|
+
getAllDockerSwarmAlertTemplates();
|
|
247
|
+
|
|
248
|
+
describe("DockerSwarmAlertTemplates - registry", () => {
|
|
249
|
+
test("template ids are unique and match the expectation table exactly", () => {
|
|
250
|
+
const ids: Array<string> = ALL_TEMPLATES.map(
|
|
251
|
+
(t: DockerSwarmAlertTemplate) => {
|
|
252
|
+
return t.id;
|
|
253
|
+
},
|
|
254
|
+
);
|
|
255
|
+
expect(new Set(ids).size).toBe(ids.length);
|
|
256
|
+
// Exhaustive both ways: a new template must get an expectation row.
|
|
257
|
+
expect([...ids].sort()).toEqual(
|
|
258
|
+
EXPECTED_TEMPLATES.map((t: TemplateExpectation) => {
|
|
259
|
+
return t.id;
|
|
260
|
+
}).sort(),
|
|
261
|
+
);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
test("getDockerSwarmAlertTemplateById resolves every id (and misses cleanly)", () => {
|
|
265
|
+
for (const expected of EXPECTED_TEMPLATES) {
|
|
266
|
+
expect(getDockerSwarmAlertTemplateById(expected.id)).toBeDefined();
|
|
267
|
+
}
|
|
268
|
+
expect(getDockerSwarmAlertTemplateById("does-not-exist")).toBeUndefined();
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test("getDockerSwarmAlertTemplatesByCategory partitions the registry", () => {
|
|
272
|
+
const resource: Array<DockerSwarmAlertTemplate> =
|
|
273
|
+
getDockerSwarmAlertTemplatesByCategory("Resource");
|
|
274
|
+
const availability: Array<DockerSwarmAlertTemplate> =
|
|
275
|
+
getDockerSwarmAlertTemplatesByCategory("Availability");
|
|
276
|
+
const container: Array<DockerSwarmAlertTemplate> =
|
|
277
|
+
getDockerSwarmAlertTemplatesByCategory("Container");
|
|
278
|
+
|
|
279
|
+
expect(
|
|
280
|
+
resource
|
|
281
|
+
.map((t: DockerSwarmAlertTemplate) => {
|
|
282
|
+
return t.id;
|
|
283
|
+
})
|
|
284
|
+
.sort(),
|
|
285
|
+
).toEqual(["docker-swarm-high-cpu", "docker-swarm-high-memory"].sort());
|
|
286
|
+
expect(
|
|
287
|
+
availability.map((t: DockerSwarmAlertTemplate) => {
|
|
288
|
+
return t.id;
|
|
289
|
+
}),
|
|
290
|
+
).toEqual(["docker-swarm-task-down"]);
|
|
291
|
+
expect(
|
|
292
|
+
container.map((t: DockerSwarmAlertTemplate) => {
|
|
293
|
+
return t.id;
|
|
294
|
+
}),
|
|
295
|
+
).toEqual(["docker-swarm-high-pids"]);
|
|
296
|
+
|
|
297
|
+
// Every template lands in exactly one of the three categories.
|
|
298
|
+
expect(resource.length + availability.length + container.length).toBe(
|
|
299
|
+
ALL_TEMPLATES.length,
|
|
300
|
+
);
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
describe("DockerSwarmAlertTemplates - enumerated invariants (every template)", () => {
|
|
305
|
+
test.each(
|
|
306
|
+
ALL_TEMPLATES.map((t: DockerSwarmAlertTemplate) => {
|
|
307
|
+
return [t.id, t];
|
|
308
|
+
}),
|
|
309
|
+
)("%s builds a valid MonitorStep", (_id: unknown, template: unknown) => {
|
|
310
|
+
const args: DockerSwarmAlertTemplateArgs = buildArgs();
|
|
311
|
+
const step: MonitorStep = (
|
|
312
|
+
template as DockerSwarmAlertTemplate
|
|
313
|
+
).getMonitorStep(args);
|
|
314
|
+
const monitor: MonitorStepDockerSwarmMonitor = getDockerSwarmMonitor(step);
|
|
315
|
+
|
|
316
|
+
// The cluster identifier is injected from the template args.
|
|
317
|
+
expect(monitor.clusterIdentifier).toBe(args.clusterIdentifier);
|
|
318
|
+
expect(monitor.metricViewConfig.queryConfigs.length).toBeGreaterThan(0);
|
|
319
|
+
|
|
320
|
+
const instances: Array<MonitorCriteriaInstance> =
|
|
321
|
+
getCriteriaInstances(step);
|
|
322
|
+
expect(instances.length).toBeGreaterThanOrEqual(2);
|
|
323
|
+
|
|
324
|
+
/*
|
|
325
|
+
* Criteria are evaluated first-match-wins: every instance before the
|
|
326
|
+
* last is an unhealthy tier (creates incidents + alerts, flips to the
|
|
327
|
+
* offline status); the LAST is the recover instance (no incidents, flips
|
|
328
|
+
* to the online status).
|
|
329
|
+
*/
|
|
330
|
+
const offlineInstances: Array<MonitorCriteriaInstance> = instances.slice(
|
|
331
|
+
0,
|
|
332
|
+
-1,
|
|
333
|
+
);
|
|
334
|
+
const onlineInstance: MonitorCriteriaInstance =
|
|
335
|
+
instances[instances.length - 1]!;
|
|
336
|
+
|
|
337
|
+
for (const offline of offlineInstances) {
|
|
338
|
+
expect(offline.data?.monitorStatusId).toBe(args.offlineMonitorStatusId);
|
|
339
|
+
expect(offline.data?.createIncidents).toBe(true);
|
|
340
|
+
expect(offline.data?.createAlerts).toBe(true);
|
|
341
|
+
expect(offline.data?.incidents).toHaveLength(1);
|
|
342
|
+
expect(offline.data?.alerts).toHaveLength(1);
|
|
343
|
+
expect(offline.data?.incidents?.[0]?.autoResolveIncident).toBe(true);
|
|
344
|
+
expect(offline.data?.alerts?.[0]?.autoResolveAlert).toBe(true);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
expect(onlineInstance.data?.monitorStatusId).toBe(
|
|
348
|
+
args.onlineMonitorStatusId,
|
|
349
|
+
);
|
|
350
|
+
expect(onlineInstance.data?.createIncidents).toBe(false);
|
|
351
|
+
expect(onlineInstance.data?.createAlerts).toBe(false);
|
|
352
|
+
expect(onlineInstance.data?.name).toBe("Healthy");
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
test.each(
|
|
356
|
+
ALL_TEMPLATES.map((t: DockerSwarmAlertTemplate) => {
|
|
357
|
+
return [t.id, t];
|
|
358
|
+
}),
|
|
359
|
+
)(
|
|
360
|
+
"%s references only catalog metrics and resolvable aliases",
|
|
361
|
+
(_id: unknown, template: unknown) => {
|
|
362
|
+
const step: MonitorStep = (
|
|
363
|
+
template as DockerSwarmAlertTemplate
|
|
364
|
+
).getMonitorStep(buildArgs());
|
|
365
|
+
const monitor: MonitorStepDockerSwarmMonitor =
|
|
366
|
+
getDockerSwarmMonitor(step);
|
|
367
|
+
|
|
368
|
+
for (const queryConfig of monitor.metricViewConfig
|
|
369
|
+
.queryConfigs as Array<any>) {
|
|
370
|
+
const metricName: string =
|
|
371
|
+
queryConfig.metricQueryData.filterData.metricName;
|
|
372
|
+
expect(getDockerSwarmMetricByMetricName(metricName)).toBeDefined();
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const aliases: Set<string> = getReferencableAliases(monitor);
|
|
376
|
+
for (const instance of getCriteriaInstances(step)) {
|
|
377
|
+
for (const filter of instance.data?.filters || []) {
|
|
378
|
+
expect(aliases).toContain(
|
|
379
|
+
(filter as any).metricMonitorOptions.metricAlias,
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
},
|
|
384
|
+
);
|
|
385
|
+
|
|
386
|
+
test.each(
|
|
387
|
+
ALL_TEMPLATES.map((t: DockerSwarmAlertTemplate) => {
|
|
388
|
+
return [t.id, t];
|
|
389
|
+
}),
|
|
390
|
+
)(
|
|
391
|
+
"%s groups by the container.name datapoint label only (never resource.-prefixed)",
|
|
392
|
+
(_id: unknown, template: unknown) => {
|
|
393
|
+
const step: MonitorStep = (
|
|
394
|
+
template as DockerSwarmAlertTemplate
|
|
395
|
+
).getMonitorStep(buildArgs());
|
|
396
|
+
const monitor: MonitorStepDockerSwarmMonitor =
|
|
397
|
+
getDockerSwarmMonitor(step);
|
|
398
|
+
|
|
399
|
+
for (const queryConfig of monitor.metricViewConfig
|
|
400
|
+
.queryConfigs as Array<any>) {
|
|
401
|
+
const groupBys: Array<string> =
|
|
402
|
+
queryConfig.metricQueryData.groupByAttributeKeys || [];
|
|
403
|
+
for (const key of groupBys) {
|
|
404
|
+
/*
|
|
405
|
+
* docker_stats container identity is the `container.name` DATAPOINT
|
|
406
|
+
* label. A `resource.`-prefixed key would match nothing in
|
|
407
|
+
* ClickHouse and collapse every task into one mislabeled series.
|
|
408
|
+
*/
|
|
409
|
+
expect(key).toBe("container.name");
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
test.each(
|
|
416
|
+
ALL_TEMPLATES.map((t: DockerSwarmAlertTemplate) => {
|
|
417
|
+
return [t.id, t];
|
|
418
|
+
}),
|
|
419
|
+
)(
|
|
420
|
+
"%s has disjoint fire/recover thresholds on the same alias",
|
|
421
|
+
(_id: unknown, template: unknown) => {
|
|
422
|
+
const step: MonitorStep = (
|
|
423
|
+
template as DockerSwarmAlertTemplate
|
|
424
|
+
).getMonitorStep(buildArgs());
|
|
425
|
+
const instances: Array<MonitorCriteriaInstance> =
|
|
426
|
+
getCriteriaInstances(step);
|
|
427
|
+
const onlineFilters: Array<any> = (instances[instances.length - 1]!.data
|
|
428
|
+
?.filters || []) as Array<any>;
|
|
429
|
+
|
|
430
|
+
for (const offline of instances.slice(0, -1)) {
|
|
431
|
+
for (const fireFilter of (offline.data?.filters || []) as Array<any>) {
|
|
432
|
+
const recoverFilter: any = onlineFilters.find((f: any) => {
|
|
433
|
+
return (
|
|
434
|
+
f.metricMonitorOptions.metricAlias ===
|
|
435
|
+
fireFilter.metricMonitorOptions.metricAlias
|
|
436
|
+
);
|
|
437
|
+
});
|
|
438
|
+
expect(recoverFilter).toBeDefined();
|
|
439
|
+
expect(
|
|
440
|
+
isDisjointComplement(
|
|
441
|
+
{
|
|
442
|
+
filterType: fireFilter.filterType,
|
|
443
|
+
value: fireFilter.value as number,
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
filterType: recoverFilter.filterType,
|
|
447
|
+
value: recoverFilter.value as number,
|
|
448
|
+
},
|
|
449
|
+
),
|
|
450
|
+
).toBe(true);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
},
|
|
454
|
+
);
|
|
455
|
+
|
|
456
|
+
test.each(
|
|
457
|
+
ALL_TEMPLATES.map((t: DockerSwarmAlertTemplate) => {
|
|
458
|
+
return [t.id, t];
|
|
459
|
+
}),
|
|
460
|
+
)(
|
|
461
|
+
"%s is single-query with no formulas (per-task container metric)",
|
|
462
|
+
(_id: unknown, template: unknown) => {
|
|
463
|
+
const step: MonitorStep = (
|
|
464
|
+
template as DockerSwarmAlertTemplate
|
|
465
|
+
).getMonitorStep(buildArgs());
|
|
466
|
+
const monitor: MonitorStepDockerSwarmMonitor =
|
|
467
|
+
getDockerSwarmMonitor(step);
|
|
468
|
+
|
|
469
|
+
// Each Docker Swarm template reads exactly one container.* series.
|
|
470
|
+
expect(monitor.metricViewConfig.queryConfigs).toHaveLength(1);
|
|
471
|
+
expect(monitor.metricViewConfig.formulaConfigs || []).toHaveLength(0);
|
|
472
|
+
},
|
|
473
|
+
);
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
describe("DockerSwarmAlertTemplates - spec table expectations", () => {
|
|
477
|
+
test.each(
|
|
478
|
+
EXPECTED_TEMPLATES.map((t: TemplateExpectation) => {
|
|
479
|
+
return [t.id, t];
|
|
480
|
+
}),
|
|
481
|
+
)(
|
|
482
|
+
"%s matches the spec'd metric/aggregation/threshold contract",
|
|
483
|
+
(_id: unknown, expected: unknown) => {
|
|
484
|
+
const tc: TemplateExpectation = expected as TemplateExpectation;
|
|
485
|
+
const template: DockerSwarmAlertTemplate | undefined =
|
|
486
|
+
getDockerSwarmAlertTemplateById(tc.id);
|
|
487
|
+
expect(template).toBeDefined();
|
|
488
|
+
|
|
489
|
+
expect(template!.name).toBe(tc.name);
|
|
490
|
+
expect(template!.category).toBe(tc.category);
|
|
491
|
+
expect(template!.severity).toBe(tc.severity);
|
|
492
|
+
|
|
493
|
+
const step: MonitorStep = template!.getMonitorStep(buildArgs());
|
|
494
|
+
const monitor: MonitorStepDockerSwarmMonitor =
|
|
495
|
+
getDockerSwarmMonitor(step);
|
|
496
|
+
|
|
497
|
+
expect(monitor.rollingTime).toBe(tc.rollingTime);
|
|
498
|
+
|
|
499
|
+
const queryConfigs: Array<any> = monitor.metricViewConfig
|
|
500
|
+
.queryConfigs as Array<any>;
|
|
501
|
+
expect(queryConfigs).toHaveLength(1);
|
|
502
|
+
|
|
503
|
+
const filterData: any = queryConfigs[0].metricQueryData.filterData;
|
|
504
|
+
expect(filterData.metricName).toBe(tc.query.metricName);
|
|
505
|
+
expect(filterData.aggegationType).toBe(tc.query.aggregation);
|
|
506
|
+
|
|
507
|
+
const groupBys: Array<string> =
|
|
508
|
+
queryConfigs[0].metricQueryData.groupByAttributeKeys || [];
|
|
509
|
+
expect(groupBys).toEqual([tc.groupBy]);
|
|
510
|
+
|
|
511
|
+
const instances: Array<MonitorCriteriaInstance> =
|
|
512
|
+
getCriteriaInstances(step);
|
|
513
|
+
expect(instances).toHaveLength(2);
|
|
514
|
+
|
|
515
|
+
const fireFilter: any = (instances[0]!.data?.filters as Array<any>)[0];
|
|
516
|
+
expect(fireFilter.metricMonitorOptions.metricAlias).toBe(tc.fire.alias);
|
|
517
|
+
expect(fireFilter.filterType).toBe(tc.fire.filterType);
|
|
518
|
+
expect(fireFilter.value).toBe(tc.fire.value);
|
|
519
|
+
|
|
520
|
+
const recoverFilter: any = (instances[1]!.data?.filters as Array<any>)[0];
|
|
521
|
+
expect(recoverFilter.metricMonitorOptions.metricAlias).toBe(
|
|
522
|
+
tc.recover.alias,
|
|
523
|
+
);
|
|
524
|
+
expect(recoverFilter.filterType).toBe(tc.recover.filterType);
|
|
525
|
+
expect(recoverFilter.value).toBe(tc.recover.value);
|
|
526
|
+
},
|
|
527
|
+
);
|
|
528
|
+
});
|
|
@@ -23,9 +23,16 @@ 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`,
|
|
27
32
|
ProxmoxNodeList = `ProxmoxNodeList`,
|
|
28
33
|
ProxmoxGuestList = `ProxmoxGuestList`,
|
|
34
|
+
DockerSwarmNodeList = `DockerSwarmNodeList`,
|
|
35
|
+
DockerSwarmServiceList = `DockerSwarmServiceList`,
|
|
29
36
|
CephOsdList = `CephOsdList`,
|
|
30
37
|
CephPoolList = `CephPoolList`,
|
|
31
38
|
}
|
|
@@ -30,8 +30,10 @@ export enum EntityFilterModelType {
|
|
|
30
30
|
Label = "Label",
|
|
31
31
|
KubernetesCluster = "KubernetesCluster",
|
|
32
32
|
DockerHost = "DockerHost",
|
|
33
|
+
PodmanHost = "PodmanHost",
|
|
33
34
|
ProxmoxCluster = "ProxmoxCluster",
|
|
34
35
|
CephCluster = "CephCluster",
|
|
36
|
+
DockerSwarmCluster = "DockerSwarmCluster",
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
export interface ComponentArgumentSection {
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import ObjectID from "../../ObjectID";
|
|
2
|
+
import DashboardComponentType from "../DashboardComponentType";
|
|
3
|
+
import BaseComponent from "./DashboardBaseComponent";
|
|
4
|
+
|
|
5
|
+
export default interface DashboardPodmanHostListComponent
|
|
6
|
+
extends BaseComponent {
|
|
7
|
+
componentType: DashboardComponentType.PodmanHostList;
|
|
8
|
+
componentId: ObjectID;
|
|
9
|
+
arguments: {
|
|
10
|
+
title?: string | undefined;
|
|
11
|
+
maxRows?: number | undefined;
|
|
12
|
+
viewMode?: "list" | "honeycomb" | undefined;
|
|
13
|
+
statusFilter?: string | undefined;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import ObjectID from "../../ObjectID";
|
|
2
|
+
import DashboardComponentType from "../DashboardComponentType";
|
|
3
|
+
import BaseComponent from "./DashboardBaseComponent";
|
|
4
|
+
|
|
5
|
+
export default interface DashboardPodmanImageListComponent
|
|
6
|
+
extends BaseComponent {
|
|
7
|
+
componentType: DashboardComponentType.PodmanImageList;
|
|
8
|
+
componentId: ObjectID;
|
|
9
|
+
arguments: {
|
|
10
|
+
title?: string | undefined;
|
|
11
|
+
maxRows?: number | undefined;
|
|
12
|
+
viewMode?: "list" | "honeycomb" | undefined;
|
|
13
|
+
podmanHostIds?: Array<string> | undefined;
|
|
14
|
+
nameSearch?: string | undefined;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import ObjectID from "../../ObjectID";
|
|
2
|
+
import DashboardComponentType from "../DashboardComponentType";
|
|
3
|
+
import BaseComponent from "./DashboardBaseComponent";
|
|
4
|
+
|
|
5
|
+
export default interface DashboardPodmanNetworkListComponent
|
|
6
|
+
extends BaseComponent {
|
|
7
|
+
componentType: DashboardComponentType.PodmanNetworkList;
|
|
8
|
+
componentId: ObjectID;
|
|
9
|
+
arguments: {
|
|
10
|
+
title?: string | undefined;
|
|
11
|
+
maxRows?: number | undefined;
|
|
12
|
+
viewMode?: "list" | "honeycomb" | undefined;
|
|
13
|
+
podmanHostIds?: Array<string> | undefined;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import ObjectID from "../../ObjectID";
|
|
2
|
+
import DashboardComponentType from "../DashboardComponentType";
|
|
3
|
+
import BaseComponent from "./DashboardBaseComponent";
|
|
4
|
+
|
|
5
|
+
export default interface DashboardPodmanVolumeListComponent
|
|
6
|
+
extends BaseComponent {
|
|
7
|
+
componentType: DashboardComponentType.PodmanVolumeList;
|
|
8
|
+
componentId: ObjectID;
|
|
9
|
+
arguments: {
|
|
10
|
+
title?: string | undefined;
|
|
11
|
+
maxRows?: number | undefined;
|
|
12
|
+
viewMode?: "list" | "honeycomb" | undefined;
|
|
13
|
+
podmanHostIds?: Array<string> | undefined;
|
|
14
|
+
};
|
|
15
|
+
}
|