@oneuptime/common 12.0.31 → 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/AlertState.ts +0 -2
- package/Models/DatabaseModels/Domain.ts +1 -1
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/Incident.ts +1 -1
- package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
- package/Models/DatabaseModels/Index.ts +12 -0
- package/Models/DatabaseModels/MetricType.ts +0 -2
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
- package/Models/DatabaseModels/MonitorTest.ts +0 -2
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +297 -3
- package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +3 -1
- package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
- package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
- package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
- package/Models/DatabaseModels/StatusPageResource.ts +0 -2
- package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
- 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/1790800000000-AddNetworkDeviceRoleTable.ts +72 -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 +14 -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/DatabaseService.ts +39 -9
- package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/Index.ts +12 -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/NetworkDeviceRoleService.ts +90 -0
- 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 +186 -44
- 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 -31
- 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 +158 -27
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -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/MonitorTemplateColumnAndFacet.test.tsx +318 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
- 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 +626 -0
- 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/SideMenuHarness.tsx +11 -3
- 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/DatabaseModels/ModelRegistryInvariants.test.ts +115 -41
- 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/NetworkDeviceRoleTableMigration.test.ts +476 -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/DatabaseServiceGenerateSlug.test.ts +215 -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/NetworkDeviceRoleModel.test.ts +672 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
- 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/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -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/UserNotificationSettingMonitorDefaults.test.ts +248 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +145 -3
- 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/BasicCron.test.ts +283 -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/IncomingCallPhoneNumber.test.ts +174 -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/DefaultNetworkDeviceRole.test.ts +417 -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/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
- package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
- package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/SideMenuItem.test.tsx +256 -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/UI/Utils/TableColumnsToCsv.test.ts +30 -0
- package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
- package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -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/NetworkDeviceRoleCatalog.test.ts +981 -0
- package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -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/DeviceRoleKeyUtil.test.ts +538 -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/Slo/SloEvaluation.test.ts +171 -0
- package/Tests/Utils/Slug.test.ts +61 -1
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
- package/Tests/jest.setup.ts +19 -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/SnmpMonitor/NetworkTopology.ts +61 -0
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -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 +135 -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/Charts/Area/AreaChart.tsx +7 -0
- package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +97 -35
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +14 -0
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +97 -35
- package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
- package/UI/Components/Charts/Line/LineChart.tsx +7 -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/ModelTable/BaseModelTable.tsx +50 -15
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/Navbar/NavBar.tsx +62 -13
- package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
- package/UI/Components/SideMenu/SideMenu.tsx +135 -7
- package/UI/Components/SideMenu/SideMenuItem.tsx +80 -85
- package/UI/Components/SideMenu/SideMenuSection.tsx +69 -25
- 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/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
- package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -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/NetworkDeviceRoleCatalog.ts +232 -0
- package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +139 -36
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
- 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/Utils/Rules/RulePatternMatchUtil.ts +1 -1
- package/Utils/Slug.ts +34 -1
- package/build/dist/Models/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
- package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Domain.js +1 -1
- package/build/dist/Models/DatabaseModels/Domain.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/Incident.js +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +12 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
- package/build/dist/Models/DatabaseModels/MetricType.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/MonitorStatusTimeline.js +0 -2
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
- package/build/dist/Models/DatabaseModels/MonitorTest.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 +304 -4
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +3 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
- 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/ScheduledMaintenance.js +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
- 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/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.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 +14 -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/DatabaseService.js +31 -5
- package/build/dist/Server/Services/DatabaseService.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 +12 -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/NetworkDeviceRoleService.js +70 -0
- package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
- 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 +131 -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 -21
- 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/DefaultNetworkDeviceRole.js +105 -0
- package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.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 +120 -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/Charts/Area/AreaChart.js +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +79 -31
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +7 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +79 -31
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- 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/ModelTable/BaseModelTable.js +39 -13
- package/build/dist/UI/Components/ModelTable/BaseModelTable.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/Navbar/NavBar.js +44 -9
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.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/CountModelSideMenuItem.js +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +76 -11
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +50 -54
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +32 -9
- 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/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
- package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
- 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/NetworkDeviceRoleCatalog.js +126 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +75 -35
- 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/DeviceRoleKeyUtil.js +114 -0
- package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
- 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/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
- package/build/dist/Utils/Slug.js +31 -1
- package/build/dist/Utils/Slug.js.map +1 -1
- package/package.json +2 -2
|
@@ -93,6 +93,41 @@ export interface BuildPingMonitorData {
|
|
|
93
93
|
seedIds: MonitorCriteriaSeedIds;
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
+
/**
|
|
97
|
+
* Where a Ping monitor is being built FROM. The sentence it writes into the
|
|
98
|
+
* monitor's description is the only thing that differs, and it matters: an
|
|
99
|
+
* operator reading the monitor list months later should be told whether a
|
|
100
|
+
* scan, a form, or a bulk action put it there.
|
|
101
|
+
*/
|
|
102
|
+
export enum PingMonitorOrigin {
|
|
103
|
+
// A host that answered a discovery sweep's ping but not its SNMP probe.
|
|
104
|
+
DiscoveryImport = "DiscoveryImport",
|
|
105
|
+
// The device create form, with "create a Ping monitor" ticked.
|
|
106
|
+
DeviceCreateForm = "DeviceCreateForm",
|
|
107
|
+
// The "Create Ping Monitor" button on a device's Overview or Monitors page.
|
|
108
|
+
DevicePage = "DevicePage",
|
|
109
|
+
// The device list's bulk "Create Ping Monitors" action.
|
|
110
|
+
BulkAction = "BulkAction",
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface BuildPingMonitorForAddressData {
|
|
114
|
+
projectId: ObjectID;
|
|
115
|
+
/*
|
|
116
|
+
* The device's address as recorded on the device — an IP or a hostname.
|
|
117
|
+
* NetworkDevice.hostname is free text and required, so this is never empty
|
|
118
|
+
* for a real device; it is still validated because the bulk action and the
|
|
119
|
+
* create form both hand over whatever the operator typed.
|
|
120
|
+
*/
|
|
121
|
+
address: string;
|
|
122
|
+
/*
|
|
123
|
+
* The name of the NetworkDevice this monitor will be bound to, so the two
|
|
124
|
+
* read as a pair in a monitor list that also contains unrelated monitors.
|
|
125
|
+
*/
|
|
126
|
+
deviceName: string;
|
|
127
|
+
seedIds: MonitorCriteriaSeedIds;
|
|
128
|
+
origin: PingMonitorOrigin;
|
|
129
|
+
}
|
|
130
|
+
|
|
96
131
|
/**
|
|
97
132
|
* The monitor's name: "Ping <device name>", clamped to the column.
|
|
98
133
|
*
|
|
@@ -157,24 +192,54 @@ function suppressIncidentCreation(step: MonitorStep): void {
|
|
|
157
192
|
}
|
|
158
193
|
|
|
159
194
|
/**
|
|
160
|
-
*
|
|
161
|
-
*
|
|
195
|
+
* The sentence a provisioned monitor carries so its origin is legible later.
|
|
196
|
+
* Exported so the surfaces that build one can be tested against the exact
|
|
197
|
+
* wording rather than a paraphrase.
|
|
198
|
+
*/
|
|
199
|
+
export function buildPingMonitorDescription(data: {
|
|
200
|
+
address: string;
|
|
201
|
+
origin: PingMonitorOrigin;
|
|
202
|
+
}): string {
|
|
203
|
+
const reachability: string = `Reachability for ${data.address}`;
|
|
204
|
+
|
|
205
|
+
switch (data.origin) {
|
|
206
|
+
case PingMonitorOrigin.DiscoveryImport:
|
|
207
|
+
return `${reachability}, created when this device was imported from a network discovery scan. The device answered ping but not SNMP, so this monitor is what reports whether it is up.`;
|
|
208
|
+
case PingMonitorOrigin.DeviceCreateForm:
|
|
209
|
+
return `${reachability}, created with this network device. The device is monitor-backed — nothing polls it over SNMP — so this monitor is what reports whether it is up.`;
|
|
210
|
+
case PingMonitorOrigin.BulkAction:
|
|
211
|
+
return `${reachability}, created by the device list's "Create Ping Monitors" action. The device is monitor-backed — nothing polls it over SNMP — so this monitor is what reports whether it is up.`;
|
|
212
|
+
case PingMonitorOrigin.DevicePage:
|
|
213
|
+
default:
|
|
214
|
+
return `${reachability}, created from this network device's page. The device is monitor-backed — nothing polls it over SNMP — so this monitor is what reports whether it is up.`;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* One device address -> the Ping monitor that will report the device's
|
|
220
|
+
* health once bound to it through `NetworkDevice.monitorId`.
|
|
162
221
|
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
222
|
+
* This is the shape every provisioning surface shares: discovery import, the
|
|
223
|
+
* device create form, the "Create Ping Monitor" button on a device's page and
|
|
224
|
+
* the bulk action on the device list. They differ only in where the address
|
|
225
|
+
* and the name come from and in the origin sentence; the monitor itself —
|
|
226
|
+
* type, interval, criteria, incident suppression — is identical, which is
|
|
227
|
+
* what lets an operator treat every provisioned monitor the same way.
|
|
228
|
+
*
|
|
229
|
+
* Order of operations is the caller's: discovery creates the monitor FIRST
|
|
230
|
+
* and then the device carrying its id (so the create-time stamp resolves the
|
|
231
|
+
* pill immediately), while the create form and the bulk action create or
|
|
232
|
+
* already have the device and bind afterwards — which re-stamps through
|
|
233
|
+
* `NetworkDeviceService.onUpdateSuccess`, so the pill resolves just the same.
|
|
169
234
|
*/
|
|
170
|
-
export function
|
|
171
|
-
data:
|
|
235
|
+
export function buildPingMonitorForAddress(
|
|
236
|
+
data: BuildPingMonitorForAddressData,
|
|
172
237
|
): Monitor {
|
|
173
|
-
const address: string = (data.
|
|
238
|
+
const address: string = (data.address || "").trim();
|
|
174
239
|
|
|
175
240
|
if (!address) {
|
|
176
241
|
throw new Error(
|
|
177
|
-
"A
|
|
242
|
+
"A device needs an address before a Ping monitor can be built for it.",
|
|
178
243
|
);
|
|
179
244
|
}
|
|
180
245
|
|
|
@@ -182,7 +247,10 @@ export function buildPingMonitorForDiscoveredHost(
|
|
|
182
247
|
|
|
183
248
|
monitor.projectId = new ObjectID(data.projectId.toString());
|
|
184
249
|
monitor.name = buildPingMonitorName(data.deviceName);
|
|
185
|
-
monitor.description =
|
|
250
|
+
monitor.description = buildPingMonitorDescription({
|
|
251
|
+
address: address,
|
|
252
|
+
origin: data.origin,
|
|
253
|
+
});
|
|
186
254
|
monitor.monitorType = MonitorType.Ping;
|
|
187
255
|
monitor.monitoringInterval = PING_MONITOR_INTERVAL;
|
|
188
256
|
|
|
@@ -213,3 +281,37 @@ export function buildPingMonitorForDiscoveredHost(
|
|
|
213
281
|
|
|
214
282
|
return monitor;
|
|
215
283
|
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* One ping-only discovered host -> the Ping monitor that will report its
|
|
287
|
+
* health once bound to the device through `NetworkDevice.monitorId`.
|
|
288
|
+
*
|
|
289
|
+
* The caller creates this monitor FIRST, then creates the device carrying the
|
|
290
|
+
* new monitor's id: `NetworkDeviceService.onCreateSuccess` stamps the
|
|
291
|
+
* monitor's current status onto the device at bind time, so the device's
|
|
292
|
+
* status pill resolves on the first render rather than waiting for the
|
|
293
|
+
* monitor's next status CHANGE (which on a healthy network may never come —
|
|
294
|
+
* that was OneUptime/oneuptime#3392).
|
|
295
|
+
*
|
|
296
|
+
* A thin adapter over `buildPingMonitorForAddress`: the only thing a
|
|
297
|
+
* discovered host contributes is its address.
|
|
298
|
+
*/
|
|
299
|
+
export function buildPingMonitorForDiscoveredHost(
|
|
300
|
+
data: BuildPingMonitorData,
|
|
301
|
+
): Monitor {
|
|
302
|
+
const address: string = (data.host?.ipAddress || "").trim();
|
|
303
|
+
|
|
304
|
+
if (!address) {
|
|
305
|
+
throw new Error(
|
|
306
|
+
"A discovered host needs an address before a Ping monitor can be built for it.",
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return buildPingMonitorForAddress({
|
|
311
|
+
projectId: data.projectId,
|
|
312
|
+
address: address,
|
|
313
|
+
deviceName: data.deviceName,
|
|
314
|
+
seedIds: data.seedIds,
|
|
315
|
+
origin: PingMonitorOrigin.DiscoveryImport,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import DeviceReachabilityUtil, {
|
|
2
2
|
NetworkDeviceReachability,
|
|
3
3
|
} from "../NetworkDevice/DeviceReachabilityUtil";
|
|
4
|
+
import { NetworkDeviceMonitoringMethodUtil } from "../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
|
|
4
5
|
import SiteHealthRollupPolicy, {
|
|
5
6
|
DefaultSiteOfflineThresholdPercent,
|
|
6
7
|
} from "../../Types/NetworkSite/SiteHealthRollupPolicy";
|
|
@@ -25,14 +26,26 @@ import SiteHealthRollupPolicy, {
|
|
|
25
26
|
*
|
|
26
27
|
* Both policies agree on which devices get a vote at all: a device that has
|
|
27
28
|
* never reported anything is not evidence of an outage and is skipped by
|
|
28
|
-
* each of them.
|
|
29
|
+
* each of them. And both agree on what a device's vote IS: for a
|
|
30
|
+
* monitor-backed device the stamped MonitorStatus, for a probe-polled one
|
|
31
|
+
* the outcome of its last poll — the stamp on a probe-polled device is
|
|
32
|
+
* informational (see the field docs), the same precedence the device list
|
|
33
|
+
* pill, the site card and the map apply.
|
|
29
34
|
*/
|
|
30
35
|
|
|
31
36
|
// One device's health inputs, denormalized by the rollup engine.
|
|
32
37
|
export interface DeviceHealthState {
|
|
33
38
|
/*
|
|
34
39
|
* The MonitorStatus stamped by the monitor bridge (string form). When set
|
|
35
|
-
* together with its priority, it is the
|
|
40
|
+
* together with its priority ON A MONITOR-BACKED DEVICE, it is the
|
|
41
|
+
* device's authoritative status.
|
|
42
|
+
*
|
|
43
|
+
* A probe-polled device can carry one too — a Network Device monitor
|
|
44
|
+
* watching its walk stamps it, and an "interface down → Offline" criterion
|
|
45
|
+
* will stamp Offline on a switch that answers every ping. Its health
|
|
46
|
+
* source is the poll (`isReachable`, which is what its own pill reads), so
|
|
47
|
+
* the stamp is ignored here for it, or one dark port would turn a site of
|
|
48
|
+
* answering devices offline while every row under it reads Up.
|
|
36
49
|
*/
|
|
37
50
|
currentMonitorStatusId?: string | null | undefined;
|
|
38
51
|
// Priority of that status row; missing when the row no longer exists.
|
|
@@ -50,16 +63,32 @@ export interface DeviceHealthState {
|
|
|
50
63
|
*/
|
|
51
64
|
monitorStatusIsOperational?: boolean | null | undefined;
|
|
52
65
|
/*
|
|
53
|
-
* The
|
|
54
|
-
* DeviceReachabilityUtil rule: the OUTCOME of the last poll,
|
|
55
|
-
* of the last success. Rolling a site up from
|
|
56
|
-
* turned "the probe is behind on a 900-device
|
|
57
|
-
* over devices that were all answering.
|
|
66
|
+
* The poll verdict for probe-polled devices, resolved by the shared
|
|
67
|
+
* DeviceReachabilityUtil rule: the OUTCOME of the last poll (ping, or the
|
|
68
|
+
* SNMP walk), not the age of the last success. Rolling a site up from
|
|
69
|
+
* freshness alone is what turned "the probe is behind on a 900-device
|
|
70
|
+
* fleet" into a red site card over devices that were all answering.
|
|
58
71
|
*/
|
|
59
72
|
isReachable?: boolean | null | undefined;
|
|
60
73
|
lastPolledAt?: Date | null | undefined;
|
|
61
74
|
lastSeenAt?: Date | null | undefined;
|
|
62
75
|
pollingIntervalInMinutes?: number | null | undefined;
|
|
76
|
+
/*
|
|
77
|
+
* How this device's health is established. NULL, empty and anything
|
|
78
|
+
* unrecognised read as Probe — see NetworkDeviceMonitoringMethodUtil.parse,
|
|
79
|
+
* which is why an omitted value keeps every existing caller on the poll
|
|
80
|
+
* rule unchanged.
|
|
81
|
+
*
|
|
82
|
+
* Load-bearing twice. It decides whether the stamped status above is the
|
|
83
|
+
* device's vote at all (only for a monitor-backed device). And a
|
|
84
|
+
* monitor-backed device (monitoringMethod "Monitor") that has no stamp
|
|
85
|
+
* yet — or whose stamped row could not be resolved — has poll columns
|
|
86
|
+
* that mean nothing (NULL, or the last thing a probe found before it
|
|
87
|
+
* stopped asking). The shared rule reads it as Pending and both policies
|
|
88
|
+
* skip it, exactly as they skip a never-polled probe device, rather than
|
|
89
|
+
* letting a months-old lastSeenAt cast a vote against the site.
|
|
90
|
+
*/
|
|
91
|
+
monitoringMethod?: string | null | undefined;
|
|
63
92
|
/*
|
|
64
93
|
* How many real devices this entry stands for.
|
|
65
94
|
*
|
|
@@ -118,13 +147,13 @@ export class SiteStatusRollupUtil {
|
|
|
118
147
|
* operational/offline rows) - the caller treats null as "leave the site's
|
|
119
148
|
* status untouched".
|
|
120
149
|
*
|
|
121
|
-
* Per device: a stamped monitor status (with a
|
|
122
|
-
* otherwise the device's
|
|
123
|
-
* isOperationalState row and Down to its
|
|
124
|
-
* that has never been polled contributes
|
|
125
|
-
* evidence of an outage, and counting it as
|
|
126
|
-
* for as long as it took the first
|
|
127
|
-
* first contributor (stable).
|
|
150
|
+
* Per device: on a monitor-backed device a stamped monitor status (with a
|
|
151
|
+
* known priority) is the vote; otherwise the device's poll reachability
|
|
152
|
+
* maps Up to the project's isOperationalState row and Down to its
|
|
153
|
+
* isOfflineState row. A device that has never been polled contributes
|
|
154
|
+
* nothing at all - it is not evidence of an outage, and counting it as
|
|
155
|
+
* one used to pin a site red for as long as it took the first poll to
|
|
156
|
+
* land. Priority ties keep the first contributor (stable).
|
|
128
157
|
*/
|
|
129
158
|
public static worstStatus(data: {
|
|
130
159
|
deviceStates: Array<DeviceHealthState>;
|
|
@@ -148,6 +177,7 @@ export class SiteStatusRollupUtil {
|
|
|
148
177
|
let candidate: RollupStatusOption | null = null;
|
|
149
178
|
|
|
150
179
|
if (
|
|
180
|
+
SiteStatusRollupUtil.isStampAuthoritative(device) &&
|
|
151
181
|
device.currentMonitorStatusId &&
|
|
152
182
|
typeof device.monitorStatusPriority === "number" &&
|
|
153
183
|
Number.isFinite(device.monitorStatusPriority)
|
|
@@ -200,12 +230,12 @@ export class SiteStatusRollupUtil {
|
|
|
200
230
|
* How the subtree splits between operational and not, in DEVICES rather
|
|
201
231
|
* than in buckets.
|
|
202
232
|
*
|
|
203
|
-
* A device counts as non-operational when its stamped
|
|
204
|
-
* the operational one
|
|
205
|
-
* reachability is Down. Never-reported devices are excluded from both
|
|
206
|
-
* numerator and the denominator, so a region half-way through its
|
|
207
|
-
* discovery walk is scored on the half that has answered rather
|
|
208
|
-
* marked down for the half that has not.
|
|
233
|
+
* A monitor-backed device counts as non-operational when its stamped
|
|
234
|
+
* MonitorStatus is not the operational one; a probe-polled device when its
|
|
235
|
+
* poll reachability is Down. Never-reported devices are excluded from both
|
|
236
|
+
* the numerator and the denominator, so a region half-way through its
|
|
237
|
+
* first discovery walk is scored on the half that has answered rather
|
|
238
|
+
* than marked down for the half that has not.
|
|
209
239
|
*/
|
|
210
240
|
public static deviceHealthShare(data: {
|
|
211
241
|
deviceStates: Array<DeviceHealthState>;
|
|
@@ -238,6 +268,7 @@ export class SiteStatusRollupUtil {
|
|
|
238
268
|
const count: number = SiteStatusRollupUtil.deviceCountOf(device);
|
|
239
269
|
|
|
240
270
|
if (
|
|
271
|
+
SiteStatusRollupUtil.isStampAuthoritative(device) &&
|
|
241
272
|
device.currentMonitorStatusId &&
|
|
242
273
|
typeof device.monitorStatusIsOperational === "boolean"
|
|
243
274
|
) {
|
|
@@ -415,6 +446,19 @@ export class SiteStatusRollupUtil {
|
|
|
415
446
|
return Math.floor(value);
|
|
416
447
|
}
|
|
417
448
|
|
|
449
|
+
/*
|
|
450
|
+
* Whether this device's stamped MonitorStatus is its vote — true only for
|
|
451
|
+
* a monitor-backed device. One gate for both policies, so the same fleet
|
|
452
|
+
* cannot read differently depending on which one a site uses; and the
|
|
453
|
+
* same gate DeviceHealthStateUtil and the topology map apply, so the site
|
|
454
|
+
* card, the map and this rollup describe one network.
|
|
455
|
+
*/
|
|
456
|
+
private static isStampAuthoritative(device: DeviceHealthState): boolean {
|
|
457
|
+
return NetworkDeviceMonitoringMethodUtil.isMonitorBacked(
|
|
458
|
+
device.monitoringMethod,
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
|
|
418
462
|
private static deviceCountOf(device: DeviceHealthState): number {
|
|
419
463
|
if (
|
|
420
464
|
typeof device.deviceCount !== "number" ||
|
|
@@ -436,6 +480,8 @@ export class SiteStatusRollupUtil {
|
|
|
436
480
|
lastPolledAt: device.lastPolledAt,
|
|
437
481
|
lastSeenAt: device.lastSeenAt,
|
|
438
482
|
pollingIntervalInMinutes: device.pollingIntervalInMinutes,
|
|
483
|
+
// See the field docs: decides whether the columns above mean anything.
|
|
484
|
+
monitoringMethod: device.monitoringMethod,
|
|
439
485
|
},
|
|
440
486
|
now,
|
|
441
487
|
);
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import NetworkSiteType from "../../Models/DatabaseModels/NetworkSiteType";
|
|
2
|
+
|
|
3
|
+
export interface NetworkSiteTypeHierarchyNode {
|
|
4
|
+
networkSiteType: NetworkSiteType;
|
|
5
|
+
depth: number;
|
|
6
|
+
children: Array<NetworkSiteTypeHierarchyNode>;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface NetworkSiteTypeHierarchyIndex {
|
|
10
|
+
byId: Map<string, NetworkSiteType>;
|
|
11
|
+
childrenByParentId: Map<string | null, Array<NetworkSiteType>>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
* Network site types describe the shape of a project's site tree. Keep the
|
|
16
|
+
* read-side helpers defensive: a direct database write or a partially applied
|
|
17
|
+
* migration can still leave an orphan or a cycle, and neither should make a
|
|
18
|
+
* settings page hang or hide a type from its operator.
|
|
19
|
+
*/
|
|
20
|
+
export default class NetworkSiteTypeHierarchyUtil {
|
|
21
|
+
public static getParentId(networkSiteType: NetworkSiteType): string | null {
|
|
22
|
+
const parentId: string | null =
|
|
23
|
+
networkSiteType.parentNetworkSiteTypeId?.toString() ||
|
|
24
|
+
networkSiteType.parentNetworkSiteType?.id?.toString() ||
|
|
25
|
+
null;
|
|
26
|
+
|
|
27
|
+
if (
|
|
28
|
+
parentId &&
|
|
29
|
+
parentId.toLowerCase() === networkSiteType.id?.toString().toLowerCase()
|
|
30
|
+
) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return parentId;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public static buildIndex(data: {
|
|
38
|
+
networkSiteTypes: Array<NetworkSiteType>;
|
|
39
|
+
}): NetworkSiteTypeHierarchyIndex {
|
|
40
|
+
const byId: Map<string, NetworkSiteType> = new Map<
|
|
41
|
+
string,
|
|
42
|
+
NetworkSiteType
|
|
43
|
+
>();
|
|
44
|
+
const childrenByParentId: Map<
|
|
45
|
+
string | null,
|
|
46
|
+
Array<NetworkSiteType>
|
|
47
|
+
> = new Map<string | null, Array<NetworkSiteType>>();
|
|
48
|
+
|
|
49
|
+
for (const networkSiteType of data.networkSiteTypes) {
|
|
50
|
+
const id: string | undefined = networkSiteType.id
|
|
51
|
+
?.toString()
|
|
52
|
+
.toLowerCase();
|
|
53
|
+
|
|
54
|
+
if (id) {
|
|
55
|
+
byId.set(id, networkSiteType);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const parentId: string | null = this.getParentId(networkSiteType);
|
|
59
|
+
const normalizedParentId: string | null = parentId
|
|
60
|
+
? parentId.toLowerCase()
|
|
61
|
+
: null;
|
|
62
|
+
const siblings: Array<NetworkSiteType> | undefined =
|
|
63
|
+
childrenByParentId.get(normalizedParentId);
|
|
64
|
+
|
|
65
|
+
if (siblings) {
|
|
66
|
+
siblings.push(networkSiteType);
|
|
67
|
+
} else {
|
|
68
|
+
childrenByParentId.set(normalizedParentId, [networkSiteType]);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
for (const siblings of childrenByParentId.values()) {
|
|
73
|
+
this.sortInPlace(siblings);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return { byId, childrenByParentId };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public static getAncestorNetworkSiteTypes(data: {
|
|
80
|
+
networkSiteType: NetworkSiteType;
|
|
81
|
+
networkSiteTypes: Array<NetworkSiteType>;
|
|
82
|
+
index?: NetworkSiteTypeHierarchyIndex | undefined;
|
|
83
|
+
}): Array<NetworkSiteType> {
|
|
84
|
+
const index: NetworkSiteTypeHierarchyIndex =
|
|
85
|
+
data.index || this.buildIndex(data);
|
|
86
|
+
const ancestors: Array<NetworkSiteType> = [];
|
|
87
|
+
const visited: Set<string> = new Set<string>();
|
|
88
|
+
|
|
89
|
+
const ownId: string | undefined = data.networkSiteType.id
|
|
90
|
+
?.toString()
|
|
91
|
+
.toLowerCase();
|
|
92
|
+
if (ownId) {
|
|
93
|
+
visited.add(ownId);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
let parentId: string | null = this.getParentId(data.networkSiteType);
|
|
97
|
+
|
|
98
|
+
while (parentId) {
|
|
99
|
+
const normalizedParentId: string = parentId.toLowerCase();
|
|
100
|
+
if (visited.has(normalizedParentId)) {
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const parent: NetworkSiteType | undefined =
|
|
105
|
+
index.byId.get(normalizedParentId);
|
|
106
|
+
if (!parent) {
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
ancestors.push(parent);
|
|
111
|
+
visited.add(normalizedParentId);
|
|
112
|
+
parentId = this.getParentId(parent);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return ancestors;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public static getDescendantNetworkSiteTypes(data: {
|
|
119
|
+
networkSiteType: NetworkSiteType;
|
|
120
|
+
networkSiteTypes: Array<NetworkSiteType>;
|
|
121
|
+
index?: NetworkSiteTypeHierarchyIndex | undefined;
|
|
122
|
+
}): Array<NetworkSiteType> {
|
|
123
|
+
const index: NetworkSiteTypeHierarchyIndex =
|
|
124
|
+
data.index || this.buildIndex(data);
|
|
125
|
+
const descendants: Array<NetworkSiteType> = [];
|
|
126
|
+
const visited: Set<string> = new Set<string>();
|
|
127
|
+
|
|
128
|
+
const ownId: string | undefined = data.networkSiteType.id
|
|
129
|
+
?.toString()
|
|
130
|
+
.toLowerCase();
|
|
131
|
+
if (ownId) {
|
|
132
|
+
visited.add(ownId);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
let frontier: Array<NetworkSiteType> = ownId
|
|
136
|
+
? [...(index.childrenByParentId.get(ownId) || [])]
|
|
137
|
+
: [];
|
|
138
|
+
|
|
139
|
+
while (frontier.length > 0) {
|
|
140
|
+
const nextFrontier: Array<NetworkSiteType> = [];
|
|
141
|
+
|
|
142
|
+
for (const networkSiteType of frontier) {
|
|
143
|
+
const id: string | undefined = networkSiteType.id
|
|
144
|
+
?.toString()
|
|
145
|
+
.toLowerCase();
|
|
146
|
+
|
|
147
|
+
if (!id || visited.has(id)) {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
visited.add(id);
|
|
152
|
+
descendants.push(networkSiteType);
|
|
153
|
+
nextFrontier.push(...(index.childrenByParentId.get(id) || []));
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
frontier = nextFrontier;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return descendants;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/*
|
|
163
|
+
* Parent picker candidates. A leaf/unit type cannot own child types, and a
|
|
164
|
+
* type cannot be placed under itself or anything already below it.
|
|
165
|
+
*/
|
|
166
|
+
public static getValidParentCandidates(data: {
|
|
167
|
+
networkSiteType: NetworkSiteType;
|
|
168
|
+
networkSiteTypes: Array<NetworkSiteType>;
|
|
169
|
+
index?: NetworkSiteTypeHierarchyIndex | undefined;
|
|
170
|
+
}): Array<NetworkSiteType> {
|
|
171
|
+
const index: NetworkSiteTypeHierarchyIndex =
|
|
172
|
+
data.index || this.buildIndex(data);
|
|
173
|
+
const excludedIds: Set<string> = new Set<string>();
|
|
174
|
+
const ownId: string | undefined = data.networkSiteType.id
|
|
175
|
+
?.toString()
|
|
176
|
+
.toLowerCase();
|
|
177
|
+
|
|
178
|
+
if (ownId) {
|
|
179
|
+
excludedIds.add(ownId);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
for (const descendant of this.getDescendantNetworkSiteTypes({
|
|
183
|
+
...data,
|
|
184
|
+
index,
|
|
185
|
+
})) {
|
|
186
|
+
const descendantId: string | undefined = descendant.id
|
|
187
|
+
?.toString()
|
|
188
|
+
.toLowerCase();
|
|
189
|
+
if (descendantId) {
|
|
190
|
+
excludedIds.add(descendantId);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return this.sort(
|
|
195
|
+
data.networkSiteTypes.filter((candidate: NetworkSiteType) => {
|
|
196
|
+
const candidateId: string | undefined = candidate.id
|
|
197
|
+
?.toString()
|
|
198
|
+
.toLowerCase();
|
|
199
|
+
return (
|
|
200
|
+
Boolean(candidateId) &&
|
|
201
|
+
!excludedIds.has(candidateId!) &&
|
|
202
|
+
candidate.isUnitLevel !== true
|
|
203
|
+
);
|
|
204
|
+
}),
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
public static getBreadcrumbLabel(data: {
|
|
209
|
+
networkSiteType: NetworkSiteType;
|
|
210
|
+
networkSiteTypes: Array<NetworkSiteType>;
|
|
211
|
+
separator?: string | undefined;
|
|
212
|
+
index?: NetworkSiteTypeHierarchyIndex | undefined;
|
|
213
|
+
}): string {
|
|
214
|
+
const ancestors: Array<NetworkSiteType> =
|
|
215
|
+
this.getAncestorNetworkSiteTypes(data).reverse();
|
|
216
|
+
|
|
217
|
+
return [...ancestors, data.networkSiteType]
|
|
218
|
+
.map((networkSiteType: NetworkSiteType) => {
|
|
219
|
+
return networkSiteType.name || "Unnamed Site Type";
|
|
220
|
+
})
|
|
221
|
+
.join(data.separator || " › ");
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
public static buildTree(data: {
|
|
225
|
+
networkSiteTypes: Array<NetworkSiteType>;
|
|
226
|
+
index?: NetworkSiteTypeHierarchyIndex | undefined;
|
|
227
|
+
}): Array<NetworkSiteTypeHierarchyNode> {
|
|
228
|
+
const index: NetworkSiteTypeHierarchyIndex =
|
|
229
|
+
data.index || this.buildIndex(data);
|
|
230
|
+
const visited: Set<string> = new Set<string>();
|
|
231
|
+
|
|
232
|
+
const buildNode: (
|
|
233
|
+
networkSiteType: NetworkSiteType,
|
|
234
|
+
depth: number,
|
|
235
|
+
) => NetworkSiteTypeHierarchyNode = (
|
|
236
|
+
networkSiteType: NetworkSiteType,
|
|
237
|
+
depth: number,
|
|
238
|
+
): NetworkSiteTypeHierarchyNode => {
|
|
239
|
+
const id: string | undefined = networkSiteType.id
|
|
240
|
+
?.toString()
|
|
241
|
+
.toLowerCase();
|
|
242
|
+
if (id) {
|
|
243
|
+
visited.add(id);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const children: Array<NetworkSiteTypeHierarchyNode> = id
|
|
247
|
+
? (index.childrenByParentId.get(id) || [])
|
|
248
|
+
.filter((child: NetworkSiteType) => {
|
|
249
|
+
const childId: string | undefined = child.id
|
|
250
|
+
?.toString()
|
|
251
|
+
.toLowerCase();
|
|
252
|
+
return Boolean(childId) && !visited.has(childId!);
|
|
253
|
+
})
|
|
254
|
+
.map((child: NetworkSiteType) => {
|
|
255
|
+
return buildNode(child, depth + 1);
|
|
256
|
+
})
|
|
257
|
+
: [];
|
|
258
|
+
|
|
259
|
+
return { networkSiteType, depth, children };
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
const roots: Array<NetworkSiteType> = this.sort(
|
|
263
|
+
data.networkSiteTypes.filter((networkSiteType: NetworkSiteType) => {
|
|
264
|
+
const parentId: string | null = this.getParentId(networkSiteType);
|
|
265
|
+
return !parentId || !index.byId.has(parentId.toLowerCase());
|
|
266
|
+
}),
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
const tree: Array<NetworkSiteTypeHierarchyNode> = roots.map(
|
|
270
|
+
(networkSiteType: NetworkSiteType) => {
|
|
271
|
+
return buildNode(networkSiteType, 0);
|
|
272
|
+
},
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
/*
|
|
276
|
+
* A component containing only a cycle has no natural root. Promote one
|
|
277
|
+
* member so all rows remain visible, and the visited set breaks the loop.
|
|
278
|
+
*/
|
|
279
|
+
for (const networkSiteType of this.sort(data.networkSiteTypes)) {
|
|
280
|
+
const id: string | undefined = networkSiteType.id
|
|
281
|
+
?.toString()
|
|
282
|
+
.toLowerCase();
|
|
283
|
+
if (!id || visited.has(id)) {
|
|
284
|
+
continue;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
tree.push(buildNode(networkSiteType, 0));
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return tree;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
private static sort(
|
|
294
|
+
networkSiteTypes: Array<NetworkSiteType>,
|
|
295
|
+
): Array<NetworkSiteType> {
|
|
296
|
+
const copy: Array<NetworkSiteType> = [...networkSiteTypes];
|
|
297
|
+
this.sortInPlace(copy);
|
|
298
|
+
return copy;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
private static sortInPlace(networkSiteTypes: Array<NetworkSiteType>): void {
|
|
302
|
+
networkSiteTypes.sort((a: NetworkSiteType, b: NetworkSiteType) => {
|
|
303
|
+
const aOrder: number = a.order ?? Number.MAX_SAFE_INTEGER;
|
|
304
|
+
const bOrder: number = b.order ?? Number.MAX_SAFE_INTEGER;
|
|
305
|
+
|
|
306
|
+
if (aOrder !== bOrder) {
|
|
307
|
+
return aOrder - bOrder;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return (a.name || "").localeCompare(b.name || "");
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* These fields are documented as case-insensitive regular expressions, but
|
|
6
6
|
* the sibling Network Site assignment rules take '*' wildcard globs and the
|
|
7
|
-
* two features sit next to each other under Network >
|
|
7
|
+
* two features sit next to each other under Network > Rules. A user who
|
|
8
8
|
* typed `*0664*` into a label rule got silence: `new RegExp("*0664*")` throws
|
|
9
9
|
* "Nothing to repeat", the rule engine swallowed the SyntaxError, and the
|
|
10
10
|
* rule matched nothing forever (OneUptime/oneuptime#2940).
|
package/Utils/Slug.ts
CHANGED
|
@@ -1,8 +1,30 @@
|
|
|
1
1
|
import Faker from "./Faker";
|
|
2
2
|
import slugify from "slugify";
|
|
3
3
|
|
|
4
|
+
/*
|
|
5
|
+
* The tail every slug carries: a dash plus ten random digits.
|
|
6
|
+
*
|
|
7
|
+
* It is what keeps two objects of the same name apart, so it is the half that
|
|
8
|
+
* survives when a slug has to be cut down to fit its column.
|
|
9
|
+
*/
|
|
10
|
+
export const SLUG_SUFFIX_LENGTH: number = 11;
|
|
11
|
+
|
|
4
12
|
export default class Slug {
|
|
5
|
-
|
|
13
|
+
/*
|
|
14
|
+
* `maxLength`, when given, is the width of the column the slug is about to
|
|
15
|
+
* be written to.
|
|
16
|
+
*
|
|
17
|
+
* It exists because the create path THROWS on an oversized value rather
|
|
18
|
+
* than truncating it (DatabaseService.checkMaxLengthOfFields), and a slug
|
|
19
|
+
* source is routinely wider than the slug column: Incident.title is
|
|
20
|
+
* varchar(500) against a varchar(100) slug. Without a ceiling, slugifying
|
|
21
|
+
* such a column turns a long title into a failed insert.
|
|
22
|
+
*
|
|
23
|
+
* Only the readable half is trimmed; the random tail is never touched. A
|
|
24
|
+
* `maxLength` narrower than SLUG_SUFFIX_LENGTH therefore cannot be honoured
|
|
25
|
+
* -- the tail wins -- but no column is anywhere near that narrow.
|
|
26
|
+
*/
|
|
27
|
+
public static getSlug(name: string | null, maxLength?: number): string {
|
|
6
28
|
if (name === null) {
|
|
7
29
|
name = Faker.generateName();
|
|
8
30
|
}
|
|
@@ -13,6 +35,17 @@ export default class Slug {
|
|
|
13
35
|
}
|
|
14
36
|
|
|
15
37
|
let slug: string = slugify(name, { remove: /[&*+~.,\\/()|'"!:@]+/g });
|
|
38
|
+
|
|
39
|
+
if (maxLength !== undefined) {
|
|
40
|
+
/*
|
|
41
|
+
* Cut to what the tail leaves, then drop any dash the cut left
|
|
42
|
+
* dangling so the result does not read as `something--0123456789`.
|
|
43
|
+
*/
|
|
44
|
+
slug = slug
|
|
45
|
+
.substring(0, Math.max(0, maxLength - SLUG_SUFFIX_LENGTH))
|
|
46
|
+
.replace(/-+$/, "");
|
|
47
|
+
}
|
|
48
|
+
|
|
16
49
|
slug = `${slug}-${Faker.getRandomNumbers(10).toString()}`;
|
|
17
50
|
slug = slug.toLowerCase();
|
|
18
51
|
|