@oneuptime/common 12.0.32 → 12.0.33
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/AnalyticsModels/Span.ts +14 -0
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/Index.ts +10 -0
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +176 -1
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/TelemetryException.ts +119 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
- package/Server/API/EnterpriseLicenseAPI.ts +391 -64
- package/Server/API/LlmProviderAPI.ts +137 -22
- package/Server/EnvironmentConfig.ts +14 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Infrastructure/QueueWorker.ts +38 -8
- package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
- package/Server/Middleware/ProjectAuthorization.ts +11 -0
- package/Server/Middleware/SCIMAuthorization.ts +12 -0
- package/Server/Middleware/TelemetryIngest.ts +11 -0
- package/Server/Services/AIBillingService.ts +101 -27
- package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/Index.ts +10 -0
- package/Server/Services/MonitorService.ts +143 -21
- package/Server/Services/MonitorStatusTimelineService.ts +150 -8
- package/Server/Services/MonitorTemplateService.ts +217 -1
- package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
- package/Server/Services/NetworkAlertPolicyService.ts +944 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
- package/Server/Services/NetworkDeviceService.ts +1032 -73
- package/Server/Services/NetworkSiteService.ts +1502 -129
- package/Server/Services/NetworkSiteTypeService.ts +1216 -0
- package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
- package/Server/Services/NotificationService.ts +118 -28
- package/Server/Services/ProjectService.ts +105 -48
- package/Server/Services/StatusPagePrivateUserService.ts +103 -3
- package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
- package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
- package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
- package/Server/Services/UserNotificationSettingService.ts +62 -25
- package/Server/Services/UserService.ts +95 -0
- package/Server/Types/Database/QueryHelper.ts +2 -2
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
- package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
- package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
- package/Server/Utils/DataSource/HttpFetch.ts +9 -2
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
- package/Server/Utils/LLM/LLMService.ts +78 -0
- package/Server/Utils/LogRedaction.ts +8 -0
- package/Server/Utils/Logger.ts +79 -1
- package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
- package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
- package/Server/Utils/OutboundUserAgent.ts +152 -0
- package/Server/Utils/StartServer.ts +51 -19
- package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
- package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
- package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
- package/Server/Utils/Telemetry.ts +198 -51
- package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
- package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
- package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
- package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
- package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
- package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
- package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
- package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
- package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
- package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
- package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
- package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
- package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
- package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
- package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
- package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
- package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
- package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
- package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
- package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
- package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
- package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
- package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
- package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
- package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
- package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
- package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
- package/Tests/Server/Utils/Captcha.test.ts +422 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
- package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
- package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
- package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
- package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
- package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
- package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
- package/Tests/Server/Utils/Telemetry.test.ts +456 -66
- package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
- package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
- package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
- package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
- package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
- package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
- package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
- package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
- package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
- package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
- package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
- package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
- package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
- package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
- package/Types/AI/ExceptionAIClassification.ts +10 -24
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
- package/Types/Exception/ApiException.ts +10 -0
- package/Types/Exception/BadDataException.ts +11 -0
- package/Types/Exception/BadRequestException.ts +11 -0
- package/Types/Exception/Exception.ts +65 -0
- package/Types/Exception/ForbiddenException.ts +10 -0
- package/Types/Exception/NotAuthenticatedException.ts +10 -0
- package/Types/Exception/NotAuthorizedException.ts +10 -0
- package/Types/Exception/NotFoundException.ts +11 -0
- package/Types/Exception/PayloadTooLargeException.ts +11 -0
- package/Types/Exception/PaymentRequiredException.ts +10 -0
- package/Types/Exception/ServiceUnavailableException.ts +10 -0
- package/Types/Exception/SsoAuthorizationException.ts +10 -0
- package/Types/Exception/TenantNotFoundException.ts +11 -0
- package/Types/Exception/TimeoutException.ts +10 -0
- package/Types/Exception/TooManyRequestsException.ts +10 -0
- package/Types/Exception/UnableToReachServer.ts +10 -0
- package/Types/Exception/WebsiteRequestException.ts +10 -0
- package/Types/Monitor/CriteriaFilter.ts +60 -2
- package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
- package/Types/Monitor/MonitorMetricType.ts +71 -0
- package/Types/Monitor/MonitorStep.ts +76 -0
- package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
- package/Types/Monitor/MonitorType.ts +47 -1
- package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
- package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
- package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
- package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
- package/Types/Permission.ts +90 -0
- package/Types/Probe/ProbeMonitorResponse.ts +16 -0
- package/Types/Telemetry/ErrorClass.ts +274 -0
- package/Types/Telemetry/UnitOfWork.ts +59 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
- package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
- package/UI/Components/Modal/Modal.tsx +2 -8
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/SideMenu.tsx +123 -5
- package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
- package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
- package/UI/Components/SideOver/SideOver.tsx +21 -20
- package/UI/Utils/PageScrollLock.ts +79 -3
- package/UI/Utils/PermissionGate.ts +61 -0
- package/UI/Utils/SensitiveUrlToken.ts +112 -0
- package/UI/Utils/TestLLMProvider.ts +11 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
- package/Utils/Monitor/MonitorMetricType.ts +153 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
- package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
- package/build/dist/Models/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +10 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/LlmProviderAPI.js +108 -13
- package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +12 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +70 -16
- package/build/dist/Server/Services/AIBillingService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +10 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +119 -21
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
- package/build/dist/Server/Services/NotificationService.js +80 -17
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +66 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +90 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
- package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +8 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +63 -1
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +38 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +162 -46
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
- package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
- package/build/dist/Types/Exception/ApiException.js +9 -0
- package/build/dist/Types/Exception/ApiException.js.map +1 -1
- package/build/dist/Types/Exception/BadDataException.js +10 -0
- package/build/dist/Types/Exception/BadDataException.js.map +1 -1
- package/build/dist/Types/Exception/BadRequestException.js +10 -0
- package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
- package/build/dist/Types/Exception/Exception.js +56 -0
- package/build/dist/Types/Exception/Exception.js.map +1 -1
- package/build/dist/Types/Exception/ForbiddenException.js +9 -0
- package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
- package/build/dist/Types/Exception/NotFoundException.js +10 -0
- package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
- package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
- package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
- package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
- package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
- package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
- package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/TimeoutException.js +9 -0
- package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
- package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
- package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
- package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
- package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
- package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +54 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +45 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
- package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +80 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
- package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -7
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +31 -3
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +42 -1
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
- package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
- package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
|
|
2
|
-
import NetworkDeviceWalkUtil
|
|
2
|
+
import NetworkDeviceWalkUtil, {
|
|
3
|
+
NetworkDevicePingResult,
|
|
4
|
+
} from "../../../../Server/Utils/Monitor/NetworkDeviceWalkUtil";
|
|
5
|
+
import { NetworkDevicePollMode } from "../../../../Server/Utils/Monitor/NetworkDeviceHydrationUtil";
|
|
3
6
|
import MonitorResourceUtil from "../../../../Server/Utils/Monitor/MonitorResource";
|
|
4
7
|
import NetworkDeviceMetricUtil from "../../../../Server/Utils/Monitor/NetworkDeviceMetricUtil";
|
|
5
8
|
import NetworkInventoryUtil from "../../../../Server/Utils/Monitor/NetworkInventoryUtil";
|
|
6
9
|
import SnmpInterfaceRateUtil from "../../../../Server/Utils/Monitor/SnmpInterfaceRateUtil";
|
|
7
10
|
import MonitorService from "../../../../Server/Services/MonitorService";
|
|
8
11
|
import NetworkDeviceService from "../../../../Server/Services/NetworkDeviceService";
|
|
12
|
+
import FindBy from "../../../../Server/Types/Database/FindBy";
|
|
13
|
+
import QueryHelper from "../../../../Server/Types/Database/QueryHelper";
|
|
9
14
|
import Monitor from "../../../../Models/DatabaseModels/Monitor";
|
|
10
15
|
import NetworkDevice from "../../../../Models/DatabaseModels/NetworkDevice";
|
|
16
|
+
import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
|
|
17
|
+
import LIMIT_MAX from "../../../../Types/Database/LimitMax";
|
|
11
18
|
import MonitorStep from "../../../../Types/Monitor/MonitorStep";
|
|
12
19
|
import MonitorSteps from "../../../../Types/Monitor/MonitorSteps";
|
|
13
20
|
import MonitorType from "../../../../Types/Monitor/MonitorType";
|
|
21
|
+
import PingMonitorResponse from "../../../../Types/Monitor/PingMonitor/PingMonitorResponse";
|
|
14
22
|
import SnmpMonitorResponse from "../../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
|
|
15
23
|
import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
|
|
16
24
|
import { JSONObject } from "../../../../Types/JSON";
|
|
@@ -19,15 +27,17 @@ import OneUptimeDate from "../../../../Types/Date";
|
|
|
19
27
|
|
|
20
28
|
/*
|
|
21
29
|
* NetworkDeviceWalkUtil is the server half of device-owned polling: the
|
|
22
|
-
* device's assigned probe reports each
|
|
30
|
+
* device's assigned probe reports each poll here - a ping always, and an
|
|
31
|
+
* SNMP walk as well when the device has credentials - and this util
|
|
23
32
|
* computes interface rates against the previous walk, persists the new
|
|
24
33
|
* delta baseline, syncs inventory, emits device-scoped metrics, and fans
|
|
25
|
-
* the
|
|
34
|
+
* the poll out to every Network Device monitor referencing the device.
|
|
26
35
|
*
|
|
27
36
|
* These tests mock every collaborator and pin the orchestration contract:
|
|
28
37
|
* the probe-scoping security guard, what flows into each collaborator (and
|
|
29
|
-
* in what order), the lastWalkLog persistence gating, the fan-out
|
|
30
|
-
*
|
|
38
|
+
* in what order), the lastWalkLog persistence gating, the fan-out lookup
|
|
39
|
+
* (indexed column UNION legacy step JSON, deduped), the synthesized
|
|
40
|
+
* ProbeMonitorResponse shape under every ping/walk combination, and the
|
|
31
41
|
* fault-isolation guarantees (metrics/criteria failures never break the
|
|
32
42
|
* pipeline).
|
|
33
43
|
*/
|
|
@@ -65,9 +75,25 @@ function buildDevice(): NetworkDevice {
|
|
|
65
75
|
return device;
|
|
66
76
|
}
|
|
67
77
|
|
|
78
|
+
/*
|
|
79
|
+
* The fan-out lookup issues two queries on the same column and the mock
|
|
80
|
+
* has to tell them apart: QueryHelper.any / isNull are replaced with
|
|
81
|
+
* sentinels so the query object says which it is.
|
|
82
|
+
*/
|
|
83
|
+
type MonitorLinkQuery = { __in?: Array<string>; __isNull?: true };
|
|
84
|
+
|
|
85
|
+
function linkQueryOf(findBy: FindBy<Monitor>): MonitorLinkQuery | undefined {
|
|
86
|
+
return (findBy.query as unknown as JSONObject)[
|
|
87
|
+
"autoProvisionedNetworkDeviceId"
|
|
88
|
+
] as MonitorLinkQuery | undefined;
|
|
89
|
+
}
|
|
90
|
+
|
|
68
91
|
function mockPipeline(options?: {
|
|
69
92
|
device?: NetworkDevice | null | undefined;
|
|
93
|
+
// Hand-made monitors: linked to the device only through their step JSON.
|
|
70
94
|
monitors?: Array<Monitor> | undefined;
|
|
95
|
+
// Provisioned monitors: linked through autoProvisionedNetworkDeviceId.
|
|
96
|
+
indexedMonitors?: Array<Monitor> | undefined;
|
|
71
97
|
}): void {
|
|
72
98
|
deviceFindSpy = jest
|
|
73
99
|
.spyOn(NetworkDeviceService, "findOneBy")
|
|
@@ -83,9 +109,35 @@ function mockPipeline(options?: {
|
|
|
83
109
|
deviceUpdateSpy = jest
|
|
84
110
|
.spyOn(NetworkDeviceService, "updateColumnsByIdWithoutHooks")
|
|
85
111
|
.mockResolvedValue(undefined);
|
|
112
|
+
jest.spyOn(QueryHelper, "any").mockImplementation(((
|
|
113
|
+
values: Array<string | ObjectID | number>,
|
|
114
|
+
): MonitorLinkQuery => {
|
|
115
|
+
return {
|
|
116
|
+
__in: values.map((value: string | ObjectID | number) => {
|
|
117
|
+
return value.toString();
|
|
118
|
+
}),
|
|
119
|
+
};
|
|
120
|
+
}) as never);
|
|
121
|
+
jest
|
|
122
|
+
.spyOn(QueryHelper, "isNull")
|
|
123
|
+
.mockReturnValue({ __isNull: true } as never);
|
|
86
124
|
monitorFindSpy = jest
|
|
87
125
|
.spyOn(MonitorService, "findBy")
|
|
88
|
-
.
|
|
126
|
+
.mockImplementation(
|
|
127
|
+
async (findBy: FindBy<Monitor>): Promise<Array<Monitor>> => {
|
|
128
|
+
const link: MonitorLinkQuery | undefined = linkQueryOf(findBy);
|
|
129
|
+
|
|
130
|
+
if (link?.__isNull) {
|
|
131
|
+
return options?.monitors || [];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (link?.__in) {
|
|
135
|
+
return options?.indexedMonitors || [];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return [];
|
|
139
|
+
},
|
|
140
|
+
);
|
|
89
141
|
monitorResourceSpy = jest
|
|
90
142
|
.spyOn(MonitorResourceUtil, "monitorResource")
|
|
91
143
|
.mockResolvedValue(undefined as never);
|
|
@@ -102,6 +154,17 @@ function mockPipeline(options?: {
|
|
|
102
154
|
});
|
|
103
155
|
}
|
|
104
156
|
|
|
157
|
+
function monitorFindCalls(kind: "indexed" | "legacy"): Array<FindBy<Monitor>> {
|
|
158
|
+
return monitorFindSpy.mock.calls
|
|
159
|
+
.map((call: Array<unknown>) => {
|
|
160
|
+
return call[0] as FindBy<Monitor>;
|
|
161
|
+
})
|
|
162
|
+
.filter((findBy: FindBy<Monitor>) => {
|
|
163
|
+
const link: MonitorLinkQuery | undefined = linkQueryOf(findBy);
|
|
164
|
+
return kind === "legacy" ? Boolean(link?.__isNull) : Boolean(link?.__in);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
105
168
|
function buildSnmpResponse(
|
|
106
169
|
overrides?: Partial<SnmpMonitorResponse>,
|
|
107
170
|
): SnmpMonitorResponse {
|
|
@@ -125,6 +188,18 @@ function buildSnmpResponse(
|
|
|
125
188
|
};
|
|
126
189
|
}
|
|
127
190
|
|
|
191
|
+
const OK_PING: NetworkDevicePingResult = {
|
|
192
|
+
isOnline: true,
|
|
193
|
+
avgRttMs: 2.5,
|
|
194
|
+
packetLossPercent: 0,
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
const FAILED_PING: NetworkDevicePingResult = {
|
|
198
|
+
isOnline: false,
|
|
199
|
+
packetLossPercent: 100,
|
|
200
|
+
failureCause: "Request timed out",
|
|
201
|
+
};
|
|
202
|
+
|
|
128
203
|
function buildStep(networkDeviceId: string | undefined): MonitorStep {
|
|
129
204
|
const step: MonitorStep = new MonitorStep();
|
|
130
205
|
step.data = {
|
|
@@ -165,15 +240,32 @@ function buildMonitor(options: {
|
|
|
165
240
|
return monitor;
|
|
166
241
|
}
|
|
167
242
|
|
|
168
|
-
async function
|
|
243
|
+
async function runPoll(input: {
|
|
244
|
+
snmpResponse?: SnmpMonitorResponse | undefined;
|
|
245
|
+
isOnline?: boolean | undefined;
|
|
246
|
+
pollMode?: NetworkDevicePollMode | undefined;
|
|
247
|
+
pingResponse?: NetworkDevicePingResult | undefined;
|
|
248
|
+
}): Promise<void> {
|
|
169
249
|
await NetworkDeviceWalkUtil.processWalkResult({
|
|
170
250
|
probeId: PROBE_ID,
|
|
171
251
|
networkDeviceId: new ObjectID(DEVICE_ID),
|
|
172
|
-
|
|
252
|
+
...input,
|
|
173
253
|
monitoredAt: MONITORED_AT,
|
|
174
254
|
});
|
|
175
255
|
}
|
|
176
256
|
|
|
257
|
+
/*
|
|
258
|
+
* What a probe that predates ping-first polling reports: a walk and nothing
|
|
259
|
+
* else - no device verdict, no mode, no ping.
|
|
260
|
+
*/
|
|
261
|
+
async function runWalk(snmpResponse: SnmpMonitorResponse): Promise<void> {
|
|
262
|
+
await runPoll({ snmpResponse: snmpResponse });
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function synthesized(index: number = 0): ProbeMonitorResponse {
|
|
266
|
+
return monitorResourceSpy.mock.calls[index]![0] as ProbeMonitorResponse;
|
|
267
|
+
}
|
|
268
|
+
|
|
177
269
|
beforeEach(() => {
|
|
178
270
|
jest.spyOn(OneUptimeDate, "getCurrentDate").mockReturnValue(NOW);
|
|
179
271
|
});
|
|
@@ -266,7 +358,7 @@ describe("NetworkDeviceWalkUtil.processWalkResult — happy path", () => {
|
|
|
266
358
|
expect(lastWalkLog["monitoredAt"]).toEqual(NOW);
|
|
267
359
|
});
|
|
268
360
|
|
|
269
|
-
test("inventory is synced with the device's own projectId/deviceId
|
|
361
|
+
test("inventory is synced with the device's own projectId/deviceId, the in-flight response and the mode", async () => {
|
|
270
362
|
mockPipeline();
|
|
271
363
|
const snmpResponse: SnmpMonitorResponse = buildSnmpResponse();
|
|
272
364
|
|
|
@@ -280,6 +372,8 @@ describe("NetworkDeviceWalkUtil.processWalkResult — happy path", () => {
|
|
|
280
372
|
expect((inventoryArgs["deviceId"] as ObjectID).toString()).toBe(DEVICE_ID);
|
|
281
373
|
expect(inventoryArgs["snmpResponse"]).toBe(snmpResponse);
|
|
282
374
|
expect(inventoryArgs["isOnline"]).toBe(true);
|
|
375
|
+
// An old probe only ever walked: its mode is snmp.
|
|
376
|
+
expect(inventoryArgs["pollMode"]).toBe("snmp");
|
|
283
377
|
});
|
|
284
378
|
|
|
285
379
|
test("device-scoped metrics are emitted with the device and probe identity", async () => {
|
|
@@ -303,6 +397,7 @@ describe("NetworkDeviceWalkUtil.processWalkResult — happy path", () => {
|
|
|
303
397
|
expect(metricArgs["snmpResponse"]).toBe(snmpResponse);
|
|
304
398
|
expect(metricArgs["responseTimeInMs"]).toBe(42);
|
|
305
399
|
expect(metricArgs["isOnline"]).toBe(true);
|
|
400
|
+
expect(metricArgs["pingResponse"]).toBeUndefined();
|
|
306
401
|
});
|
|
307
402
|
});
|
|
308
403
|
|
|
@@ -353,6 +448,253 @@ describe("NetworkDeviceWalkUtil.processWalkResult — failed poll", () => {
|
|
|
353
448
|
});
|
|
354
449
|
});
|
|
355
450
|
|
|
451
|
+
/*
|
|
452
|
+
* Ping-first polling. A ping-first probe reports the device verdict (ping OR
|
|
453
|
+
* walk), the mode, the ping, and the walk only when one ran. What reaches
|
|
454
|
+
* inventory, metrics and the monitors under each combination is the whole
|
|
455
|
+
* contract of "a device without credentials still has a status".
|
|
456
|
+
*/
|
|
457
|
+
describe("NetworkDeviceWalkUtil.processWalkResult — ping-first polling", () => {
|
|
458
|
+
const EXPECTED_OK_PING: PingMonitorResponse = {
|
|
459
|
+
packetsSent: 0,
|
|
460
|
+
packetsReceived: 0,
|
|
461
|
+
packetLossPercent: 0,
|
|
462
|
+
avgRoundTripTimeInMs: 2.5,
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
test("a reachable ping-only poll: no rates, no baseline, inventory and metrics in ping mode with no walk, and the ping carried", async () => {
|
|
466
|
+
mockPipeline();
|
|
467
|
+
|
|
468
|
+
await runPoll({ isOnline: true, pollMode: "ping", pingResponse: OK_PING });
|
|
469
|
+
|
|
470
|
+
expect(rateSpy).not.toHaveBeenCalled();
|
|
471
|
+
expect(deviceUpdateSpy).not.toHaveBeenCalled();
|
|
472
|
+
|
|
473
|
+
const inventoryArgs: JSONObject = inventorySpy.mock.calls[0][0];
|
|
474
|
+
expect(inventoryArgs["snmpResponse"]).toBeUndefined();
|
|
475
|
+
expect(inventoryArgs["isOnline"]).toBe(true);
|
|
476
|
+
expect(inventoryArgs["pollMode"]).toBe("ping");
|
|
477
|
+
|
|
478
|
+
const metricArgs: JSONObject = metricsSpy.mock.calls[0][0];
|
|
479
|
+
expect(metricArgs["snmpResponse"]).toBeUndefined();
|
|
480
|
+
// Walk time only: a ping-only poll writes no response-time point.
|
|
481
|
+
expect(metricArgs["responseTimeInMs"]).toBeUndefined();
|
|
482
|
+
expect(metricArgs["isOnline"]).toBe(true);
|
|
483
|
+
expect(metricArgs["pingResponse"]).toEqual(EXPECTED_OK_PING);
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
test("the monitor response on a ping-only poll carries NO snmpResponse - never a synthesized failure", async () => {
|
|
487
|
+
const step: MonitorStep = buildStep(DEVICE_ID);
|
|
488
|
+
mockPipeline({ monitors: [buildMonitor({ steps: [step] })] });
|
|
489
|
+
|
|
490
|
+
await runPoll({ isOnline: true, pollMode: "ping", pingResponse: OK_PING });
|
|
491
|
+
|
|
492
|
+
expect(monitorResourceSpy).toHaveBeenCalledTimes(1);
|
|
493
|
+
const response: ProbeMonitorResponse = synthesized();
|
|
494
|
+
|
|
495
|
+
expect(response.snmpResponse).toBeUndefined();
|
|
496
|
+
expect(response.isOnline).toBe(true);
|
|
497
|
+
expect(response.responseTimeInMs).toBeUndefined();
|
|
498
|
+
expect(response.isTimeout).toBeUndefined();
|
|
499
|
+
expect(response.failureCause).toBe("");
|
|
500
|
+
expect(response.pingResponse).toEqual(EXPECTED_OK_PING);
|
|
501
|
+
expect(response.monitorStepId.toString()).toBe(step.id.toString());
|
|
502
|
+
expect(response.monitoredAt).toEqual(MONITORED_AT);
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
test("an unreachable ping-only poll: verdict false, the ping's failure cause, still no walk", async () => {
|
|
506
|
+
mockPipeline({
|
|
507
|
+
monitors: [buildMonitor({ steps: [buildStep(DEVICE_ID)] })],
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
await runPoll({
|
|
511
|
+
isOnline: false,
|
|
512
|
+
pollMode: "ping",
|
|
513
|
+
pingResponse: FAILED_PING,
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
expect(inventorySpy.mock.calls[0][0]["isOnline"]).toBe(false);
|
|
517
|
+
expect(metricsSpy.mock.calls[0][0]["isOnline"]).toBe(false);
|
|
518
|
+
|
|
519
|
+
const response: ProbeMonitorResponse = synthesized();
|
|
520
|
+
expect(response.isOnline).toBe(false);
|
|
521
|
+
expect(response.snmpResponse).toBeUndefined();
|
|
522
|
+
expect(response.failureCause).toBe("Request timed out");
|
|
523
|
+
expect(response.pingResponse?.packetLossPercent).toBe(100);
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
test("snmp mode, ping answered, walk failed: the device is Up and the failed walk is the real walk", async () => {
|
|
527
|
+
mockPipeline({
|
|
528
|
+
monitors: [buildMonitor({ steps: [buildStep(DEVICE_ID)] })],
|
|
529
|
+
});
|
|
530
|
+
const failedWalk: SnmpMonitorResponse = buildSnmpResponse({
|
|
531
|
+
isOnline: false,
|
|
532
|
+
responseTimeInMs: 5000,
|
|
533
|
+
isTimeout: true,
|
|
534
|
+
failureCause: "SNMP timed out after 3 attempts",
|
|
535
|
+
interfaces: undefined,
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
await runPoll({
|
|
539
|
+
isOnline: true,
|
|
540
|
+
pollMode: "snmp",
|
|
541
|
+
pingResponse: OK_PING,
|
|
542
|
+
snmpResponse: failedWalk,
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
const inventoryArgs: JSONObject = inventorySpy.mock.calls[0][0];
|
|
546
|
+
expect(inventoryArgs["isOnline"]).toBe(true);
|
|
547
|
+
expect(inventoryArgs["pollMode"]).toBe("snmp");
|
|
548
|
+
expect(inventoryArgs["snmpResponse"]).toBe(failedWalk);
|
|
549
|
+
|
|
550
|
+
const response: ProbeMonitorResponse = synthesized();
|
|
551
|
+
// The device verdict, not the walk's.
|
|
552
|
+
expect(response.isOnline).toBe(true);
|
|
553
|
+
expect(response.snmpResponse).toBe(failedWalk);
|
|
554
|
+
expect(response.responseTimeInMs).toBe(5000);
|
|
555
|
+
expect(response.isTimeout).toBe(true);
|
|
556
|
+
// The walk's cause is the specific one; the walk-failing alert reads it.
|
|
557
|
+
expect(response.failureCause).toBe("SNMP timed out after 3 attempts");
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
/*
|
|
561
|
+
* ICMP-filtered SNMP gear. The walk is the proof of life; the ping's
|
|
562
|
+
* "timed out" is not a failure of anything and must not be surfaced as
|
|
563
|
+
* the poll's failure cause on a device that is Up.
|
|
564
|
+
*/
|
|
565
|
+
test("snmp mode, ping failed, walk succeeded: Up, the walk verbatim, and no failure cause from the ping", async () => {
|
|
566
|
+
mockPipeline({
|
|
567
|
+
monitors: [buildMonitor({ steps: [buildStep(DEVICE_ID)] })],
|
|
568
|
+
});
|
|
569
|
+
const walk: SnmpMonitorResponse = buildSnmpResponse();
|
|
570
|
+
|
|
571
|
+
await runPoll({
|
|
572
|
+
isOnline: true,
|
|
573
|
+
pollMode: "snmp",
|
|
574
|
+
pingResponse: FAILED_PING,
|
|
575
|
+
snmpResponse: walk,
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
const response: ProbeMonitorResponse = synthesized();
|
|
579
|
+
expect(response.isOnline).toBe(true);
|
|
580
|
+
expect(response.snmpResponse).toBe(walk);
|
|
581
|
+
expect(response.responseTimeInMs).toBe(42);
|
|
582
|
+
expect(response.failureCause).toBe("");
|
|
583
|
+
expect(response.pingResponse?.packetLossPercent).toBe(100);
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
test("snmp mode, both failed: Down, the walk's cause first, the ping's when the walk has none", async () => {
|
|
587
|
+
mockPipeline({
|
|
588
|
+
monitors: [buildMonitor({ steps: [buildStep(DEVICE_ID)] })],
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
await runPoll({
|
|
592
|
+
isOnline: false,
|
|
593
|
+
pollMode: "snmp",
|
|
594
|
+
pingResponse: FAILED_PING,
|
|
595
|
+
snmpResponse: buildSnmpResponse({
|
|
596
|
+
isOnline: false,
|
|
597
|
+
failureCause: "SNMP timed out after 3 attempts",
|
|
598
|
+
interfaces: undefined,
|
|
599
|
+
}),
|
|
600
|
+
});
|
|
601
|
+
|
|
602
|
+
expect(synthesized().isOnline).toBe(false);
|
|
603
|
+
expect(synthesized().failureCause).toBe("SNMP timed out after 3 attempts");
|
|
604
|
+
|
|
605
|
+
monitorResourceSpy.mockClear();
|
|
606
|
+
|
|
607
|
+
await runPoll({
|
|
608
|
+
isOnline: false,
|
|
609
|
+
pollMode: "snmp",
|
|
610
|
+
pingResponse: FAILED_PING,
|
|
611
|
+
snmpResponse: buildSnmpResponse({
|
|
612
|
+
isOnline: false,
|
|
613
|
+
failureCause: "",
|
|
614
|
+
interfaces: undefined,
|
|
615
|
+
}),
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
expect(synthesized().failureCause).toBe("Request timed out");
|
|
619
|
+
});
|
|
620
|
+
|
|
621
|
+
test("an old probe's walk (no verdict, no mode, no ping) derives the verdict from the walk", async () => {
|
|
622
|
+
mockPipeline({
|
|
623
|
+
monitors: [buildMonitor({ steps: [buildStep(DEVICE_ID)] })],
|
|
624
|
+
});
|
|
625
|
+
|
|
626
|
+
await runWalk(
|
|
627
|
+
buildSnmpResponse({ isOnline: false, interfaces: undefined }),
|
|
628
|
+
);
|
|
629
|
+
|
|
630
|
+
expect(inventorySpy.mock.calls[0][0]["isOnline"]).toBe(false);
|
|
631
|
+
expect(inventorySpy.mock.calls[0][0]["pollMode"]).toBe("snmp");
|
|
632
|
+
expect(synthesized().isOnline).toBe(false);
|
|
633
|
+
expect(synthesized().pingResponse).toBeUndefined();
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
test("an old probe's walk with no verdict at all counts as answered (the inventory's convention)", async () => {
|
|
637
|
+
mockPipeline();
|
|
638
|
+
|
|
639
|
+
await runWalk({
|
|
640
|
+
oidResponses: [],
|
|
641
|
+
responseTimeInMs: 5,
|
|
642
|
+
} as unknown as SnmpMonitorResponse);
|
|
643
|
+
|
|
644
|
+
expect(inventorySpy.mock.calls[0][0]["isOnline"]).toBe(true);
|
|
645
|
+
});
|
|
646
|
+
});
|
|
647
|
+
|
|
648
|
+
describe("NetworkDeviceWalkUtil.toPingMonitorResponse", () => {
|
|
649
|
+
test("no ping (an old probe) is no response, never an invented one", () => {
|
|
650
|
+
expect(NetworkDeviceWalkUtil.toPingMonitorResponse(undefined)).toBe(
|
|
651
|
+
undefined,
|
|
652
|
+
);
|
|
653
|
+
});
|
|
654
|
+
|
|
655
|
+
test("maps the probe's shape onto the Ping monitor's, counts defaulting when the probe did not report them", () => {
|
|
656
|
+
expect(NetworkDeviceWalkUtil.toPingMonitorResponse(OK_PING)).toEqual({
|
|
657
|
+
packetsSent: 0,
|
|
658
|
+
packetsReceived: 0,
|
|
659
|
+
packetLossPercent: 0,
|
|
660
|
+
avgRoundTripTimeInMs: 2.5,
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
expect(
|
|
664
|
+
NetworkDeviceWalkUtil.toPingMonitorResponse({
|
|
665
|
+
...OK_PING,
|
|
666
|
+
packetsSent: 2,
|
|
667
|
+
packetsReceived: 2,
|
|
668
|
+
}),
|
|
669
|
+
).toEqual({
|
|
670
|
+
packetsSent: 2,
|
|
671
|
+
packetsReceived: 2,
|
|
672
|
+
packetLossPercent: 0,
|
|
673
|
+
avgRoundTripTimeInMs: 2.5,
|
|
674
|
+
});
|
|
675
|
+
});
|
|
676
|
+
|
|
677
|
+
test("a ping with no measured loss implies it from the verdict", () => {
|
|
678
|
+
expect(
|
|
679
|
+
NetworkDeviceWalkUtil.toPingMonitorResponse({ isOnline: true })
|
|
680
|
+
?.packetLossPercent,
|
|
681
|
+
).toBe(0);
|
|
682
|
+
expect(
|
|
683
|
+
NetworkDeviceWalkUtil.toPingMonitorResponse({ isOnline: false })
|
|
684
|
+
?.packetLossPercent,
|
|
685
|
+
).toBe(100);
|
|
686
|
+
});
|
|
687
|
+
|
|
688
|
+
test("a non-finite RTT is dropped rather than charted", () => {
|
|
689
|
+
expect(
|
|
690
|
+
NetworkDeviceWalkUtil.toPingMonitorResponse({
|
|
691
|
+
isOnline: true,
|
|
692
|
+
avgRttMs: Number.NaN,
|
|
693
|
+
})?.avgRoundTripTimeInMs,
|
|
694
|
+
).toBeUndefined();
|
|
695
|
+
});
|
|
696
|
+
});
|
|
697
|
+
|
|
356
698
|
describe("NetworkDeviceWalkUtil.processWalkResult — fault isolation", () => {
|
|
357
699
|
test("a metrics failure does not break the pipeline: fan-out still happens", async () => {
|
|
358
700
|
const watching: Monitor = buildMonitor({ steps: [buildStep(DEVICE_ID)] });
|
|
@@ -361,7 +703,7 @@ describe("NetworkDeviceWalkUtil.processWalkResult — fault isolation", () => {
|
|
|
361
703
|
|
|
362
704
|
await expect(runWalk(buildSnmpResponse())).resolves.toBeUndefined();
|
|
363
705
|
|
|
364
|
-
expect(monitorFindSpy).
|
|
706
|
+
expect(monitorFindSpy).toHaveBeenCalled();
|
|
365
707
|
expect(monitorResourceSpy).toHaveBeenCalledTimes(1);
|
|
366
708
|
});
|
|
367
709
|
|
|
@@ -376,11 +718,7 @@ describe("NetworkDeviceWalkUtil.processWalkResult — fault isolation", () => {
|
|
|
376
718
|
await expect(runWalk(buildSnmpResponse())).resolves.toBeUndefined();
|
|
377
719
|
|
|
378
720
|
expect(monitorResourceSpy).toHaveBeenCalledTimes(2);
|
|
379
|
-
expect(
|
|
380
|
-
(
|
|
381
|
-
monitorResourceSpy.mock.calls[1][0] as ProbeMonitorResponse
|
|
382
|
-
).monitorId.toString(),
|
|
383
|
-
).toBe(second.id!.toString());
|
|
721
|
+
expect(synthesized(1).monitorId.toString()).toBe(second.id!.toString());
|
|
384
722
|
});
|
|
385
723
|
});
|
|
386
724
|
|
|
@@ -466,6 +804,18 @@ describe("NetworkDeviceWalkUtil.processWalkResult — monitor fan-out", () => {
|
|
|
466
804
|
);
|
|
467
805
|
});
|
|
468
806
|
|
|
807
|
+
test("a provisioned monitor found through its column is evaluated like a hand-made one", async () => {
|
|
808
|
+
const provisioned: Monitor = buildMonitor({
|
|
809
|
+
steps: [buildStep(DEVICE_ID)],
|
|
810
|
+
});
|
|
811
|
+
mockPipeline({ indexedMonitors: [provisioned] });
|
|
812
|
+
|
|
813
|
+
await runWalk(buildSnmpResponse());
|
|
814
|
+
|
|
815
|
+
expect(monitorResourceSpy).toHaveBeenCalledTimes(1);
|
|
816
|
+
expect(synthesized().monitorId.toString()).toBe(provisioned.id!.toString());
|
|
817
|
+
});
|
|
818
|
+
|
|
469
819
|
test("the synthesized response carries the walk verbatim into the criteria pipeline", async () => {
|
|
470
820
|
const step: MonitorStep = buildStep(DEVICE_ID);
|
|
471
821
|
const monitor: Monitor = buildMonitor({ steps: [step] });
|
|
@@ -481,20 +831,20 @@ describe("NetworkDeviceWalkUtil.processWalkResult — monitor fan-out", () => {
|
|
|
481
831
|
await runWalk(snmpResponse);
|
|
482
832
|
|
|
483
833
|
expect(monitorResourceSpy).toHaveBeenCalledTimes(1);
|
|
484
|
-
const
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
expect(
|
|
488
|
-
expect(
|
|
489
|
-
expect(
|
|
490
|
-
expect(
|
|
491
|
-
expect(
|
|
492
|
-
expect(
|
|
493
|
-
expect(
|
|
494
|
-
expect(
|
|
495
|
-
expect(
|
|
496
|
-
expect(
|
|
497
|
-
expect(
|
|
834
|
+
const response: ProbeMonitorResponse = synthesized();
|
|
835
|
+
|
|
836
|
+
expect(response.projectId.toString()).toBe(PROJECT_ID.toString());
|
|
837
|
+
expect(response.monitorId.toString()).toBe(monitor.id!.toString());
|
|
838
|
+
expect(response.monitorStepId.toString()).toBe(step.id.toString());
|
|
839
|
+
expect(response.probeId.toString()).toBe(PROBE_ID.toString());
|
|
840
|
+
expect(response.snmpResponse).toBe(snmpResponse);
|
|
841
|
+
expect(response.isOnline).toBe(false);
|
|
842
|
+
expect(response.responseTimeInMs).toBe(5000);
|
|
843
|
+
expect(response.isTimeout).toBe(true);
|
|
844
|
+
expect(response.failureCause).toBe("SNMP timed out after 3 attempts");
|
|
845
|
+
expect(response.pingResponse).toBeUndefined();
|
|
846
|
+
expect(response.monitoredAt).toEqual(MONITORED_AT);
|
|
847
|
+
expect(response.ingestedAt).toEqual(NOW);
|
|
498
848
|
});
|
|
499
849
|
|
|
500
850
|
test("a walk with no failure cause synthesizes an empty string, never undefined", async () => {
|
|
@@ -507,13 +857,17 @@ describe("NetworkDeviceWalkUtil.processWalkResult — monitor fan-out", () => {
|
|
|
507
857
|
|
|
508
858
|
await runWalk(snmpResponse);
|
|
509
859
|
|
|
510
|
-
expect(
|
|
511
|
-
(monitorResourceSpy.mock.calls[0][0] as ProbeMonitorResponse)
|
|
512
|
-
.failureCause,
|
|
513
|
-
).toBe("");
|
|
860
|
+
expect(synthesized().failureCause).toBe("");
|
|
514
861
|
});
|
|
515
862
|
});
|
|
516
863
|
|
|
864
|
+
/*
|
|
865
|
+
* The fan-out lookup is the prerequisite for alert policies: a walk must
|
|
866
|
+
* find the monitors watching its device by an indexed column, not by
|
|
867
|
+
* scanning every Network Device monitor's step JSON in the project. The
|
|
868
|
+
* scan survives, paged and restricted to rows the index cannot serve, for
|
|
869
|
+
* hand-made monitors that carry the link only in their steps.
|
|
870
|
+
*/
|
|
517
871
|
describe("NetworkDeviceWalkUtil.findMonitorsWatchingDevices", () => {
|
|
518
872
|
test("an empty device list short-circuits without querying", async () => {
|
|
519
873
|
mockPipeline();
|
|
@@ -528,23 +882,44 @@ describe("NetworkDeviceWalkUtil.findMonitorsWatchingDevices", () => {
|
|
|
528
882
|
expect(monitorFindSpy).not.toHaveBeenCalled();
|
|
529
883
|
});
|
|
530
884
|
|
|
531
|
-
test("
|
|
885
|
+
test("issues an indexed query on the device column and a legacy scan restricted to unlinked rows, both scoped, sorted and paged", async () => {
|
|
532
886
|
mockPipeline();
|
|
533
887
|
|
|
534
888
|
await NetworkDeviceWalkUtil.findMonitorsWatchingDevices({
|
|
535
889
|
projectId: PROJECT_ID,
|
|
536
|
-
deviceIds: [DEVICE_ID],
|
|
890
|
+
deviceIds: [DEVICE_ID, OTHER_DEVICE_ID],
|
|
537
891
|
});
|
|
538
892
|
|
|
539
|
-
|
|
540
|
-
const
|
|
541
|
-
expect(
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
expect(
|
|
893
|
+
const indexed: Array<FindBy<Monitor>> = monitorFindCalls("indexed");
|
|
894
|
+
const legacy: Array<FindBy<Monitor>> = monitorFindCalls("legacy");
|
|
895
|
+
expect(indexed).toHaveLength(1);
|
|
896
|
+
expect(legacy).toHaveLength(1);
|
|
897
|
+
|
|
898
|
+
expect(linkQueryOf(indexed[0]!)?.__in).toEqual([
|
|
899
|
+
DEVICE_ID,
|
|
900
|
+
OTHER_DEVICE_ID,
|
|
901
|
+
]);
|
|
902
|
+
expect(linkQueryOf(legacy[0]!)?.__isNull).toBe(true);
|
|
903
|
+
|
|
904
|
+
for (const findBy of [indexed[0]!, legacy[0]!]) {
|
|
905
|
+
const query: JSONObject = findBy.query as unknown as JSONObject;
|
|
906
|
+
expect((query["projectId"] as ObjectID).toString()).toBe(
|
|
907
|
+
PROJECT_ID.toString(),
|
|
908
|
+
);
|
|
909
|
+
expect(query["monitorType"]).toBe(MonitorType.NetworkDevice);
|
|
910
|
+
expect((findBy.sort as unknown as JSONObject)["_id"]).toBe(
|
|
911
|
+
SortOrder.Ascending,
|
|
912
|
+
);
|
|
913
|
+
expect(findBy.limit).toBe(LIMIT_MAX);
|
|
914
|
+
expect(findBy.skip).toBe(0);
|
|
915
|
+
expect(findBy.props.isRoot).toBe(true);
|
|
916
|
+
expect((findBy.select as unknown as JSONObject)["monitorSteps"]).toBe(
|
|
917
|
+
true,
|
|
918
|
+
);
|
|
919
|
+
}
|
|
545
920
|
});
|
|
546
921
|
|
|
547
|
-
test("keeps only monitors with at least one step referencing a given device, tolerating malformed steps", async () => {
|
|
922
|
+
test("keeps only legacy monitors with at least one step referencing a given device, tolerating malformed steps", async () => {
|
|
548
923
|
const watching: Monitor = buildMonitor({ steps: [buildStep(DEVICE_ID)] });
|
|
549
924
|
const watchingOther: Monitor = buildMonitor({
|
|
550
925
|
steps: [buildStep(OTHER_DEVICE_ID)],
|
|
@@ -613,4 +988,66 @@ describe("NetworkDeviceWalkUtil.findMonitorsWatchingDevices", () => {
|
|
|
613
988
|
|
|
614
989
|
expect(monitors).toHaveLength(2);
|
|
615
990
|
});
|
|
991
|
+
|
|
992
|
+
test("unions the indexed and legacy results, indexed first, deduped by id", async () => {
|
|
993
|
+
const provisioned: Monitor = buildMonitor({
|
|
994
|
+
steps: [buildStep(DEVICE_ID)],
|
|
995
|
+
});
|
|
996
|
+
const handMade: Monitor = buildMonitor({ steps: [buildStep(DEVICE_ID)] });
|
|
997
|
+
|
|
998
|
+
/*
|
|
999
|
+
* A row cannot really be in both sets (the legacy scan is restricted to
|
|
1000
|
+
* NULL links), but the union must not depend on that: a monitor the
|
|
1001
|
+
* indexed query returned is never evaluated twice.
|
|
1002
|
+
*/
|
|
1003
|
+
mockPipeline({
|
|
1004
|
+
indexedMonitors: [provisioned],
|
|
1005
|
+
monitors: [provisioned, handMade],
|
|
1006
|
+
});
|
|
1007
|
+
|
|
1008
|
+
const monitors: Array<Monitor> =
|
|
1009
|
+
await NetworkDeviceWalkUtil.findMonitorsWatchingDevices({
|
|
1010
|
+
projectId: PROJECT_ID,
|
|
1011
|
+
deviceIds: [DEVICE_ID],
|
|
1012
|
+
});
|
|
1013
|
+
|
|
1014
|
+
expect(
|
|
1015
|
+
monitors.map((monitor: Monitor) => {
|
|
1016
|
+
return monitor.id!.toString();
|
|
1017
|
+
}),
|
|
1018
|
+
).toEqual([provisioned.id!.toString(), handMade.id!.toString()]);
|
|
1019
|
+
});
|
|
1020
|
+
|
|
1021
|
+
test("the legacy scan pages until a short page, and finds a monitor on the second page", async () => {
|
|
1022
|
+
mockPipeline();
|
|
1023
|
+
|
|
1024
|
+
const firstPage: Array<Monitor> = Array.from({ length: LIMIT_MAX }, () => {
|
|
1025
|
+
return buildMonitor({ steps: [buildStep(OTHER_DEVICE_ID)] });
|
|
1026
|
+
});
|
|
1027
|
+
const straggler: Monitor = buildMonitor({ steps: [buildStep(DEVICE_ID)] });
|
|
1028
|
+
|
|
1029
|
+
monitorFindSpy.mockImplementation(
|
|
1030
|
+
async (findBy: FindBy<Monitor>): Promise<Array<Monitor>> => {
|
|
1031
|
+
if (linkQueryOf(findBy)?.__in) {
|
|
1032
|
+
return [];
|
|
1033
|
+
}
|
|
1034
|
+
|
|
1035
|
+
return (findBy.skip as number) === 0 ? firstPage : [straggler];
|
|
1036
|
+
},
|
|
1037
|
+
);
|
|
1038
|
+
|
|
1039
|
+
const monitors: Array<Monitor> =
|
|
1040
|
+
await NetworkDeviceWalkUtil.findMonitorsWatchingDevices({
|
|
1041
|
+
projectId: PROJECT_ID,
|
|
1042
|
+
deviceIds: [DEVICE_ID],
|
|
1043
|
+
});
|
|
1044
|
+
|
|
1045
|
+
const legacy: Array<FindBy<Monitor>> = monitorFindCalls("legacy");
|
|
1046
|
+
expect(legacy).toHaveLength(2);
|
|
1047
|
+
expect(legacy[0]!.skip).toBe(0);
|
|
1048
|
+
expect(legacy[1]!.skip).toBe(LIMIT_MAX);
|
|
1049
|
+
|
|
1050
|
+
expect(monitors).toHaveLength(1);
|
|
1051
|
+
expect(monitors[0]!.id!.toString()).toBe(straggler.id!.toString());
|
|
1052
|
+
});
|
|
616
1053
|
});
|