@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
|
@@ -52,6 +52,12 @@ import { AppVersion, Env, DisableTelemetry } from "../EnvironmentConfig";
|
|
|
52
52
|
import logger from "./Logger";
|
|
53
53
|
import GracefulShutdown, { ShutdownPriority } from "./GracefulShutdown";
|
|
54
54
|
import ContextSpanProcessor from "./Telemetry/ContextSpanProcessor";
|
|
55
|
+
import ErrorClassResolver from "./Telemetry/ErrorClassResolver";
|
|
56
|
+
import ErrorClass, {
|
|
57
|
+
isNonActionableErrorClass,
|
|
58
|
+
markErrorReported,
|
|
59
|
+
} from "../../Types/Telemetry/ErrorClass";
|
|
60
|
+
import { ERROR_CLASS_ATTRIBUTE_KEY } from "../../Types/Telemetry/UnitOfWork";
|
|
55
61
|
import RuntimeMetrics from "./Telemetry/RuntimeMetrics";
|
|
56
62
|
|
|
57
63
|
type ResourceWithRawAttributes = Resource & {
|
|
@@ -540,70 +546,158 @@ export default class Telemetry {
|
|
|
540
546
|
return this.getTracer().startActiveSpan(name, data.options || {}, data.fn);
|
|
541
547
|
}
|
|
542
548
|
|
|
549
|
+
/*
|
|
550
|
+
* Span event names. The exception name is load-bearing: the ingest side
|
|
551
|
+
* mints an ExceptionInstance row and a TelemetryException group for every
|
|
552
|
+
* span event literally named "exception" (OtelTracesIngestService
|
|
553
|
+
* getSpanEvents), with no severity, status or handled/unhandled filter. An
|
|
554
|
+
* event under any OTHER name is still pushed to the span's `events` column
|
|
555
|
+
* and still renders in the Traces UI — it simply never becomes an Issue.
|
|
556
|
+
*
|
|
557
|
+
* That is the entire mechanism by which a user error stops paging us, and
|
|
558
|
+
* it needs no ingest change, no schema change and no migration.
|
|
559
|
+
*/
|
|
560
|
+
private static readonly SPAN_EVENT_EXCEPTION: string = "exception";
|
|
561
|
+
private static readonly SPAN_EVENT_FAULT: string = "fault";
|
|
562
|
+
|
|
563
|
+
private static faultCounter: TelemetryCounter | null = null;
|
|
564
|
+
|
|
565
|
+
/**
|
|
566
|
+
* Record a thrown value on a span AND end the span.
|
|
567
|
+
*
|
|
568
|
+
* Kept as the name every @CaptureSpan frame calls, so the decorator's
|
|
569
|
+
* contract is unchanged.
|
|
570
|
+
*/
|
|
543
571
|
public static recordExceptionMarkSpanAsErrorAndEndSpan(data: {
|
|
544
572
|
span: Span;
|
|
545
573
|
exception: unknown;
|
|
574
|
+
}): void {
|
|
575
|
+
try {
|
|
576
|
+
this.recordExceptionOnSpan(data);
|
|
577
|
+
} finally {
|
|
578
|
+
this.endSpan(data.span);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
/**
|
|
583
|
+
* Record a thrown value on a span WITHOUT ending it, for callers that own
|
|
584
|
+
* the span's lifetime (QueueWorker's root job span ends it in its own
|
|
585
|
+
* `finally`).
|
|
586
|
+
*
|
|
587
|
+
* What this does, and why each part matters:
|
|
588
|
+
*
|
|
589
|
+
* 1. RESOLVES A FAULT DOMAIN. code-fault and infrastructure are real
|
|
590
|
+
* failures and behave exactly as before. user-error and expected-denial
|
|
591
|
+
* are the platform correctly refusing a request, so they get a `fault`
|
|
592
|
+
* event instead of an `exception` event and the span status is left
|
|
593
|
+
* alone.
|
|
594
|
+
*
|
|
595
|
+
* 2. REPORTS ONCE PER THROWN VALUE. One error crossing N decorated frames
|
|
596
|
+
* used to emit N exception events and N logger.error lines. The
|
|
597
|
+
* fingerprint hashes no spanId and no span name, so all N landed in the
|
|
598
|
+
* same group and occuranceCount jumped by the depth of the call stack
|
|
599
|
+
* (measured: 3 for a create with a missing field, 6 for a
|
|
600
|
+
* permission-denied get-list). Outer frames still set ERROR status and
|
|
601
|
+
* still carry the queryable exception.* attributes, so the trace shows
|
|
602
|
+
* the full error path — only the duplicate EVENT and the duplicate LOG
|
|
603
|
+
* are suppressed.
|
|
604
|
+
*
|
|
605
|
+
* 3. BUILDS THE EVENT ITSELF rather than calling span.recordException. The
|
|
606
|
+
* SDK reads `exception.code` BEFORE `exception.name` when deciding
|
|
607
|
+
* `exception.type` (sdk-trace-base Span.recordException), and every
|
|
608
|
+
* OneUptime ExceptionCode IS an HTTP status — so exceptions were being
|
|
609
|
+
* typed "401"/"400"/"500". Constructing the event here removes that trap
|
|
610
|
+
* structurally instead of relying on every caller to normalize first.
|
|
611
|
+
*
|
|
612
|
+
* 4. COUNTS EVERYTHING. `oneuptime.fault.count` is incremented for every
|
|
613
|
+
* class, suppressed or not, so suppression is never invisible. A metric
|
|
614
|
+
* also outlives trace retention, which a span event does not.
|
|
615
|
+
*
|
|
616
|
+
* Never throws: this is the universal catch path, and a throw here would
|
|
617
|
+
* mask the original error.
|
|
618
|
+
*/
|
|
619
|
+
public static recordExceptionOnSpan(data: {
|
|
620
|
+
span: Span;
|
|
621
|
+
exception: unknown;
|
|
546
622
|
}): void {
|
|
547
623
|
const { span, exception } = data;
|
|
548
624
|
|
|
549
|
-
/*
|
|
550
|
-
* This runs on the universal catch path of every @CaptureSpan-decorated
|
|
551
|
-
* function, so it must NEVER throw — a throw here would mask the original
|
|
552
|
-
* error and skip marking the span. The whole body is wrapped defensively
|
|
553
|
-
* and the span is always marked-as-error and ended (in the finally).
|
|
554
|
-
*/
|
|
555
625
|
try {
|
|
556
626
|
const exceptionAttributes: Attributes =
|
|
557
627
|
this.getExceptionAttributes(exception);
|
|
558
628
|
|
|
559
|
-
|
|
560
|
-
|
|
629
|
+
const errorClass: ErrorClass = ErrorClassResolver.resolve(exception);
|
|
630
|
+
const alreadyReported: boolean = markErrorReported(exception);
|
|
561
631
|
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
632
|
+
const exceptionType: string =
|
|
633
|
+
(exceptionAttributes["exception.type"] as string) || "Error";
|
|
634
|
+
const exceptionMessage: string =
|
|
635
|
+
(exceptionAttributes["exception.message"] as string) || "";
|
|
636
|
+
|
|
637
|
+
if (!alreadyReported) {
|
|
638
|
+
// Logger applies the same classification and demotes to WARN severity.
|
|
639
|
+
logger.error(exception);
|
|
640
|
+
}
|
|
571
641
|
|
|
572
642
|
/*
|
|
573
|
-
*
|
|
574
|
-
*
|
|
575
|
-
*
|
|
576
|
-
*
|
|
577
|
-
*
|
|
578
|
-
*
|
|
579
|
-
*
|
|
580
|
-
*
|
|
581
|
-
*
|
|
582
|
-
* That type is the exception event's identity downstream: it is hashed
|
|
583
|
-
* into the TelemetryException group fingerprint and it is what the
|
|
584
|
-
* Issues list and the AI insight titles show. A whole service's worth of
|
|
585
|
-
* unrelated failures collapsed into "401", telling nobody anything.
|
|
586
|
-
*
|
|
587
|
-
* The payload is built from the attributes getExceptionAttributes has
|
|
588
|
-
* already extracted, which means it inherits their truncation (4k
|
|
589
|
-
* message, 8k stack) and their crash-safety — a hostile thrown value is
|
|
590
|
-
* read exactly once, defensively, rather than twice.
|
|
643
|
+
* Span *events* are not reliably surfaced when the span is read back,
|
|
644
|
+
* and setStatus on its own only records the error CODE, not the message.
|
|
645
|
+
* So the exception details are also attached as queryable span
|
|
646
|
+
* attributes — including DB driver fields like the failing constraint
|
|
647
|
+
* and table — so the actual cause is visible in the trace UI instead of
|
|
648
|
+
* an empty "Error" status. Done for every class, on every frame: it is
|
|
649
|
+
* what makes `attributes.exception.type` usable as a drop-filter
|
|
650
|
+
* predicate at any depth.
|
|
591
651
|
*/
|
|
592
|
-
span.
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
...(exceptionAttributes["exception.stacktrace"]
|
|
596
|
-
? {
|
|
597
|
-
stack: exceptionAttributes["exception.stacktrace"] as string,
|
|
598
|
-
}
|
|
599
|
-
: {}),
|
|
600
|
-
} as SpanException);
|
|
601
|
-
span.setStatus({
|
|
602
|
-
code: SpanStatusCode.ERROR,
|
|
603
|
-
message:
|
|
604
|
-
(exceptionAttributes["exception.message"] as string | undefined) ||
|
|
605
|
-
"Error",
|
|
652
|
+
span.setAttributes({
|
|
653
|
+
...exceptionAttributes,
|
|
654
|
+
[ERROR_CLASS_ATTRIBUTE_KEY]: errorClass,
|
|
606
655
|
});
|
|
656
|
+
|
|
657
|
+
if (!isNonActionableErrorClass(errorClass)) {
|
|
658
|
+
if (!alreadyReported) {
|
|
659
|
+
span.addEvent(this.SPAN_EVENT_EXCEPTION, {
|
|
660
|
+
"exception.type": exceptionType,
|
|
661
|
+
"exception.message": exceptionMessage,
|
|
662
|
+
...(exceptionAttributes["exception.stacktrace"]
|
|
663
|
+
? {
|
|
664
|
+
"exception.stacktrace": exceptionAttributes[
|
|
665
|
+
"exception.stacktrace"
|
|
666
|
+
] as string,
|
|
667
|
+
}
|
|
668
|
+
: {}),
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
span.setStatus({
|
|
673
|
+
code: SpanStatusCode.ERROR,
|
|
674
|
+
message: exceptionMessage || "Error",
|
|
675
|
+
});
|
|
676
|
+
} else if (!alreadyReported) {
|
|
677
|
+
/*
|
|
678
|
+
* Deliberately NOT named "exception" and deliberately carrying no
|
|
679
|
+
* `exception.*` keys: the first stops the trace ingest path from
|
|
680
|
+
* building an Issue, the second stops LogExceptionExtractor Path A
|
|
681
|
+
* from resurrecting one out of a log record. The event is still
|
|
682
|
+
* stored and still rendered.
|
|
683
|
+
*
|
|
684
|
+
* No setStatus at all. OTel says a 4xx on a SERVER span must stay
|
|
685
|
+
* Unset, and setStatus({code: UNSET}) is a documented no-op — so
|
|
686
|
+
* "leave it unset" is implemented as "do not call it".
|
|
687
|
+
*/
|
|
688
|
+
span.addEvent(this.SPAN_EVENT_FAULT, {
|
|
689
|
+
[ERROR_CLASS_ATTRIBUTE_KEY]: errorClass,
|
|
690
|
+
"error.type": exceptionType,
|
|
691
|
+
"error.message": exceptionMessage,
|
|
692
|
+
...(exceptionAttributes["exception.code"]
|
|
693
|
+
? {
|
|
694
|
+
"error.code": exceptionAttributes["exception.code"] as string,
|
|
695
|
+
}
|
|
696
|
+
: {}),
|
|
697
|
+
});
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
this.incrementFaultCounter(errorClass, exceptionType);
|
|
607
701
|
} catch {
|
|
608
702
|
// Enrichment failed on some exotic thrown value — still flag the span.
|
|
609
703
|
try {
|
|
@@ -611,8 +705,34 @@ export default class Telemetry {
|
|
|
611
705
|
} catch {
|
|
612
706
|
// span may already be ended; nothing more we can do.
|
|
613
707
|
}
|
|
614
|
-
}
|
|
615
|
-
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
/*
|
|
712
|
+
* Built lazily and through Telemetry.getCounter directly rather than through
|
|
713
|
+
* AppMetrics — AppMetrics imports Telemetry, so registering there would
|
|
714
|
+
* close an import cycle on the error path.
|
|
715
|
+
*/
|
|
716
|
+
private static incrementFaultCounter(
|
|
717
|
+
errorClass: ErrorClass,
|
|
718
|
+
exceptionType: string,
|
|
719
|
+
): void {
|
|
720
|
+
try {
|
|
721
|
+
if (!this.faultCounter) {
|
|
722
|
+
this.faultCounter = this.getCounter({
|
|
723
|
+
name: "oneuptime.fault.count",
|
|
724
|
+
description:
|
|
725
|
+
"Faults by fault domain and type, including the ones deliberately kept out of the Issues list.",
|
|
726
|
+
unit: "1",
|
|
727
|
+
});
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
this.faultCounter.add(1, {
|
|
731
|
+
[ERROR_CLASS_ATTRIBUTE_KEY]: errorClass,
|
|
732
|
+
"error.type": exceptionType,
|
|
733
|
+
});
|
|
734
|
+
} catch {
|
|
735
|
+
// Metrics must never break the error path.
|
|
616
736
|
}
|
|
617
737
|
}
|
|
618
738
|
|
|
@@ -783,7 +903,34 @@ export default class Telemetry {
|
|
|
783
903
|
}
|
|
784
904
|
}
|
|
785
905
|
|
|
906
|
+
/*
|
|
907
|
+
* Ending a span twice makes the SDK log
|
|
908
|
+
* "You can only call end() on a span once" via diag. That happened on EVERY
|
|
909
|
+
* error path: the recorder's finally ended the span, and CaptureSpan then
|
|
910
|
+
* ended it again in its own finally / .finally(). Guard here rather than at
|
|
911
|
+
* the call sites so any future caller is safe too.
|
|
912
|
+
*/
|
|
786
913
|
public static endSpan(span: Span): void {
|
|
914
|
+
try {
|
|
915
|
+
const endTime: unknown = (span as unknown as { endTime?: Array<number> })
|
|
916
|
+
.endTime;
|
|
917
|
+
|
|
918
|
+
/*
|
|
919
|
+
* sdk-trace-base sets endTime to [0, 0] until the span ends. A span
|
|
920
|
+
* implementation that does not expose it (a no-op span, a test double)
|
|
921
|
+
* falls through and is ended normally.
|
|
922
|
+
*/
|
|
923
|
+
if (
|
|
924
|
+
Array.isArray(endTime) &&
|
|
925
|
+
endTime.length === 2 &&
|
|
926
|
+
!(endTime[0] === 0 && endTime[1] === 0)
|
|
927
|
+
) {
|
|
928
|
+
return;
|
|
929
|
+
}
|
|
930
|
+
} catch {
|
|
931
|
+
// Fall through and end it.
|
|
932
|
+
}
|
|
933
|
+
|
|
787
934
|
span.end();
|
|
788
935
|
}
|
|
789
936
|
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
Takes single-use bearer tokens out of the address bar before any
|
|
3
|
+
third-party tag can read them.
|
|
4
|
+
|
|
5
|
+
Password reset and email verification links carry their token in the URL
|
|
6
|
+
*path* — /accounts/reset-password/<token>, /accounts/verify-email/<token>,
|
|
7
|
+
/reset-password/<token> on a status page. Every analytics and advertising
|
|
8
|
+
tag on the page reports the page URL as a matter of course, so the token
|
|
9
|
+
left the browser to whoever the container happened to be loading. Measured
|
|
10
|
+
on production before this partial existed, a single visit to
|
|
11
|
+
/accounts/reset-password/<token> sent the token to five third parties:
|
|
12
|
+
region1.analytics.google.com, www.google.com, bat.bing.com, q.quora.com and
|
|
13
|
+
alb.reddit.com. A reset token is a bearer credential for the account, so
|
|
14
|
+
anyone with read access to any of those ad or analytics dashboards — inside
|
|
15
|
+
OneUptime or at the vendor — could take the account over for as long as the
|
|
16
|
+
token stayed valid.
|
|
17
|
+
|
|
18
|
+
Two mechanisms, in this order:
|
|
19
|
+
|
|
20
|
+
1. The token is moved into sessionStorage and `history.replaceState`
|
|
21
|
+
rewrites the path to the token-free route. This runs synchronously in
|
|
22
|
+
<head>, before the Google Tag Manager snippet below it, so every tag the
|
|
23
|
+
container loads sees only /accounts/reset-password. Analytics is NOT
|
|
24
|
+
disabled by this — the signup funnel still reports — it just no longer
|
|
25
|
+
sees the credential. It also keeps the token out of the browser's own
|
|
26
|
+
history, which replaceState overwrites rather than appends to.
|
|
27
|
+
|
|
28
|
+
2. If step 1 did not finish — no History API, a storage exception, a URL
|
|
29
|
+
the parser rejected — the token is still in the address bar, and the
|
|
30
|
+
partial fails closed by setting
|
|
31
|
+
__ONEUPTIME_SENSITIVE_URL_TOKEN_PENDING__. The Google Tag Manager
|
|
32
|
+
snippet on each page checks that flag and does not start the container
|
|
33
|
+
at all. Losing a page view is the cheaper failure.
|
|
34
|
+
|
|
35
|
+
The reset flow itself keeps working in both cases: the client reads the
|
|
36
|
+
token through Common/UI/Utils/SensitiveUrlToken, which prefers the
|
|
37
|
+
stash and falls back to the path when the bootstrap could not clean it.
|
|
38
|
+
|
|
39
|
+
MUST be included as the first thing in <head>, ahead of Google Tag Manager
|
|
40
|
+
and ahead of every external <script>. A tag that loads before this runs is
|
|
41
|
+
a tag that sees the token. Common/Tests/App/SensitiveUrlTokenBootstrap.test.ts
|
|
42
|
+
asserts that ordering for each page that includes it.
|
|
43
|
+
|
|
44
|
+
TOKEN_ROUTES below is duplicated in Common/UI/Utils/SensitiveUrlToken.ts,
|
|
45
|
+
which has to agree about which routes carry a token; the same test asserts
|
|
46
|
+
the two lists match. Add a route to both or to neither.
|
|
47
|
+
-%>
|
|
48
|
+
<meta name="referrer" content="no-referrer" />
|
|
49
|
+
<script>
|
|
50
|
+
(function (win) {
|
|
51
|
+
var STORAGE_KEY = "oneuptime-sensitive-url-token";
|
|
52
|
+
|
|
53
|
+
/*
|
|
54
|
+
* Route segments whose NEXT path segment is a single-use bearer token.
|
|
55
|
+
* Matched against the second-to-last segment, so this covers
|
|
56
|
+
* /accounts/reset-password/<token>, /reset-password/<token> and
|
|
57
|
+
* /status-page/<id>/reset-password/<token> alike.
|
|
58
|
+
*/
|
|
59
|
+
var TOKEN_ROUTES = ["reset-password", "verify-email"];
|
|
60
|
+
|
|
61
|
+
function segmentsOf(pathname) {
|
|
62
|
+
var parts = String(pathname || "").split("/");
|
|
63
|
+
var kept = [];
|
|
64
|
+
|
|
65
|
+
for (var i = 0; i < parts.length; i++) {
|
|
66
|
+
if (parts[i] !== "") {
|
|
67
|
+
kept.push(parts[i]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return kept;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* True when the last segment of this path is a bearer token. */
|
|
75
|
+
function carriesToken(pathname) {
|
|
76
|
+
var segments = segmentsOf(pathname);
|
|
77
|
+
|
|
78
|
+
if (segments.length < 2) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
var parent = segments[segments.length - 2];
|
|
83
|
+
|
|
84
|
+
for (var i = 0; i < TOKEN_ROUTES.length; i++) {
|
|
85
|
+
if (parent === TOKEN_ROUTES[i]) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
var pending = true;
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
var url = new URL(win.location.href);
|
|
97
|
+
|
|
98
|
+
if (carriesToken(url.pathname)) {
|
|
99
|
+
var segments = segmentsOf(url.pathname);
|
|
100
|
+
var token = segments.pop();
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
token = decodeURIComponent(token);
|
|
104
|
+
} catch (_decodeError) {
|
|
105
|
+
/* A malformed escape sequence is handed on verbatim. */
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
try {
|
|
109
|
+
win.sessionStorage.setItem(STORAGE_KEY, token);
|
|
110
|
+
} catch (_storageError) {
|
|
111
|
+
/*
|
|
112
|
+
* Private mode and blocked storage. The in-memory handoff
|
|
113
|
+
* does not survive a reload, but it does survive the SPA
|
|
114
|
+
* boot, which is all the flow needs.
|
|
115
|
+
*/
|
|
116
|
+
win.__ONEUPTIME_SENSITIVE_URL_TOKEN__ = token;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
win.history.replaceState(
|
|
120
|
+
win.history.state,
|
|
121
|
+
"",
|
|
122
|
+
"/" + segments.join("/") + url.search + url.hash
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/*
|
|
127
|
+
* Read the address bar back rather than trusting the rewrite. This
|
|
128
|
+
* is the whole safety condition: analytics runs only if the token
|
|
129
|
+
* is demonstrably no longer in the URL those tags are about to
|
|
130
|
+
* report.
|
|
131
|
+
*/
|
|
132
|
+
pending = carriesToken(win.location.pathname);
|
|
133
|
+
} catch (_bootstrapError) {
|
|
134
|
+
/* Fail closed: something went wrong, so assume the token is exposed. */
|
|
135
|
+
pending = true;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
win.__ONEUPTIME_SENSITIVE_URL_TOKEN_PENDING__ = pending;
|
|
139
|
+
})(window);
|
|
140
|
+
</script>
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
NetworkTopologyEdge,
|
|
15
15
|
NetworkTopologyNode,
|
|
16
16
|
} from "../../../Types/Monitor/SnmpMonitor/NetworkTopology";
|
|
17
|
+
import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
|
|
17
18
|
|
|
18
19
|
/*
|
|
19
20
|
* Issue #3435 — what the "Add to Monitoring" dialog actually opens with.
|
|
@@ -25,6 +26,12 @@ import {
|
|
|
25
26
|
* initialValues object is type-safe, render-safe, and puts the operator back
|
|
26
27
|
* to retyping what OneUptime already discovered.
|
|
27
28
|
*
|
|
29
|
+
* Every device the dialog creates is probe-polled: there is no monitoring
|
|
30
|
+
* method to choose, the probe is required for a phone exactly as for a
|
|
31
|
+
* switch, and the SNMP step is optional for both. The cases below that used
|
|
32
|
+
* to split on "will this device be polled?" now assert that no such split
|
|
33
|
+
* exists.
|
|
34
|
+
*
|
|
28
35
|
* The form itself is configuration passed as props, so ModelFormModal is
|
|
29
36
|
* mocked to capture them and the capture is asserted directly — the same
|
|
30
37
|
* approach DiscoveryScanWizardValidation.test.tsx uses for the Discovery
|
|
@@ -35,11 +42,18 @@ type CapturedModalProps = {
|
|
|
35
42
|
title: string;
|
|
36
43
|
description: string;
|
|
37
44
|
initialValues: Record<string, unknown>;
|
|
45
|
+
onBeforeCreate?:
|
|
46
|
+
| ((
|
|
47
|
+
item: NetworkDevice,
|
|
48
|
+
miscDataProps: Record<string, unknown>,
|
|
49
|
+
) => Promise<NetworkDevice>)
|
|
50
|
+
| undefined;
|
|
38
51
|
formProps: {
|
|
39
|
-
steps: Array<{ id: string; title: string }>;
|
|
52
|
+
steps: Array<{ id: string; title: string; showIf?: unknown }>;
|
|
40
53
|
fields: Array<{
|
|
41
54
|
field: Record<string, boolean>;
|
|
42
55
|
required?: boolean | undefined;
|
|
56
|
+
stepId?: string | undefined;
|
|
43
57
|
dropdownOptions?: Array<{ label: string; value: string }> | undefined;
|
|
44
58
|
}>;
|
|
45
59
|
};
|
|
@@ -250,13 +264,49 @@ describe("the Add to Monitoring dialog", () => {
|
|
|
250
264
|
});
|
|
251
265
|
|
|
252
266
|
/*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
267
|
+
* There is no monitoring-method question any more. A phone is never
|
|
268
|
+
* SNMP-walkable, but it is pingable — and pinging is all a probe-polled
|
|
269
|
+
* device needs to have a status — so the dialog asks nothing and writes
|
|
270
|
+
* Probe on the way out. ModelForm sends only the fields it renders, which
|
|
271
|
+
* is why the method travels through onBeforeCreate rather than
|
|
272
|
+
* initialValues: a seeded value with no field behind it would never reach
|
|
273
|
+
* the server.
|
|
255
274
|
*/
|
|
256
|
-
test("
|
|
275
|
+
test("asks no monitoring-method question and writes Probe on the way out", async () => {
|
|
257
276
|
const props: CapturedModalProps = await openDialog();
|
|
258
277
|
|
|
259
|
-
expect(props
|
|
278
|
+
expect(fieldFor(props, "monitoringMethod")).toBeUndefined();
|
|
279
|
+
expect(props.initialValues["monitoringMethod"]).toBeUndefined();
|
|
280
|
+
expect(props.onBeforeCreate).toBeDefined();
|
|
281
|
+
|
|
282
|
+
const device: NetworkDevice = await props.onBeforeCreate!(
|
|
283
|
+
new NetworkDevice(),
|
|
284
|
+
{},
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
expect(device.monitoringMethod).toBe("Probe");
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
/*
|
|
291
|
+
* And the same for an infrastructure peer: the method is not a function of
|
|
292
|
+
* the role, so a switch and a phone leave the dialog identically.
|
|
293
|
+
*/
|
|
294
|
+
test("writes Probe for a walkable peer too", async () => {
|
|
295
|
+
const props: CapturedModalProps = await openDialog({
|
|
296
|
+
...PHONE_NODE,
|
|
297
|
+
role: "switch",
|
|
298
|
+
roleKey: "switch",
|
|
299
|
+
roleLabel: "Switch",
|
|
300
|
+
roleId: SWITCH_ROLE_ID,
|
|
301
|
+
isSnmpWalkableRole: true,
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
const device: NetworkDevice = await props.onBeforeCreate!(
|
|
305
|
+
new NetworkDevice(),
|
|
306
|
+
{},
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
expect(device.monitoringMethod).toBe("Probe");
|
|
260
310
|
});
|
|
261
311
|
|
|
262
312
|
/*
|
|
@@ -309,20 +359,22 @@ describe("the Add to Monitoring dialog", () => {
|
|
|
309
359
|
});
|
|
310
360
|
|
|
311
361
|
/*
|
|
312
|
-
* The probe is
|
|
313
|
-
*
|
|
314
|
-
*
|
|
362
|
+
* The probe is inherited for EVERY device. It used to be withheld from a
|
|
363
|
+
* leaf device, which opened on a monitor-backed branch with the probe
|
|
364
|
+
* field hidden; a phone is as probe-polled as a switch now, so the probe
|
|
365
|
+
* its neighbours agree on is the right head start for both. The phone
|
|
366
|
+
* fixture carries the handset's isSnmpWalkableRole: false, which is
|
|
367
|
+
* exactly the case the seed used to be withheld from.
|
|
315
368
|
*/
|
|
316
|
-
test("inherits a probe for a device
|
|
369
|
+
test("inherits a probe for a leaf device", async () => {
|
|
370
|
+
const props: CapturedModalProps = await openDialog();
|
|
371
|
+
|
|
372
|
+
expect(props.initialValues["probe"]).toBe("probe-a");
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
test("inherits a probe for a walkable device", async () => {
|
|
317
376
|
const props: CapturedModalProps = await openDialog({
|
|
318
377
|
...PHONE_NODE,
|
|
319
|
-
/*
|
|
320
|
-
* The whole role stamp, not just `role`: the configured
|
|
321
|
-
* isSnmpWalkableRole is what decides the monitoring method now, and the
|
|
322
|
-
* phone fixture carries the handset's (false). Overriding only the
|
|
323
|
-
* built-in role would leave the flag saying "nothing will poll this",
|
|
324
|
-
* which is the opposite of what this test is about.
|
|
325
|
-
*/
|
|
326
378
|
role: "switch",
|
|
327
379
|
roleKey: "switch",
|
|
328
380
|
roleLabel: "Switch",
|
|
@@ -330,14 +382,19 @@ describe("the Add to Monitoring dialog", () => {
|
|
|
330
382
|
isSnmpWalkableRole: true,
|
|
331
383
|
});
|
|
332
384
|
|
|
333
|
-
expect(props.initialValues["monitoringMethod"]).toBe("SNMP");
|
|
334
385
|
expect(props.initialValues["probe"]).toBe("probe-a");
|
|
335
386
|
});
|
|
336
387
|
|
|
337
|
-
|
|
388
|
+
/*
|
|
389
|
+
* Required for a phone exactly as for a switch: a probe-polled device with
|
|
390
|
+
* no probe is claimed by nothing and never polls, which is the "Pending
|
|
391
|
+
* forever" this flow exists to end. The server does not insist, so the
|
|
392
|
+
* form does.
|
|
393
|
+
*/
|
|
394
|
+
test("requires a probe for a leaf device", async () => {
|
|
338
395
|
const props: CapturedModalProps = await openDialog();
|
|
339
396
|
|
|
340
|
-
expect(props
|
|
397
|
+
expect(fieldFor(props, "probe")?.required).toBe(true);
|
|
341
398
|
});
|
|
342
399
|
|
|
343
400
|
/*
|
|
@@ -361,16 +418,16 @@ describe("the Add to Monitoring dialog", () => {
|
|
|
361
418
|
});
|
|
362
419
|
|
|
363
420
|
/*
|
|
364
|
-
*
|
|
365
|
-
*
|
|
366
|
-
*
|
|
367
|
-
*
|
|
368
|
-
*
|
|
421
|
+
* No Monitor binding field at all. The binding is the override for gear a
|
|
422
|
+
* probe cannot reach, chosen on a device's Settings page; a neighbour the
|
|
423
|
+
* probe just heard about from the switch beside it is, by construction,
|
|
424
|
+
* reachable — so the dialog does not offer a field whose only honest value
|
|
425
|
+
* here is "empty".
|
|
369
426
|
*/
|
|
370
|
-
test("
|
|
427
|
+
test("has no monitor binding field", async () => {
|
|
371
428
|
const props: CapturedModalProps = await openDialog();
|
|
372
429
|
|
|
373
|
-
expect(fieldFor(props, "monitor")
|
|
430
|
+
expect(fieldFor(props, "monitor")).toBeUndefined();
|
|
374
431
|
});
|
|
375
432
|
|
|
376
433
|
test("still demands the two things a device cannot exist without", async () => {
|
|
@@ -414,18 +471,62 @@ describe("the Add to Monitoring dialog", () => {
|
|
|
414
471
|
]);
|
|
415
472
|
});
|
|
416
473
|
|
|
417
|
-
test("walks the operator through
|
|
474
|
+
test("walks the operator through Device Details, Probe & Site and SNMP", async () => {
|
|
418
475
|
const props: CapturedModalProps = await openDialog();
|
|
419
476
|
|
|
420
477
|
expect(
|
|
421
478
|
props.formProps.steps.map((step: { id: string }) => {
|
|
422
479
|
return step.id;
|
|
423
480
|
}),
|
|
424
|
-
).toEqual([
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
481
|
+
).toEqual(["device-details", "probe-and-site", "snmp"]);
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
/*
|
|
485
|
+
* The SNMP step is walked through by every device, a phone included. It
|
|
486
|
+
* used to be hidden wholesale for a leaf device (nothing polled it, so
|
|
487
|
+
* nothing could use a credential); now the probe walks whatever it has
|
|
488
|
+
* credentials for, and leaving the step empty is the "ping only" answer.
|
|
489
|
+
*/
|
|
490
|
+
test("shows the SNMP step to a leaf device, unconditionally", async () => {
|
|
491
|
+
const props: CapturedModalProps = await openDialog();
|
|
492
|
+
|
|
493
|
+
const snmpStep: { id: string; showIf?: unknown } | undefined =
|
|
494
|
+
props.formProps.steps.find((step: { id: string }) => {
|
|
495
|
+
return step.id === "snmp";
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
expect(snmpStep).toBeDefined();
|
|
499
|
+
expect(snmpStep?.showIf).toBeUndefined();
|
|
500
|
+
expect(fieldFor(props, "snmpVersion")).toBeDefined();
|
|
501
|
+
expect(fieldFor(props, "snmpCommunityString")?.required).toBe(false);
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
/*
|
|
505
|
+
* Every step the wizard declares is claimed by a field, and every field
|
|
506
|
+
* names a declared step — the two silent failures NetworkFormStepsInvariants
|
|
507
|
+
* pins against the source, asserted here against the props the form is
|
|
508
|
+
* actually handed.
|
|
509
|
+
*/
|
|
510
|
+
test("every field lands on a step the wizard declares, and no step is empty", async () => {
|
|
511
|
+
const props: CapturedModalProps = await openDialog();
|
|
512
|
+
|
|
513
|
+
const declared: Array<string> = props.formProps.steps.map(
|
|
514
|
+
(step: { id: string }) => {
|
|
515
|
+
return step.id;
|
|
516
|
+
},
|
|
517
|
+
);
|
|
518
|
+
const used: Array<string> = props.formProps.fields.map(
|
|
519
|
+
(field: { stepId?: string | undefined }) => {
|
|
520
|
+
return field.stepId || "";
|
|
521
|
+
},
|
|
522
|
+
);
|
|
523
|
+
|
|
524
|
+
for (const stepId of used) {
|
|
525
|
+
expect(declared).toContain(stepId);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
for (const stepId of declared) {
|
|
529
|
+
expect(used).toContain(stepId);
|
|
530
|
+
}
|
|
430
531
|
});
|
|
431
532
|
});
|