@oneuptime/common 13.0.6 → 13.0.7
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/AIAgentOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/AIAgentOwnerUser.ts +6 -0
- package/Models/DatabaseModels/Alert.ts +12 -0
- package/Models/DatabaseModels/AlertEpisodeOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/AlertEpisodeOwnerUser.ts +6 -1
- package/Models/DatabaseModels/AlertOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/AlertOwnerUser.ts +6 -1
- package/Models/DatabaseModels/CephClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/CephClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/CloudResourceOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/CloudResourceOwnerUser.ts +6 -0
- package/Models/DatabaseModels/DashboardOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/DashboardOwnerUser.ts +6 -1
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +8 -0
- package/Models/DatabaseModels/DockerHostOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/DockerHostOwnerUser.ts +6 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/DockerSwarmClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/HostOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/HostOwnerUser.ts +6 -0
- package/Models/DatabaseModels/Incident.ts +12 -0
- package/Models/DatabaseModels/IncidentEpisodeOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/IncidentEpisodeOwnerUser.ts +6 -1
- package/Models/DatabaseModels/IncidentOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/IncidentOwnerUser.ts +6 -1
- package/Models/DatabaseModels/IncidentTemplateOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/IncidentTemplateOwnerUser.ts +6 -0
- package/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/IncomingCallPolicyOwnerUser.ts +6 -1
- package/Models/DatabaseModels/IoTFleetOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/IoTFleetOwnerUser.ts +6 -0
- package/Models/DatabaseModels/KubernetesClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/KubernetesClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/Monitor.ts +2 -3
- package/Models/DatabaseModels/MonitorGroupOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/MonitorGroupOwnerUser.ts +6 -0
- package/Models/DatabaseModels/MonitorOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/MonitorOwnerUser.ts +6 -1
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -3
- package/Models/DatabaseModels/NetworkDeviceOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/NetworkDeviceOwnerUser.ts +6 -0
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.ts +6 -1
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.ts +6 -1
- package/Models/DatabaseModels/PodmanHostOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/PodmanHostOwnerUser.ts +6 -0
- package/Models/DatabaseModels/ProbeOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ProbeOwnerUser.ts +6 -0
- package/Models/DatabaseModels/ProxmoxClusterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ProxmoxClusterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/RumApplicationOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/RumApplicationOwnerUser.ts +6 -0
- package/Models/DatabaseModels/RunbookOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/RunbookOwnerUser.ts +6 -1
- package/Models/DatabaseModels/RunnerOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/RunnerOwnerUser.ts +6 -1
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.ts +6 -1
- package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.ts +8 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +8 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerUser.ts +6 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +6 -1
- package/Models/DatabaseModels/ServiceOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/ServiceOwnerUser.ts +6 -0
- package/Models/DatabaseModels/StatusPageOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/StatusPageOwnerUser.ts +6 -1
- package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +6 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +6 -0
- package/Models/DatabaseModels/WorkflowOwnerTeam.ts +6 -1
- package/Models/DatabaseModels/WorkflowOwnerUser.ts +6 -1
- package/Scripts/benchmark-fanin-capacity.js +2 -2
- package/Server/API/AIAgentDataAPI.ts +1 -1
- package/Server/API/AIChatAPI.ts +6 -4
- package/Server/API/AIInvestigationAPI.ts +7 -0
- package/Server/API/StatusPageAPI.ts +13 -0
- package/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.ts +1057 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Readme.md +6 -4
- package/Server/Middleware/IdentityRateLimit.ts +34 -1
- package/Server/Middleware/PublicDashboardRateLimit.ts +169 -39
- package/Server/Services/AlertEpisodeService.ts +13 -34
- package/Server/Services/AlertGroupingEngineService.ts +7 -4
- package/Server/Services/AlertService.ts +13 -32
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +18 -10
- package/Server/Services/DashboardOwnerRuleEngineService.ts +18 -10
- package/Server/Services/DatabaseService.ts +101 -1
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +18 -10
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/HostOwnerRuleEngineService.ts +18 -10
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +6 -4
- package/Server/Services/IncidentEpisodeService.ts +15 -75
- package/Server/Services/IncidentGroupingEngineService.ts +7 -4
- package/Server/Services/IncidentService.ts +13 -32
- package/Server/Services/IncidentTemplateService.ts +13 -36
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +18 -10
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +18 -10
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/MonitorService.ts +13 -32
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +18 -10
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +18 -10
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +18 -10
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +18 -10
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +18 -10
- package/Server/Services/RunbookOwnerRuleEngineService.ts +18 -10
- package/Server/Services/ScheduledMaintenanceService.ts +13 -34
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +12 -34
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +18 -10
- package/Server/Services/ServiceOwnerRuleEngineService.ts +18 -10
- package/Server/Services/StatusPagePrivateUserService.ts +38 -29
- package/Server/Services/StatusPagePrivateUserSessionService.ts +49 -1
- package/Server/Services/StatusPageService.ts +59 -36
- package/Server/Services/UserSessionService.ts +6 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +18 -10
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +18 -10
- package/Server/Static/Brand/README.md +7 -7
- package/Server/Static/Vendor/README.md +7 -7
- package/Server/Types/Database/Permissions/OwnedScopePermission.ts +18 -9
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +82 -0
- package/Server/Utils/AI/Chat/ChatAgentRunner.ts +21 -8
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +41 -4
- package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +1 -1
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +1 -1
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +13 -5
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +53 -13
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +51 -14
- package/Server/Utils/AI/SRE/InvestigationEligibility.ts +292 -0
- package/Server/Utils/AI/SRE/InvestigationQueue.ts +25 -0
- package/Server/Utils/AI/Toolbox/Index.ts +43 -13
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +952 -0
- package/Server/Utils/AI/Toolbox/RumTools.ts +424 -0
- package/Server/Utils/AI/Toolbox/ToolTypes.ts +10 -0
- package/Server/Utils/AI/Toolbox/TraceTools.ts +2 -1
- package/Server/Utils/Database/PostgresErrorTranslator.ts +14 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +137 -126
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +4 -1
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +157 -6
- package/Server/Utils/Telemetry/TelemetryEntity.ts +205 -6
- package/SslCertificates/GlobalSign.crt +26 -0
- package/SslCertificates/Readme.md +3 -0
- package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +451 -0
- package/Tests/App/Dashboard/AIInsightsChatPanel.test.tsx +881 -0
- package/Tests/App/Dashboard/AIInsightsPageContext.test.ts +458 -0
- package/Tests/App/Dashboard/AIInsightsResourceCitations.test.ts +124 -0
- package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +798 -0
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +7 -0
- package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +104 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +156 -64
- package/Tests/App/Dashboard/DiscoveryScanStatusMessage.test.tsx +970 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +406 -12
- package/Tests/App/Dashboard/EmbeddedMetricEventScope.test.tsx +358 -0
- package/Tests/App/Dashboard/ErrorPatternEventScope.test.tsx +148 -0
- package/Tests/App/Dashboard/EventOverlayAdditionalResourceScope.test.ts +255 -0
- package/Tests/App/Dashboard/EventOverlayScope.test.ts +845 -0
- package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +903 -0
- package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +3 -3
- package/Tests/App/Dashboard/InvestigationDrawer.test.tsx +21 -0
- package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +761 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +7 -4
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +15 -7
- package/Tests/App/Dashboard/MetricsViewerEventScopeNavigation.test.tsx +264 -0
- package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +342 -0
- package/Tests/App/Dashboard/MonitorTestForm.test.tsx +612 -0
- package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +301 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +74 -2
- package/Tests/App/Dashboard/TextClampLayoutHarness.ts +224 -0
- package/Tests/Models/InventoryItemNaming.test.ts +54 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +161 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +14 -0
- package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +260 -0
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +133 -0
- package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +482 -0
- package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +1 -1
- package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +1 -1
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +38 -16
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +106 -31
- package/Tests/Server/Infrastructure/ExampleDockerfiles.test.ts +46 -12
- package/Tests/Server/Infrastructure/Postgres/MonitorDescriptionMigration.test.ts +422 -0
- package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +1 -1
- package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +25 -4
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +72 -0
- package/Tests/Server/Middleware/PublicDashboardRateLimit.test.ts +12 -12
- package/Tests/Server/Middleware/PublicDashboardRateLimitStatusPage.test.ts +800 -0
- package/Tests/Server/Services/AIInvestigationDecisionPostgres.test.ts +346 -0
- package/Tests/Server/Services/AddOwnersIdempotency.test.ts +471 -0
- package/Tests/Server/Services/DatabaseServiceAutoOwnerOnCreate.test.ts +250 -0
- package/Tests/Server/Services/DatabaseServiceUniqueColumnsTogether.test.ts +622 -0
- package/Tests/Server/Services/MonitorDescriptionValidation.test.ts +211 -0
- package/Tests/Server/Services/MonitorTemplateDescriptionPropagation.test.ts +269 -0
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +504 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +43 -0
- package/Tests/Server/Services/SessionRetention.test.ts +334 -0
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +172 -0
- package/Tests/Server/Services/StatusPagePrivateUserReadAccess.test.ts +178 -0
- package/Tests/Server/Services/StatusPagePrivateUserReadAccessPostgres.test.ts +311 -0
- package/Tests/Server/Services/StatusPagePrivateUserSessionService.test.ts +216 -1
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +1 -1
- package/Tests/Server/Services/UserOnCallLogNoNotificationRules.test.ts +1 -1
- package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +626 -0
- package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +668 -0
- package/Tests/Server/Types/Database/Permissions/SelectRejectionMessageContract.test.ts +1 -0
- package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +1 -1
- package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +16 -9
- package/Tests/Server/Utils/AI/ChatAgentRunner.test.ts +137 -1
- package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +697 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +105 -0
- package/Tests/Server/Utils/AI/RemediationHandoff.test.ts +16 -5
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +1304 -0
- package/Tests/Server/Utils/AI/RumTools.test.ts +769 -0
- package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +63 -0
- package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaEvaluateOverTime.test.ts +11 -9
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +62 -45
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +25 -24
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaHumanMessages.test.ts +513 -0
- package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +2 -2
- package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/Criteria/ExternalStatusPageMonitorCriteria.test.ts +9 -9
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +7 -5
- package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +2 -2
- package/Tests/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.test.ts +4 -3
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +2 -2
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +3 -2
- package/Tests/Server/Utils/Monitor/MonitorCriteriaHumanMessages.test.ts +529 -0
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +412 -4
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts +1 -1
- package/Tests/Server/Utils/TailwindBuildCopy.test.ts +14 -2
- package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +235 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +385 -2
- package/Tests/Server/Utils/VendorAssets.test.ts +17 -3
- package/Tests/Types/AI/AIChatPageContext.test.ts +0 -0
- package/Tests/Types/AI/AIResourceContext.test.ts +312 -0
- package/Tests/Types/Database/UniqueColumnsTogether.test.ts +100 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +4 -4
- package/Tests/Types/Monitor/MonitorStepRetryPersistence.test.ts +125 -0
- package/Tests/Types/WebsiteRequest.test.ts +44 -0
- package/Tests/UI/Components/Forms/MonitorDescriptionForm.test.tsx +410 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableReadPermissions.test.tsx +439 -0
- package/Tests/UI/Components/NavBarMenuSearch.test.tsx +372 -0
- package/Tests/UI/EsbuildConfig.test.ts +1 -1
- package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +616 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +4 -2
- package/Tests/UI/Rum/ReplayEngine.test.ts +179 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +23 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +88 -0
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +83 -0
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +33 -0
- package/Tests/Utils/API.test.ts +96 -0
- package/Tests/Utils/HTTPResponseBodyReader.test.ts +188 -1
- package/Tests/Utils/Metrics/MetricEventScopeUrl.test.ts +101 -0
- package/Tests/Utils/Monitor/MonitorTestAvailabilityUtil.test.ts +256 -0
- package/Tests/Utils/Telemetry/HostIpAddresses.test.ts +105 -0
- package/Types/AI/AIChatPageContext.ts +87 -2
- package/Types/AI/AIChatTypes.ts +4 -0
- package/Types/AI/AIResourceContext.ts +198 -0
- package/Types/AI/InvestigationNotStartedReason.ts +30 -0
- package/Types/Database/UniqueColumnsTogether.ts +55 -0
- package/Types/Metrics/MetricQueryConfigData.ts +8 -0
- package/Types/Rum/WebVitals.ts +71 -0
- package/Types/WebsiteRequest.ts +2 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +7 -5
- package/UI/Components/KeyboardShortcut/Screenshots/README.md +1 -1
- package/UI/Components/ModelTable/BaseModelTable.tsx +8 -0
- package/UI/Components/Navbar/NavBar.tsx +2 -0
- package/UI/Components/Navbar/NavBarMenuModal.tsx +6 -2
- package/UI/esbuild-config.js +4 -4
- package/Utils/API.ts +10 -1
- package/Utils/Dashboard/HtmlWidgetDocument.ts +1 -1
- package/Utils/HTTPResponseBodyReader.ts +64 -8
- package/Utils/Metrics/MetricExplorerUrl.ts +19 -0
- package/Utils/Monitor/MonitorTestAvailabilityUtil.ts +92 -0
- package/Utils/Telemetry/HostIpAddresses.ts +46 -2
- package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/AIAgentOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/AIAgentOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Alert.js +12 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +3 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/HostOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/HostOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +12 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplateOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -3
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/MonitorGroupOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -3
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ProbeOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/RunnerOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js +6 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +6 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +4 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +4 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js +3 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js +3 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerUser.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +1 -1
- package/build/dist/Server/API/AIChatAPI.js +3 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +3 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +9 -1
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/LocalMigrationGenerationDataSource.js +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js +602 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793500000000-MakeOwnerRowsUnique.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793700000000-AddAIInvestigationDecision.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793800000000-RemoveMonitorDescriptionLengthLimit.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +22 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js +117 -36
- package/build/dist/Server/Middleware/PublicDashboardRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +13 -31
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +7 -4
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +13 -31
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +71 -1
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +6 -4
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +15 -68
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +7 -4
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +13 -31
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +13 -31
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +13 -31
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +13 -31
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +12 -29
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +33 -25
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +36 -1
- package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +50 -35
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/UserSessionService.js +5 -0
- package/build/dist/Server/Services/UserSessionService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +12 -8
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js +15 -10
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +82 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +12 -3
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +32 -4
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +8 -5
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +33 -13
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +31 -10
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +205 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +13 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +30 -6
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +721 -0
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/RumTools.js +330 -0
- package/build/dist/Server/Utils/AI/Toolbox/RumTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/ToolTypes.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/TraceTools.js.map +1 -1
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +11 -0
- package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +106 -101
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +4 -2
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +94 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +171 -6
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Types/AI/AIChatPageContext.js +68 -2
- package/build/dist/Types/AI/AIChatPageContext.js.map +1 -1
- package/build/dist/Types/AI/AIChatTypes.js +4 -0
- package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
- package/build/dist/Types/AI/AIResourceContext.js +162 -0
- package/build/dist/Types/AI/AIResourceContext.js.map +1 -0
- package/build/dist/Types/AI/InvestigationNotStartedReason.js +2 -0
- package/build/dist/Types/AI/InvestigationNotStartedReason.js.map +1 -0
- package/build/dist/Types/Database/UniqueColumnsTogether.js +19 -0
- package/build/dist/Types/Database/UniqueColumnsTogether.js.map +1 -0
- package/build/dist/Types/Metrics/MetricQueryConfigData.js.map +1 -1
- package/build/dist/Types/Rum/WebVitals.js +64 -0
- package/build/dist/Types/Rum/WebVitals.js.map +1 -0
- package/build/dist/Types/WebsiteRequest.js +2 -0
- package/build/dist/Types/WebsiteRequest.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +7 -5
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +7 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +4 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/Utils/API.js +8 -4
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/HTTPResponseBodyReader.js +50 -6
- package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +14 -3
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js +68 -0
- package/build/dist/Utils/Monitor/MonitorTestAvailabilityUtil.js.map +1 -0
- package/build/dist/Utils/Telemetry/HostIpAddresses.js +42 -3
- package/build/dist/Utils/Telemetry/HostIpAddresses.js.map +1 -1
- package/package.json +5 -5
- package/test-setup.sh +2 -2
|
@@ -465,13 +465,15 @@ afterEach(() => {
|
|
|
465
465
|
});
|
|
466
466
|
|
|
467
467
|
describe("InvestigationPanel report lifecycle", () => {
|
|
468
|
-
test("
|
|
468
|
+
test("explains a missing run and briefly checks whether one appears", async () => {
|
|
469
469
|
postMock.mockResolvedValue(noInvestigationResponse() as never);
|
|
470
470
|
|
|
471
|
-
|
|
471
|
+
renderPanel();
|
|
472
472
|
await flush();
|
|
473
473
|
|
|
474
|
-
expect(
|
|
474
|
+
expect(
|
|
475
|
+
screen.getByText("No investigation has been recorded"),
|
|
476
|
+
).toBeVisible();
|
|
475
477
|
expect(jest.getTimerCount()).toBe(1);
|
|
476
478
|
|
|
477
479
|
await advanceFastPolls(4);
|
|
@@ -706,7 +708,8 @@ describe("InvestigationPanel report lifecycle", () => {
|
|
|
706
708
|
);
|
|
707
709
|
await flush();
|
|
708
710
|
|
|
709
|
-
expect(
|
|
711
|
+
expect(screen.getByText("Checking investigation status…")).toBeVisible();
|
|
712
|
+
expect(screen.queryByTestId("investigation-markdown")).toBeNull();
|
|
710
713
|
expect(onAnalysisAvailable).not.toHaveBeenCalled();
|
|
711
714
|
|
|
712
715
|
await resolveDeferred(
|
|
@@ -148,7 +148,7 @@ describe("InvestigationPanel status reporting", () => {
|
|
|
148
148
|
),
|
|
149
149
|
);
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
render(
|
|
152
152
|
<InvestigationPanel
|
|
153
153
|
subjectType="incident"
|
|
154
154
|
subjectId={SUBJECT_ID}
|
|
@@ -164,7 +164,9 @@ describe("InvestigationPanel status reporting", () => {
|
|
|
164
164
|
});
|
|
165
165
|
|
|
166
166
|
expect(onStatusChange).toHaveBeenCalledWith(null);
|
|
167
|
-
expect(
|
|
167
|
+
expect(
|
|
168
|
+
screen.getByText("No investigation has been recorded"),
|
|
169
|
+
).toBeVisible();
|
|
168
170
|
});
|
|
169
171
|
|
|
170
172
|
test("discovers an AI run that is enqueued after the incident page loads", async () => {
|
|
@@ -447,13 +449,13 @@ describe("InvestigationPanel status reporting", () => {
|
|
|
447
449
|
expect(jest.getTimerCount()).toBe(0);
|
|
448
450
|
});
|
|
449
451
|
|
|
450
|
-
test("
|
|
452
|
+
test("shows an unavailable status when the initial request fails", async () => {
|
|
451
453
|
const onStatusChange: MockFunction = getJestMockFunction();
|
|
452
454
|
postMock.mockResolvedValue(
|
|
453
455
|
new HTTPErrorResponse(500, { message: "boom" }, {}),
|
|
454
456
|
);
|
|
455
457
|
|
|
456
|
-
|
|
458
|
+
render(
|
|
457
459
|
<InvestigationPanel
|
|
458
460
|
subjectType="incident"
|
|
459
461
|
subjectId={SUBJECT_ID}
|
|
@@ -464,7 +466,10 @@ describe("InvestigationPanel status reporting", () => {
|
|
|
464
466
|
await waitFor(() => {
|
|
465
467
|
expect(onStatusChange).toHaveBeenCalledWith(null);
|
|
466
468
|
});
|
|
467
|
-
expect(
|
|
469
|
+
expect(
|
|
470
|
+
screen.getByText("Investigation status is unavailable"),
|
|
471
|
+
).toBeVisible();
|
|
472
|
+
expect(screen.queryByText("Not investigated")).toBeNull();
|
|
468
473
|
});
|
|
469
474
|
|
|
470
475
|
test("preserves the last active status through a transient polling failure", async () => {
|
|
@@ -534,7 +539,7 @@ describe("InvestigationPanel status reporting", () => {
|
|
|
534
539
|
new HTTPErrorResponse(503, { message: "try again" }, {}),
|
|
535
540
|
);
|
|
536
541
|
|
|
537
|
-
const {
|
|
542
|
+
const { rerender } = render(
|
|
538
543
|
<InvestigationPanel
|
|
539
544
|
subjectType="incident"
|
|
540
545
|
subjectId={SUBJECT_ID}
|
|
@@ -552,10 +557,13 @@ describe("InvestigationPanel status reporting", () => {
|
|
|
552
557
|
);
|
|
553
558
|
|
|
554
559
|
await waitFor(() => {
|
|
555
|
-
expect(
|
|
560
|
+
expect(
|
|
561
|
+
screen.getByText("Investigation status is unavailable"),
|
|
562
|
+
).toBeVisible();
|
|
556
563
|
expect(onStatusChange).toHaveBeenLastCalledWith(null);
|
|
557
564
|
});
|
|
558
565
|
expect(postMock).toHaveBeenCalledTimes(2);
|
|
566
|
+
expect(screen.queryByText("Investigating…")).toBeNull();
|
|
559
567
|
});
|
|
560
568
|
|
|
561
569
|
test("ignores a late response from the previous subject", async () => {
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import {
|
|
3
|
+
afterEach,
|
|
4
|
+
beforeEach,
|
|
5
|
+
describe,
|
|
6
|
+
expect,
|
|
7
|
+
jest,
|
|
8
|
+
test,
|
|
9
|
+
} from "@jest/globals";
|
|
10
|
+
import {
|
|
11
|
+
act,
|
|
12
|
+
cleanup,
|
|
13
|
+
fireEvent,
|
|
14
|
+
render,
|
|
15
|
+
screen,
|
|
16
|
+
} from "@testing-library/react";
|
|
17
|
+
import * as React from "react";
|
|
18
|
+
import MetricsViewer from "../../../../App/FeatureSet/Dashboard/src/Components/Metrics/MetricsViewer";
|
|
19
|
+
import MetricExplorerUrl, {
|
|
20
|
+
SerializedMetricQuery,
|
|
21
|
+
} from "../../../Utils/Metrics/MetricExplorerUrl";
|
|
22
|
+
import { buildQueryConfigsFromSerializedQueries } from "../../../../App/FeatureSet/Dashboard/src/Components/Metrics/Utils/MetricConfigReconstruct";
|
|
23
|
+
import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
|
|
24
|
+
import MetricType from "../../../Models/DatabaseModels/MetricType";
|
|
25
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
26
|
+
import Includes from "../../../Types/BaseDatabase/Includes";
|
|
27
|
+
import ServiceType from "../../../Types/Telemetry/ServiceType";
|
|
28
|
+
import Navigation from "../../../UI/Utils/Navigation";
|
|
29
|
+
import ProjectUtil from "../../../UI/Utils/Project";
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
* Render the real list's row navigation with the data-loading and table
|
|
33
|
+
* chrome replaced. These boundaries do not participate in URL generation.
|
|
34
|
+
*/
|
|
35
|
+
jest.mock("../../../UI/Components/TelemetryViewer/TelemetryViewer", () => {
|
|
36
|
+
return {
|
|
37
|
+
__esModule: true,
|
|
38
|
+
default: (props: {
|
|
39
|
+
renderRow: (metric: MetricType) => React.ReactElement;
|
|
40
|
+
}) => {
|
|
41
|
+
return props.renderRow({ name: "cpu.usage" } as MetricType);
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
jest.mock(
|
|
47
|
+
"../../../../App/FeatureSet/Dashboard/src/Components/Metrics/MetricRow",
|
|
48
|
+
() => {
|
|
49
|
+
return {
|
|
50
|
+
__esModule: true,
|
|
51
|
+
default: (props: { onClick: () => void }) => {
|
|
52
|
+
return <button onClick={props.onClick}>Open metric</button>;
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
|
|
59
|
+
return {
|
|
60
|
+
__esModule: true,
|
|
61
|
+
default: {
|
|
62
|
+
getList: () => {
|
|
63
|
+
return Promise.resolve({ data: [], count: 0 });
|
|
64
|
+
},
|
|
65
|
+
getCommonHeaders: () => {
|
|
66
|
+
return {};
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
jest.mock("../../../UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI", () => {
|
|
73
|
+
return {
|
|
74
|
+
__esModule: true,
|
|
75
|
+
default: {
|
|
76
|
+
getList: () => {
|
|
77
|
+
return Promise.resolve({ data: [] });
|
|
78
|
+
},
|
|
79
|
+
aggregate: () => {
|
|
80
|
+
return Promise.resolve({ data: [] });
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
jest.mock("../../../UI/Utils/API/API", () => {
|
|
87
|
+
return {
|
|
88
|
+
__esModule: true,
|
|
89
|
+
default: {
|
|
90
|
+
post: () => {
|
|
91
|
+
return Promise.resolve({ data: { facets: {} } });
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
jest.mock(
|
|
98
|
+
"../../../../App/FeatureSet/Dashboard/src/Components/Metrics/Utils/Metrics",
|
|
99
|
+
() => {
|
|
100
|
+
return {
|
|
101
|
+
__esModule: true,
|
|
102
|
+
default: {
|
|
103
|
+
getTelemetryAttributes: () => {
|
|
104
|
+
return Promise.resolve([]);
|
|
105
|
+
},
|
|
106
|
+
fetchSparklineAggregates: () => {
|
|
107
|
+
return Promise.resolve(new Map());
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
},
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
jest.mock("../../../UI/Utils/Telemetry/UseTelemetryEntityNames", () => {
|
|
115
|
+
return {
|
|
116
|
+
__esModule: true,
|
|
117
|
+
default: () => {
|
|
118
|
+
return {};
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const FIRST_ID: ObjectID = new ObjectID("11111111-0000-4000-8000-000000000001");
|
|
124
|
+
const SECOND_ID: ObjectID = new ObjectID(
|
|
125
|
+
"22222222-0000-4000-8000-000000000002",
|
|
126
|
+
);
|
|
127
|
+
let navigateSpy: ReturnType<typeof jest.spyOn>;
|
|
128
|
+
|
|
129
|
+
type ViewerProps = React.ComponentProps<typeof MetricsViewer>;
|
|
130
|
+
|
|
131
|
+
async function openMetric(props: ViewerProps): Promise<MetricQueryConfigData> {
|
|
132
|
+
await act(async () => {
|
|
133
|
+
render(<MetricsViewer {...props} disableUrlSync={true} />);
|
|
134
|
+
});
|
|
135
|
+
fireEvent.click(screen.getByRole("button", { name: "Open metric" }));
|
|
136
|
+
const url: globalThis.URL = new globalThis.URL(
|
|
137
|
+
navigateSpy.mock.calls[0]![0]!.toString(),
|
|
138
|
+
);
|
|
139
|
+
const queries: Array<SerializedMetricQuery> =
|
|
140
|
+
MetricExplorerUrl.parseMetricQueriesParam(
|
|
141
|
+
url.searchParams.get("metricQueries")!,
|
|
142
|
+
);
|
|
143
|
+
expect(queries).toHaveLength(1);
|
|
144
|
+
return buildQueryConfigsFromSerializedQueries(queries)[0]!;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
beforeEach(() => {
|
|
148
|
+
jest.spyOn(ProjectUtil, "getCurrentProjectId").mockReturnValue(FIRST_ID);
|
|
149
|
+
navigateSpy = jest.spyOn(Navigation, "navigate").mockImplementation(() => {
|
|
150
|
+
return undefined;
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
afterEach(() => {
|
|
155
|
+
cleanup();
|
|
156
|
+
jest.restoreAllMocks();
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
describe("metric-list resource scope on row navigation", () => {
|
|
160
|
+
test("RUM's polymorphic entity id remains RUM when its metric has no attribute filter", async () => {
|
|
161
|
+
const query: MetricQueryConfigData = await openMetric({
|
|
162
|
+
serviceIds: [FIRST_ID],
|
|
163
|
+
scopeEntityType: ServiceType.RealUserMonitor,
|
|
164
|
+
});
|
|
165
|
+
expect(query.eventScope?.["primaryEntityType"]).toBe(
|
|
166
|
+
ServiceType.RealUserMonitor,
|
|
167
|
+
);
|
|
168
|
+
expect((query.eventScope?.["primaryEntityId"] as Includes).values).toEqual([
|
|
169
|
+
FIRST_ID.toString(),
|
|
170
|
+
]);
|
|
171
|
+
expect(query.metricQueryData.filterData.attributes).toEqual({});
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test("service scope retains every selected service id", async () => {
|
|
175
|
+
const query: MetricQueryConfigData = await openMetric({
|
|
176
|
+
serviceIds: [FIRST_ID, SECOND_ID],
|
|
177
|
+
});
|
|
178
|
+
expect(query.eventScope?.["primaryEntityType"]).toBe(
|
|
179
|
+
ServiceType.OpenTelemetry,
|
|
180
|
+
);
|
|
181
|
+
expect((query.eventScope?.["primaryEntityId"] as Includes).values).toEqual([
|
|
182
|
+
FIRST_ID.toString(),
|
|
183
|
+
SECOND_ID.toString(),
|
|
184
|
+
]);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test("Inventory's opaque entity membership survives navigation", async () => {
|
|
188
|
+
const query: MetricQueryConfigData = await openMetric({
|
|
189
|
+
entityKeysFilter: ["inventory-entity"],
|
|
190
|
+
});
|
|
191
|
+
expect((query.eventScope?.["entityKeys"] as Includes).values).toEqual([
|
|
192
|
+
"inventory-entity",
|
|
193
|
+
]);
|
|
194
|
+
expect(query.metricQueryData.filterData.attributes).toEqual({});
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test.each<Record<string, string>>([
|
|
198
|
+
{ "resource.host.name": "Web-01" },
|
|
199
|
+
{ "resource.service.name": "Checkout" },
|
|
200
|
+
{
|
|
201
|
+
"resource.k8s.cluster.name": "Prod",
|
|
202
|
+
"resource.k8s.namespace.name": "Apps",
|
|
203
|
+
"resource.k8s.pod.name": "Checkout-1",
|
|
204
|
+
},
|
|
205
|
+
])(
|
|
206
|
+
"Inventory's natural identity %p survives without losing its original case",
|
|
207
|
+
async (searchAttributes: Record<string, string>) => {
|
|
208
|
+
const query: MetricQueryConfigData = await openMetric({
|
|
209
|
+
entityKeysFilter: ["inventory-entity"],
|
|
210
|
+
entityKeyDisplays: {
|
|
211
|
+
"inventory-entity": {
|
|
212
|
+
displayKey: "Resource",
|
|
213
|
+
displayValue: "Example",
|
|
214
|
+
searchAttributes,
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
expect(query.eventScope).toEqual(searchAttributes);
|
|
219
|
+
expect(query.metricQueryData.filterData.attributes).toEqual({});
|
|
220
|
+
},
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
test("multiple inventory memberships remain bounded when one natural identity cannot represent them", async () => {
|
|
224
|
+
const query: MetricQueryConfigData = await openMetric({
|
|
225
|
+
entityKeysFilter: ["entity-a", "entity-b"],
|
|
226
|
+
entityKeyDisplays: {
|
|
227
|
+
"entity-a": {
|
|
228
|
+
displayKey: "Host",
|
|
229
|
+
displayValue: "Web-01",
|
|
230
|
+
searchAttributes: { "resource.host.name": "Web-01" },
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
expect((query.eventScope?.["entityKeys"] as Includes).values).toEqual([
|
|
235
|
+
"entity-a",
|
|
236
|
+
"entity-b",
|
|
237
|
+
]);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
test("legacy membership scopes survive without becoming synthetic attribute filters", async () => {
|
|
241
|
+
const query: MetricQueryConfigData = await openMetric({
|
|
242
|
+
entityScope: {
|
|
243
|
+
entityKeys: ["host-entity"],
|
|
244
|
+
attributeKey: "resource.host.name",
|
|
245
|
+
attributeValue: "web-01",
|
|
246
|
+
},
|
|
247
|
+
attributeFilters: { "resource.host.name": "web-01" },
|
|
248
|
+
});
|
|
249
|
+
expect(query.eventScope).toEqual({ "resource.host.name": "web-01" });
|
|
250
|
+
expect(query.metricQueryData.filterData.attributes).toEqual({
|
|
251
|
+
"resource.host.name": "web-01",
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
test("ordinary attribute-scoped charts retain their existing scope", async () => {
|
|
256
|
+
const query: MetricQueryConfigData = await openMetric({
|
|
257
|
+
attributeFilters: { "resource.k8s.cluster.name": "prod" },
|
|
258
|
+
});
|
|
259
|
+
expect(query.eventScope).toBeUndefined();
|
|
260
|
+
expect(query.metricQueryData.filterData.attributes).toEqual({
|
|
261
|
+
"resource.k8s.cluster.name": "prod",
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
});
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import {
|
|
3
|
+
afterEach,
|
|
4
|
+
beforeEach,
|
|
5
|
+
describe,
|
|
6
|
+
expect,
|
|
7
|
+
jest,
|
|
8
|
+
test,
|
|
9
|
+
} from "@jest/globals";
|
|
10
|
+
import { cleanup, render, screen, within } from "@testing-library/react";
|
|
11
|
+
import * as React from "react";
|
|
12
|
+
import Permission from "../../../Types/Permission";
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
* https://github.com/OneUptime/oneuptime/issues/3867
|
|
16
|
+
*
|
|
17
|
+
* "Test Monitor" on the Monitor Overview's summary card.
|
|
18
|
+
*
|
|
19
|
+
* The card is where a reader already asks "is this working right now", so it
|
|
20
|
+
* is where the on-demand version of that question belongs. What these pin is
|
|
21
|
+
* when the action is offered at all - because the summary card renders for
|
|
22
|
+
* every monitor type except Manual, while a test only means something for the
|
|
23
|
+
* fourteen types a probe actually runs, and only when there are steps to run
|
|
24
|
+
* and something to run them on.
|
|
25
|
+
*
|
|
26
|
+
* The other half is coexistence: the card's right-hand slot already holds the
|
|
27
|
+
* "Showing results from:" probe picker, and an implementation that reached for
|
|
28
|
+
* the same slot would silently replace it - the regression that issue #2899
|
|
29
|
+
* was about. So every test that expects the button also checks the picker is
|
|
30
|
+
* still there.
|
|
31
|
+
*
|
|
32
|
+
* ModelAPI is stubbed because MonitorTestForm imports it; nothing here presses
|
|
33
|
+
* the button, so the stub only has to exist.
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
let currentPermissions: Array<Permission> = [Permission.ProjectAdmin];
|
|
37
|
+
|
|
38
|
+
jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
|
|
39
|
+
return {
|
|
40
|
+
__esModule: true,
|
|
41
|
+
default: {
|
|
42
|
+
create: (): Promise<never> => {
|
|
43
|
+
return Promise.reject(new Error("not used"));
|
|
44
|
+
},
|
|
45
|
+
getItem: (): Promise<null> => {
|
|
46
|
+
return Promise.resolve(null);
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
jest.mock("../../../UI/Utils/Permission", () => {
|
|
53
|
+
return {
|
|
54
|
+
__esModule: true,
|
|
55
|
+
default: {
|
|
56
|
+
getAllPermissions: (): Array<Permission> => {
|
|
57
|
+
return currentPermissions;
|
|
58
|
+
},
|
|
59
|
+
getProjectPermissions: (): null => {
|
|
60
|
+
return null;
|
|
61
|
+
},
|
|
62
|
+
getGlobalPermissions: (): null => {
|
|
63
|
+
return null;
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
jest.mock("../../../UI/Utils/User", () => {
|
|
70
|
+
return {
|
|
71
|
+
__esModule: true,
|
|
72
|
+
default: {
|
|
73
|
+
isMasterAdmin: (): boolean => {
|
|
74
|
+
return false;
|
|
75
|
+
},
|
|
76
|
+
getUserId: (): null => {
|
|
77
|
+
return null;
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
import Summary from "../../../../App/FeatureSet/Dashboard/src/Components/Monitor/SummaryView/Summary";
|
|
84
|
+
import Probe from "../../../Models/DatabaseModels/Probe";
|
|
85
|
+
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
86
|
+
import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
|
|
87
|
+
import MonitorType from "../../../Types/Monitor/MonitorType";
|
|
88
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
89
|
+
|
|
90
|
+
const MONITOR_ID: string = "11111111-1111-4111-8111-111111111111";
|
|
91
|
+
const PROBE_ID: string = "44444444-4444-4444-8444-444444444444";
|
|
92
|
+
const DISABLED_PROBE_ID: string = "55555555-5555-4555-8555-555555555555";
|
|
93
|
+
|
|
94
|
+
function probe(id: string, name: string): Probe {
|
|
95
|
+
return Object.assign(new Probe(), { _id: id, name: name });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const ATTACHED_PROBES: Array<Probe> = [probe(PROBE_ID, "Ohio Probe")];
|
|
99
|
+
|
|
100
|
+
function stepsWith(count: number): MonitorSteps {
|
|
101
|
+
const monitorSteps: MonitorSteps = new MonitorSteps();
|
|
102
|
+
|
|
103
|
+
monitorSteps.data = {
|
|
104
|
+
monitorStepsInstanceArray: Array.from({ length: count }, () => {
|
|
105
|
+
return new MonitorStep();
|
|
106
|
+
}),
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
return monitorSteps;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
interface SummaryOptions {
|
|
113
|
+
monitorType?: MonitorType | undefined;
|
|
114
|
+
monitorSteps?: MonitorSteps | undefined;
|
|
115
|
+
/*
|
|
116
|
+
* Spelled as its own flag rather than `monitorSteps: undefined`, which a
|
|
117
|
+
* `?? default` in this helper would silently turn back into the default -
|
|
118
|
+
* and the test would then assert the opposite of what it says.
|
|
119
|
+
*/
|
|
120
|
+
withoutMonitorSteps?: boolean | undefined;
|
|
121
|
+
probes?: Array<Probe> | undefined;
|
|
122
|
+
disabledProbeIds?: Array<string> | undefined;
|
|
123
|
+
withoutMonitorId?: boolean | undefined;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function renderSummary(options: SummaryOptions = {}): void {
|
|
127
|
+
const monitorSteps: MonitorSteps | undefined = options.withoutMonitorSteps
|
|
128
|
+
? undefined
|
|
129
|
+
: options.monitorSteps || stepsWith(1);
|
|
130
|
+
|
|
131
|
+
if (options.withoutMonitorId) {
|
|
132
|
+
render(
|
|
133
|
+
<Summary
|
|
134
|
+
monitorType={options.monitorType || MonitorType.Website}
|
|
135
|
+
monitorSteps={monitorSteps}
|
|
136
|
+
probes={options.probes || ATTACHED_PROBES}
|
|
137
|
+
disabledProbeIds={options.disabledProbeIds}
|
|
138
|
+
/>,
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
render(
|
|
145
|
+
<Summary
|
|
146
|
+
monitorType={options.monitorType || MonitorType.Website}
|
|
147
|
+
monitorSteps={monitorSteps}
|
|
148
|
+
monitorId={new ObjectID(MONITOR_ID)}
|
|
149
|
+
probes={options.probes || ATTACHED_PROBES}
|
|
150
|
+
disabledProbeIds={options.disabledProbeIds}
|
|
151
|
+
/>,
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function testButton(): HTMLElement | null {
|
|
156
|
+
return screen.queryByTestId("test-monitor-button");
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function probePicker(): HTMLElement | null {
|
|
160
|
+
return screen.queryByRole("combobox");
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
beforeEach(() => {
|
|
164
|
+
currentPermissions = [Permission.ProjectAdmin];
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
afterEach(() => {
|
|
168
|
+
cleanup();
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
describe("the summary card offers a test", () => {
|
|
172
|
+
test("a probeable monitor with steps and a probe gets the button", () => {
|
|
173
|
+
renderSummary();
|
|
174
|
+
|
|
175
|
+
expect(testButton()).toBeInTheDocument();
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test("the button lives on the Monitor Summary card itself", () => {
|
|
179
|
+
/*
|
|
180
|
+
* Queried through the card rather than the page, because a second
|
|
181
|
+
* component in the dashboard also renders a card titled "Monitor Summary"
|
|
182
|
+
* (the snapshot card on incident and alert pages). This one is the
|
|
183
|
+
* overview's.
|
|
184
|
+
*/
|
|
185
|
+
renderSummary();
|
|
186
|
+
|
|
187
|
+
const card: HTMLElement = screen.getByTestId("card");
|
|
188
|
+
|
|
189
|
+
expect(
|
|
190
|
+
within(card).getByRole("heading", { name: "Monitor Summary" }),
|
|
191
|
+
).toBeInTheDocument();
|
|
192
|
+
expect(within(card).getByTestId("test-monitor-button")).toBeInTheDocument();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
test("the probe picker is still there next to it", () => {
|
|
196
|
+
/*
|
|
197
|
+
* The card's right-hand slot was already taken by "Showing results from:".
|
|
198
|
+
* Putting the button there instead of in the card's own actions slot would
|
|
199
|
+
* have removed the picker - and would have shipped green, because nothing
|
|
200
|
+
* else asserts the picker renders.
|
|
201
|
+
*/
|
|
202
|
+
renderSummary();
|
|
203
|
+
|
|
204
|
+
expect(testButton()).toBeInTheDocument();
|
|
205
|
+
expect(probePicker()).toBeInTheDocument();
|
|
206
|
+
expect(screen.getByText("Showing results from:")).toBeInTheDocument();
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test("the button is offered for every probeable monitor type", () => {
|
|
210
|
+
const probeableTypes: Array<MonitorType> = [
|
|
211
|
+
MonitorType.API,
|
|
212
|
+
MonitorType.Website,
|
|
213
|
+
MonitorType.IP,
|
|
214
|
+
MonitorType.Ping,
|
|
215
|
+
MonitorType.Port,
|
|
216
|
+
MonitorType.SSLCertificate,
|
|
217
|
+
MonitorType.SyntheticMonitor,
|
|
218
|
+
MonitorType.CustomJavaScriptCode,
|
|
219
|
+
MonitorType.DNS,
|
|
220
|
+
MonitorType.DNSSEC,
|
|
221
|
+
MonitorType.Domain,
|
|
222
|
+
MonitorType.SQLQuery,
|
|
223
|
+
MonitorType.Database,
|
|
224
|
+
MonitorType.ExternalStatusPage,
|
|
225
|
+
];
|
|
226
|
+
|
|
227
|
+
for (const monitorType of probeableTypes) {
|
|
228
|
+
renderSummary({ monitorType: monitorType });
|
|
229
|
+
|
|
230
|
+
expect(testButton()).toBeInTheDocument();
|
|
231
|
+
|
|
232
|
+
cleanup();
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
test("an attached probe that is switched off can still be tested against", () => {
|
|
237
|
+
/*
|
|
238
|
+
* A disabled probe stops WATCHING the monitor; it still picks up a test,
|
|
239
|
+
* because the queue is claimed by probe id alone. Being able to test with
|
|
240
|
+
* it is how an operator checks a probe before switching it back on.
|
|
241
|
+
*/
|
|
242
|
+
renderSummary({
|
|
243
|
+
probes: [
|
|
244
|
+
probe(PROBE_ID, "Ohio Probe"),
|
|
245
|
+
probe(DISABLED_PROBE_ID, "Attic"),
|
|
246
|
+
],
|
|
247
|
+
disabledProbeIds: [DISABLED_PROBE_ID],
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
expect(testButton()).toBeInTheDocument();
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
describe("the summary card withholds a test", () => {
|
|
255
|
+
test("a monitor type no probe runs gets no button", () => {
|
|
256
|
+
/*
|
|
257
|
+
* The card still renders for these - they have their own summary - so the
|
|
258
|
+
* button has to be withheld at this call site rather than left to the form
|
|
259
|
+
* to render nothing, which would leave an empty slot in the header.
|
|
260
|
+
*/
|
|
261
|
+
renderSummary({ monitorType: MonitorType.Logs });
|
|
262
|
+
|
|
263
|
+
expect(testButton()).not.toBeInTheDocument();
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
test("an incoming-request monitor gets no button", () => {
|
|
267
|
+
renderSummary({ monitorType: MonitorType.IncomingRequest });
|
|
268
|
+
|
|
269
|
+
expect(testButton()).not.toBeInTheDocument();
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
test("a server monitor gets no button", () => {
|
|
273
|
+
renderSummary({ monitorType: MonitorType.Server });
|
|
274
|
+
|
|
275
|
+
expect(testButton()).not.toBeInTheDocument();
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
test("a monitor with no steps gets no button", () => {
|
|
279
|
+
/*
|
|
280
|
+
* The row would be created and accepted, and the probe would return
|
|
281
|
+
* without reporting anything - so the only thing the user would ever see
|
|
282
|
+
* is the poll giving up two and a half minutes later.
|
|
283
|
+
*/
|
|
284
|
+
renderSummary({ withoutMonitorSteps: true });
|
|
285
|
+
|
|
286
|
+
expect(testButton()).not.toBeInTheDocument();
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
test("a monitor with an empty steps array gets no button", () => {
|
|
290
|
+
renderSummary({ monitorSteps: stepsWith(0) });
|
|
291
|
+
|
|
292
|
+
expect(testButton()).not.toBeInTheDocument();
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
test("a monitor with nothing attached gets no button", () => {
|
|
296
|
+
/*
|
|
297
|
+
* The modal's "Select Probe" field is required and would have no options,
|
|
298
|
+
* so Run Test could never be submitted. The card already explains this
|
|
299
|
+
* case in its body.
|
|
300
|
+
*/
|
|
301
|
+
renderSummary({ probes: [] });
|
|
302
|
+
|
|
303
|
+
expect(testButton()).not.toBeInTheDocument();
|
|
304
|
+
expect(probePicker()).not.toBeInTheDocument();
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
test("a read-only user gets no button", () => {
|
|
308
|
+
currentPermissions = [Permission.Viewer];
|
|
309
|
+
|
|
310
|
+
renderSummary();
|
|
311
|
+
|
|
312
|
+
expect(testButton()).not.toBeInTheDocument();
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
test("withholding the button leaves the rest of the card alone", () => {
|
|
316
|
+
renderSummary({ probes: [] });
|
|
317
|
+
|
|
318
|
+
expect(
|
|
319
|
+
screen.getByRole("heading", { name: "Monitor Summary" }),
|
|
320
|
+
).toBeInTheDocument();
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
test("a manual monitor renders no card at all", () => {
|
|
324
|
+
renderSummary({ monitorType: MonitorType.Manual });
|
|
325
|
+
|
|
326
|
+
expect(screen.queryByTestId("card")).not.toBeInTheDocument();
|
|
327
|
+
expect(testButton()).not.toBeInTheDocument();
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
describe("what the card hands the test form", () => {
|
|
332
|
+
test("it still renders the button when the page has no monitor id", () => {
|
|
333
|
+
/*
|
|
334
|
+
* monitorId is optional on the card so that a caller which cannot supply
|
|
335
|
+
* one is not forced to; the overview page always does, which is what lets
|
|
336
|
+
* the server resolve this monitor's secrets for the run.
|
|
337
|
+
*/
|
|
338
|
+
renderSummary({ withoutMonitorId: true });
|
|
339
|
+
|
|
340
|
+
expect(testButton()).toBeInTheDocument();
|
|
341
|
+
});
|
|
342
|
+
});
|