@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,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
KubernetesMetricCategory,
|
|
3
|
+
KubernetesMetricDefinition,
|
|
4
|
+
getAllKubernetesMetricCategories,
|
|
5
|
+
getAllKubernetesMetrics,
|
|
6
|
+
getKubernetesMetricById,
|
|
7
|
+
getKubernetesMetricByMetricName,
|
|
8
|
+
getKubernetesMetricsByCategory,
|
|
9
|
+
} from "../../../Types/Monitor/KubernetesMetricCatalog";
|
|
10
|
+
import AggregationType from "../../../Types/BaseDatabase/AggregationType";
|
|
11
|
+
import { describe, expect, test } from "@jest/globals";
|
|
12
|
+
|
|
13
|
+
describe("KubernetesMetricCatalog", () => {
|
|
14
|
+
const allMetrics: Array<KubernetesMetricDefinition> =
|
|
15
|
+
getAllKubernetesMetrics();
|
|
16
|
+
const allCategories: Array<KubernetesMetricCategory> =
|
|
17
|
+
getAllKubernetesMetricCategories();
|
|
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: KubernetesMetricDefinition) => {
|
|
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: KubernetesMetricDefinition) => {
|
|
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(getKubernetesMetricsByCategory(category).length).toBeGreaterThan(
|
|
74
|
+
0,
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("getKubernetesMetricsByCategory returns only metrics of that category", () => {
|
|
80
|
+
for (const category of allCategories) {
|
|
81
|
+
for (const metric of getKubernetesMetricsByCategory(category)) {
|
|
82
|
+
expect(metric.category).toBe(category);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test("getKubernetesMetricById round-trips every metric", () => {
|
|
88
|
+
for (const metric of allMetrics) {
|
|
89
|
+
expect(getKubernetesMetricById(metric.id)).toEqual(metric);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("getKubernetesMetricById returns undefined for an unknown id", () => {
|
|
94
|
+
expect(getKubernetesMetricById("does-not-exist")).toBeUndefined();
|
|
95
|
+
expect(getKubernetesMetricById("")).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("getKubernetesMetricByMetricName round-trips every metric", () => {
|
|
99
|
+
for (const metric of allMetrics) {
|
|
100
|
+
expect(getKubernetesMetricByMetricName(metric.metricName)).toEqual(
|
|
101
|
+
metric,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test("getKubernetesMetricByMetricName returns undefined for an unknown name", () => {
|
|
107
|
+
expect(getKubernetesMetricByMetricName("nope.nope.nope")).toBeUndefined();
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("known metrics are present", () => {
|
|
111
|
+
expect(
|
|
112
|
+
getKubernetesMetricByMetricName("k8s.pod.cpu.utilization"),
|
|
113
|
+
).toBeDefined();
|
|
114
|
+
expect(
|
|
115
|
+
getKubernetesMetricByMetricName("k8s.pod.memory.usage"),
|
|
116
|
+
).toBeDefined();
|
|
117
|
+
});
|
|
118
|
+
});
|
|
@@ -146,6 +146,28 @@ describe("MonitorCriteriaInstance", () => {
|
|
|
146
146
|
});
|
|
147
147
|
expect(instance).toBeNull();
|
|
148
148
|
});
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* A domain whose registration data cannot be read has no expiry date, so
|
|
152
|
+
* DomainIsExpired cannot decide anything. Requiring IsOnline as well is
|
|
153
|
+
* what stops an unreadable registration from being reported as healthy
|
|
154
|
+
* (issue #3046).
|
|
155
|
+
*/
|
|
156
|
+
test("Domain monitor requires a successful lookup as well as a live registration", () => {
|
|
157
|
+
const instance: MonitorCriteriaInstance | null =
|
|
158
|
+
MonitorCriteriaInstance.getDefaultOnlineMonitorCriteriaInstance({
|
|
159
|
+
monitorType: MonitorType.Domain,
|
|
160
|
+
monitorStatusId,
|
|
161
|
+
monitorName: "identity.digital",
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
expect(instance?.data?.filterCondition).toBe(FilterCondition.All);
|
|
165
|
+
expect(instance?.data?.filters).toHaveLength(2);
|
|
166
|
+
expect(instance?.data?.filters[0]?.checkOn).toBe(CheckOn.IsOnline);
|
|
167
|
+
expect(instance?.data?.filters[0]?.filterType).toBe(FilterType.True);
|
|
168
|
+
expect(instance?.data?.filters[1]?.checkOn).toBe(CheckOn.DomainIsExpired);
|
|
169
|
+
expect(instance?.data?.filters[1]?.filterType).toBe(FilterType.False);
|
|
170
|
+
});
|
|
149
171
|
});
|
|
150
172
|
|
|
151
173
|
describe("getDefaultOfflineMonitorCriteriaInstance", () => {
|
|
@@ -181,6 +203,26 @@ describe("MonitorCriteriaInstance", () => {
|
|
|
181
203
|
);
|
|
182
204
|
expect(instance.data?.incidents[0]?.title).toContain("Edge");
|
|
183
205
|
});
|
|
206
|
+
|
|
207
|
+
test("Domain offline criteria fires on an expired registration or a failed lookup", () => {
|
|
208
|
+
const instance: MonitorCriteriaInstance =
|
|
209
|
+
MonitorCriteriaInstance.getDefaultOfflineMonitorCriteriaInstance({
|
|
210
|
+
monitorType: MonitorType.Domain,
|
|
211
|
+
monitorStatusId: new ObjectID("bbbbbbbbbbbbbbbbbbbbbbbb"),
|
|
212
|
+
incidentSeverityId: new ObjectID("cccccccccccccccccccccccc"),
|
|
213
|
+
alertSeverityId: new ObjectID("dddddddddddddddddddddddd"),
|
|
214
|
+
monitorName: "identity.digital",
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
expect(instance.data?.filterCondition).toBe(FilterCondition.Any);
|
|
218
|
+
expect(instance.data?.filters).toHaveLength(2);
|
|
219
|
+
expect(instance.data?.filters[0]?.checkOn).toBe(CheckOn.DomainIsExpired);
|
|
220
|
+
expect(instance.data?.filters[0]?.filterType).toBe(FilterType.True);
|
|
221
|
+
expect(instance.data?.filters[1]?.checkOn).toBe(CheckOn.IsOnline);
|
|
222
|
+
expect(instance.data?.filters[1]?.filterType).toBe(FilterType.False);
|
|
223
|
+
expect(instance.data?.createIncidents).toBe(true);
|
|
224
|
+
expect(instance.data?.incidents[0]?.title).toContain("identity.digital");
|
|
225
|
+
});
|
|
184
226
|
});
|
|
185
227
|
|
|
186
228
|
describe("getValidationError", () => {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
2
2
|
import MonitorType from "../../../Types/Monitor/MonitorType";
|
|
3
|
+
import DomainLookupMethod from "../../../Types/Monitor/DomainMonitor/DomainLookupMethod";
|
|
3
4
|
import ObjectID from "../../../Types/ObjectID";
|
|
4
5
|
import HTTPMethod from "../../../Types/API/HTTPMethod";
|
|
5
6
|
import { JSONObject, ObjectType } from "../../../Types/JSON";
|
|
@@ -179,5 +180,42 @@ describe("MonitorStep", () => {
|
|
|
179
180
|
const parsed: JSONObject = JSON.parse(step.toString()) as JSONObject;
|
|
180
181
|
expect(parsed["_type"]).toBe(ObjectType.MonitorStep);
|
|
181
182
|
});
|
|
183
|
+
|
|
184
|
+
/*
|
|
185
|
+
* Domain monitors saved before the lookupMethod option existed carry no
|
|
186
|
+
* such key. fromJSON has to fill it in, because the probe reads the
|
|
187
|
+
* deserialized config directly and its type says the field is present.
|
|
188
|
+
*/
|
|
189
|
+
function restoreWithDomainMonitor(domainMonitor: JSONObject): JSONObject {
|
|
190
|
+
const json: JSONObject =
|
|
191
|
+
MonitorStep.getDefaultMonitorStep(DEFAULT_ARG).toJSON();
|
|
192
|
+
|
|
193
|
+
(json["value"] as JSONObject)["domainMonitor"] = domainMonitor;
|
|
194
|
+
|
|
195
|
+
return MonitorStep.fromJSON(json).data
|
|
196
|
+
?.domainMonitor as unknown as JSONObject;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
test("fills in the domain monitor lookup method for a step saved without one", () => {
|
|
200
|
+
const domainMonitor: JSONObject = restoreWithDomainMonitor({
|
|
201
|
+
domainName: "identity.digital",
|
|
202
|
+
timeout: 10000,
|
|
203
|
+
retries: 3,
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
expect(domainMonitor["domainName"]).toBe("identity.digital");
|
|
207
|
+
expect(domainMonitor["lookupMethod"]).toBe(DomainLookupMethod.Auto);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test("preserves an explicitly chosen domain monitor lookup method", () => {
|
|
211
|
+
const domainMonitor: JSONObject = restoreWithDomainMonitor({
|
|
212
|
+
domainName: "identity.digital",
|
|
213
|
+
lookupMethod: DomainLookupMethod.WHOIS,
|
|
214
|
+
timeout: 10000,
|
|
215
|
+
retries: 3,
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
expect(domainMonitor["lookupMethod"]).toBe(DomainLookupMethod.WHOIS);
|
|
219
|
+
});
|
|
182
220
|
});
|
|
183
221
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { JSONObject } from "../../../Types/JSON";
|
|
2
|
+
import DomainLookupMethod from "../../../Types/Monitor/DomainMonitor/DomainLookupMethod";
|
|
2
3
|
import MonitorStepDomainMonitor, {
|
|
3
4
|
MonitorStepDomainMonitorUtil,
|
|
4
5
|
} from "../../../Types/Monitor/MonitorStepDomainMonitor";
|
|
@@ -13,6 +14,16 @@ describe("MonitorStepDomainMonitorUtil", () => {
|
|
|
13
14
|
expect(def.timeout).toBe(10000);
|
|
14
15
|
expect(def.retries).toBe(3);
|
|
15
16
|
});
|
|
17
|
+
|
|
18
|
+
/*
|
|
19
|
+
* Auto rather than RDAP: about half the ccTLDs (.io, .co, .de, ...)
|
|
20
|
+
* publish no RDAP service, so RDAP-only would break them.
|
|
21
|
+
*/
|
|
22
|
+
test("defaults to the Auto lookup method", () => {
|
|
23
|
+
expect(MonitorStepDomainMonitorUtil.getDefault().lookupMethod).toBe(
|
|
24
|
+
DomainLookupMethod.Auto,
|
|
25
|
+
);
|
|
26
|
+
});
|
|
16
27
|
});
|
|
17
28
|
|
|
18
29
|
describe("fromJSON", () => {
|
|
@@ -20,11 +31,13 @@ describe("MonitorStepDomainMonitorUtil", () => {
|
|
|
20
31
|
const parsed: MonitorStepDomainMonitor =
|
|
21
32
|
MonitorStepDomainMonitorUtil.fromJSON({
|
|
22
33
|
domainName: "oneuptime.com",
|
|
34
|
+
lookupMethod: DomainLookupMethod.RDAP,
|
|
23
35
|
timeout: 3000,
|
|
24
36
|
retries: 7,
|
|
25
37
|
});
|
|
26
38
|
|
|
27
39
|
expect(parsed.domainName).toBe("oneuptime.com");
|
|
40
|
+
expect(parsed.lookupMethod).toBe(DomainLookupMethod.RDAP);
|
|
28
41
|
expect(parsed.timeout).toBe(3000);
|
|
29
42
|
expect(parsed.retries).toBe(7);
|
|
30
43
|
});
|
|
@@ -41,12 +54,54 @@ describe("MonitorStepDomainMonitorUtil", () => {
|
|
|
41
54
|
expect(parsed.timeout).toBe(10000);
|
|
42
55
|
expect(parsed.retries).toBe(3);
|
|
43
56
|
});
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* Every domain monitor saved before RDAP support existed has no
|
|
60
|
+
* lookupMethod key at all, and must keep working.
|
|
61
|
+
*/
|
|
62
|
+
test("treats a monitor saved without a lookup method as Auto", () => {
|
|
63
|
+
const parsed: MonitorStepDomainMonitor =
|
|
64
|
+
MonitorStepDomainMonitorUtil.fromJSON({
|
|
65
|
+
domainName: "identity.digital",
|
|
66
|
+
timeout: 10000,
|
|
67
|
+
retries: 3,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
expect(parsed.lookupMethod).toBe(DomainLookupMethod.Auto);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test("treats an unrecognised lookup method as Auto", () => {
|
|
74
|
+
expect(
|
|
75
|
+
MonitorStepDomainMonitorUtil.fromJSON({ lookupMethod: "" })
|
|
76
|
+
.lookupMethod,
|
|
77
|
+
).toBe(DomainLookupMethod.Auto);
|
|
78
|
+
|
|
79
|
+
expect(
|
|
80
|
+
MonitorStepDomainMonitorUtil.fromJSON({ lookupMethod: "Telepathy" })
|
|
81
|
+
.lookupMethod,
|
|
82
|
+
).toBe(DomainLookupMethod.Auto);
|
|
83
|
+
|
|
84
|
+
expect(
|
|
85
|
+
MonitorStepDomainMonitorUtil.fromJSON({ lookupMethod: 42 })
|
|
86
|
+
.lookupMethod,
|
|
87
|
+
).toBe(DomainLookupMethod.Auto);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("accepts every declared lookup method", () => {
|
|
91
|
+
for (const method of Object.values(DomainLookupMethod)) {
|
|
92
|
+
expect(
|
|
93
|
+
MonitorStepDomainMonitorUtil.fromJSON({ lookupMethod: method })
|
|
94
|
+
.lookupMethod,
|
|
95
|
+
).toBe(method);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
44
98
|
});
|
|
45
99
|
|
|
46
100
|
describe("round-trip", () => {
|
|
47
101
|
test("toJSON emits every field and fromJSON restores it", () => {
|
|
48
102
|
const monitor: MonitorStepDomainMonitor = {
|
|
49
103
|
domainName: "example.com",
|
|
104
|
+
lookupMethod: DomainLookupMethod.WHOIS,
|
|
50
105
|
timeout: 5000,
|
|
51
106
|
retries: 2,
|
|
52
107
|
};
|
|
@@ -57,4 +112,24 @@ describe("MonitorStepDomainMonitorUtil", () => {
|
|
|
57
112
|
expect(MonitorStepDomainMonitorUtil.fromJSON(json)).toEqual(monitor);
|
|
58
113
|
});
|
|
59
114
|
});
|
|
115
|
+
|
|
116
|
+
describe("parseLookupMethod", () => {
|
|
117
|
+
test("accepts the declared values and rejects anything else", () => {
|
|
118
|
+
expect(MonitorStepDomainMonitorUtil.parseLookupMethod("RDAP")).toBe(
|
|
119
|
+
DomainLookupMethod.RDAP,
|
|
120
|
+
);
|
|
121
|
+
expect(MonitorStepDomainMonitorUtil.parseLookupMethod("WHOIS")).toBe(
|
|
122
|
+
DomainLookupMethod.WHOIS,
|
|
123
|
+
);
|
|
124
|
+
expect(MonitorStepDomainMonitorUtil.parseLookupMethod("rdap")).toBe(
|
|
125
|
+
DomainLookupMethod.Auto,
|
|
126
|
+
);
|
|
127
|
+
expect(MonitorStepDomainMonitorUtil.parseLookupMethod(null)).toBe(
|
|
128
|
+
DomainLookupMethod.Auto,
|
|
129
|
+
);
|
|
130
|
+
expect(MonitorStepDomainMonitorUtil.parseLookupMethod(undefined)).toBe(
|
|
131
|
+
DomainLookupMethod.Auto,
|
|
132
|
+
);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
60
135
|
});
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PodmanMetricCategory,
|
|
3
|
+
PodmanMetricDefinition,
|
|
4
|
+
getAllPodmanMetricCategories,
|
|
5
|
+
getAllPodmanMetrics,
|
|
6
|
+
getPodmanMetricById,
|
|
7
|
+
getPodmanMetricByMetricName,
|
|
8
|
+
getPodmanMetricsByCategory,
|
|
9
|
+
} from "../../../Types/Monitor/PodmanMetricCatalog";
|
|
10
|
+
import AggregationType from "../../../Types/BaseDatabase/AggregationType";
|
|
11
|
+
import { describe, expect, test } from "@jest/globals";
|
|
12
|
+
|
|
13
|
+
describe("PodmanMetricCatalog", () => {
|
|
14
|
+
const allMetrics: Array<PodmanMetricDefinition> = getAllPodmanMetrics();
|
|
15
|
+
const allCategories: Array<PodmanMetricCategory> =
|
|
16
|
+
getAllPodmanMetricCategories();
|
|
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: PodmanMetricDefinition) => {
|
|
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: PodmanMetricDefinition) => {
|
|
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(getPodmanMetricsByCategory(category).length).toBeGreaterThan(0);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("getPodmanMetricsByCategory returns only metrics of that category", () => {
|
|
73
|
+
for (const category of allCategories) {
|
|
74
|
+
for (const metric of getPodmanMetricsByCategory(category)) {
|
|
75
|
+
expect(metric.category).toBe(category);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
test("getPodmanMetricById round-trips every metric", () => {
|
|
81
|
+
for (const metric of allMetrics) {
|
|
82
|
+
expect(getPodmanMetricById(metric.id)).toEqual(metric);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("getPodmanMetricById returns undefined for an unknown id", () => {
|
|
87
|
+
expect(getPodmanMetricById("does-not-exist")).toBeUndefined();
|
|
88
|
+
expect(getPodmanMetricById("")).toBeUndefined();
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("getPodmanMetricByMetricName round-trips every metric", () => {
|
|
92
|
+
for (const metric of allMetrics) {
|
|
93
|
+
expect(getPodmanMetricByMetricName(metric.metricName)).toEqual(metric);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test("getPodmanMetricByMetricName returns undefined for an unknown name", () => {
|
|
98
|
+
expect(getPodmanMetricByMetricName("nope.nope.nope")).toBeUndefined();
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("known metrics are present", () => {
|
|
102
|
+
expect(
|
|
103
|
+
getPodmanMetricByMetricName("container.cpu.usage.total"),
|
|
104
|
+
).toBeDefined();
|
|
105
|
+
expect(
|
|
106
|
+
getPodmanMetricByMetricName("container.cpu.utilization"),
|
|
107
|
+
).toBeDefined();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ProxmoxMetricCategory,
|
|
3
|
+
ProxmoxMetricDefinition,
|
|
4
|
+
getAllProxmoxMetricCategories,
|
|
5
|
+
getAllProxmoxMetrics,
|
|
6
|
+
getProxmoxMetricById,
|
|
7
|
+
getProxmoxMetricByMetricName,
|
|
8
|
+
getProxmoxMetricsByCategory,
|
|
9
|
+
} from "../../../Types/Monitor/ProxmoxMetricCatalog";
|
|
10
|
+
import AggregationType from "../../../Types/BaseDatabase/AggregationType";
|
|
11
|
+
import { describe, expect, test } from "@jest/globals";
|
|
12
|
+
|
|
13
|
+
describe("ProxmoxMetricCatalog", () => {
|
|
14
|
+
const allMetrics: Array<ProxmoxMetricDefinition> = getAllProxmoxMetrics();
|
|
15
|
+
const allCategories: Array<ProxmoxMetricCategory> =
|
|
16
|
+
getAllProxmoxMetricCategories();
|
|
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: ProxmoxMetricDefinition) => {
|
|
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(
|
|
50
|
+
(m: ProxmoxMetricDefinition) => {
|
|
51
|
+
return m.metricName;
|
|
52
|
+
},
|
|
53
|
+
);
|
|
54
|
+
expect(new Set(names).size).toBe(names.length);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("every metric category is a declared category", () => {
|
|
58
|
+
for (const metric of allMetrics) {
|
|
59
|
+
expect(allCategories).toContain(metric.category);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test("declared categories are unique and non-empty", () => {
|
|
64
|
+
expect(allCategories.length).toBeGreaterThan(0);
|
|
65
|
+
expect(new Set(allCategories).size).toBe(allCategories.length);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("every declared category has at least one metric", () => {
|
|
69
|
+
for (const category of allCategories) {
|
|
70
|
+
expect(getProxmoxMetricsByCategory(category).length).toBeGreaterThan(0);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("getProxmoxMetricsByCategory returns only metrics of that category", () => {
|
|
75
|
+
for (const category of allCategories) {
|
|
76
|
+
for (const metric of getProxmoxMetricsByCategory(category)) {
|
|
77
|
+
expect(metric.category).toBe(category);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test("getProxmoxMetricById round-trips every metric", () => {
|
|
83
|
+
for (const metric of allMetrics) {
|
|
84
|
+
expect(getProxmoxMetricById(metric.id)).toEqual(metric);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test("getProxmoxMetricById returns undefined for an unknown id", () => {
|
|
89
|
+
expect(getProxmoxMetricById("does-not-exist")).toBeUndefined();
|
|
90
|
+
expect(getProxmoxMetricById("")).toBeUndefined();
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("getProxmoxMetricByMetricName round-trips every metric", () => {
|
|
94
|
+
for (const metric of allMetrics) {
|
|
95
|
+
expect(getProxmoxMetricByMetricName(metric.metricName)).toEqual(metric);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("getProxmoxMetricByMetricName returns undefined for an unknown name", () => {
|
|
100
|
+
expect(getProxmoxMetricByMetricName("nope.nope.nope")).toBeUndefined();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
test("known metrics are present", () => {
|
|
104
|
+
expect(getProxmoxMetricByMetricName("pve_up")).toBeDefined();
|
|
105
|
+
expect(getProxmoxMetricByMetricName("pve_uptime_seconds")).toBeDefined();
|
|
106
|
+
});
|
|
107
|
+
});
|