@oneuptime/common 12.0.4 → 12.0.5
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/AIRun.ts +38 -1
- package/Models/DatabaseModels/AlertFeed.ts +30 -0
- package/Models/DatabaseModels/Dashboard.ts +28 -0
- package/Models/DatabaseModels/Incident.ts +2 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentFeed.ts +30 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/LogSavedView.ts +33 -0
- package/Models/DatabaseModels/Project.ts +231 -9
- package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +4 -4
- package/Models/DatabaseModels/StatusPage.ts +28 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
- package/Server/API/AIAgentDataAPI.ts +44 -55
- package/Server/API/AIInvestigationAPI.ts +175 -17
- package/Server/API/DashboardAPI.ts +10 -10
- package/Server/API/StatusPageAPI.ts +38 -19
- package/Server/EnvironmentConfig.ts +16 -0
- package/Server/Infrastructure/ClickhouseConfig.ts +15 -1
- package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.ts +89 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts +40 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Services/AIRunService.ts +78 -10
- package/Server/Services/AIService.ts +94 -22
- package/Server/Services/AlertFeedService.ts +5 -0
- package/Server/Services/AnalyticsDatabaseService.ts +29 -0
- package/Server/Services/DatabaseService.ts +43 -2
- package/Server/Services/IncidentFeedService.ts +5 -0
- package/Server/Services/LlmLogService.ts +46 -2
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +6 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +4 -0
- package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +8 -5
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +90 -16
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +2 -0
- package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +2 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +223 -22
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +25 -24
- package/Server/Utils/AI/SRE/ConfidenceSignal.ts +182 -71
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +252 -43
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +25 -24
- package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +47 -13
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +9 -5
- package/Server/Utils/AI/SRE/InvestigationQueue.ts +141 -24
- package/Server/Utils/AI/SRE/InvestigationSubjectLock.ts +66 -0
- package/Server/Utils/AI/SRE/PostedRootCause.ts +94 -3
- package/Server/Utils/AI/SRE/README.md +1 -1
- package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +132 -10
- package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -0
- package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +29 -0
- package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +56 -0
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +46 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
- package/Server/Utils/PasswordHash.ts +28 -4
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +251 -0
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +747 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +480 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1184 -0
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +500 -0
- package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
- package/Tests/App/StatusPage/PublicStatusPageAPIErrorHandling.test.ts +117 -0
- package/Tests/App/StatusPage/StatusPageModelAPIPolymorphism.test.ts +223 -0
- package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +243 -0
- package/Tests/Server/API/AIAgentDataFixFromIncidentContext.test.ts +266 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +594 -0
- package/Tests/Server/API/AIInvestigationCreateFixTask.test.ts +80 -0
- package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +172 -1
- package/Tests/Server/API/StatusPageMasterPasswordAPI.test.ts +335 -0
- package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +59 -5
- package/Tests/Server/Services/AIRunHumanVerdict.test.ts +127 -58
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +396 -20
- package/Tests/Server/Services/AddMasterPasswordSaltMigration.test.ts +283 -0
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +25 -1
- package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +45 -35
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +54 -0
- package/Tests/Server/Services/FeedAIRunAssociation.test.ts +125 -0
- package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +418 -57
- package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +173 -14
- package/Tests/Server/Services/MasterPasswordScrypt.test.ts +567 -0
- package/Tests/Server/Services/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -0
- package/Tests/Server/Utils/AI/AIAlertGating.test.ts +37 -4
- package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +330 -29
- package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +25 -0
- package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +293 -5
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +59 -1
- package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +342 -19
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +214 -30
- package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +2 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +65 -17
- package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +3 -0
- package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +313 -20
- package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +4 -0
- package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +2 -0
- package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +44 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +30 -0
- package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +212 -0
- package/Tests/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.test.ts +401 -0
- package/Tests/Server/Utils/Monitor/MonitorMetricUtilPortTimings.test.ts +243 -0
- package/Tests/Server/Utils/PasswordHash.test.ts +30 -0
- package/Tests/Types/Dashboard/DashboardTemplates.test.ts +111 -0
- package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
- package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
- package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
- package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/IotMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +118 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +42 -0
- package/Tests/Types/Monitor/MonitorStep.test.ts +38 -0
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +75 -0
- package/Tests/Types/Monitor/PodmanMetricCatalog.test.ts +109 -0
- package/Tests/Types/Monitor/ProxmoxMetricCatalog.test.ts +107 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.test.ts +151 -0
- package/Tests/Types/Permission.test.ts +137 -0
- package/Tests/Types/Rum/SessionReplayMaskingMode.test.ts +101 -0
- package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +5 -5
- package/Tests/UI/Components/CardModelDetailEdit.test.tsx +3 -5
- package/Tests/UI/Components/ErrorBoundary.test.tsx +158 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +74 -0
- package/Tests/UI/Components/MoreMenu.test.tsx +756 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +62 -0
- package/Tests/UI/Monitor/PortMonitorView.test.tsx +237 -0
- package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +91 -0
- package/Tests/UI/Utils/DownloadFile.test.ts +103 -0
- package/Tests/UI/Utils/ErrorSupportBundle.test.ts +582 -0
- package/Tests/UI/Utils/Project.test.ts +31 -0
- package/Tests/UI/Utils/StatusPageModelAPIInjection.test.ts +245 -0
- package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +820 -0
- package/Tests/Utils/Dashboard/DashboardViewConfig.test.ts +329 -0
- package/Tests/Utils/Dashboard/GridLayout.test.ts +951 -0
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +117 -0
- package/Tests/Utils/RecordingRuleExpression.test.ts +327 -0
- package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +186 -0
- package/Tests/Utils/StatusPage/GroupTree.test.ts +456 -0
- package/Tests/Utils/StatusPage/OverviewGroupHierarchyVisibility.test.ts +588 -0
- package/Tests/Utils/Telemetry/SavedViewTimeRange.test.ts +244 -0
- package/Tests/Utils/Telemetry/TelemetryQueryTimeRange.test.ts +825 -0
- package/Types/AI/AIRunCodeFixRecommendation.ts +17 -0
- package/Types/AI/CodeFixTaskContext.ts +63 -3
- package/Types/AI/CodeFixTaskType.ts +3 -3
- package/Types/HashedString.ts +4 -3
- package/Types/Monitor/CriteriaFilter.ts +4 -0
- package/Types/Monitor/DomainMonitor/DomainLookupMethod.ts +23 -0
- package/Types/Monitor/DomainMonitor/DomainMonitorResponse.ts +7 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +24 -7
- package/Types/Monitor/MonitorMetricType.ts +8 -0
- package/Types/Monitor/MonitorStep.ts +10 -1
- package/Types/Monitor/MonitorStepDomainMonitor.ts +21 -0
- package/Types/Monitor/PortMonitor/PortMonitorTimings.ts +10 -0
- package/Types/Permission.ts +23 -175
- package/Types/Probe/ProbeMonitorResponse.ts +6 -0
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +2 -3
- package/UI/Components/ErrorBoundary.tsx +138 -11
- package/UI/Components/Feed/FeedItem.tsx +9 -2
- package/UI/Components/ModelDetail/CardModelDetail.tsx +0 -12
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +12 -2
- package/UI/Components/MoreMenu/MoreMenu.tsx +285 -97
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +8 -5
- package/UI/Utils/DownloadFile.ts +16 -8
- package/UI/Utils/ErrorSupportBundle.ts +805 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +19 -8
- package/UI/Utils/Project.ts +4 -0
- package/UI/Utils/StatusPage.ts +8 -2
- package/UI/Utils/UseDashboardGridDnd.ts +917 -0
- package/Utils/Dashboard/DashboardViewConfig.ts +80 -36
- package/Utils/Dashboard/GridLayout.ts +523 -0
- package/Utils/Metrics/RecordingRuleExpression.ts +19 -17
- package/Utils/Monitor/MonitorMetricType.ts +44 -2
- package/Utils/StatusPage/GroupNestingLayout.ts +69 -0
- package/Utils/StatusPage/GroupTree.ts +157 -66
- package/Utils/StatusPage/ResourceUptime.ts +37 -2
- package/Utils/Telemetry/SavedViewTimeRange.ts +114 -0
- package/Utils/Telemetry/TelemetryQueryTimeRange.ts +334 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +39 -1
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertFeed.js +32 -0
- package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Dashboard.js +29 -0
- package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +2 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentFeed.js +32 -0
- package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogSavedView.js +33 -0
- package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +241 -11
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +4 -4
- package/build/dist/Models/DatabaseModels/StatusPage.js +29 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +28 -46
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +111 -11
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +8 -5
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +29 -11
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +14 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.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/Services/AIRunService.js +58 -12
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +74 -21
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertFeedService.js +3 -0
- package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +29 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +21 -2
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentFeedService.js +3 -0
- package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
- package/build/dist/Server/Services/LlmLogService.js +22 -1
- package/build/dist/Server/Services/LlmLogService.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +4 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +8 -5
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +63 -24
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +2 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +2 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +156 -28
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +21 -19
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +128 -49
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +170 -31
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +21 -19
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +33 -9
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +9 -5
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +121 -41
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js +46 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +61 -14
- package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +79 -1
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +21 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +20 -3
- package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +43 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/PasswordHash.js +25 -4
- package/build/dist/Server/Utils/PasswordHash.js.map +1 -1
- package/build/dist/Types/AI/AIRunCodeFixRecommendation.js +18 -0
- package/build/dist/Types/AI/AIRunCodeFixRecommendation.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js +23 -3
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskType.js +3 -3
- package/build/dist/Types/HashedString.js +4 -3
- package/build/dist/Types/HashedString.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js +24 -0
- package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +24 -7
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +6 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +15 -0
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js +2 -0
- package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js.map +1 -0
- package/build/dist/Types/Permission.js +23 -155
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -5
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +67 -8
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +2 -2
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +0 -12
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +12 -2
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +193 -65
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Utils/DownloadFile.js +15 -8
- package/build/dist/UI/Utils/DownloadFile.js.map +1 -1
- package/build/dist/UI/Utils/ErrorSupportBundle.js +476 -0
- package/build/dist/UI/Utils/ErrorSupportBundle.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -8
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Project.js +3 -0
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/UI/Utils/StatusPage.js +4 -4
- package/build/dist/UI/Utils/StatusPage.js.map +1 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js +551 -0
- package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -0
- package/build/dist/Utils/Dashboard/DashboardViewConfig.js +42 -26
- package/build/dist/Utils/Dashboard/DashboardViewConfig.js.map +1 -1
- package/build/dist/Utils/Dashboard/GridLayout.js +338 -0
- package/build/dist/Utils/Dashboard/GridLayout.js.map +1 -0
- package/build/dist/Utils/Metrics/RecordingRuleExpression.js +19 -17
- package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +38 -6
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js +46 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupTree.js +79 -34
- package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -1
- package/build/dist/Utils/StatusPage/ResourceUptime.js +22 -1
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/Telemetry/SavedViewTimeRange.js +79 -0
- package/build/dist/Utils/Telemetry/SavedViewTimeRange.js.map +1 -0
- package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js +236 -0
- package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DashboardTemplate,
|
|
3
|
+
DashboardTemplateCategories,
|
|
4
|
+
DashboardTemplateCategory,
|
|
5
|
+
DashboardTemplateType,
|
|
6
|
+
DashboardTemplates,
|
|
7
|
+
getDashboardTemplatesByCategory,
|
|
8
|
+
getTemplateConfig,
|
|
9
|
+
} from "../../../Types/Dashboard/DashboardTemplates";
|
|
10
|
+
import DashboardViewConfig from "../../../Types/Dashboard/DashboardViewConfig";
|
|
11
|
+
import { ObjectType } from "../../../Types/JSON";
|
|
12
|
+
import { describe, expect, test } from "@jest/globals";
|
|
13
|
+
|
|
14
|
+
describe("DashboardTemplates", () => {
|
|
15
|
+
test("exposes a non-empty template list", () => {
|
|
16
|
+
expect(Array.isArray(DashboardTemplates)).toBe(true);
|
|
17
|
+
expect(DashboardTemplates.length).toBeGreaterThan(0);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("every template has all required non-empty fields", () => {
|
|
21
|
+
for (const template of DashboardTemplates) {
|
|
22
|
+
expect(template.name.length).toBeGreaterThan(0);
|
|
23
|
+
expect(template.description.length).toBeGreaterThan(0);
|
|
24
|
+
expect(template.icon.length).toBeGreaterThan(0);
|
|
25
|
+
expect(Object.values(DashboardTemplateType).includes(template.type)).toBe(
|
|
26
|
+
true,
|
|
27
|
+
);
|
|
28
|
+
expect(
|
|
29
|
+
Object.values(DashboardTemplateCategory).includes(template.category),
|
|
30
|
+
).toBe(true);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("template types are unique", () => {
|
|
35
|
+
const types: Array<DashboardTemplateType> = DashboardTemplates.map(
|
|
36
|
+
(t: DashboardTemplate) => {
|
|
37
|
+
return t.type;
|
|
38
|
+
},
|
|
39
|
+
);
|
|
40
|
+
expect(new Set(types).size).toBe(types.length);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test("every template category is one of the declared categories", () => {
|
|
44
|
+
for (const template of DashboardTemplates) {
|
|
45
|
+
expect(DashboardTemplateCategories).toContain(template.category);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test("declared categories are unique", () => {
|
|
50
|
+
expect(new Set(DashboardTemplateCategories).size).toBe(
|
|
51
|
+
DashboardTemplateCategories.length,
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe("getDashboardTemplatesByCategory", () => {
|
|
56
|
+
test("returns only templates of the requested category", () => {
|
|
57
|
+
for (const category of DashboardTemplateCategories) {
|
|
58
|
+
for (const template of getDashboardTemplatesByCategory(category)) {
|
|
59
|
+
expect(template.category).toBe(category);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test("every declared category has at least one template", () => {
|
|
65
|
+
for (const category of DashboardTemplateCategories) {
|
|
66
|
+
expect(
|
|
67
|
+
getDashboardTemplatesByCategory(category).length,
|
|
68
|
+
).toBeGreaterThan(0);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("categories partition the full template list", () => {
|
|
73
|
+
const totalByCategory: number = DashboardTemplateCategories.reduce(
|
|
74
|
+
(sum: number, category: DashboardTemplateCategory) => {
|
|
75
|
+
return sum + getDashboardTemplatesByCategory(category).length;
|
|
76
|
+
},
|
|
77
|
+
0,
|
|
78
|
+
);
|
|
79
|
+
expect(totalByCategory).toBe(DashboardTemplates.length);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
describe("getTemplateConfig", () => {
|
|
84
|
+
test("returns null for the Blank template", () => {
|
|
85
|
+
expect(getTemplateConfig(DashboardTemplateType.Blank)).toBeNull();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test("returns a well-formed config for every non-Blank type", () => {
|
|
89
|
+
for (const type of Object.values(DashboardTemplateType)) {
|
|
90
|
+
if (type === DashboardTemplateType.Blank) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
const config: DashboardViewConfig | null = getTemplateConfig(type);
|
|
94
|
+
expect(config).not.toBeNull();
|
|
95
|
+
expect(config!._type).toBe(ObjectType.DashboardViewConfig);
|
|
96
|
+
expect(Array.isArray(config!.components)).toBe(true);
|
|
97
|
+
expect(config!.components.length).toBeGreaterThan(0);
|
|
98
|
+
expect(typeof config!.heightInDashboardUnits).toBe("number");
|
|
99
|
+
expect(config!.heightInDashboardUnits).toBeGreaterThan(0);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("handles every enum value without throwing", () => {
|
|
104
|
+
for (const type of Object.values(DashboardTemplateType)) {
|
|
105
|
+
expect(() => {
|
|
106
|
+
return getTemplateConfig(type);
|
|
107
|
+
}).not.toThrow();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CephMetricCategory,
|
|
3
|
+
CephMetricDefinition,
|
|
4
|
+
getAllCephMetricCategories,
|
|
5
|
+
getAllCephMetrics,
|
|
6
|
+
getCephMetricById,
|
|
7
|
+
getCephMetricByMetricName,
|
|
8
|
+
getCephMetricsByCategory,
|
|
9
|
+
} from "../../../Types/Monitor/CephMetricCatalog";
|
|
10
|
+
import AggregationType from "../../../Types/BaseDatabase/AggregationType";
|
|
11
|
+
import { describe, expect, test } from "@jest/globals";
|
|
12
|
+
|
|
13
|
+
describe("CephMetricCatalog", () => {
|
|
14
|
+
const allMetrics: Array<CephMetricDefinition> = getAllCephMetrics();
|
|
15
|
+
const allCategories: Array<CephMetricCategory> = getAllCephMetricCategories();
|
|
16
|
+
const validAggregations: Array<string> = Object.values(AggregationType);
|
|
17
|
+
|
|
18
|
+
test("returns a non-empty catalog", () => {
|
|
19
|
+
expect(Array.isArray(allMetrics)).toBe(true);
|
|
20
|
+
expect(allMetrics.length).toBeGreaterThan(0);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("every metric definition has all required non-empty fields", () => {
|
|
24
|
+
for (const metric of allMetrics) {
|
|
25
|
+
expect(typeof metric.id).toBe("string");
|
|
26
|
+
expect(metric.id.length).toBeGreaterThan(0);
|
|
27
|
+
expect(metric.friendlyName.length).toBeGreaterThan(0);
|
|
28
|
+
expect(metric.description.length).toBeGreaterThan(0);
|
|
29
|
+
expect(metric.metricName.length).toBeGreaterThan(0);
|
|
30
|
+
expect(metric.category.length).toBeGreaterThan(0);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("every metric uses a valid aggregation type", () => {
|
|
35
|
+
for (const metric of allMetrics) {
|
|
36
|
+
expect(validAggregations).toContain(metric.defaultAggregation);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("metric ids are unique", () => {
|
|
41
|
+
const ids: Array<string> = allMetrics.map((m: CephMetricDefinition) => {
|
|
42
|
+
return m.id;
|
|
43
|
+
});
|
|
44
|
+
expect(new Set(ids).size).toBe(ids.length);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("metric names are unique", () => {
|
|
48
|
+
const names: Array<string> = allMetrics.map((m: CephMetricDefinition) => {
|
|
49
|
+
return m.metricName;
|
|
50
|
+
});
|
|
51
|
+
expect(new Set(names).size).toBe(names.length);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("every metric category is a declared category", () => {
|
|
55
|
+
for (const metric of allMetrics) {
|
|
56
|
+
expect(allCategories).toContain(metric.category);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("declared categories are unique and non-empty", () => {
|
|
61
|
+
expect(allCategories.length).toBeGreaterThan(0);
|
|
62
|
+
expect(new Set(allCategories).size).toBe(allCategories.length);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("every declared category has at least one metric", () => {
|
|
66
|
+
for (const category of allCategories) {
|
|
67
|
+
expect(getCephMetricsByCategory(category).length).toBeGreaterThan(0);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("getCephMetricsByCategory returns only metrics of that category", () => {
|
|
72
|
+
for (const category of allCategories) {
|
|
73
|
+
for (const metric of getCephMetricsByCategory(category)) {
|
|
74
|
+
expect(metric.category).toBe(category);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("getCephMetricById round-trips every metric", () => {
|
|
80
|
+
for (const metric of allMetrics) {
|
|
81
|
+
expect(getCephMetricById(metric.id)).toEqual(metric);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("getCephMetricById returns undefined for an unknown id", () => {
|
|
86
|
+
expect(getCephMetricById("does-not-exist")).toBeUndefined();
|
|
87
|
+
expect(getCephMetricById("")).toBeUndefined();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("getCephMetricByMetricName round-trips every metric", () => {
|
|
91
|
+
for (const metric of allMetrics) {
|
|
92
|
+
expect(getCephMetricByMetricName(metric.metricName)).toEqual(metric);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("getCephMetricByMetricName returns undefined for an unknown name", () => {
|
|
97
|
+
expect(getCephMetricByMetricName("nope.nope.nope")).toBeUndefined();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test("known metrics are present", () => {
|
|
101
|
+
expect(getCephMetricByMetricName("ceph_health_status")).toBeDefined();
|
|
102
|
+
expect(getCephMetricByMetricName("ceph_health_detail")).toBeDefined();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
@@ -270,6 +270,8 @@ describe("CriteriaFilterUtil", () => {
|
|
|
270
270
|
test.each([
|
|
271
271
|
CheckOn.ResponseStatusCode,
|
|
272
272
|
CheckOn.ResponseTime,
|
|
273
|
+
CheckOn.PortDnsLookupTime,
|
|
274
|
+
CheckOn.PortTcpConnectTime,
|
|
273
275
|
CheckOn.CPUUsagePercent,
|
|
274
276
|
CheckOn.MemoryUsagePercent,
|
|
275
277
|
CheckOn.IsOnline,
|
|
@@ -290,6 +292,8 @@ describe("CriteriaFilterUtil", () => {
|
|
|
290
292
|
test.each([
|
|
291
293
|
CheckOn.ResponseStatusCode,
|
|
292
294
|
CheckOn.ResponseTime,
|
|
295
|
+
CheckOn.PortDnsLookupTime,
|
|
296
|
+
CheckOn.PortTcpConnectTime,
|
|
293
297
|
CheckOn.DiskUsagePercent,
|
|
294
298
|
CheckOn.CPUUsagePercent,
|
|
295
299
|
CheckOn.MemoryUsagePercent,
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DockerMetricCategory,
|
|
3
|
+
DockerMetricDefinition,
|
|
4
|
+
getAllDockerMetricCategories,
|
|
5
|
+
getAllDockerMetrics,
|
|
6
|
+
getDockerMetricById,
|
|
7
|
+
getDockerMetricByMetricName,
|
|
8
|
+
getDockerMetricsByCategory,
|
|
9
|
+
} from "../../../Types/Monitor/DockerMetricCatalog";
|
|
10
|
+
import AggregationType from "../../../Types/BaseDatabase/AggregationType";
|
|
11
|
+
import { describe, expect, test } from "@jest/globals";
|
|
12
|
+
|
|
13
|
+
describe("DockerMetricCatalog", () => {
|
|
14
|
+
const allMetrics: Array<DockerMetricDefinition> = getAllDockerMetrics();
|
|
15
|
+
const allCategories: Array<DockerMetricCategory> =
|
|
16
|
+
getAllDockerMetricCategories();
|
|
17
|
+
const validAggregations: Array<string> = Object.values(AggregationType);
|
|
18
|
+
|
|
19
|
+
test("returns a non-empty catalog", () => {
|
|
20
|
+
expect(Array.isArray(allMetrics)).toBe(true);
|
|
21
|
+
expect(allMetrics.length).toBeGreaterThan(0);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("every metric definition has all required non-empty fields", () => {
|
|
25
|
+
for (const metric of allMetrics) {
|
|
26
|
+
expect(typeof metric.id).toBe("string");
|
|
27
|
+
expect(metric.id.length).toBeGreaterThan(0);
|
|
28
|
+
expect(metric.friendlyName.length).toBeGreaterThan(0);
|
|
29
|
+
expect(metric.description.length).toBeGreaterThan(0);
|
|
30
|
+
expect(metric.metricName.length).toBeGreaterThan(0);
|
|
31
|
+
expect(metric.category.length).toBeGreaterThan(0);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test("every metric uses a valid aggregation type", () => {
|
|
36
|
+
for (const metric of allMetrics) {
|
|
37
|
+
expect(validAggregations).toContain(metric.defaultAggregation);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("metric ids are unique", () => {
|
|
42
|
+
const ids: Array<string> = allMetrics.map((m: DockerMetricDefinition) => {
|
|
43
|
+
return m.id;
|
|
44
|
+
});
|
|
45
|
+
expect(new Set(ids).size).toBe(ids.length);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
test("metric names are unique", () => {
|
|
49
|
+
const names: Array<string> = allMetrics.map((m: DockerMetricDefinition) => {
|
|
50
|
+
return m.metricName;
|
|
51
|
+
});
|
|
52
|
+
expect(new Set(names).size).toBe(names.length);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test("every metric category is a declared category", () => {
|
|
56
|
+
for (const metric of allMetrics) {
|
|
57
|
+
expect(allCategories).toContain(metric.category);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("declared categories are unique and non-empty", () => {
|
|
62
|
+
expect(allCategories.length).toBeGreaterThan(0);
|
|
63
|
+
expect(new Set(allCategories).size).toBe(allCategories.length);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("every declared category has at least one metric", () => {
|
|
67
|
+
for (const category of allCategories) {
|
|
68
|
+
expect(getDockerMetricsByCategory(category).length).toBeGreaterThan(0);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("getDockerMetricsByCategory returns only metrics of that category", () => {
|
|
73
|
+
for (const category of allCategories) {
|
|
74
|
+
for (const metric of getDockerMetricsByCategory(category)) {
|
|
75
|
+
expect(metric.category).toBe(category);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test("getDockerMetricById round-trips every metric", () => {
|
|
81
|
+
for (const metric of allMetrics) {
|
|
82
|
+
expect(getDockerMetricById(metric.id)).toEqual(metric);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("getDockerMetricById returns undefined for an unknown id", () => {
|
|
87
|
+
expect(getDockerMetricById("does-not-exist")).toBeUndefined();
|
|
88
|
+
expect(getDockerMetricById("")).toBeUndefined();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("getDockerMetricByMetricName round-trips every metric", () => {
|
|
92
|
+
for (const metric of allMetrics) {
|
|
93
|
+
expect(getDockerMetricByMetricName(metric.metricName)).toEqual(metric);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test("getDockerMetricByMetricName returns undefined for an unknown name", () => {
|
|
98
|
+
expect(getDockerMetricByMetricName("nope.nope.nope")).toBeUndefined();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("known metrics are present", () => {
|
|
102
|
+
expect(
|
|
103
|
+
getDockerMetricByMetricName("container.cpu.usage.total"),
|
|
104
|
+
).toBeDefined();
|
|
105
|
+
expect(
|
|
106
|
+
getDockerMetricByMetricName("container.cpu.utilization"),
|
|
107
|
+
).toBeDefined();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DockerSwarmMetricCategory,
|
|
3
|
+
DockerSwarmMetricDefinition,
|
|
4
|
+
getAllDockerSwarmMetricCategories,
|
|
5
|
+
getAllDockerSwarmMetrics,
|
|
6
|
+
getDockerSwarmMetricById,
|
|
7
|
+
getDockerSwarmMetricByMetricName,
|
|
8
|
+
getDockerSwarmMetricsByCategory,
|
|
9
|
+
} from "../../../Types/Monitor/DockerSwarmMetricCatalog";
|
|
10
|
+
import AggregationType from "../../../Types/BaseDatabase/AggregationType";
|
|
11
|
+
import { describe, expect, test } from "@jest/globals";
|
|
12
|
+
|
|
13
|
+
describe("DockerSwarmMetricCatalog", () => {
|
|
14
|
+
const allMetrics: Array<DockerSwarmMetricDefinition> =
|
|
15
|
+
getAllDockerSwarmMetrics();
|
|
16
|
+
const allCategories: Array<DockerSwarmMetricCategory> =
|
|
17
|
+
getAllDockerSwarmMetricCategories();
|
|
18
|
+
const validAggregations: Array<string> = Object.values(AggregationType);
|
|
19
|
+
|
|
20
|
+
test("returns a non-empty catalog", () => {
|
|
21
|
+
expect(Array.isArray(allMetrics)).toBe(true);
|
|
22
|
+
expect(allMetrics.length).toBeGreaterThan(0);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test("every metric definition has all required non-empty fields", () => {
|
|
26
|
+
for (const metric of allMetrics) {
|
|
27
|
+
expect(typeof metric.id).toBe("string");
|
|
28
|
+
expect(metric.id.length).toBeGreaterThan(0);
|
|
29
|
+
expect(metric.friendlyName.length).toBeGreaterThan(0);
|
|
30
|
+
expect(metric.description.length).toBeGreaterThan(0);
|
|
31
|
+
expect(metric.metricName.length).toBeGreaterThan(0);
|
|
32
|
+
expect(metric.category.length).toBeGreaterThan(0);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("every metric uses a valid aggregation type", () => {
|
|
37
|
+
for (const metric of allMetrics) {
|
|
38
|
+
expect(validAggregations).toContain(metric.defaultAggregation);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("metric ids are unique", () => {
|
|
43
|
+
const ids: Array<string> = allMetrics.map(
|
|
44
|
+
(m: DockerSwarmMetricDefinition) => {
|
|
45
|
+
return m.id;
|
|
46
|
+
},
|
|
47
|
+
);
|
|
48
|
+
expect(new Set(ids).size).toBe(ids.length);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test("metric names are unique", () => {
|
|
52
|
+
const names: Array<string> = allMetrics.map(
|
|
53
|
+
(m: DockerSwarmMetricDefinition) => {
|
|
54
|
+
return m.metricName;
|
|
55
|
+
},
|
|
56
|
+
);
|
|
57
|
+
expect(new Set(names).size).toBe(names.length);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("every metric category is a declared category", () => {
|
|
61
|
+
for (const metric of allMetrics) {
|
|
62
|
+
expect(allCategories).toContain(metric.category);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("declared categories are unique and non-empty", () => {
|
|
67
|
+
expect(allCategories.length).toBeGreaterThan(0);
|
|
68
|
+
expect(new Set(allCategories).size).toBe(allCategories.length);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("every declared category has at least one metric", () => {
|
|
72
|
+
for (const category of allCategories) {
|
|
73
|
+
expect(getDockerSwarmMetricsByCategory(category).length).toBeGreaterThan(
|
|
74
|
+
0,
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("getDockerSwarmMetricsByCategory returns only metrics of that category", () => {
|
|
80
|
+
for (const category of allCategories) {
|
|
81
|
+
for (const metric of getDockerSwarmMetricsByCategory(category)) {
|
|
82
|
+
expect(metric.category).toBe(category);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test("getDockerSwarmMetricById round-trips every metric", () => {
|
|
88
|
+
for (const metric of allMetrics) {
|
|
89
|
+
expect(getDockerSwarmMetricById(metric.id)).toEqual(metric);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("getDockerSwarmMetricById returns undefined for an unknown id", () => {
|
|
94
|
+
expect(getDockerSwarmMetricById("does-not-exist")).toBeUndefined();
|
|
95
|
+
expect(getDockerSwarmMetricById("")).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("getDockerSwarmMetricByMetricName round-trips every metric", () => {
|
|
99
|
+
for (const metric of allMetrics) {
|
|
100
|
+
expect(getDockerSwarmMetricByMetricName(metric.metricName)).toEqual(
|
|
101
|
+
metric,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test("getDockerSwarmMetricByMetricName returns undefined for an unknown name", () => {
|
|
107
|
+
expect(getDockerSwarmMetricByMetricName("nope.nope.nope")).toBeUndefined();
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("known metrics are present", () => {
|
|
111
|
+
expect(
|
|
112
|
+
getDockerSwarmMetricByMetricName("container.cpu.utilization"),
|
|
113
|
+
).toBeDefined();
|
|
114
|
+
expect(
|
|
115
|
+
getDockerSwarmMetricByMetricName("container.memory.usage.total"),
|
|
116
|
+
).toBeDefined();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import {
|
|
2
|
+
HostMetricCategory,
|
|
3
|
+
HostMetricDefinition,
|
|
4
|
+
getAllHostMetricCategories,
|
|
5
|
+
getAllHostMetrics,
|
|
6
|
+
getHostMetricById,
|
|
7
|
+
getHostMetricByMetricName,
|
|
8
|
+
getHostMetricsByCategory,
|
|
9
|
+
} from "../../../Types/Monitor/HostMetricCatalog";
|
|
10
|
+
import AggregationType from "../../../Types/BaseDatabase/AggregationType";
|
|
11
|
+
import { describe, expect, test } from "@jest/globals";
|
|
12
|
+
|
|
13
|
+
describe("HostMetricCatalog", () => {
|
|
14
|
+
const allMetrics: Array<HostMetricDefinition> = getAllHostMetrics();
|
|
15
|
+
const allCategories: Array<HostMetricCategory> = getAllHostMetricCategories();
|
|
16
|
+
const validAggregations: Array<string> = Object.values(AggregationType);
|
|
17
|
+
|
|
18
|
+
test("returns a non-empty catalog", () => {
|
|
19
|
+
expect(Array.isArray(allMetrics)).toBe(true);
|
|
20
|
+
expect(allMetrics.length).toBeGreaterThan(0);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("every metric definition has all required non-empty fields", () => {
|
|
24
|
+
for (const metric of allMetrics) {
|
|
25
|
+
expect(typeof metric.id).toBe("string");
|
|
26
|
+
expect(metric.id.length).toBeGreaterThan(0);
|
|
27
|
+
expect(metric.friendlyName.length).toBeGreaterThan(0);
|
|
28
|
+
expect(metric.description.length).toBeGreaterThan(0);
|
|
29
|
+
expect(metric.metricName.length).toBeGreaterThan(0);
|
|
30
|
+
expect(metric.category.length).toBeGreaterThan(0);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("every metric uses a valid aggregation type", () => {
|
|
35
|
+
for (const metric of allMetrics) {
|
|
36
|
+
expect(validAggregations).toContain(metric.defaultAggregation);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("metric ids are unique", () => {
|
|
41
|
+
const ids: Array<string> = allMetrics.map((m: HostMetricDefinition) => {
|
|
42
|
+
return m.id;
|
|
43
|
+
});
|
|
44
|
+
expect(new Set(ids).size).toBe(ids.length);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("metric names are unique", () => {
|
|
48
|
+
const names: Array<string> = allMetrics.map((m: HostMetricDefinition) => {
|
|
49
|
+
return m.metricName;
|
|
50
|
+
});
|
|
51
|
+
expect(new Set(names).size).toBe(names.length);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("every metric category is a declared category", () => {
|
|
55
|
+
for (const metric of allMetrics) {
|
|
56
|
+
expect(allCategories).toContain(metric.category);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("declared categories are unique and non-empty", () => {
|
|
61
|
+
expect(allCategories.length).toBeGreaterThan(0);
|
|
62
|
+
expect(new Set(allCategories).size).toBe(allCategories.length);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("every declared category has at least one metric", () => {
|
|
66
|
+
for (const category of allCategories) {
|
|
67
|
+
expect(getHostMetricsByCategory(category).length).toBeGreaterThan(0);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("getHostMetricsByCategory returns only metrics of that category", () => {
|
|
72
|
+
for (const category of allCategories) {
|
|
73
|
+
for (const metric of getHostMetricsByCategory(category)) {
|
|
74
|
+
expect(metric.category).toBe(category);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("getHostMetricById round-trips every metric", () => {
|
|
80
|
+
for (const metric of allMetrics) {
|
|
81
|
+
expect(getHostMetricById(metric.id)).toEqual(metric);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("getHostMetricById returns undefined for an unknown id", () => {
|
|
86
|
+
expect(getHostMetricById("does-not-exist")).toBeUndefined();
|
|
87
|
+
expect(getHostMetricById("")).toBeUndefined();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("getHostMetricByMetricName round-trips every metric", () => {
|
|
91
|
+
for (const metric of allMetrics) {
|
|
92
|
+
expect(getHostMetricByMetricName(metric.metricName)).toEqual(metric);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("getHostMetricByMetricName returns undefined for an unknown name", () => {
|
|
97
|
+
expect(getHostMetricByMetricName("nope.nope")).toBeUndefined();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test("known host metrics are present", () => {
|
|
101
|
+
expect(getHostMetricByMetricName("system.cpu.utilization")).toBeDefined();
|
|
102
|
+
expect(getHostMetricByMetricName("system.memory.usage")).toBeDefined();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import {
|
|
2
|
+
IoTMetricCategory,
|
|
3
|
+
IoTMetricDefinition,
|
|
4
|
+
getAllIoTMetricCategories,
|
|
5
|
+
getAllIoTMetrics,
|
|
6
|
+
getIoTMetricById,
|
|
7
|
+
getIoTMetricByMetricName,
|
|
8
|
+
getIoTMetricsByCategory,
|
|
9
|
+
} from "../../../Types/Monitor/IotMetricCatalog";
|
|
10
|
+
import AggregationType from "../../../Types/BaseDatabase/AggregationType";
|
|
11
|
+
import { describe, expect, test } from "@jest/globals";
|
|
12
|
+
|
|
13
|
+
describe("IotMetricCatalog", () => {
|
|
14
|
+
const allMetrics: Array<IoTMetricDefinition> = getAllIoTMetrics();
|
|
15
|
+
const allCategories: Array<IoTMetricCategory> = getAllIoTMetricCategories();
|
|
16
|
+
const validAggregations: Array<string> = Object.values(AggregationType);
|
|
17
|
+
|
|
18
|
+
test("returns a non-empty catalog", () => {
|
|
19
|
+
expect(Array.isArray(allMetrics)).toBe(true);
|
|
20
|
+
expect(allMetrics.length).toBeGreaterThan(0);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("every metric definition has all required non-empty fields", () => {
|
|
24
|
+
for (const metric of allMetrics) {
|
|
25
|
+
expect(typeof metric.id).toBe("string");
|
|
26
|
+
expect(metric.id.length).toBeGreaterThan(0);
|
|
27
|
+
expect(metric.friendlyName.length).toBeGreaterThan(0);
|
|
28
|
+
expect(metric.description.length).toBeGreaterThan(0);
|
|
29
|
+
expect(metric.metricName.length).toBeGreaterThan(0);
|
|
30
|
+
expect(metric.category.length).toBeGreaterThan(0);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("every metric uses a valid aggregation type", () => {
|
|
35
|
+
for (const metric of allMetrics) {
|
|
36
|
+
expect(validAggregations).toContain(metric.defaultAggregation);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("metric ids are unique", () => {
|
|
41
|
+
const ids: Array<string> = allMetrics.map((m: IoTMetricDefinition) => {
|
|
42
|
+
return m.id;
|
|
43
|
+
});
|
|
44
|
+
expect(new Set(ids).size).toBe(ids.length);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("metric names are unique", () => {
|
|
48
|
+
const names: Array<string> = allMetrics.map((m: IoTMetricDefinition) => {
|
|
49
|
+
return m.metricName;
|
|
50
|
+
});
|
|
51
|
+
expect(new Set(names).size).toBe(names.length);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("every metric category is a declared category", () => {
|
|
55
|
+
for (const metric of allMetrics) {
|
|
56
|
+
expect(allCategories).toContain(metric.category);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("declared categories are unique and non-empty", () => {
|
|
61
|
+
expect(allCategories.length).toBeGreaterThan(0);
|
|
62
|
+
expect(new Set(allCategories).size).toBe(allCategories.length);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("every declared category has at least one metric", () => {
|
|
66
|
+
for (const category of allCategories) {
|
|
67
|
+
expect(getIoTMetricsByCategory(category).length).toBeGreaterThan(0);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("getIoTMetricsByCategory returns only metrics of that category", () => {
|
|
72
|
+
for (const category of allCategories) {
|
|
73
|
+
for (const metric of getIoTMetricsByCategory(category)) {
|
|
74
|
+
expect(metric.category).toBe(category);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("getIoTMetricById round-trips every metric", () => {
|
|
80
|
+
for (const metric of allMetrics) {
|
|
81
|
+
expect(getIoTMetricById(metric.id)).toEqual(metric);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("getIoTMetricById returns undefined for an unknown id", () => {
|
|
86
|
+
expect(getIoTMetricById("does-not-exist")).toBeUndefined();
|
|
87
|
+
expect(getIoTMetricById("")).toBeUndefined();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("getIoTMetricByMetricName round-trips every metric", () => {
|
|
91
|
+
for (const metric of allMetrics) {
|
|
92
|
+
expect(getIoTMetricByMetricName(metric.metricName)).toEqual(metric);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("getIoTMetricByMetricName returns undefined for an unknown name", () => {
|
|
97
|
+
expect(getIoTMetricByMetricName("nope.nope.nope")).toBeUndefined();
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test("known metrics are present", () => {
|
|
101
|
+
expect(getIoTMetricByMetricName("iot_device_up")).toBeDefined();
|
|
102
|
+
expect(getIoTMetricByMetricName("iot_battery_percent")).toBeDefined();
|
|
103
|
+
});
|
|
104
|
+
});
|