@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
|
@@ -9,6 +9,7 @@ import DataSourceHttpFetch, {
|
|
|
9
9
|
DataSourceHttpRequest,
|
|
10
10
|
DataSourceHttpResponse,
|
|
11
11
|
} from "../../../../Server/Utils/DataSource/HttpFetch";
|
|
12
|
+
import OutboundUserAgent from "../../../../Server/Utils/OutboundUserAgent";
|
|
12
13
|
import { DataSourceConnectionSettings } from "../../../../Server/Utils/DataSource/Types";
|
|
13
14
|
import {
|
|
14
15
|
DATA_SOURCE_MAX_RESPONSE_SIZE_IN_BYTES,
|
|
@@ -367,14 +368,17 @@ describe("DataSourceHttpFetch.fetch - egress guard runs before axios", () => {
|
|
|
367
368
|
});
|
|
368
369
|
|
|
369
370
|
describe("DataSourceHttpFetch.fetch - headers and body encoding", () => {
|
|
370
|
-
test("passes request headers through to axios untouched", async () => {
|
|
371
|
+
test("passes request headers through to axios untouched, plus our User-Agent", async () => {
|
|
371
372
|
const headers: Dictionary<string> = {
|
|
372
373
|
"X-Api-Key": "secret-key",
|
|
373
374
|
Authorization: "Bearer token-123",
|
|
374
375
|
};
|
|
375
376
|
await DataSourceHttpFetch.fetch(makeRequest({ headers: headers }));
|
|
376
377
|
const config: AxiosRequestConfig = getAxiosConfig();
|
|
377
|
-
expect(config.headers).toEqual(
|
|
378
|
+
expect(config.headers).toEqual({
|
|
379
|
+
...headers,
|
|
380
|
+
"User-Agent": OutboundUserAgent.get(),
|
|
381
|
+
});
|
|
378
382
|
});
|
|
379
383
|
|
|
380
384
|
test("GET requests never send a body, even when one is provided", async () => {
|
|
@@ -439,6 +443,96 @@ describe("DataSourceHttpFetch.fetch - headers and body encoding", () => {
|
|
|
439
443
|
});
|
|
440
444
|
});
|
|
441
445
|
|
|
446
|
+
/*
|
|
447
|
+
* Regression cover for issue #3555: a bare `axios/<version>` User-Agent got
|
|
448
|
+
* every outbound request 403'd by the target's WAF before it reached the
|
|
449
|
+
* API. The transport now names the product on every request unless the
|
|
450
|
+
* caller deliberately set its own UA.
|
|
451
|
+
*/
|
|
452
|
+
describe("DataSourceHttpFetch.fetch - outbound User-Agent", () => {
|
|
453
|
+
function getSentHeaders(callIndex: number = 0): Dictionary<string> {
|
|
454
|
+
return getAxiosConfig(callIndex).headers as Dictionary<string>;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
test("sends a descriptive User-Agent when the caller set none", async () => {
|
|
458
|
+
await DataSourceHttpFetch.fetch(makeRequest());
|
|
459
|
+
expect(getSentHeaders()["User-Agent"]).toBe(OutboundUserAgent.get());
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
test("the User-Agent names OneUptime and is never axios' default", async () => {
|
|
463
|
+
await DataSourceHttpFetch.fetch(makeRequest());
|
|
464
|
+
const userAgent: string = getSentHeaders()["User-Agent"] as string;
|
|
465
|
+
|
|
466
|
+
expect(userAgent.startsWith("OneUptime")).toBe(true);
|
|
467
|
+
expect(userAgent).toContain("https://oneuptime.com");
|
|
468
|
+
expect(userAgent.toLowerCase()).not.toContain("axios");
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
test("axios is never left to pick the User-Agent itself — the header is always set", async () => {
|
|
472
|
+
await DataSourceHttpFetch.fetch(makeRequest({ headers: {} }));
|
|
473
|
+
await DataSourceHttpFetch.fetch(
|
|
474
|
+
makeRequest({ method: "POST", body: { q: "up" } }),
|
|
475
|
+
);
|
|
476
|
+
|
|
477
|
+
for (const callIndex of [0, 1]) {
|
|
478
|
+
const userAgent: string | undefined =
|
|
479
|
+
getSentHeaders(callIndex)["User-Agent"];
|
|
480
|
+
expect(typeof userAgent).toBe("string");
|
|
481
|
+
expect((userAgent as string).trim()).not.toBe("");
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
test("a caller's explicit User-Agent wins — a data source may demand its own", async () => {
|
|
486
|
+
await DataSourceHttpFetch.fetch(
|
|
487
|
+
makeRequest({
|
|
488
|
+
headers: { "User-Agent": "AcmeSOC/3.1 (soc@acme.example)" },
|
|
489
|
+
}),
|
|
490
|
+
);
|
|
491
|
+
expect(getSentHeaders()["User-Agent"]).toBe(
|
|
492
|
+
"AcmeSOC/3.1 (soc@acme.example)",
|
|
493
|
+
);
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
test("a caller's lowercase user-agent wins without a second casing being sent", async () => {
|
|
497
|
+
await DataSourceHttpFetch.fetch(
|
|
498
|
+
makeRequest({ headers: { "user-agent": "AcmeSOC/3.1" } }),
|
|
499
|
+
);
|
|
500
|
+
const headers: Dictionary<string> = getSentHeaders();
|
|
501
|
+
|
|
502
|
+
expect(headers["user-agent"]).toBe("AcmeSOC/3.1");
|
|
503
|
+
expect(headers["User-Agent"]).toBeUndefined();
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
test("a blank User-Agent is replaced rather than sent as-is", async () => {
|
|
507
|
+
await DataSourceHttpFetch.fetch(
|
|
508
|
+
makeRequest({ headers: { "User-Agent": " " } }),
|
|
509
|
+
);
|
|
510
|
+
expect(getSentHeaders()["User-Agent"]).toBe(OutboundUserAgent.get());
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
test("it rides alongside auth headers rather than displacing them", async () => {
|
|
514
|
+
const headers: Dictionary<string> = DataSourceHttpFetch.buildAuthHeaders({
|
|
515
|
+
dataSourceType: DataSourceType.RestApi,
|
|
516
|
+
url: "https://api.example.com",
|
|
517
|
+
apiToken: "tok-abc",
|
|
518
|
+
});
|
|
519
|
+
|
|
520
|
+
await DataSourceHttpFetch.fetch(makeRequest({ headers: headers }));
|
|
521
|
+
const sent: Dictionary<string> = getSentHeaders();
|
|
522
|
+
|
|
523
|
+
expect(sent["Authorization"]).toBe("Bearer tok-abc");
|
|
524
|
+
expect(sent["User-Agent"]).toBe(OutboundUserAgent.get());
|
|
525
|
+
});
|
|
526
|
+
|
|
527
|
+
test("the caller's header dictionary is not mutated — pagination reuses it", async () => {
|
|
528
|
+
const headers: Dictionary<string> = { Accept: "application/json" };
|
|
529
|
+
|
|
530
|
+
await DataSourceHttpFetch.fetch(makeRequest({ headers: headers }));
|
|
531
|
+
|
|
532
|
+
expect(headers).toEqual({ Accept: "application/json" });
|
|
533
|
+
});
|
|
534
|
+
});
|
|
535
|
+
|
|
442
536
|
describe("DataSourceHttpFetch.buildAuthHeaders", () => {
|
|
443
537
|
function makeSettings(
|
|
444
538
|
overrides?: Partial<DataSourceConnectionSettings>,
|
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MigrationFailureType,
|
|
3
|
+
recordMigrationFailure,
|
|
4
|
+
scrubMigrationErrorText,
|
|
5
|
+
} from "../../../../Server/Utils/Database/MigrationFailureLog";
|
|
6
|
+
import { DataSource } from "typeorm";
|
|
7
|
+
import { describe, expect, it } from "@jest/globals";
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* The migration-failure diagnostic log.
|
|
11
|
+
*
|
|
12
|
+
* This module exists so the admin health page can say WHY a migration is
|
|
13
|
+
* pending rather than only that it is behind, which means the free-form text of
|
|
14
|
+
* a database error gets persisted and then rendered back to an operator. Two
|
|
15
|
+
* properties carry the weight, and neither one announces itself when it breaks:
|
|
16
|
+
*
|
|
17
|
+
* 1. The text is scrubbed first. Connection errors echo the DSN they failed
|
|
18
|
+
* to dial - `postgres://oneuptime:<password>@host/db` - and a failing DDL
|
|
19
|
+
* quotes its literal defaults, so an unscrubbed error message parks the
|
|
20
|
+
* database password in a table and puts it on a web page. A regex that
|
|
21
|
+
* stops matching still produces a row, still renders, and reads exactly
|
|
22
|
+
* like a working one.
|
|
23
|
+
*
|
|
24
|
+
* 2. Nothing here ever throws. Every write is best-effort by design: it runs
|
|
25
|
+
* on the failure path of a boot or migrate Job, where the caller is
|
|
26
|
+
* already holding a real error. A diagnostic that escalated would mask the
|
|
27
|
+
* failure it was written to explain - and on a first rollout the
|
|
28
|
+
* "MigrationFailure" table does not exist yet, so the INSERT genuinely
|
|
29
|
+
* does fail on the run that most needs the original error to survive.
|
|
30
|
+
*
|
|
31
|
+
* The row is written with raw SQL against a caller-supplied DataSource, which
|
|
32
|
+
* is what lets the assertions below drive it with a stub instead of a database.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
// Mirrors the module's own bounds; a row must not be able to bloat the table.
|
|
36
|
+
const MAX_ERROR_MESSAGE_LENGTH: number = 10000;
|
|
37
|
+
const MAX_ERROR_STACK_LENGTH: number = 20000;
|
|
38
|
+
|
|
39
|
+
interface RecordedQuery {
|
|
40
|
+
sql: string;
|
|
41
|
+
parameters: Array<unknown>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* A DataSource stand-in that records what would have been executed. Only
|
|
46
|
+
* `query` is reached by the code under test, so the cast is narrow and the stub
|
|
47
|
+
* cannot silently absorb a call to some other member.
|
|
48
|
+
*/
|
|
49
|
+
function stubDataSource(recorded: Array<RecordedQuery>): DataSource {
|
|
50
|
+
return {
|
|
51
|
+
query: (sql: string, parameters: Array<unknown>): Promise<void> => {
|
|
52
|
+
recorded.push({ sql, parameters });
|
|
53
|
+
return Promise.resolve();
|
|
54
|
+
},
|
|
55
|
+
} as unknown as DataSource;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function throwingDataSource(error: Error): DataSource {
|
|
59
|
+
return {
|
|
60
|
+
query: (): Promise<void> => {
|
|
61
|
+
return Promise.reject(error);
|
|
62
|
+
},
|
|
63
|
+
} as unknown as DataSource;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Positional parameters of the INSERT, in the order the statement binds them.
|
|
67
|
+
const MESSAGE_PARAMETER: number = 2;
|
|
68
|
+
const STACK_PARAMETER: number = 3;
|
|
69
|
+
|
|
70
|
+
describe("scrubMigrationErrorText", () => {
|
|
71
|
+
describe("connection strings", () => {
|
|
72
|
+
it("masks the password in a DSN the error echoed back", () => {
|
|
73
|
+
expect(
|
|
74
|
+
scrubMigrationErrorText(
|
|
75
|
+
'could not connect to postgres://oneuptime:sup3r-s3cret@db:5432/oneuptime"',
|
|
76
|
+
),
|
|
77
|
+
).toBe(
|
|
78
|
+
'could not connect to postgres://oneuptime:***REDACTED***@db:5432/oneuptime"',
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("keeps the scheme and the username, which are what identify the failure", () => {
|
|
83
|
+
/*
|
|
84
|
+
* Redacting the whole DSN would be safe and useless: an operator reading
|
|
85
|
+
* the health page needs to know which host and which role could not
|
|
86
|
+
* connect. Only the password is a credential.
|
|
87
|
+
*/
|
|
88
|
+
const scrubbed: string = scrubMigrationErrorText(
|
|
89
|
+
"postgres://readonly:hunter2@primary.internal:5432/app",
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
expect(scrubbed).toContain("postgres://readonly:");
|
|
93
|
+
expect(scrubbed).toContain("@primary.internal:5432/app");
|
|
94
|
+
expect(scrubbed).not.toContain("hunter2");
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("masks every DSN in a message that names more than one", () => {
|
|
98
|
+
const scrubbed: string = scrubMigrationErrorText(
|
|
99
|
+
"failed over from postgres://a:first@one/db to postgres://b:second@two/db",
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
expect(scrubbed).not.toContain("first");
|
|
103
|
+
expect(scrubbed).not.toContain("second");
|
|
104
|
+
expect(scrubbed.match(/\*\*\*REDACTED\*\*\*/g)).toHaveLength(2);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("masks schemes other than postgres", () => {
|
|
108
|
+
// The same error text can carry a redis or amqp URL from a side effect.
|
|
109
|
+
for (const scheme of ["redis", "amqp", "mongodb+srv", "clickhouse"]) {
|
|
110
|
+
expect(
|
|
111
|
+
scrubMigrationErrorText(`${scheme}://user:leaked@host:1234/x`),
|
|
112
|
+
).not.toContain("leaked");
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("leaves a URL that carries no credentials untouched", () => {
|
|
117
|
+
const harmless: string = "see https://oneuptime.com/docs/migrations";
|
|
118
|
+
expect(scrubMigrationErrorText(harmless)).toBe(harmless);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
describe("keyword-introduced secrets", () => {
|
|
123
|
+
it.each([
|
|
124
|
+
["password", "password=letmein"],
|
|
125
|
+
["secret", "secret=letmein"],
|
|
126
|
+
["token", "token=letmein"],
|
|
127
|
+
["api_key", "api_key=letmein"],
|
|
128
|
+
["api-key", "api-key=letmein"],
|
|
129
|
+
["apikey", "apikey=letmein"],
|
|
130
|
+
["credential", "credential=letmein"],
|
|
131
|
+
["private_key", "private_key=letmein"],
|
|
132
|
+
["auth_token", "auth_token=letmein"],
|
|
133
|
+
["access_key", "access_key=letmein"],
|
|
134
|
+
])("masks a value introduced by %s", (_label: string, text: string) => {
|
|
135
|
+
const scrubbed: string = scrubMigrationErrorText(text);
|
|
136
|
+
|
|
137
|
+
expect(scrubbed).not.toContain("letmein");
|
|
138
|
+
expect(scrubbed).toContain("***REDACTED***");
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it("matches the keyword whatever its case", () => {
|
|
142
|
+
expect(scrubMigrationErrorText("PASSWORD=letmein")).not.toContain(
|
|
143
|
+
"letmein",
|
|
144
|
+
);
|
|
145
|
+
expect(scrubMigrationErrorText("Api_Key: letmein")).not.toContain(
|
|
146
|
+
"letmein",
|
|
147
|
+
);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("masks a single-quoted literal, as a failing DDL default would quote it", () => {
|
|
151
|
+
const scrubbed: string = scrubMigrationErrorText(
|
|
152
|
+
`ALTER TABLE "User" ADD "x" text DEFAULT password='p@ss word'`,
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
expect(scrubbed).not.toContain("p@ss word");
|
|
156
|
+
expect(scrubbed).toContain("***REDACTED***");
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it("masks a double-quoted literal", () => {
|
|
160
|
+
expect(scrubMigrationErrorText('token: "abc def"')).not.toContain(
|
|
161
|
+
"abc def",
|
|
162
|
+
);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it("keeps the keyword and separator so the message still reads", () => {
|
|
166
|
+
expect(scrubMigrationErrorText("password: letmein")).toBe(
|
|
167
|
+
"password: ***REDACTED***",
|
|
168
|
+
);
|
|
169
|
+
expect(scrubMigrationErrorText("password=letmein")).toBe(
|
|
170
|
+
"password=***REDACTED***",
|
|
171
|
+
);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it("stops at the delimiter rather than swallowing the rest of the message", () => {
|
|
175
|
+
/*
|
|
176
|
+
* The tail of a migration error is the part an operator acts on. A
|
|
177
|
+
* greedy match would redact the failure itself along with the secret.
|
|
178
|
+
*/
|
|
179
|
+
const scrubbed: string = scrubMigrationErrorText(
|
|
180
|
+
"connect failed (password=letmein, host=db) while running migration",
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
expect(scrubbed).not.toContain("letmein");
|
|
184
|
+
expect(scrubbed).toContain("host=db");
|
|
185
|
+
expect(scrubbed).toContain("while running migration");
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
describe("as a whole", () => {
|
|
190
|
+
it("scrubs a DSN and a keyword secret in the same message", () => {
|
|
191
|
+
const scrubbed: string = scrubMigrationErrorText(
|
|
192
|
+
"postgres://app:dsnpass@db/x rejected password=kwpass",
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
expect(scrubbed).not.toContain("dsnpass");
|
|
196
|
+
expect(scrubbed).not.toContain("kwpass");
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it("is idempotent, so text scrubbed twice is unchanged the second time", () => {
|
|
200
|
+
/*
|
|
201
|
+
* The message is scrubbed on the way into the row; anything that scrubs
|
|
202
|
+
* again on the way out must not mangle the redaction marker.
|
|
203
|
+
*/
|
|
204
|
+
const once: string = scrubMigrationErrorText(
|
|
205
|
+
"postgres://app:p@db/x and password=q",
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
expect(scrubMigrationErrorText(once)).toBe(once);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it("returns an empty string unchanged rather than throwing", () => {
|
|
212
|
+
expect(scrubMigrationErrorText("")).toBe("");
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it("leaves ordinary migration errors completely alone", () => {
|
|
216
|
+
const ordinary: string =
|
|
217
|
+
'relation "Monitor" already exists — column "name" of relation "User" does not exist';
|
|
218
|
+
|
|
219
|
+
expect(scrubMigrationErrorText(ordinary)).toBe(ordinary);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
describe("recordMigrationFailure", () => {
|
|
225
|
+
it("writes one row and reports that it did", async () => {
|
|
226
|
+
const recorded: Array<RecordedQuery> = [];
|
|
227
|
+
|
|
228
|
+
const wrote: boolean = await recordMigrationFailure(
|
|
229
|
+
stubDataSource(recorded),
|
|
230
|
+
{
|
|
231
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
232
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
233
|
+
error: new Error("relation already exists"),
|
|
234
|
+
},
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
expect(wrote).toBe(true);
|
|
238
|
+
expect(recorded).toHaveLength(1);
|
|
239
|
+
expect(recorded[0]!.sql).toContain('INSERT INTO "MigrationFailure"');
|
|
240
|
+
expect(recorded[0]!.parameters[0]).toBe("AddMonitorTable1790900000000");
|
|
241
|
+
expect(recorded[0]!.parameters[1]).toBe(
|
|
242
|
+
MigrationFailureType.PostgresSchema,
|
|
243
|
+
);
|
|
244
|
+
expect(recorded[0]!.parameters[MESSAGE_PARAMETER]).toBe(
|
|
245
|
+
"relation already exists",
|
|
246
|
+
);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it("records the runner the migration belongs to", async () => {
|
|
250
|
+
const recorded: Array<RecordedQuery> = [];
|
|
251
|
+
|
|
252
|
+
await recordMigrationFailure(stubDataSource(recorded), {
|
|
253
|
+
migrationName: "BackfillMonitorStatus",
|
|
254
|
+
migrationType: MigrationFailureType.DataMigration,
|
|
255
|
+
error: new Error("boom"),
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
expect(recorded[0]!.parameters[1]).toBe(MigrationFailureType.DataMigration);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
it("scrubs the credential out of the message before it is stored", async () => {
|
|
262
|
+
/*
|
|
263
|
+
* The row is read back by the admin health page, so an unscrubbed message
|
|
264
|
+
* is a password on a web page as well as one in a table.
|
|
265
|
+
*/
|
|
266
|
+
const recorded: Array<RecordedQuery> = [];
|
|
267
|
+
|
|
268
|
+
await recordMigrationFailure(stubDataSource(recorded), {
|
|
269
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
270
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
271
|
+
error: new Error(
|
|
272
|
+
"connect ECONNREFUSED postgres://oneuptime:sup3r-s3cret@db:5432/oneuptime",
|
|
273
|
+
),
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
const message: string = recorded[0]!.parameters[
|
|
277
|
+
MESSAGE_PARAMETER
|
|
278
|
+
] as string;
|
|
279
|
+
|
|
280
|
+
expect(message).not.toContain("sup3r-s3cret");
|
|
281
|
+
expect(message).toContain("***REDACTED***");
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it("scrubs the stack too, not only the message", async () => {
|
|
285
|
+
const recorded: Array<RecordedQuery> = [];
|
|
286
|
+
|
|
287
|
+
const error: Error = new Error("connect failed");
|
|
288
|
+
error.stack =
|
|
289
|
+
"Error: connect failed\n at dial (postgres://u:stackpw@db/x)";
|
|
290
|
+
|
|
291
|
+
await recordMigrationFailure(stubDataSource(recorded), {
|
|
292
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
293
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
294
|
+
error,
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
const stack: string = recorded[0]!.parameters[STACK_PARAMETER] as string;
|
|
298
|
+
|
|
299
|
+
expect(stack).not.toContain("stackpw");
|
|
300
|
+
expect(stack).toContain("***REDACTED***");
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it("stores a null stack when the error carries none", async () => {
|
|
304
|
+
const recorded: Array<RecordedQuery> = [];
|
|
305
|
+
|
|
306
|
+
await recordMigrationFailure(stubDataSource(recorded), {
|
|
307
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
308
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
309
|
+
// Not an Error, so there is no stack to take.
|
|
310
|
+
error: "a bare string rejection",
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
expect(recorded[0]!.parameters[STACK_PARAMETER]).toBeNull();
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
it("stringifies a rejection that is not an Error", async () => {
|
|
317
|
+
const recorded: Array<RecordedQuery> = [];
|
|
318
|
+
|
|
319
|
+
await recordMigrationFailure(stubDataSource(recorded), {
|
|
320
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
321
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
322
|
+
error: "a bare string rejection",
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
expect(recorded[0]!.parameters[MESSAGE_PARAMETER]).toBe(
|
|
326
|
+
"a bare string rejection",
|
|
327
|
+
);
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
it("falls back to the error name when the message is empty", async () => {
|
|
331
|
+
/*
|
|
332
|
+
* An empty message would render as a blank explanation on the health page,
|
|
333
|
+
* which reads as "no error" rather than "an error we cannot describe".
|
|
334
|
+
*/
|
|
335
|
+
const recorded: Array<RecordedQuery> = [];
|
|
336
|
+
|
|
337
|
+
const error: Error = new Error("");
|
|
338
|
+
error.name = "QueryFailedError";
|
|
339
|
+
|
|
340
|
+
await recordMigrationFailure(stubDataSource(recorded), {
|
|
341
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
342
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
343
|
+
error,
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
expect(recorded[0]!.parameters[MESSAGE_PARAMETER]).toBe("QueryFailedError");
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it("bounds the message so a pathological error cannot bloat the table", async () => {
|
|
350
|
+
const recorded: Array<RecordedQuery> = [];
|
|
351
|
+
|
|
352
|
+
await recordMigrationFailure(stubDataSource(recorded), {
|
|
353
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
354
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
355
|
+
error: new Error("x".repeat(MAX_ERROR_MESSAGE_LENGTH + 5000)),
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
expect((recorded[0]!.parameters[MESSAGE_PARAMETER] as string).length).toBe(
|
|
359
|
+
MAX_ERROR_MESSAGE_LENGTH,
|
|
360
|
+
);
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
it("bounds the stack as well", async () => {
|
|
364
|
+
const recorded: Array<RecordedQuery> = [];
|
|
365
|
+
|
|
366
|
+
const error: Error = new Error("boom");
|
|
367
|
+
error.stack = "y".repeat(MAX_ERROR_STACK_LENGTH + 5000);
|
|
368
|
+
|
|
369
|
+
await recordMigrationFailure(stubDataSource(recorded), {
|
|
370
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
371
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
372
|
+
error,
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
expect((recorded[0]!.parameters[STACK_PARAMETER] as string).length).toBe(
|
|
376
|
+
MAX_ERROR_STACK_LENGTH,
|
|
377
|
+
);
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
it("stamps the row with a version so an INSERT never relies on a column default", async () => {
|
|
381
|
+
const recorded: Array<RecordedQuery> = [];
|
|
382
|
+
|
|
383
|
+
await recordMigrationFailure(stubDataSource(recorded), {
|
|
384
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
385
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
386
|
+
error: new Error("boom"),
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
expect(recorded[0]!.sql).toContain('"attemptedAt"');
|
|
390
|
+
expect(recorded[0]!.sql).toContain('"hostName"');
|
|
391
|
+
expect(recorded[0]!.sql).toContain('"appVersion"');
|
|
392
|
+
// attemptedAt is bound, not defaulted, so the row is honest about when.
|
|
393
|
+
expect(recorded[0]!.parameters[4]).toBeInstanceOf(Date);
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
describe("when the write itself fails", () => {
|
|
397
|
+
/*
|
|
398
|
+
* The case this module was written for. On a first rollout the
|
|
399
|
+
* "MigrationFailure" table does not exist yet, so the very run that most
|
|
400
|
+
* needs the original migration error to survive is the run where this
|
|
401
|
+
* INSERT throws.
|
|
402
|
+
*/
|
|
403
|
+
it("swallows the error rather than masking the migration failure", async () => {
|
|
404
|
+
const failure: Promise<boolean> = recordMigrationFailure(
|
|
405
|
+
throwingDataSource(
|
|
406
|
+
new Error('relation "MigrationFailure" does not exist'),
|
|
407
|
+
),
|
|
408
|
+
{
|
|
409
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
410
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
411
|
+
error: new Error("the real migration error"),
|
|
412
|
+
},
|
|
413
|
+
);
|
|
414
|
+
|
|
415
|
+
await expect(failure).resolves.toBe(false);
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
it("reports false rather than a silent success", async () => {
|
|
419
|
+
/*
|
|
420
|
+
* The return value is how a caller can tell the diagnostic landed. A
|
|
421
|
+
* swallowed error that still returned true would make a lost row
|
|
422
|
+
* indistinguishable from a written one.
|
|
423
|
+
*/
|
|
424
|
+
const wrote: boolean = await recordMigrationFailure(
|
|
425
|
+
throwingDataSource(new Error("connection terminated")),
|
|
426
|
+
{
|
|
427
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
428
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
429
|
+
error: new Error("the real migration error"),
|
|
430
|
+
},
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
expect(wrote).toBe(false);
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
it("does not throw even when building the row would", async () => {
|
|
437
|
+
// A rejection whose String() throws — the ugliest input available.
|
|
438
|
+
const hostile: unknown = {
|
|
439
|
+
toString: (): string => {
|
|
440
|
+
throw new Error("cannot stringify");
|
|
441
|
+
},
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
const recorded: Array<RecordedQuery> = [];
|
|
445
|
+
|
|
446
|
+
await expect(
|
|
447
|
+
recordMigrationFailure(stubDataSource(recorded), {
|
|
448
|
+
migrationName: "AddMonitorTable1790900000000",
|
|
449
|
+
migrationType: MigrationFailureType.PostgresSchema,
|
|
450
|
+
error: hostile,
|
|
451
|
+
}),
|
|
452
|
+
).resolves.toBe(false);
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
describe("MigrationFailureType", () => {
|
|
458
|
+
it("stores each runner verbatim, since the value is persisted", () => {
|
|
459
|
+
/*
|
|
460
|
+
* These strings live in rows that outlive any deployment. Renaming one
|
|
461
|
+
* orphans every row already written under the old value.
|
|
462
|
+
*/
|
|
463
|
+
expect(MigrationFailureType.PostgresSchema).toBe("PostgresSchema");
|
|
464
|
+
expect(MigrationFailureType.DataMigration).toBe("DataMigration");
|
|
465
|
+
});
|
|
466
|
+
});
|