@oneuptime/common 12.0.33 → 13.0.0
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/RumSession.ts +117 -1
- package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
- package/Models/DatabaseModels/AlertCustomField.ts +77 -3
- package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
- package/Models/DatabaseModels/GlobalConfig.ts +12 -12
- package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
- package/Models/DatabaseModels/InventoryItem.ts +44 -1
- package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
- package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
- package/Models/DatabaseModels/NetworkDevice.ts +126 -0
- package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
- package/Models/DatabaseModels/RumApplication.ts +6 -6
- package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
- package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamMember.ts +0 -9
- package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamPermission.ts +3 -24
- package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
- package/Models/DatabaseModels/UserTelegram.ts +0 -4
- package/Scripts/benchmark-fanin-capacity.js +181 -0
- package/Server/API/TelemetryAPI.ts +1284 -164
- package/Server/API/UserNotificationSettingAPI.ts +55 -0
- package/Server/API/UserTelegramAPI.ts +48 -4
- package/Server/EnvironmentConfig.ts +82 -18
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Infrastructure/QueueWorker.ts +20 -14
- package/Server/Infrastructure/Redis.ts +8 -8
- package/Server/Infrastructure/Semaphore.ts +2 -0
- package/Server/Infrastructure/Status.ts +10 -4
- package/Server/Middleware/TelemetryIngest.ts +453 -7
- package/Server/Services/AccessTokenService.ts +1 -0
- package/Server/Services/AlertCustomFieldService.ts +98 -0
- package/Server/Services/AlertService.ts +37 -0
- package/Server/Services/ApiKeyPermissionService.ts +461 -29
- package/Server/Services/CustomFieldMappingService.ts +879 -0
- package/Server/Services/DatabaseService.ts +65 -13
- package/Server/Services/GlobalConfigService.ts +194 -0
- package/Server/Services/IncidentCustomFieldService.ts +98 -0
- package/Server/Services/IncidentService.ts +35 -0
- package/Server/Services/InventoryItemService.ts +31 -1
- package/Server/Services/MetricService.ts +194 -0
- package/Server/Services/MonitorService.ts +32 -0
- package/Server/Services/MonitorTemplateService.ts +140 -19
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +427 -66
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
- package/Server/Services/NetworkDeviceService.ts +69 -0
- package/Server/Services/ProjectService.ts +22 -0
- package/Server/Services/RoutineEmailSettingsService.ts +73 -0
- package/Server/Services/RumSessionReplayViewService.ts +104 -24
- package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
- package/Server/Services/ScheduledMaintenanceService.ts +32 -0
- package/Server/Services/TeamMemberService.ts +78 -0
- package/Server/Services/TeamPermissionService.ts +235 -3
- package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
- package/Server/Services/UserNotificationRuleService.ts +76 -25
- package/Server/Services/UserNotificationSettingService.ts +34 -6
- package/Server/Services/UserTelegramService.ts +326 -5
- package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
- package/Server/Types/Database/QueryHelper.ts +2 -0
- package/Server/Types/Database/QueryUtil.ts +56 -0
- package/Server/Types/Markdown.ts +93 -1
- package/Server/Utils/APIKey/AccessPermission.ts +5 -2
- package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
- package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
- package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +82 -17
- package/Server/Utils/DataSource/EgressGuard.ts +177 -8
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +67 -5
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +2 -2
- package/Server/Utils/FrontendEnvironment.ts +40 -0
- package/Server/Utils/LogRedaction.ts +20 -0
- package/Server/Utils/Logger.ts +11 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +394 -86
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
- package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +312 -52
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
- package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
- package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
- package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
- package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
- package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
- package/Server/Utils/SSRFProtection.ts +217 -10
- package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
- package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
- package/Server/Utils/StartServer.ts +2 -17
- package/Server/Utils/TelegramVerificationToken.ts +185 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +11 -1
- package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +83 -9
- package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
- package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
- package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
- package/Server/Utils/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +975 -95
- package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
- package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
- package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
- package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
- package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
- package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
- package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
- package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
- package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
- package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
- package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
- package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
- package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
- package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
- package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
- package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
- package/Tests/Models/InventoryItemStatus.test.ts +147 -0
- package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
- package/Tests/ResponsiveVisibility.test.ts +115 -0
- package/Tests/ResponsiveVisibility.ts +183 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +129 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
- package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
- package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
- package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
- package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
- package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
- package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +241 -0
- package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
- package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
- package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
- package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
- package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
- package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
- package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
- package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
- package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
- package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
- package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
- package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
- package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
- package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +178 -0
- package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
- package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1351 -74
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
- package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
- package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
- package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
- package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
- package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
- package/Tests/Server/Types/Markdown.test.ts +194 -1
- package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
- package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
- package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
- package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +214 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
- package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +2 -2
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +10 -3
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
- package/Tests/Server/Utils/EventLoop.test.ts +359 -0
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
- package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
- package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +590 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +659 -8
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
- package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
- package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
- package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
- package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
- package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
- package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
- package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
- package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +111 -8
- package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
- package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
- package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
- package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
- package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
- package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
- package/Tests/Types/JSONFunctions.test.ts +300 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
- package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
- package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
- package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
- package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
- package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
- package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
- package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
- package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
- package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
- package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
- package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
- package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
- package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
- package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
- package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
- package/Tests/Types/WebsiteRequest.test.ts +285 -3
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
- package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
- package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
- package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
- package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
- package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
- package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
- package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
- package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
- package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
- package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
- package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
- package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
- package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
- package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +133 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
- package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
- package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
- package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
- package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
- package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
- package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +719 -0
- package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
- package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
- package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
- package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
- package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
- package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
- package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
- package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
- package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
- package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
- package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +5 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -0
- package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
- package/Tests/Utils/API.test.ts +308 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
- package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
- package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
- package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
- package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
- package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
- package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
- package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
- package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
- package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
- package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
- package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
- package/Tests/Utils/ValueFormatter.test.ts +148 -0
- package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
- package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
- package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
- package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
- package/Types/Dashboard/DashboardVariable.ts +8 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/JSON.ts +4 -0
- package/Types/JSONFunctions.ts +205 -43
- package/Types/Monitor/CephAlertTemplates.ts +157 -195
- package/Types/Monitor/DockerAlertTemplates.ts +338 -128
- package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
- package/Types/Monitor/HostAlertTemplates.ts +302 -130
- package/Types/Monitor/IotAlertTemplates.ts +112 -104
- package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
- package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
- package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
- package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
- package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
- package/Types/Monitor/RumAlertTemplates.ts +46 -7
- package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
- package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
- package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
- package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
- package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
- package/Types/Rum/SessionReplay.ts +209 -0
- package/Types/Rum/SessionReplayApi.ts +722 -0
- package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
- package/Types/Rum/SessionReplayConsentMode.ts +11 -7
- package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
- package/Types/Rum/SessionReplayHealth.ts +238 -0
- package/Types/SerializableObjectDictionary.ts +4 -0
- package/Types/Telemetry/InventoryLiveness.ts +56 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
- package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
- package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
- package/Types/WebsiteRequest.ts +85 -3
- package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
- package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
- package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
- package/UI/Components/Charts/Line/LineChart.tsx +13 -2
- package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
- package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
- package/UI/Components/Charts/Utils/XAxis.ts +217 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +189 -46
- package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
- package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
- package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
- package/UI/Components/Header/Header.tsx +25 -9
- package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
- package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
- package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
- package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
- package/UI/Components/Icon/Icon.tsx +11 -0
- package/UI/Components/JSONTable/JSONTable.tsx +2 -2
- package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
- package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
- package/UI/Components/ModelTable/Column.ts +15 -0
- package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
- package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
- package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
- package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
- package/UI/Components/Table/CellClassName.ts +81 -0
- package/UI/Components/Table/TableRow.tsx +20 -14
- package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
- package/UI/Components/Table/Types/Column.ts +36 -0
- package/UI/Components/Tooltip/Tooltip.tsx +11 -1
- package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
- package/UI/Components/Workflow/NodePlacement.ts +57 -0
- package/UI/Components/Workflow/Workflow.tsx +47 -18
- package/UI/Config.ts +15 -33
- package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
- package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
- package/UI/Utils/Telemetry/Telemetry.ts +10 -8
- package/UI/esbuild-config.js +6 -0
- package/Utils/API.ts +129 -3
- package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
- package/Utils/Dashboard/LabelVariable.ts +152 -0
- package/Utils/Dashboard/VariableUrlState.ts +27 -5
- package/Utils/HTTPResponseBodyReader.ts +221 -0
- package/Utils/MetricUnitUtil.ts +34 -0
- package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
- package/Utils/Monitor/MetricValueFormatter.ts +342 -0
- package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
- package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
- package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
- package/Utils/Rum/ChunkMath.ts +106 -0
- package/Utils/Rum/SessionReplayHealth.ts +732 -0
- package/Utils/Rum/SessionReplayStringMap.ts +226 -0
- package/Utils/Schema/ModelSchema.ts +1 -0
- package/Utils/StatusPage/ResourceSearch.ts +290 -0
- package/Utils/Telemetry/OriginAllowList.ts +355 -0
- package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
- package/Utils/ValueFormatter.ts +35 -1
- package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
- package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
- package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js +34 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
- package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
- package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
- package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +769 -109
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
- package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
- package/build/dist/Server/API/UserTelegramAPI.js +28 -6
- package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +73 -14
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Infrastructure/Redis.js +8 -8
- package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Infrastructure/Status.js +10 -4
- package/build/dist/Server/Infrastructure/Status.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AccessTokenService.js +1 -0
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
- package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +34 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
- package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseService.js +58 -13
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +133 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +32 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +28 -1
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/MetricService.js +163 -0
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +29 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +116 -17
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +349 -64
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +22 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
- package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
- package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
- package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
- package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +62 -2
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamPermissionService.js +166 -3
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserTelegramService.js +257 -4
- package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +75 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
- package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +53 -18
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +54 -3
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +2 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
- package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
- package/build/dist/Server/Utils/LogRedaction.js +20 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +10 -0
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +323 -81
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +254 -48
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
- package/build/dist/Server/Utils/SSRFProtection.js +136 -9
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +3 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
- package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +9 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +70 -13
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
- package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
- package/build/dist/Types/CustomField/CustomFieldValueMapping.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
- package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/JSON.js +1 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +131 -37
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
- package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
- package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
- package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
- package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
- package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +117 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
- package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
- package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
- package/build/dist/Types/SerializableObjectDictionary.js +4 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
- package/build/dist/Types/WebsiteRequest.js +55 -3
- package/build/dist/Types/WebsiteRequest.js.map +1 -1
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +89 -8
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
- package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
- package/build/dist/UI/Components/Header/Header.js +2 -3
- package/build/dist/UI/Components/Header/Header.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
- package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +5 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
- package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
- package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
- package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
- package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
- package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
- package/build/dist/UI/Components/Table/CellClassName.js +55 -0
- package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
- package/build/dist/UI/Components/Table/TableRow.js +16 -13
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
- package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
- package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
- package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
- package/build/dist/UI/Config.js +10 -20
- package/build/dist/UI/Config.js.map +1 -1
- package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
- package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
- package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
- package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Utils/API.js +67 -5
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
- package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
- package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
- package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
- package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
- package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
- package/build/dist/Utils/MetricUnitUtil.js +26 -0
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
- package/build/dist/Utils/Rum/ChunkMath.js +76 -0
- package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
- package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
- package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
- package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
- package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
- package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
- package/build/dist/Utils/ValueFormatter.js +32 -1
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/jest.config.json +2 -0
- package/package.json +1 -1
- package/test-setup.sh +9 -9
- package/tsconfig.json +51 -11
|
@@ -21,6 +21,8 @@ import MonitorType from "../../Types/Monitor/MonitorType";
|
|
|
21
21
|
import {
|
|
22
22
|
AutoImportRuleRunResult,
|
|
23
23
|
MAX_MATCHED_IP_SAMPLE,
|
|
24
|
+
MAX_RUN_FAILURE_REASON_LENGTH,
|
|
25
|
+
MAX_RUN_FAILURE_REASONS,
|
|
24
26
|
} from "../../Types/NetworkAutomation/RuleRunResult";
|
|
25
27
|
import AutoImportRuleMatcher, {
|
|
26
28
|
AutoImportHostEvaluation,
|
|
@@ -31,6 +33,7 @@ import {
|
|
|
31
33
|
buildNetworkDeviceFromDiscoveredHost,
|
|
32
34
|
} from "../../Utils/NetworkDiscovery/DiscoveredDeviceBuilder";
|
|
33
35
|
import { normalizeDiscoveredHosts } from "../../Utils/NetworkDiscovery/DiscoveredHostUtil";
|
|
36
|
+
import { DISCOVERY_SCAN_IMPORTABLE_STATUSES } from "../../Utils/NetworkDiscovery/DiscoveryScanStatus";
|
|
34
37
|
import { NetworkDeviceMonitoringMethodUtil } from "../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
|
|
35
38
|
import NetworkDeviceMonitorTemplateUtil from "../../Utils/Monitor/NetworkDeviceMonitorTemplateUtil";
|
|
36
39
|
import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
|
|
@@ -41,7 +44,8 @@ import logger, { LogAttributes } from "../Utils/Logger";
|
|
|
41
44
|
|
|
42
45
|
/*
|
|
43
46
|
* The engine behind network device auto-import rules (issue #3378): reads a
|
|
44
|
-
*
|
|
47
|
+
* discovery scan's results — finished or still arriving from a running sweep,
|
|
48
|
+
* see DISCOVERY_SCAN_IMPORTABLE_STATUSES — asks the project's rules which hosts
|
|
45
49
|
* import, and creates the Network Devices the manual Review dialog would
|
|
46
50
|
* have — through the same builder, so a rule-imported host and a
|
|
47
51
|
* hand-imported host are the same device. Site assignment, owners and labels
|
|
@@ -116,6 +120,26 @@ export const MAX_MONITORS_PER_AUTO_IMPORT_RUN: number = 500;
|
|
|
116
120
|
// Scans one manual "Run Now" will read, oldest results last.
|
|
117
121
|
export const MAX_SCANS_PER_AUTO_IMPORT_RULE_RUN: number = 100;
|
|
118
122
|
|
|
123
|
+
/*
|
|
124
|
+
* How many monitor creates may fail IDENTICALLY, back to back with no success
|
|
125
|
+
* between them, before the run stops attempting any more.
|
|
126
|
+
*
|
|
127
|
+
* A monitor create fails for one of two kinds of reason. Per host — this
|
|
128
|
+
* device's name collides, this one raced another writer — where the next host
|
|
129
|
+
* is unaffected and trying it is right. Or systemic: the template's criteria
|
|
130
|
+
* name a monitor status that no longer exists, the plan's monitor limit is
|
|
131
|
+
* reached, the database is refusing writes. Those fail for the FIRST device
|
|
132
|
+
* and for all 500 after it, and the old engine could not tell the difference:
|
|
133
|
+
* it spent the whole per-run monitor budget re-proving one broken thing, then
|
|
134
|
+
* reported "Stopped at the run cap — run again to continue", which is an
|
|
135
|
+
* instruction to do it all again. That is OneUptime/oneuptime#3643.
|
|
136
|
+
*
|
|
137
|
+
* Ten consecutive failures carrying the SAME message, with no create
|
|
138
|
+
* succeeding in between, is not a run of bad luck. Any success resets it, so a
|
|
139
|
+
* genuinely per-host fault never trips this.
|
|
140
|
+
*/
|
|
141
|
+
export const MAX_CONSECUTIVE_MONITOR_CREATE_FAILURES: number = 10;
|
|
142
|
+
|
|
119
143
|
/*
|
|
120
144
|
* Results older than this are stamped processed WITHOUT importing. A late
|
|
121
145
|
* result can land on a reaper-Failed scan hours after its sweep ran (the
|
|
@@ -159,6 +183,28 @@ export interface ExistingMonitorProvisioningState {
|
|
|
159
183
|
autoProvisionedKeys: Set<string>;
|
|
160
184
|
manuallyMonitoredDeviceIds: Set<string>;
|
|
161
185
|
attemptedProvisioningKeys: Set<string>;
|
|
186
|
+
/*
|
|
187
|
+
* Monitor template ids this run has already proved it cannot resolve —
|
|
188
|
+
* deleted, moved to another project, or no longer of type Network Device.
|
|
189
|
+
* That is a property of the RULE, settled the first time a host needs the
|
|
190
|
+
* template, and re-deciding it per host costs one wasted monitor budget slot
|
|
191
|
+
* and one log line per device in the estate.
|
|
192
|
+
*/
|
|
193
|
+
unresolvableTemplateIds: Set<string>;
|
|
194
|
+
/*
|
|
195
|
+
* Consecutive monitor creates that failed with the same message and no
|
|
196
|
+
* success since — see MAX_CONSECUTIVE_MONITOR_CREATE_FAILURES.
|
|
197
|
+
*/
|
|
198
|
+
consecutiveCreateFailures: number;
|
|
199
|
+
lastCreateFailureReason: string;
|
|
200
|
+
/*
|
|
201
|
+
* Whether this run has EVER provisioned a monitor (or lost a race to
|
|
202
|
+
* somebody who did). One success is proof the create pipeline works, which
|
|
203
|
+
* is what disarms the systemic-failure guard for good.
|
|
204
|
+
*/
|
|
205
|
+
hasProvisionedAnyMonitor: boolean;
|
|
206
|
+
// Set once this run gives up on provisioning monitors at all.
|
|
207
|
+
isProvisioningHalted: boolean;
|
|
162
208
|
}
|
|
163
209
|
|
|
164
210
|
export type ExistingMonitorsByProjectId = Map<
|
|
@@ -182,24 +228,32 @@ export type ImportAttemptBudgetsByProjectId = Map<string, ImportAttemptBudget>;
|
|
|
182
228
|
|
|
183
229
|
class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
184
230
|
/**
|
|
185
|
-
* The automatic path: apply the project's enabled rules to one
|
|
186
|
-
*
|
|
231
|
+
* The automatic path: apply the project's enabled rules to one scan's
|
|
232
|
+
* stored results, then stamp the scan's autoImportProcessedAt marker.
|
|
233
|
+
*
|
|
234
|
+
* The scan may still be SWEEPING — see
|
|
235
|
+
* DISCOVERY_SCAN_IMPORTABLE_STATUSES. Its partial results are as real as
|
|
236
|
+
* a finished scan's (the probe found those hosts; it simply has more of the
|
|
237
|
+
* range to cover), and waiting for the whole sweep is what left 527
|
|
238
|
+
* discovered switches unimportable for a day in OneUptime issue #3599. The
|
|
239
|
+
* name is kept because it is the automatic path's identity across the
|
|
240
|
+
* worker, its tests and its logs.
|
|
187
241
|
*
|
|
188
242
|
* Returns null when there was nothing to do (scan gone, superseded,
|
|
189
243
|
* already processed, no import rules, or results too old) and the run's
|
|
190
244
|
* counters otherwise. Throws only on unexpected failures — the caller
|
|
191
245
|
* (the worker sweep) isolates those per scan.
|
|
192
246
|
*
|
|
193
|
-
* The marker protocol, and why every stamp is a compare-and-set on
|
|
194
|
-
*
|
|
195
|
-
* write that stores new results
|
|
196
|
-
* results now on the row have not been processed".
|
|
197
|
-
* while this pass is reading the old ones, the CAS
|
|
198
|
-
* stays NULL, and the next tick processes the new upload
|
|
199
|
-
* never retire results it did not see, and the jsonb
|
|
200
|
-
* clobber a newer host list. A truncated pass that
|
|
201
|
-
* stamps nothing on purpose: the NULL marker is what
|
|
202
|
-
* resume. (A truncated pass where every create FAILED stamps anyway — see
|
|
247
|
+
* The marker protocol, and why every stamp is a compare-and-set on the run
|
|
248
|
+
* state this pass read: the ingest endpoint clears the marker in the same
|
|
249
|
+
* write that stores new results — partial uploads included — so "marker is
|
|
250
|
+
* NULL" always means "the results now on the row have not been processed".
|
|
251
|
+
* If new results land while this pass is reading the old ones, the CAS
|
|
252
|
+
* misses, the marker stays NULL, and the next tick processes the new upload
|
|
253
|
+
* — the stamp can never retire results it did not see, and the jsonb
|
|
254
|
+
* write-back can never clobber a newer host list. A truncated pass that
|
|
255
|
+
* created something stamps nothing on purpose: the NULL marker is what
|
|
256
|
+
* makes the next tick resume. (A truncated pass where every create FAILED stamps anyway — see
|
|
203
257
|
* the zero-progress note at the stamp below.)
|
|
204
258
|
*/
|
|
205
259
|
@CaptureSpan()
|
|
@@ -213,19 +267,32 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
213
267
|
await NetworkDeviceDiscoveryScanService.findOneBy({
|
|
214
268
|
query: {
|
|
215
269
|
_id: data.scanId,
|
|
216
|
-
status:
|
|
270
|
+
status: QueryHelper.any(DISCOVERY_SCAN_IMPORTABLE_STATUSES),
|
|
217
271
|
},
|
|
218
272
|
select: {
|
|
219
273
|
_id: true,
|
|
220
274
|
projectId: true,
|
|
221
275
|
status: true,
|
|
222
276
|
completedAt: true,
|
|
277
|
+
/*
|
|
278
|
+
* The two counters a running scan's partial uploads move. They are
|
|
279
|
+
* not read for anything; they are the version token stampScan's
|
|
280
|
+
* compare-and-set uses to tell "the results I evaluated" from "the
|
|
281
|
+
* results that landed while I was evaluating".
|
|
282
|
+
*/
|
|
283
|
+
scannedHostCount: true,
|
|
284
|
+
respondedHostCount: true,
|
|
223
285
|
autoImportProcessedAt: true,
|
|
224
286
|
discoveredDevices: true,
|
|
225
287
|
...AUTO_IMPORT_SCAN_CREDENTIAL_SELECT,
|
|
226
288
|
},
|
|
227
289
|
props: {
|
|
228
290
|
isRoot: true,
|
|
291
|
+
/*
|
|
292
|
+
* Keep the stored payload for stampScan; the engine checks live
|
|
293
|
+
* inventory itself before evaluating these hosts.
|
|
294
|
+
*/
|
|
295
|
+
ignoreHooks: true,
|
|
229
296
|
},
|
|
230
297
|
});
|
|
231
298
|
|
|
@@ -538,11 +605,21 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
538
605
|
await NetworkDeviceDiscoveryScanService.findBy({
|
|
539
606
|
query: {
|
|
540
607
|
projectId: data.projectId,
|
|
541
|
-
|
|
608
|
+
/*
|
|
609
|
+
* A scan that is still sweeping counts too: its partial results are
|
|
610
|
+
* already on the row, and "Run Now found 25 hosts while 527 sat in
|
|
611
|
+
* the Devices list" was exactly the report (OneUptime issue #3599).
|
|
612
|
+
*/
|
|
613
|
+
status: QueryHelper.any(DISCOVERY_SCAN_IMPORTABLE_STATUSES),
|
|
542
614
|
},
|
|
543
615
|
select: {
|
|
544
616
|
_id: true,
|
|
545
617
|
},
|
|
618
|
+
/*
|
|
619
|
+
* Newest results first. An in-progress scan has no completedAt, and
|
|
620
|
+
* Postgres orders NULLs first under DESC — which is the right place
|
|
621
|
+
* for it: its results are the freshest the project has.
|
|
622
|
+
*/
|
|
546
623
|
sort: {
|
|
547
624
|
completedAt: SortOrder.Descending,
|
|
548
625
|
},
|
|
@@ -558,23 +635,28 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
558
635
|
scanStubs.pop();
|
|
559
636
|
}
|
|
560
637
|
|
|
561
|
-
for (
|
|
638
|
+
for (let index: number = 0; index < scanStubs.length; index++) {
|
|
639
|
+
const scanStub: NetworkDeviceDiscoveryScan = scanStubs[index]!;
|
|
562
640
|
const scan: NetworkDeviceDiscoveryScan | null =
|
|
563
641
|
await NetworkDeviceDiscoveryScanService.findOneBy({
|
|
564
642
|
query: {
|
|
565
643
|
_id: scanStub.id!,
|
|
566
644
|
projectId: data.projectId,
|
|
567
|
-
status:
|
|
645
|
+
status: QueryHelper.any(DISCOVERY_SCAN_IMPORTABLE_STATUSES),
|
|
568
646
|
},
|
|
569
647
|
select: {
|
|
570
648
|
_id: true,
|
|
571
649
|
projectId: true,
|
|
572
650
|
status: true,
|
|
573
651
|
completedAt: true,
|
|
652
|
+
// The version token stampScan's compare-and-set uses; see there.
|
|
653
|
+
scannedHostCount: true,
|
|
654
|
+
respondedHostCount: true,
|
|
574
655
|
discoveredDevices: true,
|
|
575
656
|
...AUTO_IMPORT_SCAN_CREDENTIAL_SELECT,
|
|
576
657
|
},
|
|
577
|
-
|
|
658
|
+
// Preserve the raw scan rows for the compare-and-set write-back.
|
|
659
|
+
props: { isRoot: true, ignoreHooks: true },
|
|
578
660
|
});
|
|
579
661
|
|
|
580
662
|
// Re-queued or deleted since the stub query — nothing to evaluate.
|
|
@@ -608,8 +690,15 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
608
690
|
});
|
|
609
691
|
}
|
|
610
692
|
|
|
611
|
-
|
|
693
|
+
/*
|
|
694
|
+
* The caps are shared across the whole run, dry or real. Stop OPENING
|
|
695
|
+
* further scans once they are spent — each one is a multi-megabyte
|
|
696
|
+
* jsonb read whose hosts this pass could not act on anyway — but say
|
|
697
|
+
* that scans were left unread, so the pending counters below are
|
|
698
|
+
* reported as a floor rather than as the estate's total.
|
|
699
|
+
*/
|
|
612
700
|
if (result.isTruncated) {
|
|
701
|
+
result.hasUnevaluatedScans = index < scanStubs.length - 1;
|
|
613
702
|
break;
|
|
614
703
|
}
|
|
615
704
|
|
|
@@ -647,18 +736,69 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
647
736
|
monitorsSkippedAlreadyExisting: 0,
|
|
648
737
|
monitorsSkippedUnsupportedHost: 0,
|
|
649
738
|
monitorsFailed: 0,
|
|
739
|
+
deviceFailureReasons: [],
|
|
740
|
+
monitorFailureReasons: [],
|
|
741
|
+
monitorProvisioningHalted: false,
|
|
650
742
|
isTruncated: false,
|
|
743
|
+
hostsPendingImport: 0,
|
|
744
|
+
monitorsPendingCreation: 0,
|
|
745
|
+
hasUnevaluatedScans: false,
|
|
651
746
|
hasMoreScans: false,
|
|
652
747
|
isDryRun: isDryRun,
|
|
653
748
|
matchedIpAddressSample: [],
|
|
654
749
|
};
|
|
655
750
|
}
|
|
656
751
|
|
|
752
|
+
/*
|
|
753
|
+
* Keep the reason a create failed, so the run can say WHY it created
|
|
754
|
+
* nothing instead of pointing at server logs the operator of a self-hosted
|
|
755
|
+
* install may not be able to read. Deduplicated (500 identical failures are
|
|
756
|
+
* one reason) and capped, in both count and length, because this string
|
|
757
|
+
* ends up in a modal.
|
|
758
|
+
*/
|
|
759
|
+
private recordFailureReason(reasons: Array<string>, error: unknown): void {
|
|
760
|
+
const message: string = this.describeError(error);
|
|
761
|
+
|
|
762
|
+
if (!message) {
|
|
763
|
+
return;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
const trimmed: string = message.substring(0, MAX_RUN_FAILURE_REASON_LENGTH);
|
|
767
|
+
|
|
768
|
+
if (reasons.includes(trimmed)) {
|
|
769
|
+
return;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
if (reasons.length >= MAX_RUN_FAILURE_REASONS) {
|
|
773
|
+
return;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
reasons.push(trimmed);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
/*
|
|
780
|
+
* The message an operator should see. Exception extends Error, so one arm
|
|
781
|
+
* covers both; anything else is stringified rather than dropped, because a
|
|
782
|
+
* thrown non-Error is exactly the case where the reason matters most.
|
|
783
|
+
*/
|
|
784
|
+
private describeError(error: unknown): string {
|
|
785
|
+
if (error instanceof Error) {
|
|
786
|
+
return (error.message || "").replace(/\s+/g, " ").trim();
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
return String(error).replace(/\s+/g, " ").trim();
|
|
790
|
+
}
|
|
791
|
+
|
|
657
792
|
private emptyExistingMonitorProvisioningState(): ExistingMonitorProvisioningState {
|
|
658
793
|
return {
|
|
659
794
|
autoProvisionedKeys: new Set(),
|
|
660
795
|
manuallyMonitoredDeviceIds: new Set(),
|
|
661
796
|
attemptedProvisioningKeys: new Set(),
|
|
797
|
+
unresolvableTemplateIds: new Set(),
|
|
798
|
+
consecutiveCreateFailures: 0,
|
|
799
|
+
lastCreateFailureReason: "",
|
|
800
|
+
hasProvisionedAnyMonitor: false,
|
|
801
|
+
isProvisioningHalted: false,
|
|
662
802
|
};
|
|
663
803
|
}
|
|
664
804
|
|
|
@@ -1077,6 +1217,18 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1077
1217
|
|
|
1078
1218
|
const createdIpAddresses: Array<string> = [];
|
|
1079
1219
|
|
|
1220
|
+
/*
|
|
1221
|
+
* What this pass counted as still-to-do, deduplicated.
|
|
1222
|
+
*
|
|
1223
|
+
* A stored result can list the same address twice (duplicate rows are
|
|
1224
|
+
* normal enough that normalisation preserves them and the import path
|
|
1225
|
+
* treats the second as already-registered), so counting rows rather than
|
|
1226
|
+
* distinct work would report a remainder larger than the work that
|
|
1227
|
+
* actually remains — in a number whose whole purpose is to be trusted.
|
|
1228
|
+
*/
|
|
1229
|
+
const pendingImportAddresses: Set<string> = new Set<string>();
|
|
1230
|
+
const pendingProvisioningKeys: Set<string> = new Set<string>();
|
|
1231
|
+
|
|
1080
1232
|
for (const host of hosts) {
|
|
1081
1233
|
/*
|
|
1082
1234
|
* The address becomes the device's varchar(100) hostname, on which
|
|
@@ -1149,22 +1301,13 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1149
1301
|
let deviceWasCreated: boolean = false;
|
|
1150
1302
|
|
|
1151
1303
|
/*
|
|
1152
|
-
*
|
|
1153
|
-
*
|
|
1154
|
-
*
|
|
1155
|
-
* duplicate rows and overlapping scans
|
|
1304
|
+
* Current inventory is authoritative. The stored isAlreadyRegistered
|
|
1305
|
+
* flag can outlive a deleted device and must not veto re-importing it.
|
|
1306
|
+
* The map also includes devices created during this run, keeping
|
|
1307
|
+
* duplicate rows and overlapping scans idempotent.
|
|
1156
1308
|
*/
|
|
1157
|
-
if (
|
|
1309
|
+
if (networkDevice) {
|
|
1158
1310
|
result.hostsSkippedAlreadyRegistered++;
|
|
1159
|
-
|
|
1160
|
-
/*
|
|
1161
|
-
* A stale scan can claim a deleted device is still registered. With
|
|
1162
|
-
* no live row there is neither a safe binding nor enough intent to
|
|
1163
|
-
* recreate it from old data, so preserve the established skip.
|
|
1164
|
-
*/
|
|
1165
|
-
if (!networkDevice) {
|
|
1166
|
-
continue;
|
|
1167
|
-
}
|
|
1168
1311
|
}
|
|
1169
1312
|
|
|
1170
1313
|
if (result.matchedIpAddressSample.length < MAX_MATCHED_IP_SAMPLE) {
|
|
@@ -1175,8 +1318,25 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1175
1318
|
|
|
1176
1319
|
if (!networkDevice) {
|
|
1177
1320
|
if (data.attempts.deviceCount >= MAX_DEVICES_PER_AUTO_IMPORT_RUN) {
|
|
1321
|
+
/*
|
|
1322
|
+
* Budget spent — stop WRITING, keep COUNTING. The rest of this
|
|
1323
|
+
* loop is pure matching over a jsonb array that is already in
|
|
1324
|
+
* memory against addresses primeExistingDevices already resolved,
|
|
1325
|
+
* so finishing the scan costs nothing the cap exists to prevent,
|
|
1326
|
+
* and it is the difference between "imported 500" and "imported
|
|
1327
|
+
* 500 of 909, 409 still to go". A run that stopped mid-count
|
|
1328
|
+
* reported the truncated numbers as if they were the estate,
|
|
1329
|
+
* which is what OneUptime issue #3642 experienced as the
|
|
1330
|
+
* remainder being silently dropped.
|
|
1331
|
+
*/
|
|
1178
1332
|
result.isTruncated = true;
|
|
1179
|
-
|
|
1333
|
+
|
|
1334
|
+
if (!pendingImportAddresses.has(host.ipAddress)) {
|
|
1335
|
+
pendingImportAddresses.add(host.ipAddress);
|
|
1336
|
+
result.hostsPendingImport++;
|
|
1337
|
+
}
|
|
1338
|
+
|
|
1339
|
+
continue;
|
|
1180
1340
|
}
|
|
1181
1341
|
|
|
1182
1342
|
if (data.isDryRun) {
|
|
@@ -1231,8 +1391,8 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1231
1391
|
continue;
|
|
1232
1392
|
}
|
|
1233
1393
|
|
|
1234
|
-
const
|
|
1235
|
-
{
|
|
1394
|
+
const monitorsLeftPending: Array<string> =
|
|
1395
|
+
await this.ensureMonitorsForDevice({
|
|
1236
1396
|
projectId: scan.projectId,
|
|
1237
1397
|
host: host,
|
|
1238
1398
|
networkDevice: networkDevice,
|
|
@@ -1242,18 +1402,45 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1242
1402
|
result: result,
|
|
1243
1403
|
attempts: data.attempts,
|
|
1244
1404
|
isDryRun: data.isDryRun,
|
|
1245
|
-
}
|
|
1246
|
-
);
|
|
1405
|
+
});
|
|
1247
1406
|
|
|
1248
|
-
|
|
1407
|
+
/*
|
|
1408
|
+
* Same protocol as the device cap above: the monitor budget stops the
|
|
1409
|
+
* creates, not the accounting. It also has its OWN cap, so an estate
|
|
1410
|
+
* that is fully imported but unmonitored — the shape of issue #3642 —
|
|
1411
|
+
* runs out of monitor budget with nothing pending on the device side,
|
|
1412
|
+
* and the operator needs to be told how many devices are still
|
|
1413
|
+
* waiting for a monitor.
|
|
1414
|
+
*/
|
|
1415
|
+
for (const templateId of monitorsLeftPending) {
|
|
1249
1416
|
result.isTruncated = true;
|
|
1250
|
-
|
|
1417
|
+
|
|
1418
|
+
const pendingKey: string =
|
|
1419
|
+
NetworkDeviceAutoImportRuleEngineServiceClass.monitorProvisioningKey(
|
|
1420
|
+
networkDevice.id!,
|
|
1421
|
+
templateId,
|
|
1422
|
+
);
|
|
1423
|
+
|
|
1424
|
+
if (!pendingProvisioningKeys.has(pendingKey)) {
|
|
1425
|
+
pendingProvisioningKeys.add(pendingKey);
|
|
1426
|
+
result.monitorsPendingCreation++;
|
|
1427
|
+
}
|
|
1251
1428
|
}
|
|
1252
1429
|
}
|
|
1253
1430
|
|
|
1254
1431
|
return createdIpAddresses;
|
|
1255
1432
|
}
|
|
1256
1433
|
|
|
1434
|
+
/*
|
|
1435
|
+
* Reconcile one device against the templates the matched rules selected.
|
|
1436
|
+
*
|
|
1437
|
+
* Returns the template ids the run's budget left UNATTEMPTED — empty when
|
|
1438
|
+
* every requested monitor was settled, whether created, failed, or skipped
|
|
1439
|
+
* because monitoring already existed. A non-empty answer is what makes the
|
|
1440
|
+
* run report itself truncated; the ids (rather than a bare count) are what
|
|
1441
|
+
* let the caller count one device's leftover work once, however many
|
|
1442
|
+
* duplicate rows the scan lists that host under.
|
|
1443
|
+
*/
|
|
1257
1444
|
private async ensureMonitorsForDevice(data: {
|
|
1258
1445
|
projectId: ObjectID;
|
|
1259
1446
|
host: DiscoveredNetworkDevice;
|
|
@@ -1264,7 +1451,7 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1264
1451
|
result: AutoImportRuleRunResult;
|
|
1265
1452
|
attempts: ImportAttemptBudget;
|
|
1266
1453
|
isDryRun: boolean;
|
|
1267
|
-
}): Promise<
|
|
1454
|
+
}): Promise<Array<string>> {
|
|
1268
1455
|
/*
|
|
1269
1456
|
* A Network Device monitor is fed by the device's polls, and nothing
|
|
1270
1457
|
* polls a monitor-backed device — its bound monitor's status IS its
|
|
@@ -1281,7 +1468,7 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1281
1468
|
)
|
|
1282
1469
|
) {
|
|
1283
1470
|
data.result.monitorsSkippedUnsupportedHost += data.templateIds.length;
|
|
1284
|
-
return
|
|
1471
|
+
return [];
|
|
1285
1472
|
}
|
|
1286
1473
|
|
|
1287
1474
|
if (!data.networkDevice.id) {
|
|
@@ -1290,7 +1477,7 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1290
1477
|
`Auto-import: cannot provision monitor(s) for ${data.host.ipAddress} because the Network Device has no id.`,
|
|
1291
1478
|
{ projectId: data.projectId.toString() } as LogAttributes,
|
|
1292
1479
|
);
|
|
1293
|
-
return
|
|
1480
|
+
return [];
|
|
1294
1481
|
}
|
|
1295
1482
|
|
|
1296
1483
|
const networkDeviceId: ObjectID = data.networkDevice.id;
|
|
@@ -1323,25 +1510,76 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1323
1510
|
}
|
|
1324
1511
|
|
|
1325
1512
|
if (pendingTemplateIds.length === 0) {
|
|
1326
|
-
return
|
|
1513
|
+
return [];
|
|
1327
1514
|
}
|
|
1328
1515
|
|
|
1516
|
+
/*
|
|
1517
|
+
* The project-wide snapshot already knows this device is monitored by
|
|
1518
|
+
* hand, and that answer outranks any failure below: a device nobody was
|
|
1519
|
+
* going to provision cannot be a monitor this run failed to create. Read
|
|
1520
|
+
* from memory, so it stays ahead of the systemic verdicts.
|
|
1521
|
+
*/
|
|
1329
1522
|
if (
|
|
1330
1523
|
data.existingMonitors.manuallyMonitoredDeviceIds.has(
|
|
1331
1524
|
networkDeviceIdString,
|
|
1332
1525
|
)
|
|
1333
1526
|
) {
|
|
1334
1527
|
data.result.monitorsSkippedAlreadyExisting += pendingTemplateIds.length;
|
|
1335
|
-
return
|
|
1528
|
+
return [];
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
/*
|
|
1532
|
+
* Everything below here costs the run something — a monitor budget slot, a
|
|
1533
|
+
* per-device search of the unindexed monitor step payload, a create round
|
|
1534
|
+
* trip. None of it is worth spending on work this run has already proved
|
|
1535
|
+
* cannot succeed, so the two systemic verdicts are settled next: a
|
|
1536
|
+
* template this run could not load, and a create pipeline that has failed
|
|
1537
|
+
* identically for every device it tried.
|
|
1538
|
+
*
|
|
1539
|
+
* Both still COUNT the monitors that are missing. "0 created, and here is
|
|
1540
|
+
* why" is the answer; quietly reporting fewer missing monitors than there
|
|
1541
|
+
* are would trade one confusing dialog for another.
|
|
1542
|
+
*/
|
|
1543
|
+
const resolvableTemplateIds: Array<string> = [];
|
|
1544
|
+
|
|
1545
|
+
for (const templateId of pendingTemplateIds) {
|
|
1546
|
+
if (
|
|
1547
|
+
!data.existingMonitors.isProvisioningHalted &&
|
|
1548
|
+
!data.existingMonitors.unresolvableTemplateIds.has(templateId)
|
|
1549
|
+
) {
|
|
1550
|
+
resolvableTemplateIds.push(templateId);
|
|
1551
|
+
continue;
|
|
1552
|
+
}
|
|
1553
|
+
|
|
1554
|
+
/*
|
|
1555
|
+
* Counted once and then settled. Marking the (device, template) key
|
|
1556
|
+
* attempted is what keeps a host carried by two overlapping scans in the
|
|
1557
|
+
* same run from being counted as two missing monitors — the same
|
|
1558
|
+
* bookkeeping a real attempt does, for the same reason.
|
|
1559
|
+
*/
|
|
1560
|
+
data.existingMonitors.attemptedProvisioningKeys.add(
|
|
1561
|
+
NetworkDeviceAutoImportRuleEngineServiceClass.monitorProvisioningKey(
|
|
1562
|
+
networkDeviceId,
|
|
1563
|
+
templateId,
|
|
1564
|
+
),
|
|
1565
|
+
);
|
|
1566
|
+
data.result.monitorsFailed++;
|
|
1567
|
+
data.result.monitorProvisioningHalted = true;
|
|
1568
|
+
}
|
|
1569
|
+
|
|
1570
|
+
if (resolvableTemplateIds.length === 0) {
|
|
1571
|
+
return [];
|
|
1336
1572
|
}
|
|
1337
1573
|
|
|
1338
1574
|
/*
|
|
1339
1575
|
* Do not run the unindexed JSON race-check after this run's monitor-work
|
|
1340
1576
|
* budget is already exhausted. The device remains unreconciled and the
|
|
1341
|
-
* truncated marker protocol brings it back on the next bounded pass
|
|
1577
|
+
* truncated marker protocol brings it back on the next bounded pass —
|
|
1578
|
+
* counted, so the operator is told how many devices are still waiting
|
|
1579
|
+
* rather than left to infer it from a total that stopped early.
|
|
1342
1580
|
*/
|
|
1343
1581
|
if (data.attempts.monitorCount >= MAX_MONITORS_PER_AUTO_IMPORT_RUN) {
|
|
1344
|
-
return
|
|
1582
|
+
return resolvableTemplateIds;
|
|
1345
1583
|
}
|
|
1346
1584
|
|
|
1347
1585
|
if (!data.isDryRun) {
|
|
@@ -1357,43 +1595,74 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1357
1595
|
networkDeviceIdString,
|
|
1358
1596
|
)
|
|
1359
1597
|
) {
|
|
1360
|
-
data.result.monitorsSkippedAlreadyExisting +=
|
|
1361
|
-
|
|
1598
|
+
data.result.monitorsSkippedAlreadyExisting +=
|
|
1599
|
+
resolvableTemplateIds.length;
|
|
1600
|
+
return [];
|
|
1362
1601
|
}
|
|
1363
1602
|
|
|
1364
|
-
for (
|
|
1603
|
+
for (let index: number = 0; index < resolvableTemplateIds.length; index++) {
|
|
1604
|
+
const templateId: string = resolvableTemplateIds[index]!;
|
|
1365
1605
|
const key: string =
|
|
1366
1606
|
NetworkDeviceAutoImportRuleEngineServiceClass.monitorProvisioningKey(
|
|
1367
1607
|
networkDeviceId,
|
|
1368
1608
|
templateId,
|
|
1369
1609
|
);
|
|
1370
1610
|
|
|
1611
|
+
/*
|
|
1612
|
+
* A create earlier in THIS device's loop can be the one that trips the
|
|
1613
|
+
* systemic verdict. The rest of its templates are then in exactly the
|
|
1614
|
+
* position of every device after it.
|
|
1615
|
+
*/
|
|
1616
|
+
if (data.existingMonitors.isProvisioningHalted) {
|
|
1617
|
+
data.existingMonitors.attemptedProvisioningKeys.add(key);
|
|
1618
|
+
data.result.monitorsFailed++;
|
|
1619
|
+
data.result.monitorProvisioningHalted = true;
|
|
1620
|
+
continue;
|
|
1621
|
+
}
|
|
1622
|
+
|
|
1371
1623
|
/* The race-check may have found this key after the initial snapshot. */
|
|
1372
1624
|
if (data.existingMonitors.autoProvisionedKeys.has(key)) {
|
|
1373
1625
|
data.result.monitorsSkippedAlreadyExisting++;
|
|
1374
1626
|
continue;
|
|
1375
1627
|
}
|
|
1376
1628
|
|
|
1629
|
+
/*
|
|
1630
|
+
* Budget spent mid-device. Everything from here on is untouched, so
|
|
1631
|
+
* that is exactly what is left pending for this device.
|
|
1632
|
+
*/
|
|
1377
1633
|
if (data.attempts.monitorCount >= MAX_MONITORS_PER_AUTO_IMPORT_RUN) {
|
|
1378
|
-
return
|
|
1634
|
+
return resolvableTemplateIds.slice(index);
|
|
1379
1635
|
}
|
|
1380
1636
|
|
|
1381
1637
|
data.attempts.monitorCount++;
|
|
1382
1638
|
data.existingMonitors.attemptedProvisioningKeys.add(key);
|
|
1383
1639
|
|
|
1384
1640
|
/*
|
|
1385
|
-
*
|
|
1386
|
-
*
|
|
1387
|
-
*
|
|
1388
|
-
*
|
|
1641
|
+
* A template the run could not load is a fault in the RULE, not in this
|
|
1642
|
+
* host: the rule points at a template that has been deleted, moved to
|
|
1643
|
+
* another project, or changed to a different monitor type since the rule
|
|
1644
|
+
* was saved (the rule form validates all three, but only at save time).
|
|
1645
|
+
* It will be just as unloadable for every other device, so the verdict is
|
|
1646
|
+
* recorded once and every later host short-circuits above — instead of
|
|
1647
|
+
* spending the run's whole monitor budget re-proving it, which is what
|
|
1648
|
+
* turned this into "500 monitors failed, stopped at the run cap, run
|
|
1649
|
+
* again to continue" in issue #3643.
|
|
1389
1650
|
*/
|
|
1390
1651
|
const template: MonitorTemplate | undefined =
|
|
1391
1652
|
data.monitorTemplates.get(templateId);
|
|
1392
1653
|
|
|
1393
1654
|
if (!template) {
|
|
1655
|
+
data.existingMonitors.unresolvableTemplateIds.add(templateId);
|
|
1394
1656
|
data.result.monitorsFailed++;
|
|
1657
|
+
data.result.monitorProvisioningHalted = true;
|
|
1658
|
+
this.recordFailureReason(
|
|
1659
|
+
data.result.monitorFailureReasons,
|
|
1660
|
+
new Error(
|
|
1661
|
+
"This rule's Monitor Template could not be loaded. It may have been deleted, moved to another project, or changed to a monitor type other than Network Device. Edit the rule and select a Network Device Monitor Template.",
|
|
1662
|
+
),
|
|
1663
|
+
);
|
|
1395
1664
|
logger.error(
|
|
1396
|
-
`Auto-import: Network Device monitor template ${templateId} is missing, deleted, or not valid for project ${data.projectId.toString()}.`,
|
|
1665
|
+
`Auto-import: Network Device monitor template ${templateId} is missing, deleted, or not valid for project ${data.projectId.toString()}. No monitors will be provisioned from it for the rest of this run.`,
|
|
1397
1666
|
{ projectId: data.projectId.toString() } as LogAttributes,
|
|
1398
1667
|
);
|
|
1399
1668
|
continue;
|
|
@@ -1421,6 +1690,7 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1421
1690
|
|
|
1422
1691
|
data.existingMonitors.autoProvisionedKeys.add(key);
|
|
1423
1692
|
data.result.monitorsCreated++;
|
|
1693
|
+
this.recordMonitorCreateSuccess(data.existingMonitors);
|
|
1424
1694
|
} catch (error) {
|
|
1425
1695
|
/*
|
|
1426
1696
|
* The partial unique index is the final race backstop. If another
|
|
@@ -1452,19 +1722,87 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1452
1722
|
|
|
1453
1723
|
if (data.existingMonitors.autoProvisionedKeys.has(key)) {
|
|
1454
1724
|
data.result.monitorsSkippedAlreadyExisting++;
|
|
1725
|
+
/*
|
|
1726
|
+
* Losing this race proves the create pipeline works — somebody
|
|
1727
|
+
* else just used it — so it is not evidence of a systemic fault.
|
|
1728
|
+
*/
|
|
1729
|
+
this.recordMonitorCreateSuccess(data.existingMonitors);
|
|
1455
1730
|
continue;
|
|
1456
1731
|
}
|
|
1457
1732
|
}
|
|
1458
1733
|
|
|
1459
1734
|
data.result.monitorsFailed++;
|
|
1735
|
+
this.recordFailureReason(data.result.monitorFailureReasons, error);
|
|
1460
1736
|
logger.error(
|
|
1461
1737
|
`Auto-import: could not create monitor from template ${templateId} for Network Device ${networkDeviceId.toString()} (${data.host.ipAddress}): ${error}`,
|
|
1462
1738
|
{ projectId: data.projectId.toString() } as LogAttributes,
|
|
1463
1739
|
);
|
|
1740
|
+
this.recordMonitorCreateFailure({
|
|
1741
|
+
state: data.existingMonitors,
|
|
1742
|
+
result: data.result,
|
|
1743
|
+
projectId: data.projectId,
|
|
1744
|
+
error: error,
|
|
1745
|
+
});
|
|
1464
1746
|
}
|
|
1465
1747
|
}
|
|
1466
1748
|
|
|
1467
|
-
return
|
|
1749
|
+
return [];
|
|
1750
|
+
}
|
|
1751
|
+
|
|
1752
|
+
/*
|
|
1753
|
+
* A create succeeded (or lost a race to another writer, which proves the
|
|
1754
|
+
* same thing): whatever the last failures were, they were not systemic, and
|
|
1755
|
+
* this run has now seen the create pipeline work at least once.
|
|
1756
|
+
*/
|
|
1757
|
+
private recordMonitorCreateSuccess(
|
|
1758
|
+
state: ExistingMonitorProvisioningState,
|
|
1759
|
+
): void {
|
|
1760
|
+
state.consecutiveCreateFailures = 0;
|
|
1761
|
+
state.lastCreateFailureReason = "";
|
|
1762
|
+
state.hasProvisionedAnyMonitor = true;
|
|
1763
|
+
}
|
|
1764
|
+
|
|
1765
|
+
/*
|
|
1766
|
+
* Decide whether one monitor create failure is this host's problem or the
|
|
1767
|
+
* whole run's. The bar is deliberately high, because giving up early on a
|
|
1768
|
+
* per-host fault would silently cost an estate its monitors — the failure
|
|
1769
|
+
* this fix exists to make visible. All three must hold: the run has never
|
|
1770
|
+
* created a monitor, the last MAX_CONSECUTIVE_MONITOR_CREATE_FAILURES
|
|
1771
|
+
* attempts all failed, and they all failed with the SAME message.
|
|
1772
|
+
*/
|
|
1773
|
+
private recordMonitorCreateFailure(data: {
|
|
1774
|
+
state: ExistingMonitorProvisioningState;
|
|
1775
|
+
result: AutoImportRuleRunResult;
|
|
1776
|
+
projectId: ObjectID;
|
|
1777
|
+
error: unknown;
|
|
1778
|
+
}): void {
|
|
1779
|
+
const reason: string = this.describeError(data.error);
|
|
1780
|
+
|
|
1781
|
+
if (reason && reason === data.state.lastCreateFailureReason) {
|
|
1782
|
+
data.state.consecutiveCreateFailures++;
|
|
1783
|
+
} else {
|
|
1784
|
+
data.state.lastCreateFailureReason = reason;
|
|
1785
|
+
data.state.consecutiveCreateFailures = 1;
|
|
1786
|
+
}
|
|
1787
|
+
|
|
1788
|
+
if (data.state.hasProvisionedAnyMonitor) {
|
|
1789
|
+
return;
|
|
1790
|
+
}
|
|
1791
|
+
|
|
1792
|
+
if (
|
|
1793
|
+
data.state.consecutiveCreateFailures <
|
|
1794
|
+
MAX_CONSECUTIVE_MONITOR_CREATE_FAILURES
|
|
1795
|
+
) {
|
|
1796
|
+
return;
|
|
1797
|
+
}
|
|
1798
|
+
|
|
1799
|
+
data.state.isProvisioningHalted = true;
|
|
1800
|
+
data.result.monitorProvisioningHalted = true;
|
|
1801
|
+
|
|
1802
|
+
logger.error(
|
|
1803
|
+
`Auto-import: ${MAX_CONSECUTIVE_MONITOR_CREATE_FAILURES} Network Device monitor creates failed identically for project ${data.projectId.toString()} with none succeeding ("${reason}"). Treating this as a systemic failure and provisioning no further monitors this run.`,
|
|
1804
|
+
{ projectId: data.projectId.toString() } as LogAttributes,
|
|
1805
|
+
);
|
|
1468
1806
|
}
|
|
1469
1807
|
|
|
1470
1808
|
/*
|
|
@@ -1549,6 +1887,7 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1549
1887
|
createdDevice = await attemptCreate(buildFallbackDeviceName(data.host));
|
|
1550
1888
|
} catch (secondError) {
|
|
1551
1889
|
data.result.devicesFailed++;
|
|
1890
|
+
this.recordFailureReason(data.result.deviceFailureReasons, secondError);
|
|
1552
1891
|
logger.error(
|
|
1553
1892
|
`Auto-import: could not create a device for ${data.host.ipAddress} (scan ${data.scan.id?.toString()}): ${firstError} / retry: ${secondError}`,
|
|
1554
1893
|
{ projectId: data.projectId.toString() } as LogAttributes,
|
|
@@ -1566,20 +1905,20 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1566
1905
|
/*
|
|
1567
1906
|
* The one write this engine makes to the scan row: retire the consumed
|
|
1568
1907
|
* hosts in the stored jsonb (so the Review dialog stops offering them) and
|
|
1569
|
-
* stamp the processed marker — in a single hook-free compare-and-set on
|
|
1570
|
-
*
|
|
1908
|
+
* stamp the processed marker — in a single hook-free compare-and-set on the
|
|
1909
|
+
* run state that was read, for the reasons on processCompletedScan. The
|
|
1571
1910
|
* claim endpoint's hook-free contract is why this must never go through
|
|
1572
1911
|
* updateOneById: the scan service deliberately has no update-success hooks
|
|
1573
1912
|
* to piggyback on, and this write must not fire the full pipeline on every
|
|
1574
1913
|
* worker tick.
|
|
1575
1914
|
*
|
|
1576
1915
|
* The CAS defends against exactly one concurrent writer — the ingest
|
|
1577
|
-
* endpoint, which rewrites completedAt with
|
|
1578
|
-
*
|
|
1579
|
-
*
|
|
1580
|
-
* holds the sweep lock (the worker for its
|
|
1581
|
-
* real run; dry runs never write), so the
|
|
1582
|
-
* has the row's only engine writer. Weaken that invariant and this
|
|
1916
|
+
* endpoint, which rewrites completedAt with a final upload and the host
|
|
1917
|
+
* counters with a partial one. It cannot defend against another ENGINE
|
|
1918
|
+
* write (which changes none of those columns), and does not need to: every
|
|
1919
|
+
* path that reaches this method holds the sweep lock (the worker for its
|
|
1920
|
+
* whole sweep, Run Now for a real run; dry runs never write), so the
|
|
1921
|
+
* full-array replace below always has the row's only engine writer. Weaken that invariant and this
|
|
1583
1922
|
* becomes last-writer-wins on the isAlreadyRegistered flips.
|
|
1584
1923
|
*/
|
|
1585
1924
|
private async stampScan(data: {
|
|
@@ -1632,8 +1971,30 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1632
1971
|
// Cast: the model's JSON column makes DeepPartial recursion blow up.
|
|
1633
1972
|
data: payload as unknown as QueryDeepPartialEntity<NetworkDeviceDiscoveryScan>,
|
|
1634
1973
|
expectedData: {
|
|
1635
|
-
|
|
1974
|
+
/*
|
|
1975
|
+
* The scan's own status, not the literal "Completed" this used to
|
|
1976
|
+
* pin. A scan that is still sweeping is importable now (issue
|
|
1977
|
+
* #3599), and its status is exactly the thing that changes when its
|
|
1978
|
+
* run ends — so reading it off the row keeps the guard doing what it
|
|
1979
|
+
* always did rather than making an In Progress stamp always miss.
|
|
1980
|
+
*/
|
|
1981
|
+
status: data.scan.status ?? null,
|
|
1636
1982
|
completedAt: data.scan.completedAt || null,
|
|
1983
|
+
/*
|
|
1984
|
+
* The counters a running scan's partial uploads move, so a partial
|
|
1985
|
+
* landing between the read and this write is caught the way a
|
|
1986
|
+
* completion is: the stamp misses, the marker stays NULL, and the
|
|
1987
|
+
* next tick processes the newer host list.
|
|
1988
|
+
*
|
|
1989
|
+
* Not a perfect version token for an in-progress scan — the
|
|
1990
|
+
* ICMP-filtered fallback pass finds hosts without advancing
|
|
1991
|
+
* scannedHostCount, so two partials can carry both counts unchanged.
|
|
1992
|
+
* The consequence is bounded and self-healing: one batch of hosts
|
|
1993
|
+
* waits for the next partial upload (which clears the marker again),
|
|
1994
|
+
* and the run's final result clears it unconditionally.
|
|
1995
|
+
*/
|
|
1996
|
+
scannedHostCount: data.scan.scannedHostCount ?? null,
|
|
1997
|
+
respondedHostCount: data.scan.respondedHostCount ?? null,
|
|
1637
1998
|
} as unknown as QueryDeepPartialEntity<NetworkDeviceDiscoveryScan>,
|
|
1638
1999
|
});
|
|
1639
2000
|
}
|