@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
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* End-to-end for issue #3866, at the only seam that proves the feature
|
|
3
|
+
* works: a real OTLP resource-attribute payload, flattened exactly the way
|
|
4
|
+
* ingest flattens it, fed to the entity extractor.
|
|
5
|
+
*
|
|
6
|
+
* TelemetryEntity.test.ts covers the extractor against a hand-built
|
|
7
|
+
* dictionary, which is where the logic lives. It cannot catch the failure
|
|
8
|
+
* that actually matters here — that `host.ip` arrives from the wire in a
|
|
9
|
+
* shape the extractor does not recognise. An OTLP `arrayValue` has to
|
|
10
|
+
* survive `TelemetryUtil.getAttributes` as a real JS array under the same
|
|
11
|
+
* key; if it were ever flattened to `host.ip.0` / `host.ip.1`, or
|
|
12
|
+
* serialized to a string, every assertion in the other suite would still
|
|
13
|
+
* pass while the Attributes card stayed empty.
|
|
14
|
+
*
|
|
15
|
+
* Stub the DatabaseService base class out before TelemetryUtil's import
|
|
16
|
+
* graph drags the server-side service layer in. See
|
|
17
|
+
* TelemetryUtilAttributeKeys.test.ts for why the stub needs these methods.
|
|
18
|
+
*/
|
|
19
|
+
jest.mock("../../../../Server/Services/DatabaseService", () => {
|
|
20
|
+
return {
|
|
21
|
+
__esModule: true,
|
|
22
|
+
default: class DatabaseServiceStub {
|
|
23
|
+
public hardDeleteItemsOlderThanInDays(): void {
|
|
24
|
+
// no-op: retention config, nothing for a pure unit test to do.
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public setDoNotAllowDelete(): void {
|
|
28
|
+
// no-op: delete-permission config, same.
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
import TelemetryUtil, {
|
|
35
|
+
AttributeType,
|
|
36
|
+
} from "../../../../Server/Utils/Telemetry/Telemetry";
|
|
37
|
+
import InventoryItem, {
|
|
38
|
+
EntityAttributes,
|
|
39
|
+
ExtractedEntity,
|
|
40
|
+
} from "../../../../Server/Utils/Telemetry/TelemetryEntity";
|
|
41
|
+
import EntityType from "../../../../Types/Telemetry/EntityType";
|
|
42
|
+
import Dictionary from "../../../../Types/Dictionary";
|
|
43
|
+
import { JSONArray, JSONObject } from "../../../../Types/JSON";
|
|
44
|
+
import { normalizeHostIpAddresses } from "../../../../Utils/Telemetry/HostIpAddresses";
|
|
45
|
+
import { describe, expect, test } from "@jest/globals";
|
|
46
|
+
|
|
47
|
+
const PROJECT: string = "proj1";
|
|
48
|
+
|
|
49
|
+
/*
|
|
50
|
+
* `OtelPayloadDecoder.decodeFromQueue` runs protobuf `message.toJSON()`,
|
|
51
|
+
* which camelCases field names — so camelCase is the shape ingest really
|
|
52
|
+
* sees. OTLP/JSON producers can send snake_case instead, and
|
|
53
|
+
* `getAttributeValues` handles both; the snake_case case is asserted below.
|
|
54
|
+
*/
|
|
55
|
+
function stringAttribute(key: string, value: string): JSONObject {
|
|
56
|
+
return { key: key, value: { stringValue: value } };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function stringArrayAttribute(key: string, values: Array<string>): JSONObject {
|
|
60
|
+
return {
|
|
61
|
+
key: key,
|
|
62
|
+
value: {
|
|
63
|
+
arrayValue: {
|
|
64
|
+
values: values.map((value: string) => {
|
|
65
|
+
return { stringValue: value };
|
|
66
|
+
}),
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function snakeCaseStringArrayAttribute(
|
|
73
|
+
key: string,
|
|
74
|
+
values: Array<string>,
|
|
75
|
+
): JSONObject {
|
|
76
|
+
return {
|
|
77
|
+
key: key,
|
|
78
|
+
value: {
|
|
79
|
+
array_value: {
|
|
80
|
+
values: values.map((value: string) => {
|
|
81
|
+
return { string_value: value };
|
|
82
|
+
}),
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const IP_ADDRESSES: Array<string> = [
|
|
89
|
+
"10.1.2.3",
|
|
90
|
+
"10.1.2.4",
|
|
91
|
+
"fe80::42:acff:fe11:1",
|
|
92
|
+
];
|
|
93
|
+
|
|
94
|
+
/*
|
|
95
|
+
* The reporter's machine: a Windows host whose collector runs the `system`
|
|
96
|
+
* resource detector and has the three hardware values stamped onto the
|
|
97
|
+
* resource. Deliberately carries no container.runtime, which would route
|
|
98
|
+
* the batch to the DockerHost table instead.
|
|
99
|
+
*/
|
|
100
|
+
function windowsHostResourceAttributes(): JSONArray {
|
|
101
|
+
return [
|
|
102
|
+
stringAttribute("host.name", "wbprjdeais002"),
|
|
103
|
+
stringAttribute("host.arch", "amd64"),
|
|
104
|
+
stringAttribute("host.id", "4C4C4544-0037-5A10-8054-B4C04F335931"),
|
|
105
|
+
stringArrayAttribute("host.ip", IP_ADDRESSES),
|
|
106
|
+
stringAttribute("os.type", "windows"),
|
|
107
|
+
stringAttribute("os.description", "Microsoft Windows 11 Enterprise"),
|
|
108
|
+
stringAttribute("host.serial_number", "7XYZ123"),
|
|
109
|
+
stringAttribute("device.manufacturer", "Dell Inc."),
|
|
110
|
+
stringAttribute("device.model.name", "OptiPlex 7090"),
|
|
111
|
+
] as JSONArray;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Exactly what `OTelIngestService.resolveTelemetryResource` does. */
|
|
115
|
+
function extractHost(attributes: JSONArray): ExtractedEntity | undefined {
|
|
116
|
+
const flat: Dictionary<AttributeType | Array<AttributeType>> =
|
|
117
|
+
TelemetryUtil.getAttributes({
|
|
118
|
+
items: attributes,
|
|
119
|
+
prefixKeysWithString: "",
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
return InventoryItem.extractEntities({
|
|
123
|
+
projectId: PROJECT,
|
|
124
|
+
attributes: flat as EntityAttributes,
|
|
125
|
+
}).find((entity: ExtractedEntity) => {
|
|
126
|
+
return entity.entityType === EntityType.Host;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
describe("host asset attributes survive the OTLP wire shape (issue #3866)", () => {
|
|
131
|
+
test("an OTLP arrayValue reaches the extractor as a real array under the same key", () => {
|
|
132
|
+
const flat: Dictionary<AttributeType | Array<AttributeType>> =
|
|
133
|
+
TelemetryUtil.getAttributes({
|
|
134
|
+
items: windowsHostResourceAttributes(),
|
|
135
|
+
prefixKeysWithString: "",
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
expect(Array.isArray(flat["host.ip"])).toBe(true);
|
|
139
|
+
expect(flat["host.ip"]).toEqual(IP_ADDRESSES);
|
|
140
|
+
// Not flattened into indexed keys, which would make the join unreachable.
|
|
141
|
+
expect(flat["host.ip.0"]).toBeUndefined();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test("the reporter's Windows host yields every requested attribute", () => {
|
|
145
|
+
const host: ExtractedEntity | undefined = extractHost(
|
|
146
|
+
windowsHostResourceAttributes(),
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
expect(host).toBeDefined();
|
|
150
|
+
expect(host!.descriptiveAttributes).toEqual({
|
|
151
|
+
"os.type": "windows",
|
|
152
|
+
"os.description": "Microsoft Windows 11 Enterprise",
|
|
153
|
+
"host.arch": "amd64",
|
|
154
|
+
"host.id": "4C4C4544-0037-5A10-8054-B4C04F335931",
|
|
155
|
+
"host.ip": "10.1.2.3, 10.1.2.4, fe80::42:acff:fe11:1",
|
|
156
|
+
"host.serial_number": "7XYZ123",
|
|
157
|
+
"device.manufacturer": "Dell Inc.",
|
|
158
|
+
"device.model.name": "OptiPlex 7090",
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test("identity is still the host name alone", () => {
|
|
163
|
+
const host: ExtractedEntity | undefined = extractHost(
|
|
164
|
+
windowsHostResourceAttributes(),
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
expect(host!.identifyingAttributes).toEqual({
|
|
168
|
+
"host.name": "wbprjdeais002",
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
/*
|
|
173
|
+
* The key is a hash of the identifying set only. If any asset attribute
|
|
174
|
+
* leaked into it, the existing row would fork the moment a host got a new
|
|
175
|
+
* IP — which is exactly the duplicate-inventory failure mode.
|
|
176
|
+
*/
|
|
177
|
+
test("the entity key is unchanged by every asset attribute", () => {
|
|
178
|
+
const withAssets: ExtractedEntity | undefined = extractHost(
|
|
179
|
+
windowsHostResourceAttributes(),
|
|
180
|
+
);
|
|
181
|
+
const nameOnly: ExtractedEntity | undefined = extractHost([
|
|
182
|
+
stringAttribute("host.name", "wbprjdeais002"),
|
|
183
|
+
stringAttribute("os.type", "windows"),
|
|
184
|
+
] as JSONArray);
|
|
185
|
+
|
|
186
|
+
expect(withAssets!.entityKey).toBe(nameOnly!.entityKey);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
test("a snake_case OTLP/JSON producer yields the identical entity", () => {
|
|
190
|
+
const camelCase: ExtractedEntity | undefined = extractHost(
|
|
191
|
+
windowsHostResourceAttributes(),
|
|
192
|
+
);
|
|
193
|
+
const snakeCase: ExtractedEntity | undefined = extractHost([
|
|
194
|
+
stringAttribute("host.name", "wbprjdeais002"),
|
|
195
|
+
stringAttribute("os.type", "windows"),
|
|
196
|
+
snakeCaseStringArrayAttribute("host.ip", IP_ADDRESSES),
|
|
197
|
+
stringAttribute("host.arch", "amd64"),
|
|
198
|
+
stringAttribute("host.id", "4C4C4544-0037-5A10-8054-B4C04F335931"),
|
|
199
|
+
stringAttribute("os.description", "Microsoft Windows 11 Enterprise"),
|
|
200
|
+
stringAttribute("host.serial_number", "7XYZ123"),
|
|
201
|
+
stringAttribute("device.manufacturer", "Dell Inc."),
|
|
202
|
+
stringAttribute("device.model.name", "OptiPlex 7090"),
|
|
203
|
+
] as JSONArray);
|
|
204
|
+
|
|
205
|
+
expect(snakeCase!.entityKey).toBe(camelCase!.entityKey);
|
|
206
|
+
expect(snakeCase!.descriptiveAttributes).toEqual(
|
|
207
|
+
camelCase!.descriptiveAttributes,
|
|
208
|
+
);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
test("the joined value matches what the Host column stores", () => {
|
|
212
|
+
const host: ExtractedEntity | undefined = extractHost(
|
|
213
|
+
windowsHostResourceAttributes(),
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
expect(host!.descriptiveAttributes!["host.ip"]).toBe(
|
|
217
|
+
normalizeHostIpAddresses(IP_ADDRESSES),
|
|
218
|
+
);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
/*
|
|
222
|
+
* Unchanged behaviour, asserted here because the new attributes are
|
|
223
|
+
* exactly the kind of thing a Kubernetes node also reports: a resource
|
|
224
|
+
* carrying a Kubernetes identity must still mint no Host at all.
|
|
225
|
+
*/
|
|
226
|
+
test("a Kubernetes resource still yields no Host entity", () => {
|
|
227
|
+
const host: ExtractedEntity | undefined = extractHost([
|
|
228
|
+
...(windowsHostResourceAttributes() as Array<JSONObject>),
|
|
229
|
+
stringAttribute("k8s.cluster.name", "prod-us"),
|
|
230
|
+
stringAttribute("k8s.node.name", "node-1"),
|
|
231
|
+
] as JSONArray);
|
|
232
|
+
|
|
233
|
+
expect(host).toBeUndefined();
|
|
234
|
+
});
|
|
235
|
+
});
|
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import InventoryItem, {
|
|
2
|
+
EntityAttributeValue,
|
|
2
3
|
EntityAttributes,
|
|
3
4
|
EntityExtractionResult,
|
|
4
5
|
ExtractedEntity,
|
|
6
|
+
MAX_DESCRIPTIVE_ATTRIBUTE_VALUE_LENGTH,
|
|
5
7
|
ResourceEntityRef,
|
|
6
8
|
RetiredEntityIdentity,
|
|
7
9
|
} from "../../../../Server/Utils/Telemetry/TelemetryEntity";
|
|
10
|
+
import {
|
|
11
|
+
MAX_INVENTORY_HOST_IP_ADDRESSES_LENGTH,
|
|
12
|
+
MAX_INVENTORY_HOST_IP_ADDRESS_COUNT,
|
|
13
|
+
normalizeHostIpAddresses,
|
|
14
|
+
} from "../../../../Utils/Telemetry/HostIpAddresses";
|
|
8
15
|
import EntityType from "../../../../Types/Telemetry/EntityType";
|
|
9
16
|
import {
|
|
10
17
|
keyForHost,
|
|
@@ -1155,12 +1162,19 @@ describe("descriptive attributes & labels (never identity-bearing)", () => {
|
|
|
1155
1162
|
{
|
|
1156
1163
|
"host.name": "web-1",
|
|
1157
1164
|
"os.type": "linux",
|
|
1165
|
+
"os.description": "Ubuntu 24.04.1 LTS (Noble Numbat)",
|
|
1158
1166
|
"host.arch": "arm64",
|
|
1167
|
+
"host.id": "ec2-9f3c",
|
|
1168
|
+
// an array attribute — joined, not truncated to its first element.
|
|
1169
|
+
"host.ip": ["10.0.0.1", "10.0.0.2"],
|
|
1170
|
+
"host.serial_number": "7XYZ123",
|
|
1171
|
+
"device.manufacturer": "Dell Inc.",
|
|
1172
|
+
"device.model.name": "OptiPlex 7090",
|
|
1159
1173
|
"cloud.provider": "aws",
|
|
1160
1174
|
"cloud.region": "us-east-1",
|
|
1161
1175
|
"cloud.availability_zone": "us-east-1a",
|
|
1162
|
-
// not in the allowlist — must not leak into descriptive.
|
|
1163
|
-
"host.
|
|
1176
|
+
// still not in the allowlist — must not leak into descriptive.
|
|
1177
|
+
"host.mac": ["02:42:ac:11:00:02"],
|
|
1164
1178
|
},
|
|
1165
1179
|
EntityType.Host,
|
|
1166
1180
|
);
|
|
@@ -1171,7 +1185,13 @@ describe("descriptive attributes & labels (never identity-bearing)", () => {
|
|
|
1171
1185
|
);
|
|
1172
1186
|
expect(decorated!.descriptiveAttributes).toEqual({
|
|
1173
1187
|
"os.type": "linux",
|
|
1188
|
+
"os.description": "Ubuntu 24.04.1 LTS (Noble Numbat)",
|
|
1174
1189
|
"host.arch": "arm64",
|
|
1190
|
+
"host.id": "ec2-9f3c",
|
|
1191
|
+
"host.ip": "10.0.0.1, 10.0.0.2",
|
|
1192
|
+
"host.serial_number": "7XYZ123",
|
|
1193
|
+
"device.manufacturer": "Dell Inc.",
|
|
1194
|
+
"device.model.name": "OptiPlex 7090",
|
|
1175
1195
|
"cloud.provider": "aws",
|
|
1176
1196
|
"cloud.region": "us-east-1",
|
|
1177
1197
|
"cloud.availability_zone": "us-east-1a",
|
|
@@ -1533,7 +1553,13 @@ describe("descriptive attributes & labels (never identity-bearing)", () => {
|
|
|
1533
1553
|
const decorated: EntityAttributes = {
|
|
1534
1554
|
...identityOnly,
|
|
1535
1555
|
"os.type": "linux",
|
|
1556
|
+
"os.description": "Ubuntu 24.04.1 LTS",
|
|
1536
1557
|
"host.arch": "amd64",
|
|
1558
|
+
"host.id": "gce-77aa",
|
|
1559
|
+
"host.ip": ["10.0.0.1", "10.0.0.2", "fe80::1"],
|
|
1560
|
+
"host.serial_number": "7XYZ123",
|
|
1561
|
+
"device.manufacturer": "Dell Inc.",
|
|
1562
|
+
"device.model.name": "OptiPlex 7090",
|
|
1537
1563
|
"cloud.provider": "gcp",
|
|
1538
1564
|
"cloud.region": "europe-west1",
|
|
1539
1565
|
"cloud.availability_zone": "europe-west1-b",
|
|
@@ -1573,6 +1599,363 @@ describe("descriptive attributes & labels (never identity-bearing)", () => {
|
|
|
1573
1599
|
});
|
|
1574
1600
|
});
|
|
1575
1601
|
|
|
1602
|
+
/*
|
|
1603
|
+
* Issue #3866 — a discovered host's Attributes card showed only host.name,
|
|
1604
|
+
* host.arch and os.type, so a CMDB sync had to collect the machine's IP,
|
|
1605
|
+
* serial number, make and model somewhere else. These assert the shape of
|
|
1606
|
+
* what the extractor now emits, and — more importantly — that none of it
|
|
1607
|
+
* is allowed to touch identity.
|
|
1608
|
+
*/
|
|
1609
|
+
describe("host asset attributes (issue #3866)", () => {
|
|
1610
|
+
const IDENTITY: EntityAttributes = { "host.name": "wbprjdeais002" };
|
|
1611
|
+
|
|
1612
|
+
function hostDescriptive(
|
|
1613
|
+
extra: EntityAttributes,
|
|
1614
|
+
): Record<string, string> | undefined {
|
|
1615
|
+
return entityOfType({ ...IDENTITY, ...extra }, EntityType.Host)
|
|
1616
|
+
?.descriptiveAttributes;
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1619
|
+
describe("host.ip", () => {
|
|
1620
|
+
test("every address is kept, comma-joined in source order", () => {
|
|
1621
|
+
expect(
|
|
1622
|
+
hostDescriptive({ "host.ip": ["10.1.2.3", "10.1.2.4", "fe80::1"] }),
|
|
1623
|
+
).toEqual({ "host.ip": "10.1.2.3, 10.1.2.4, fe80::1" });
|
|
1624
|
+
});
|
|
1625
|
+
|
|
1626
|
+
/*
|
|
1627
|
+
* The bug this replaces: strOrFirst kept element 0 and dropped the
|
|
1628
|
+
* rest, so a Docker host reported whichever veth the detector
|
|
1629
|
+
* enumerated first as "the host's IP".
|
|
1630
|
+
*/
|
|
1631
|
+
test("is not truncated to its first element", () => {
|
|
1632
|
+
const value: string = hostDescriptive({
|
|
1633
|
+
"host.ip": ["172.17.0.1", "192.168.1.42"],
|
|
1634
|
+
})!["host.ip"]!;
|
|
1635
|
+
expect(value).toContain("192.168.1.42");
|
|
1636
|
+
});
|
|
1637
|
+
|
|
1638
|
+
test("dedupes case-insensitively, because IPv6 hex casing is not stable", () => {
|
|
1639
|
+
expect(
|
|
1640
|
+
hostDescriptive({ "host.ip": ["FE80::1", "fe80::1", "10.0.0.1"] }),
|
|
1641
|
+
).toEqual({ "host.ip": "FE80::1, 10.0.0.1" });
|
|
1642
|
+
});
|
|
1643
|
+
|
|
1644
|
+
test("a scalar string passes through unchanged", () => {
|
|
1645
|
+
expect(hostDescriptive({ "host.ip": "10.1.2.3" })).toEqual({
|
|
1646
|
+
"host.ip": "10.1.2.3",
|
|
1647
|
+
});
|
|
1648
|
+
});
|
|
1649
|
+
|
|
1650
|
+
/*
|
|
1651
|
+
* The `env` resource detector can only express scalars, so a list set
|
|
1652
|
+
* through OTEL_RESOURCE_ATTRIBUTES arrives as one comma-joined string.
|
|
1653
|
+
* Both routes must produce the same stored value.
|
|
1654
|
+
*/
|
|
1655
|
+
test("an env-detector comma-separated scalar matches the array form", () => {
|
|
1656
|
+
const fromEnv: Record<string, string> | undefined = hostDescriptive({
|
|
1657
|
+
"host.ip": "10.1.2.3,10.1.2.4",
|
|
1658
|
+
});
|
|
1659
|
+
const fromArray: Record<string, string> | undefined = hostDescriptive({
|
|
1660
|
+
"host.ip": ["10.1.2.3", "10.1.2.4"],
|
|
1661
|
+
});
|
|
1662
|
+
expect(fromEnv).toEqual(fromArray);
|
|
1663
|
+
expect(fromEnv).toEqual({ "host.ip": "10.1.2.3, 10.1.2.4" });
|
|
1664
|
+
});
|
|
1665
|
+
|
|
1666
|
+
test.each([
|
|
1667
|
+
["an empty array", []],
|
|
1668
|
+
["whitespace-only entries", [" ", "\t"]],
|
|
1669
|
+
["an empty string", ""],
|
|
1670
|
+
])("%s emits no attribute at all", (_label: string, value: unknown) => {
|
|
1671
|
+
expect(
|
|
1672
|
+
hostDescriptive({
|
|
1673
|
+
"host.ip": value as
|
|
1674
|
+
| EntityAttributeValue
|
|
1675
|
+
| Array<EntityAttributeValue>,
|
|
1676
|
+
}),
|
|
1677
|
+
).toBeUndefined();
|
|
1678
|
+
});
|
|
1679
|
+
|
|
1680
|
+
test("caps at MAX_INVENTORY_HOST_IP_ADDRESS_COUNT addresses", () => {
|
|
1681
|
+
const addresses: Array<string> = [];
|
|
1682
|
+
for (let i: number = 0; i < 40; i++) {
|
|
1683
|
+
addresses.push(`10.0.${i}.1`);
|
|
1684
|
+
}
|
|
1685
|
+
const value: string = hostDescriptive({ "host.ip": addresses })![
|
|
1686
|
+
"host.ip"
|
|
1687
|
+
]!;
|
|
1688
|
+
expect(value.split(", ")).toHaveLength(
|
|
1689
|
+
MAX_INVENTORY_HOST_IP_ADDRESS_COUNT,
|
|
1690
|
+
);
|
|
1691
|
+
expect(value).toContain("10.0.0.1");
|
|
1692
|
+
expect(value).not.toContain("10.0.39.1");
|
|
1693
|
+
});
|
|
1694
|
+
|
|
1695
|
+
test("caps by length, and never on a half-written address", () => {
|
|
1696
|
+
const addresses: Array<string> = [];
|
|
1697
|
+
for (let i: number = 0; i < 30; i++) {
|
|
1698
|
+
addresses.push(`fd00:dead:beef:${i.toString(16)}::abcd:1234`);
|
|
1699
|
+
}
|
|
1700
|
+
const value: string = hostDescriptive({ "host.ip": addresses })![
|
|
1701
|
+
"host.ip"
|
|
1702
|
+
]!;
|
|
1703
|
+
expect(value.length).toBeLessThanOrEqual(
|
|
1704
|
+
MAX_INVENTORY_HOST_IP_ADDRESSES_LENGTH,
|
|
1705
|
+
);
|
|
1706
|
+
for (const address of value.split(", ")) {
|
|
1707
|
+
expect(addresses).toContain(address);
|
|
1708
|
+
}
|
|
1709
|
+
});
|
|
1710
|
+
|
|
1711
|
+
/*
|
|
1712
|
+
* The Host row keeps the lossless list. Below the inventory caps the
|
|
1713
|
+
* two surfaces must agree byte for byte, or the same host reads
|
|
1714
|
+
* differently on its Network card and in a CMDB export.
|
|
1715
|
+
*/
|
|
1716
|
+
test("is byte-identical to Host.hostIpAddresses below the caps", () => {
|
|
1717
|
+
const addresses: Array<string> = [
|
|
1718
|
+
"192.168.1.42",
|
|
1719
|
+
"10.0.0.7",
|
|
1720
|
+
"fe80::42:acff:fe11:1",
|
|
1721
|
+
];
|
|
1722
|
+
expect(hostDescriptive({ "host.ip": addresses })!["host.ip"]).toBe(
|
|
1723
|
+
normalizeHostIpAddresses(addresses),
|
|
1724
|
+
);
|
|
1725
|
+
});
|
|
1726
|
+
|
|
1727
|
+
test("never becomes identifying, and never moves the entity key", () => {
|
|
1728
|
+
const withIp: ExtractedEntity | undefined = entityOfType(
|
|
1729
|
+
{ ...IDENTITY, "host.ip": ["10.1.2.3", "10.1.2.4"] },
|
|
1730
|
+
EntityType.Host,
|
|
1731
|
+
);
|
|
1732
|
+
const without: ExtractedEntity | undefined = entityOfType(
|
|
1733
|
+
IDENTITY,
|
|
1734
|
+
EntityType.Host,
|
|
1735
|
+
);
|
|
1736
|
+
expect(withIp!.identifyingAttributes).toEqual({
|
|
1737
|
+
"host.name": "wbprjdeais002",
|
|
1738
|
+
});
|
|
1739
|
+
expect(withIp!.entityKey).toBe(without!.entityKey);
|
|
1740
|
+
});
|
|
1741
|
+
});
|
|
1742
|
+
|
|
1743
|
+
describe("serial number, make and model", () => {
|
|
1744
|
+
test("land verbatim from the keys issue #3866 names", () => {
|
|
1745
|
+
expect(
|
|
1746
|
+
hostDescriptive({
|
|
1747
|
+
"host.serial_number": "7XYZ123",
|
|
1748
|
+
"device.manufacturer": "Dell Inc.",
|
|
1749
|
+
"device.model.name": "OptiPlex 7090",
|
|
1750
|
+
}),
|
|
1751
|
+
).toEqual({
|
|
1752
|
+
"host.serial_number": "7XYZ123",
|
|
1753
|
+
"device.manufacturer": "Dell Inc.",
|
|
1754
|
+
"device.model.name": "OptiPlex 7090",
|
|
1755
|
+
});
|
|
1756
|
+
});
|
|
1757
|
+
|
|
1758
|
+
/*
|
|
1759
|
+
* host.* is the namespace an operator reaches for when describing a
|
|
1760
|
+
* machine. Accept it, but store under the canonical key so a CMDB
|
|
1761
|
+
* export has one column per fact.
|
|
1762
|
+
*/
|
|
1763
|
+
test.each([
|
|
1764
|
+
["host.manufacturer", "device.manufacturer", "Lenovo"],
|
|
1765
|
+
["host.model.name", "device.model.name", "ThinkSystem SR650"],
|
|
1766
|
+
["host.model", "device.model.name", "PowerEdge R760"],
|
|
1767
|
+
])(
|
|
1768
|
+
"%s is accepted and stored as %s",
|
|
1769
|
+
(alias: string, canonical: string, value: string) => {
|
|
1770
|
+
expect(hostDescriptive({ [alias]: value })).toEqual({
|
|
1771
|
+
[canonical]: value,
|
|
1772
|
+
});
|
|
1773
|
+
},
|
|
1774
|
+
);
|
|
1775
|
+
|
|
1776
|
+
test("the canonical key wins when both spellings are present", () => {
|
|
1777
|
+
expect(
|
|
1778
|
+
hostDescriptive({
|
|
1779
|
+
"device.manufacturer": "Dell Inc.",
|
|
1780
|
+
"host.manufacturer": "ignored",
|
|
1781
|
+
}),
|
|
1782
|
+
).toEqual({ "device.manufacturer": "Dell Inc." });
|
|
1783
|
+
});
|
|
1784
|
+
|
|
1785
|
+
/*
|
|
1786
|
+
* These arrive from a customer-controlled environment variable into a
|
|
1787
|
+
* jsonb bag that never drops a key, and nothing downstream bounds them.
|
|
1788
|
+
*/
|
|
1789
|
+
test("an over-long value is truncated, not dropped", () => {
|
|
1790
|
+
const long: string = "D".repeat(400);
|
|
1791
|
+
const value: string = hostDescriptive({ "device.manufacturer": long })![
|
|
1792
|
+
"device.manufacturer"
|
|
1793
|
+
]!;
|
|
1794
|
+
expect(value).toHaveLength(MAX_DESCRIPTIVE_ATTRIBUTE_VALUE_LENGTH);
|
|
1795
|
+
expect(long.startsWith(value)).toBe(true);
|
|
1796
|
+
});
|
|
1797
|
+
|
|
1798
|
+
/*
|
|
1799
|
+
* A cut that lands inside a surrogate pair leaves an unpaired half.
|
|
1800
|
+
* JSON.stringify emits that as a bare \uD83D escape, which Postgres
|
|
1801
|
+
* rejects on the jsonb write — and reconcile swallows its errors, so
|
|
1802
|
+
* the row would just silently stop updating.
|
|
1803
|
+
*/
|
|
1804
|
+
test("truncation never leaves a lone surrogate", () => {
|
|
1805
|
+
// Put a non-BMP character exactly astride the cut.
|
|
1806
|
+
const long: string =
|
|
1807
|
+
"x".repeat(MAX_DESCRIPTIVE_ATTRIBUTE_VALUE_LENGTH - 1) +
|
|
1808
|
+
"\u{1F5A5}".repeat(20);
|
|
1809
|
+
const value: string = hostDescriptive({ "device.manufacturer": long })![
|
|
1810
|
+
"device.manufacturer"
|
|
1811
|
+
]!;
|
|
1812
|
+
|
|
1813
|
+
// One code unit short: the cut stepped back off the high surrogate.
|
|
1814
|
+
expect(value).toHaveLength(MAX_DESCRIPTIVE_ATTRIBUTE_VALUE_LENGTH - 1);
|
|
1815
|
+
|
|
1816
|
+
// No unpaired half in either direction.
|
|
1817
|
+
const loneHighSurrogate: RegExp = new RegExp(
|
|
1818
|
+
"[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])",
|
|
1819
|
+
);
|
|
1820
|
+
const loneLowSurrogate: RegExp = new RegExp(
|
|
1821
|
+
"(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]",
|
|
1822
|
+
);
|
|
1823
|
+
expect(loneHighSurrogate.test(value)).toBe(false);
|
|
1824
|
+
expect(loneLowSurrogate.test(value)).toBe(false);
|
|
1825
|
+
|
|
1826
|
+
/*
|
|
1827
|
+
* The property that actually matters downstream: JSON.stringify must
|
|
1828
|
+
* not emit a bare surrogate escape, because that is what the jsonb
|
|
1829
|
+
* write rejects.
|
|
1830
|
+
*/
|
|
1831
|
+
expect(JSON.stringify(value)).not.toMatch(
|
|
1832
|
+
/\\u[dD][89abAB][0-9a-fA-F]{2}/,
|
|
1833
|
+
);
|
|
1834
|
+
});
|
|
1835
|
+
|
|
1836
|
+
test("a whole non-BMP character still survives when it fits", () => {
|
|
1837
|
+
const long: string =
|
|
1838
|
+
"x".repeat(MAX_DESCRIPTIVE_ATTRIBUTE_VALUE_LENGTH - 2) +
|
|
1839
|
+
"\u{1F5A5}".repeat(20);
|
|
1840
|
+
const value: string = hostDescriptive({ "device.manufacturer": long })![
|
|
1841
|
+
"device.manufacturer"
|
|
1842
|
+
]!;
|
|
1843
|
+
|
|
1844
|
+
expect(value).toHaveLength(MAX_DESCRIPTIVE_ATTRIBUTE_VALUE_LENGTH);
|
|
1845
|
+
expect(value.endsWith("\u{1F5A5}")).toBe(true);
|
|
1846
|
+
});
|
|
1847
|
+
});
|
|
1848
|
+
|
|
1849
|
+
test("os.description and host.id are collected too", () => {
|
|
1850
|
+
expect(
|
|
1851
|
+
hostDescriptive({
|
|
1852
|
+
"host.id": "4C4C4544-0037-5A10-8054-B4C04F335931",
|
|
1853
|
+
"os.description": "Microsoft Windows 11 Enterprise",
|
|
1854
|
+
}),
|
|
1855
|
+
).toEqual({
|
|
1856
|
+
"host.id": "4C4C4544-0037-5A10-8054-B4C04F335931",
|
|
1857
|
+
"os.description": "Microsoft Windows 11 Enterprise",
|
|
1858
|
+
});
|
|
1859
|
+
});
|
|
1860
|
+
|
|
1861
|
+
/*
|
|
1862
|
+
* The join is scoped to host.ip by key. Any tag names the same image, so
|
|
1863
|
+
* container.image.tags must still collapse to its first element.
|
|
1864
|
+
*/
|
|
1865
|
+
test("the list join did not leak into other array attributes", () => {
|
|
1866
|
+
const container: ExtractedEntity | undefined = entityOfType(
|
|
1867
|
+
{
|
|
1868
|
+
"container.id": "c-1",
|
|
1869
|
+
"container.image.name": "ghcr.io/acme/checkout",
|
|
1870
|
+
"container.image.tags": ["7.2", "latest"],
|
|
1871
|
+
},
|
|
1872
|
+
EntityType.Container,
|
|
1873
|
+
);
|
|
1874
|
+
expect(container!.descriptiveAttributes!["container.image.tags"]).toBe(
|
|
1875
|
+
"7.2",
|
|
1876
|
+
);
|
|
1877
|
+
});
|
|
1878
|
+
|
|
1879
|
+
describe("producer-declared entity_refs get the same treatment", () => {
|
|
1880
|
+
function hostFromRef(attrs: EntityAttributes): ExtractedEntity | undefined {
|
|
1881
|
+
return InventoryItem.extractEntities({
|
|
1882
|
+
projectId: PROJECT,
|
|
1883
|
+
attributes: attrs,
|
|
1884
|
+
entityRefs: [
|
|
1885
|
+
{
|
|
1886
|
+
type: "host",
|
|
1887
|
+
idKeys: ["host.name"],
|
|
1888
|
+
descriptionKeys: ["host.ip", "device.manufacturer"],
|
|
1889
|
+
},
|
|
1890
|
+
],
|
|
1891
|
+
}).find((e: ExtractedEntity) => {
|
|
1892
|
+
return e.entityType === EntityType.Host;
|
|
1893
|
+
});
|
|
1894
|
+
}
|
|
1895
|
+
|
|
1896
|
+
test("a description_keys host.ip is joined, not truncated", () => {
|
|
1897
|
+
expect(
|
|
1898
|
+
hostFromRef({ ...IDENTITY, "host.ip": ["10.1.2.3", "10.1.2.4"] })!
|
|
1899
|
+
.descriptiveAttributes,
|
|
1900
|
+
).toEqual({ "host.ip": "10.1.2.3, 10.1.2.4" });
|
|
1901
|
+
});
|
|
1902
|
+
|
|
1903
|
+
test("an over-long description value is capped", () => {
|
|
1904
|
+
expect(
|
|
1905
|
+
hostFromRef({
|
|
1906
|
+
...IDENTITY,
|
|
1907
|
+
"device.manufacturer": "D".repeat(400),
|
|
1908
|
+
})!.descriptiveAttributes!["device.manufacturer"],
|
|
1909
|
+
).toHaveLength(MAX_DESCRIPTIVE_ATTRIBUTE_VALUE_LENGTH);
|
|
1910
|
+
});
|
|
1911
|
+
|
|
1912
|
+
/*
|
|
1913
|
+
* description_keys is producer-controlled, so the alias lookup takes a
|
|
1914
|
+
* key we did not choose. An object-literal alias table would resolve
|
|
1915
|
+
* "constructor" to Object.prototype.constructor — truthy, not iterable
|
|
1916
|
+
* — and spreading it threw a TypeError out of extractEntities. Nothing
|
|
1917
|
+
* up the ingest path catches that, so one malformed ref would have
|
|
1918
|
+
* rejected the entire OTLP batch.
|
|
1919
|
+
*/
|
|
1920
|
+
test.each(["constructor", "toString", "__proto__", "valueOf"])(
|
|
1921
|
+
"a description_keys entry named %s does not throw",
|
|
1922
|
+
(inheritedKey: string) => {
|
|
1923
|
+
expect(() => {
|
|
1924
|
+
return InventoryItem.extractEntities({
|
|
1925
|
+
projectId: PROJECT,
|
|
1926
|
+
attributes: { ...IDENTITY, "host.arch": "amd64" },
|
|
1927
|
+
entityRefs: [
|
|
1928
|
+
{
|
|
1929
|
+
type: "host",
|
|
1930
|
+
idKeys: ["host.name"],
|
|
1931
|
+
descriptionKeys: [inheritedKey, "host.arch"],
|
|
1932
|
+
},
|
|
1933
|
+
],
|
|
1934
|
+
});
|
|
1935
|
+
}).not.toThrow();
|
|
1936
|
+
},
|
|
1937
|
+
);
|
|
1938
|
+
|
|
1939
|
+
test("the batch still produces its entity alongside a poisoned key", () => {
|
|
1940
|
+
const host: ExtractedEntity | undefined = InventoryItem.extractEntities({
|
|
1941
|
+
projectId: PROJECT,
|
|
1942
|
+
attributes: { ...IDENTITY, "host.arch": "amd64" },
|
|
1943
|
+
entityRefs: [
|
|
1944
|
+
{
|
|
1945
|
+
type: "host",
|
|
1946
|
+
idKeys: ["host.name"],
|
|
1947
|
+
descriptionKeys: ["constructor", "host.arch"],
|
|
1948
|
+
},
|
|
1949
|
+
],
|
|
1950
|
+
}).find((e: ExtractedEntity) => {
|
|
1951
|
+
return e.entityType === EntityType.Host;
|
|
1952
|
+
});
|
|
1953
|
+
|
|
1954
|
+
expect(host!.descriptiveAttributes).toEqual({ "host.arch": "amd64" });
|
|
1955
|
+
});
|
|
1956
|
+
});
|
|
1957
|
+
});
|
|
1958
|
+
|
|
1576
1959
|
describe("extractEntitiesWithRetirements — legacy Kubernetes Host repair", () => {
|
|
1577
1960
|
test.each([
|
|
1578
1961
|
["pod name", "k8s.pod.name", "checkout-7d9f"],
|