@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
|
@@ -109,6 +109,25 @@ export interface TopologyDeviceInput {
|
|
|
109
109
|
* peer advertises about itself.
|
|
110
110
|
*/
|
|
111
111
|
macAddresses?: Array<string> | undefined;
|
|
112
|
+
/*
|
|
113
|
+
* The device's OWN MAC, as declared by an operator or learned from a
|
|
114
|
+
* router's ARP table (NetworkDevice.macAddress). Distinct from the
|
|
115
|
+
* interface MACs above, which a walk reports and only a walked device
|
|
116
|
+
* has: this one exists precisely for the device nothing walks. It is a
|
|
117
|
+
* match key twice over - for an LLDP chassis id like the interface MACs,
|
|
118
|
+
* and for the endpoint inventory, where a switch's forwarding table
|
|
119
|
+
* having learned it on an access port is what puts the device on that
|
|
120
|
+
* port. See adoptEndpointsIntoDevices.
|
|
121
|
+
*/
|
|
122
|
+
macAddress?: string | undefined;
|
|
123
|
+
/*
|
|
124
|
+
* Which site the device belongs to. ALWAYS a string, never an ObjectID -
|
|
125
|
+
* the endpoint adoption below keys a Map on it, and an ObjectID instance
|
|
126
|
+
* would compare by identity. Read only to scope the by-address match:
|
|
127
|
+
* every branch site has a 10.0.0.5, so an endpoint's ARP-learned address
|
|
128
|
+
* may only name a device in the SAME site as the switch that learned it.
|
|
129
|
+
*/
|
|
130
|
+
siteId?: string | undefined;
|
|
112
131
|
lldpNeighbors?: Array<LldpNeighbor> | undefined;
|
|
113
132
|
cdpNeighbors?: Array<CdpNeighbor> | undefined;
|
|
114
133
|
}
|
|
@@ -146,6 +165,12 @@ export interface TopologyEndpointInput {
|
|
|
146
165
|
attachedInterfaceIndex?: number | undefined;
|
|
147
166
|
attachedPortName?: string | undefined;
|
|
148
167
|
lastSeenAt?: Date | undefined;
|
|
168
|
+
/*
|
|
169
|
+
* The site of the switch that learned this MAC, stamped by the endpoint
|
|
170
|
+
* service when the attachment was written. A string for the same reason
|
|
171
|
+
* TopologyDeviceInput.siteId is one.
|
|
172
|
+
*/
|
|
173
|
+
siteId?: string | undefined;
|
|
149
174
|
}
|
|
150
175
|
|
|
151
176
|
/*
|
|
@@ -181,6 +206,14 @@ export interface TopologyBuildResult extends NetworkTopology {
|
|
|
181
206
|
droppedEndpointCount?: number | undefined;
|
|
182
207
|
// True when more attachable endpoints existed than the render cap allows.
|
|
183
208
|
endpointsTruncated?: boolean | undefined;
|
|
209
|
+
/*
|
|
210
|
+
* Endpoints that turned out to BE a managed device - matched to one by
|
|
211
|
+
* MAC or by site-scoped address - and were therefore drawn as a link to
|
|
212
|
+
* that device's own node rather than as a node of their own. Reported so
|
|
213
|
+
* the count of what the switches learned still adds up: rendered +
|
|
214
|
+
* dropped + adopted is every row the caller passed in (less truncation).
|
|
215
|
+
*/
|
|
216
|
+
adoptedEndpointCount?: number | undefined;
|
|
184
217
|
/*
|
|
185
218
|
* Nodes removed because the project hid them. Always reported, even when
|
|
186
219
|
* zero: a map that quietly drops things is the same failure as a map that
|
|
@@ -292,6 +325,27 @@ interface ResolvedClaim {
|
|
|
292
325
|
peerAliases: Array<MatchKey>;
|
|
293
326
|
}
|
|
294
327
|
|
|
328
|
+
/*
|
|
329
|
+
* One endpoint row recognised as a managed device, and by which evidence.
|
|
330
|
+
* See planEndpointAdoption.
|
|
331
|
+
*/
|
|
332
|
+
interface AdoptionMatch {
|
|
333
|
+
device: TopologyDeviceInput;
|
|
334
|
+
matchedByMac: boolean;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
interface AdoptionCandidate {
|
|
338
|
+
endpoint: TopologyEndpointInput;
|
|
339
|
+
matchedByMac: boolean;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
interface EndpointAdoptionPlan {
|
|
343
|
+
// Every endpoint that IS a managed device, whether or not it draws.
|
|
344
|
+
deviceByEndpointId: Map<string, TopologyDeviceInput>;
|
|
345
|
+
// The one endpoint per device that draws its cable.
|
|
346
|
+
drawnEndpointIds: Set<string>;
|
|
347
|
+
}
|
|
348
|
+
|
|
295
349
|
/*
|
|
296
350
|
* Hoisted so the literal is not the object of a member expression, which
|
|
297
351
|
* `wrap-regex` and Prettier cannot agree on.
|
|
@@ -324,6 +378,18 @@ function isIpv4Address(value: string | undefined): boolean {
|
|
|
324
378
|
// Endpoint nodes rendered per graph; the slice is deterministic (by MAC).
|
|
325
379
|
const ENDPOINT_RENDER_CAP: number = 2000;
|
|
326
380
|
|
|
381
|
+
/*
|
|
382
|
+
* The built-in roles that sit at the top of a network, for the parent rule
|
|
383
|
+
* in drawAdoptedEndpoint when the project has not stamped its own answer.
|
|
384
|
+
* Mirrors the isCoreLayer flags in DEFAULT_NETWORK_DEVICE_ROLES, which is
|
|
385
|
+
* the seed every project's role table starts from.
|
|
386
|
+
*/
|
|
387
|
+
const BUILT_IN_CORE_LAYER_ROLES: ReadonlySet<string> = new Set<string>([
|
|
388
|
+
"router",
|
|
389
|
+
"firewall",
|
|
390
|
+
"loadBalancer",
|
|
391
|
+
]);
|
|
392
|
+
|
|
327
393
|
/*
|
|
328
394
|
* How long an ARP/FDB-learned endpoint keeps its "up" colour after the last
|
|
329
395
|
* walk that saw it. Taken from the shared device rule at its default
|
|
@@ -419,6 +485,16 @@ export default class NetworkTopologyUtil {
|
|
|
419
485
|
const isNeighborDiscoveryEnabledById: Map<string, boolean | undefined> =
|
|
420
486
|
new Map<string, boolean | undefined>();
|
|
421
487
|
|
|
488
|
+
/*
|
|
489
|
+
* Managed nodes by id, for the endpoint adoption pass: a device found
|
|
490
|
+
* in a switch's forwarding table is stamped with what the table knew
|
|
491
|
+
* about it (MAC, address, VLAN), and the parent rule reads its role.
|
|
492
|
+
*/
|
|
493
|
+
const deviceNodeById: Map<string, NetworkTopologyNode> = new Map<
|
|
494
|
+
string,
|
|
495
|
+
NetworkTopologyNode
|
|
496
|
+
>();
|
|
497
|
+
|
|
422
498
|
for (const device of devices) {
|
|
423
499
|
isNeighborDiscoveryEnabledById.set(
|
|
424
500
|
device.id,
|
|
@@ -448,6 +524,13 @@ export default class NetworkTopologyUtil {
|
|
|
448
524
|
sysName: device.sysName,
|
|
449
525
|
vendor: device.vendor,
|
|
450
526
|
deviceModel: device.deviceModel,
|
|
527
|
+
/*
|
|
528
|
+
* The declared or learned MAC, whether or not a forwarding table
|
|
529
|
+
* has found it yet: the drawer shows it, and an operator checking
|
|
530
|
+
* why a device floats wants to see what the map was looking for.
|
|
531
|
+
* Normalised so it reads the same as the endpoint rows beside it.
|
|
532
|
+
*/
|
|
533
|
+
macAddress: normalizeMac(device.macAddress),
|
|
451
534
|
};
|
|
452
535
|
|
|
453
536
|
/*
|
|
@@ -465,6 +548,7 @@ export default class NetworkTopologyUtil {
|
|
|
465
548
|
);
|
|
466
549
|
|
|
467
550
|
nodes.push(deviceNode);
|
|
551
|
+
deviceNodeById.set(device.id, deviceNode);
|
|
468
552
|
}
|
|
469
553
|
|
|
470
554
|
const edgeByKey: Map<string, NetworkTopologyEdge> = new Map();
|
|
@@ -822,6 +906,26 @@ export default class NetworkTopologyUtil {
|
|
|
822
906
|
let droppedEndpointCount: number = 0;
|
|
823
907
|
let renderedEndpointCount: number = 0;
|
|
824
908
|
let endpointsTruncated: boolean = false;
|
|
909
|
+
let adoptedEndpointCount: number = 0;
|
|
910
|
+
|
|
911
|
+
/*
|
|
912
|
+
* --- Endpoints that ARE managed devices ---
|
|
913
|
+
*
|
|
914
|
+
* A ping-only register, handset or kiosk is a NetworkDevice with a node
|
|
915
|
+
* of its own, and it is ALSO a MAC some switch learned on an access
|
|
916
|
+
* port - which until now was drawn as a second, anonymous node hanging
|
|
917
|
+
* off that switch while the device's own node floated with no link at
|
|
918
|
+
* all (issue #3489). The index below is what lets the two be recognised
|
|
919
|
+
* as one box, so the forwarding-table evidence draws the device's cable
|
|
920
|
+
* instead of a stranger's.
|
|
921
|
+
*/
|
|
922
|
+
const adoption: EndpointAdoptionPlan =
|
|
923
|
+
NetworkTopologyUtil.planEndpointAdoption(
|
|
924
|
+
devices,
|
|
925
|
+
sortedEndpoints,
|
|
926
|
+
deviceNodeIds,
|
|
927
|
+
now,
|
|
928
|
+
);
|
|
825
929
|
|
|
826
930
|
for (const endpoint of sortedEndpoints) {
|
|
827
931
|
if (
|
|
@@ -833,6 +937,29 @@ export default class NetworkTopologyUtil {
|
|
|
833
937
|
continue;
|
|
834
938
|
}
|
|
835
939
|
|
|
940
|
+
const adoptedDevice: TopologyDeviceInput | undefined =
|
|
941
|
+
adoption.deviceByEndpointId.get(endpoint.id);
|
|
942
|
+
|
|
943
|
+
if (adoptedDevice) {
|
|
944
|
+
/*
|
|
945
|
+
* Counted before the render cap, and never against it: an adopted
|
|
946
|
+
* endpoint mints no node, so it cannot crowd out one that does.
|
|
947
|
+
*/
|
|
948
|
+
adoptedEndpointCount++;
|
|
949
|
+
|
|
950
|
+
if (adoption.drawnEndpointIds.has(endpoint.id)) {
|
|
951
|
+
NetworkTopologyUtil.drawAdoptedEndpoint({
|
|
952
|
+
endpoint: endpoint,
|
|
953
|
+
device: adoptedDevice,
|
|
954
|
+
deviceNode: deviceNodeById.get(adoptedDevice.id),
|
|
955
|
+
edgeByKey: edgeByKey,
|
|
956
|
+
edges: edges,
|
|
957
|
+
interfaceByDeviceAndIndex: interfaceByDeviceAndIndex,
|
|
958
|
+
});
|
|
959
|
+
}
|
|
960
|
+
continue;
|
|
961
|
+
}
|
|
962
|
+
|
|
836
963
|
if (renderedEndpointCount >= ENDPOINT_RENDER_CAP) {
|
|
837
964
|
endpointsTruncated = true;
|
|
838
965
|
continue;
|
|
@@ -900,6 +1027,7 @@ export default class NetworkTopologyUtil {
|
|
|
900
1027
|
toNodeId: nodeId,
|
|
901
1028
|
fromPort: fromPort,
|
|
902
1029
|
protocols: ["fdb"],
|
|
1030
|
+
learnedByNodeId: endpoint.attachedNetworkDeviceId,
|
|
903
1031
|
fromInterface: switchInterface
|
|
904
1032
|
? {
|
|
905
1033
|
interfaceIndex: switchInterface.interfaceIndex,
|
|
@@ -930,6 +1058,7 @@ export default class NetworkTopologyUtil {
|
|
|
930
1058
|
edges,
|
|
931
1059
|
droppedEndpointCount,
|
|
932
1060
|
endpointsTruncated,
|
|
1061
|
+
adoptedEndpointCount,
|
|
933
1062
|
suppressedNodeCount: 0,
|
|
934
1063
|
};
|
|
935
1064
|
}
|
|
@@ -955,10 +1084,564 @@ export default class NetworkTopologyUtil {
|
|
|
955
1084
|
}),
|
|
956
1085
|
droppedEndpointCount,
|
|
957
1086
|
endpointsTruncated,
|
|
1087
|
+
adoptedEndpointCount,
|
|
958
1088
|
suppressedNodeCount: nodes.length - visibleNodes.length,
|
|
959
1089
|
};
|
|
960
1090
|
}
|
|
961
1091
|
|
|
1092
|
+
/*
|
|
1093
|
+
* Which endpoints are managed devices, and which ONE of them draws the
|
|
1094
|
+
* device's cable.
|
|
1095
|
+
*
|
|
1096
|
+
* A device can match more than one row. The common way is hardware that
|
|
1097
|
+
* was swapped keeping its address: the old unit's MAC is still a row in
|
|
1098
|
+
* the endpoint table (nothing prunes it), stored on the device from the
|
|
1099
|
+
* ARP pass, and the new unit's MAC is a fresher row that matches the
|
|
1100
|
+
* device by address. Drawing both would put the register on two ports
|
|
1101
|
+
* at once, one of them a port nothing has been plugged into for a
|
|
1102
|
+
* month. So every matching row is ADOPTED - none of them is minted as a
|
|
1103
|
+
* stranger - and the most recently seen one draws the link. A MAC match
|
|
1104
|
+
* outranks an address match at equal freshness, and the MAC order the
|
|
1105
|
+
* caller already sorted by settles the rest, so the choice never depends
|
|
1106
|
+
* on query order.
|
|
1107
|
+
*
|
|
1108
|
+
* The price is that a genuinely dual-homed device draws one cable. That
|
|
1109
|
+
* is rare among the devices this exists for, and it is the honest
|
|
1110
|
+
* trade: one current cable beats one current and one stale.
|
|
1111
|
+
*/
|
|
1112
|
+
private static planEndpointAdoption(
|
|
1113
|
+
devices: Array<TopologyDeviceInput>,
|
|
1114
|
+
sortedEndpoints: Array<TopologyEndpointInput>,
|
|
1115
|
+
deviceNodeIds: ReadonlySet<string>,
|
|
1116
|
+
now: Date,
|
|
1117
|
+
): EndpointAdoptionPlan {
|
|
1118
|
+
const index: Map<string, TopologyDeviceInput> =
|
|
1119
|
+
NetworkTopologyUtil.buildEndpointAdoptionIndex(devices);
|
|
1120
|
+
|
|
1121
|
+
const deviceByEndpointId: Map<string, TopologyDeviceInput> = new Map<
|
|
1122
|
+
string,
|
|
1123
|
+
TopologyDeviceInput
|
|
1124
|
+
>();
|
|
1125
|
+
const drawnEndpointIds: Set<string> = new Set<string>();
|
|
1126
|
+
|
|
1127
|
+
if (index.size === 0) {
|
|
1128
|
+
return { deviceByEndpointId, drawnEndpointIds };
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
const candidatesByDeviceId: Map<string, Array<AdoptionCandidate>> = new Map<
|
|
1132
|
+
string,
|
|
1133
|
+
Array<AdoptionCandidate>
|
|
1134
|
+
>();
|
|
1135
|
+
|
|
1136
|
+
for (const endpoint of sortedEndpoints) {
|
|
1137
|
+
if (
|
|
1138
|
+
!endpoint.attachedNetworkDeviceId ||
|
|
1139
|
+
!deviceNodeIds.has(endpoint.attachedNetworkDeviceId)
|
|
1140
|
+
) {
|
|
1141
|
+
continue;
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
const match: AdoptionMatch | undefined =
|
|
1145
|
+
NetworkTopologyUtil.adoptionMatchForEndpoint(endpoint, index);
|
|
1146
|
+
if (!match) {
|
|
1147
|
+
continue;
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
/*
|
|
1151
|
+
* An address is only evidence while it is current. A MAC names a
|
|
1152
|
+
* box for good, but an address is re-leased: a row the ARP pass
|
|
1153
|
+
* bound months ago may name a laptop that held the register's
|
|
1154
|
+
* address before the register was plugged in. Such a row is left to
|
|
1155
|
+
* be drawn as the stale (down-coloured) endpoint it is, rather than
|
|
1156
|
+
* cabling the device to a stranger's port with a live node's
|
|
1157
|
+
* confidence. The window is the one endpoint nodes age out on.
|
|
1158
|
+
*/
|
|
1159
|
+
if (
|
|
1160
|
+
!match.matchedByMac &&
|
|
1161
|
+
!NetworkTopologyUtil.isFreshSighting(endpoint, now)
|
|
1162
|
+
) {
|
|
1163
|
+
continue;
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
deviceByEndpointId.set(endpoint.id, match.device);
|
|
1167
|
+
|
|
1168
|
+
const bucket: Array<AdoptionCandidate> | undefined =
|
|
1169
|
+
candidatesByDeviceId.get(match.device.id);
|
|
1170
|
+
const candidate: AdoptionCandidate = {
|
|
1171
|
+
endpoint: endpoint,
|
|
1172
|
+
matchedByMac: match.matchedByMac,
|
|
1173
|
+
};
|
|
1174
|
+
if (bucket) {
|
|
1175
|
+
bucket.push(candidate);
|
|
1176
|
+
} else {
|
|
1177
|
+
candidatesByDeviceId.set(match.device.id, [candidate]);
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
for (const candidates of candidatesByDeviceId.values()) {
|
|
1182
|
+
let chosen: AdoptionCandidate = candidates[0]!;
|
|
1183
|
+
for (const candidate of candidates.slice(1)) {
|
|
1184
|
+
if (NetworkTopologyUtil.isFresherSighting(candidate, chosen)) {
|
|
1185
|
+
chosen = candidate;
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
drawnEndpointIds.add(chosen.endpoint.id);
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
return { deviceByEndpointId, drawnEndpointIds };
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
private static isFreshSighting(
|
|
1195
|
+
endpoint: TopologyEndpointInput,
|
|
1196
|
+
now: Date,
|
|
1197
|
+
): boolean {
|
|
1198
|
+
if (!endpoint.lastSeenAt) {
|
|
1199
|
+
return false;
|
|
1200
|
+
}
|
|
1201
|
+
const ageMs: number =
|
|
1202
|
+
now.getTime() - new Date(endpoint.lastSeenAt).getTime();
|
|
1203
|
+
return ageMs <= ENDPOINT_FRESH_WINDOW_MS;
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
/*
|
|
1207
|
+
* Strictly fresher: later lastSeenAt, then a MAC match over an address
|
|
1208
|
+
* match. Equal on both keeps the incumbent, which is the earlier entry
|
|
1209
|
+
* in MAC order.
|
|
1210
|
+
*/
|
|
1211
|
+
private static isFresherSighting(
|
|
1212
|
+
candidate: AdoptionCandidate,
|
|
1213
|
+
incumbent: AdoptionCandidate,
|
|
1214
|
+
): boolean {
|
|
1215
|
+
const candidateSeen: number = candidate.endpoint.lastSeenAt
|
|
1216
|
+
? new Date(candidate.endpoint.lastSeenAt).getTime()
|
|
1217
|
+
: Number.NEGATIVE_INFINITY;
|
|
1218
|
+
const incumbentSeen: number = incumbent.endpoint.lastSeenAt
|
|
1219
|
+
? new Date(incumbent.endpoint.lastSeenAt).getTime()
|
|
1220
|
+
: Number.NEGATIVE_INFINITY;
|
|
1221
|
+
|
|
1222
|
+
if (candidateSeen !== incumbentSeen) {
|
|
1223
|
+
return candidateSeen > incumbentSeen;
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
return candidate.matchedByMac && !incumbent.matchedByMac;
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
/*
|
|
1230
|
+
* Every key an endpoint could be recognised as a managed device by.
|
|
1231
|
+
*
|
|
1232
|
+
* Two kinds, strongest first:
|
|
1233
|
+
*
|
|
1234
|
+
* "mac" - the device's declared or ARP-learned MAC against the MAC the
|
|
1235
|
+
* switch learned. A MAC is unique per project among endpoints
|
|
1236
|
+
* (the endpoint table enforces it), so this needs no scoping.
|
|
1237
|
+
* "ip" - the device's hostname, when it is an IPv4 literal, against
|
|
1238
|
+
* the address a router's ARP table bound the MAC to. Scoped to
|
|
1239
|
+
* the SITE: every branch has a 10.0.0.5, and an unscoped match
|
|
1240
|
+
* would cable one register in every store to whichever switch
|
|
1241
|
+
* happened to learn a MAC that answers at that address. No site
|
|
1242
|
+
* on either side is a site of its own, so a project that never
|
|
1243
|
+
* set sites up still matches - project-wide, as it has to.
|
|
1244
|
+
*
|
|
1245
|
+
* The same ambiguity guard as the neighbour matcher: a key two devices
|
|
1246
|
+
* both claim is deleted rather than resolved, because a cable drawn to
|
|
1247
|
+
* the wrong box is worse than one not drawn.
|
|
1248
|
+
*
|
|
1249
|
+
* Interface MACs (TopologyDeviceInput.macAddresses) are deliberately NOT
|
|
1250
|
+
* keys here. A walked switch's interface MACs turn up in its uplink
|
|
1251
|
+
* neighbours' forwarding tables as transit traffic, and adopting those
|
|
1252
|
+
* would redraw every switch-to-switch cable LLDP already reports from a
|
|
1253
|
+
* weaker source. The declared MAC is different in kind: an operator (or
|
|
1254
|
+
* the ARP pass) put it there to say "this is the box".
|
|
1255
|
+
*/
|
|
1256
|
+
private static buildEndpointAdoptionIndex(
|
|
1257
|
+
devices: Array<TopologyDeviceInput>,
|
|
1258
|
+
): Map<string, TopologyDeviceInput> {
|
|
1259
|
+
const index: Map<string, TopologyDeviceInput> = new Map<
|
|
1260
|
+
string,
|
|
1261
|
+
TopologyDeviceInput
|
|
1262
|
+
>();
|
|
1263
|
+
const ambiguous: Set<string> = new Set<string>();
|
|
1264
|
+
|
|
1265
|
+
for (const device of devices) {
|
|
1266
|
+
for (const key of NetworkTopologyUtil.adoptionKeysForDevice(device)) {
|
|
1267
|
+
const existing: TopologyDeviceInput | undefined = index.get(key);
|
|
1268
|
+
if (existing && existing.id !== device.id) {
|
|
1269
|
+
ambiguous.add(key);
|
|
1270
|
+
continue;
|
|
1271
|
+
}
|
|
1272
|
+
index.set(key, device);
|
|
1273
|
+
}
|
|
1274
|
+
}
|
|
1275
|
+
|
|
1276
|
+
/*
|
|
1277
|
+
* A walked device's interface MACs are not adoption keys (see above),
|
|
1278
|
+
* but they ARE evidence about who owns a MAC. A declared MAC that some
|
|
1279
|
+
* walked device reports as one of its own interfaces is a contradiction
|
|
1280
|
+
* - a register registered at a switch's SVI address and stamped with
|
|
1281
|
+
* the switch's MAC, say - and the neighbour matcher already refuses
|
|
1282
|
+
* that key. Refusing it here too keeps the two from disagreeing about
|
|
1283
|
+
* which box a MAC is.
|
|
1284
|
+
*/
|
|
1285
|
+
for (const device of devices) {
|
|
1286
|
+
for (const rawMac of device.macAddresses || []) {
|
|
1287
|
+
const mac: string | undefined = normalizeMac(rawMac);
|
|
1288
|
+
if (!mac) {
|
|
1289
|
+
continue;
|
|
1290
|
+
}
|
|
1291
|
+
const key: string = NetworkTopologyUtil.adoptionMacKey(mac);
|
|
1292
|
+
const claimant: TopologyDeviceInput | undefined = index.get(key);
|
|
1293
|
+
if (claimant && claimant.id !== device.id) {
|
|
1294
|
+
ambiguous.add(key);
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
for (const key of ambiguous) {
|
|
1300
|
+
index.delete(key);
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
return index;
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
private static adoptionKeysForDevice(
|
|
1307
|
+
device: TopologyDeviceInput,
|
|
1308
|
+
): Array<string> {
|
|
1309
|
+
const keys: Array<string> = [];
|
|
1310
|
+
|
|
1311
|
+
const mac: string | undefined = normalizeMac(device.macAddress);
|
|
1312
|
+
if (mac) {
|
|
1313
|
+
keys.push(NetworkTopologyUtil.adoptionMacKey(mac));
|
|
1314
|
+
}
|
|
1315
|
+
|
|
1316
|
+
/*
|
|
1317
|
+
* hostname only, never `name`: a name is an operator's label, and one
|
|
1318
|
+
* that happens to be an IP literal is not a claim that the device
|
|
1319
|
+
* answers there - the same line matchKeysForDevice draws.
|
|
1320
|
+
*/
|
|
1321
|
+
const hostname: string | undefined = NetworkTopologyUtil.normalizeKey(
|
|
1322
|
+
device.hostname,
|
|
1323
|
+
);
|
|
1324
|
+
if (isIpv4Address(hostname)) {
|
|
1325
|
+
keys.push(NetworkTopologyUtil.adoptionIpKey(device.siteId, hostname!));
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
return keys;
|
|
1329
|
+
}
|
|
1330
|
+
|
|
1331
|
+
/*
|
|
1332
|
+
* The device this endpoint is, if it is one, and by which evidence. MAC
|
|
1333
|
+
* first: it is the stronger claim, and the only one that survives an
|
|
1334
|
+
* address change.
|
|
1335
|
+
*/
|
|
1336
|
+
private static adoptionMatchForEndpoint(
|
|
1337
|
+
endpoint: TopologyEndpointInput,
|
|
1338
|
+
index: Map<string, TopologyDeviceInput>,
|
|
1339
|
+
): AdoptionMatch | undefined {
|
|
1340
|
+
const mac: string | undefined = normalizeMac(endpoint.macAddress);
|
|
1341
|
+
if (mac) {
|
|
1342
|
+
const byMac: TopologyDeviceInput | undefined = index.get(
|
|
1343
|
+
NetworkTopologyUtil.adoptionMacKey(mac),
|
|
1344
|
+
);
|
|
1345
|
+
if (byMac) {
|
|
1346
|
+
return { device: byMac, matchedByMac: true };
|
|
1347
|
+
}
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1350
|
+
const ip: string | undefined = NetworkTopologyUtil.normalizeKey(
|
|
1351
|
+
endpoint.ipAddress,
|
|
1352
|
+
);
|
|
1353
|
+
if (isIpv4Address(ip)) {
|
|
1354
|
+
const byIp: TopologyDeviceInput | undefined = index.get(
|
|
1355
|
+
NetworkTopologyUtil.adoptionIpKey(endpoint.siteId, ip!),
|
|
1356
|
+
);
|
|
1357
|
+
if (byIp) {
|
|
1358
|
+
return { device: byIp, matchedByMac: false };
|
|
1359
|
+
}
|
|
1360
|
+
}
|
|
1361
|
+
|
|
1362
|
+
return undefined;
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
private static adoptionMacKey(normalizedMac: string): string {
|
|
1366
|
+
return `mac\u0000${normalizedMac}`;
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
private static adoptionIpKey(
|
|
1370
|
+
siteId: string | undefined,
|
|
1371
|
+
normalizedIp: string,
|
|
1372
|
+
): string {
|
|
1373
|
+
/*
|
|
1374
|
+
* null, undefined, "" and whitespace all normalise to the same "no
|
|
1375
|
+
* site" key - the convention NetworkDeviceLinkRuleUtil already uses.
|
|
1376
|
+
*/
|
|
1377
|
+
const siteKey: string = (siteId || "").trim();
|
|
1378
|
+
return `ip\u0000${siteKey}\u0000${normalizedIp}`;
|
|
1379
|
+
}
|
|
1380
|
+
|
|
1381
|
+
/*
|
|
1382
|
+
* Draws one adopted endpoint: an "fdb" edge from the switch that learned
|
|
1383
|
+
* the MAC to the device's own node, merged into whatever edge already
|
|
1384
|
+
* joins that pair, plus the identity the tables knew stamped on the node.
|
|
1385
|
+
*
|
|
1386
|
+
* A device found in its OWN tables is a self-reference (its address in
|
|
1387
|
+
* its own ARP cache, say) and draws nothing - an edge from a node to
|
|
1388
|
+
* itself is not a cable. It still counts as adopted: the row is not an
|
|
1389
|
+
* endpoint, and it must not be minted as one.
|
|
1390
|
+
*/
|
|
1391
|
+
private static drawAdoptedEndpoint(data: {
|
|
1392
|
+
endpoint: TopologyEndpointInput;
|
|
1393
|
+
device: TopologyDeviceInput;
|
|
1394
|
+
deviceNode: NetworkTopologyNode | undefined;
|
|
1395
|
+
edgeByKey: Map<string, NetworkTopologyEdge>;
|
|
1396
|
+
edges: Array<NetworkTopologyEdge>;
|
|
1397
|
+
interfaceByDeviceAndIndex: Map<string, TopologyInterfaceInput>;
|
|
1398
|
+
}): void {
|
|
1399
|
+
const switchId: string = data.endpoint.attachedNetworkDeviceId!;
|
|
1400
|
+
const deviceId: string = data.device.id;
|
|
1401
|
+
|
|
1402
|
+
if (data.deviceNode) {
|
|
1403
|
+
NetworkTopologyUtil.stampAdoptedIdentity(data.deviceNode, data.endpoint);
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
if (switchId === deviceId) {
|
|
1407
|
+
return;
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
// Port label + interface state on the switch end, when identifiable.
|
|
1411
|
+
let switchInterface: TopologyInterfaceInput | undefined = undefined;
|
|
1412
|
+
if (data.endpoint.attachedInterfaceIndex !== undefined) {
|
|
1413
|
+
switchInterface = data.interfaceByDeviceAndIndex.get(
|
|
1414
|
+
`${switchId}::${data.endpoint.attachedInterfaceIndex}`,
|
|
1415
|
+
);
|
|
1416
|
+
}
|
|
1417
|
+
let switchPort: string | undefined =
|
|
1418
|
+
data.endpoint.attachedPortName || switchInterface?.name;
|
|
1419
|
+
if (!switchPort && data.endpoint.attachedInterfaceIndex !== undefined) {
|
|
1420
|
+
switchPort = `if${data.endpoint.attachedInterfaceIndex}`;
|
|
1421
|
+
}
|
|
1422
|
+
const switchEndpoint: NetworkTopologyEdgeEndpoint | undefined =
|
|
1423
|
+
switchInterface
|
|
1424
|
+
? {
|
|
1425
|
+
interfaceIndex: switchInterface.interfaceIndex,
|
|
1426
|
+
interfaceName: switchInterface.name,
|
|
1427
|
+
isOperationallyUp: switchInterface.isOperationallyUp,
|
|
1428
|
+
isAdministrativelyUp: switchInterface.isAdministrativelyUp,
|
|
1429
|
+
utilizationPercent: switchInterface.utilizationPercent,
|
|
1430
|
+
inRateMbps: switchInterface.inRateMbps,
|
|
1431
|
+
outRateMbps: switchInterface.outRateMbps,
|
|
1432
|
+
errorsPerSecond: switchInterface.errorsPerSecond,
|
|
1433
|
+
}
|
|
1434
|
+
: undefined;
|
|
1435
|
+
|
|
1436
|
+
/*
|
|
1437
|
+
* Which end is up. A forwarding table is not symmetric the way a
|
|
1438
|
+
* neighbour protocol is: the switch LEARNED this MAC on an access
|
|
1439
|
+
* port, which is a statement that the device hangs off it - for a
|
|
1440
|
+
* register, a phone, a camera, a server. It is no such statement
|
|
1441
|
+
* about a router or a firewall, whose MAC a switch learns on the port
|
|
1442
|
+
* that leads UPSTREAM, nor about another switch, where the table says
|
|
1443
|
+
* nothing about which of the two is nearer the core. Those are left
|
|
1444
|
+
* for the layout to infer, exactly as an LLDP edge is.
|
|
1445
|
+
*/
|
|
1446
|
+
const declaredParentId: string | undefined =
|
|
1447
|
+
NetworkTopologyUtil.isLearningSwitchTheParent(data.deviceNode)
|
|
1448
|
+
? switchId
|
|
1449
|
+
: undefined;
|
|
1450
|
+
|
|
1451
|
+
const edgeKey: string = [switchId, deviceId].sort().join("::");
|
|
1452
|
+
const existing: NetworkTopologyEdge | undefined =
|
|
1453
|
+
data.edgeByKey.get(edgeKey);
|
|
1454
|
+
|
|
1455
|
+
if (!existing) {
|
|
1456
|
+
const edge: NetworkTopologyEdge = {
|
|
1457
|
+
fromNodeId: switchId,
|
|
1458
|
+
toNodeId: deviceId,
|
|
1459
|
+
fromPort: switchPort,
|
|
1460
|
+
protocols: ["fdb"],
|
|
1461
|
+
fromInterface: switchEndpoint,
|
|
1462
|
+
parentNodeId: declaredParentId,
|
|
1463
|
+
learnedByNodeId: switchId,
|
|
1464
|
+
};
|
|
1465
|
+
data.edgeByKey.set(edgeKey, edge);
|
|
1466
|
+
data.edges.push(edge);
|
|
1467
|
+
return;
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1470
|
+
/*
|
|
1471
|
+
* The pair is already joined - by a neighbour protocol, by a link the
|
|
1472
|
+
* operator drew, or by both. Merge rather than double the line.
|
|
1473
|
+
*/
|
|
1474
|
+
if (existing.protocols && !existing.protocols.includes("fdb")) {
|
|
1475
|
+
existing.protocols.push("fdb");
|
|
1476
|
+
}
|
|
1477
|
+
|
|
1478
|
+
/*
|
|
1479
|
+
* Which end learned. The existing edge may be stored device→switch,
|
|
1480
|
+
* so this is the only reliable statement of which end the table
|
|
1481
|
+
* belongs to; the freshest sighting draws, so a later one does not
|
|
1482
|
+
* move it.
|
|
1483
|
+
*/
|
|
1484
|
+
existing.learnedByNodeId = existing.learnedByNodeId || switchId;
|
|
1485
|
+
|
|
1486
|
+
/*
|
|
1487
|
+
* The switch-end port. Measured beats typed: against a hand-drawn
|
|
1488
|
+
* link the forwarding table's port replaces whatever was typed,
|
|
1489
|
+
* because the operator's port is a best recollection and this is
|
|
1490
|
+
* what the switch actually reports. Against a neighbour protocol both
|
|
1491
|
+
* are measured, and the protocol's is kept - it names the port from
|
|
1492
|
+
* both ends, where the table only knows one.
|
|
1493
|
+
*/
|
|
1494
|
+
const isMeasuredAlready: boolean = Boolean(
|
|
1495
|
+
existing.protocols?.some((protocol: NetworkTopologyLinkProtocol) => {
|
|
1496
|
+
return protocol === "lldp" || protocol === "cdp";
|
|
1497
|
+
}),
|
|
1498
|
+
);
|
|
1499
|
+
const switchIsFromEnd: boolean = existing.fromNodeId === switchId;
|
|
1500
|
+
const existingPort: string | undefined = switchIsFromEnd
|
|
1501
|
+
? existing.fromPort
|
|
1502
|
+
: existing.toPort;
|
|
1503
|
+
const existingInterface: NetworkTopologyEdgeEndpoint | undefined =
|
|
1504
|
+
switchIsFromEnd ? existing.fromInterface : existing.toInterface;
|
|
1505
|
+
|
|
1506
|
+
let mergedPort: string | undefined;
|
|
1507
|
+
let mergedInterface: NetworkTopologyEdgeEndpoint | undefined;
|
|
1508
|
+
|
|
1509
|
+
if (!isMeasuredAlready) {
|
|
1510
|
+
mergedPort = switchPort || existingPort;
|
|
1511
|
+
mergedInterface = NetworkTopologyUtil.mergeEndpoints(
|
|
1512
|
+
switchEndpoint,
|
|
1513
|
+
existingInterface,
|
|
1514
|
+
);
|
|
1515
|
+
} else if (
|
|
1516
|
+
NetworkTopologyUtil.describesSamePort(
|
|
1517
|
+
existingInterface,
|
|
1518
|
+
existingPort,
|
|
1519
|
+
switchEndpoint,
|
|
1520
|
+
switchPort,
|
|
1521
|
+
)
|
|
1522
|
+
) {
|
|
1523
|
+
/*
|
|
1524
|
+
* Two reports of ONE port: the protocol's fields are kept and the
|
|
1525
|
+
* table fills whatever the protocol's report left blank.
|
|
1526
|
+
*/
|
|
1527
|
+
mergedPort = existingPort || switchPort;
|
|
1528
|
+
mergedInterface = NetworkTopologyUtil.mergeEndpoints(
|
|
1529
|
+
existingInterface,
|
|
1530
|
+
switchEndpoint,
|
|
1531
|
+
);
|
|
1532
|
+
} else {
|
|
1533
|
+
/*
|
|
1534
|
+
* Two reports of DIFFERENT ports - the device was re-patched and the
|
|
1535
|
+
* table has caught up before the neighbour protocol, or the other
|
|
1536
|
+
* way round. Splicing the two field by field would label the
|
|
1537
|
+
* protocol's port with the other port's name and paint it with the
|
|
1538
|
+
* other port's state, so the protocol's end is left whole and the
|
|
1539
|
+
* table's port is not shown until the two agree.
|
|
1540
|
+
*/
|
|
1541
|
+
mergedPort = existingPort;
|
|
1542
|
+
mergedInterface = existingInterface;
|
|
1543
|
+
}
|
|
1544
|
+
|
|
1545
|
+
if (switchIsFromEnd) {
|
|
1546
|
+
existing.fromPort = mergedPort;
|
|
1547
|
+
existing.fromInterface = mergedInterface;
|
|
1548
|
+
} else {
|
|
1549
|
+
existing.toPort = mergedPort;
|
|
1550
|
+
existing.toInterface = mergedInterface;
|
|
1551
|
+
}
|
|
1552
|
+
|
|
1553
|
+
/*
|
|
1554
|
+
* A hierarchy somebody DECLARED - on the link, or through a rule -
|
|
1555
|
+
* beats the one the table implies. The specific statement beats the
|
|
1556
|
+
* general one, the same precedence the manual-link merge applies.
|
|
1557
|
+
*/
|
|
1558
|
+
existing.parentNodeId = existing.parentNodeId || declaredParentId;
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1561
|
+
/*
|
|
1562
|
+
* Whether a neighbour protocol's report of the switch end and the
|
|
1563
|
+
* forwarding table's attachment name the same port. By ifIndex when both
|
|
1564
|
+
* know it; by port label when the protocol's end has no interface row
|
|
1565
|
+
* behind it. Unknown on both sides is not "the same" - it is nothing to
|
|
1566
|
+
* compare, and the protocol's end is kept as it was.
|
|
1567
|
+
*/
|
|
1568
|
+
private static describesSamePort(
|
|
1569
|
+
existingInterface: NetworkTopologyEdgeEndpoint | undefined,
|
|
1570
|
+
existingPort: string | undefined,
|
|
1571
|
+
switchEndpoint: NetworkTopologyEdgeEndpoint | undefined,
|
|
1572
|
+
switchPort: string | undefined,
|
|
1573
|
+
): boolean {
|
|
1574
|
+
if (
|
|
1575
|
+
existingInterface?.interfaceIndex !== undefined &&
|
|
1576
|
+
switchEndpoint?.interfaceIndex !== undefined
|
|
1577
|
+
) {
|
|
1578
|
+
return existingInterface.interfaceIndex === switchEndpoint.interfaceIndex;
|
|
1579
|
+
}
|
|
1580
|
+
|
|
1581
|
+
const existingLabel: string | undefined = NetworkTopologyUtil.normalizeKey(
|
|
1582
|
+
existingInterface?.interfaceName || existingPort,
|
|
1583
|
+
);
|
|
1584
|
+
const switchLabel: string | undefined = NetworkTopologyUtil.normalizeKey(
|
|
1585
|
+
switchEndpoint?.interfaceName || switchPort,
|
|
1586
|
+
);
|
|
1587
|
+
return (
|
|
1588
|
+
existingLabel !== undefined &&
|
|
1589
|
+
switchLabel !== undefined &&
|
|
1590
|
+
existingLabel === switchLabel
|
|
1591
|
+
);
|
|
1592
|
+
}
|
|
1593
|
+
|
|
1594
|
+
/*
|
|
1595
|
+
* What the tables knew about the device, onto its node, so the detail
|
|
1596
|
+
* drawer can show the MAC, the address and the VLAN it was learned on.
|
|
1597
|
+
* Fills gaps only: a MAC the operator declared is already the one that
|
|
1598
|
+
* matched, and an address the row carries is left as it is.
|
|
1599
|
+
*/
|
|
1600
|
+
private static stampAdoptedIdentity(
|
|
1601
|
+
node: NetworkTopologyNode,
|
|
1602
|
+
endpoint: TopologyEndpointInput,
|
|
1603
|
+
): void {
|
|
1604
|
+
const mac: string | undefined = normalizeMac(endpoint.macAddress);
|
|
1605
|
+
if (mac && !node.macAddress) {
|
|
1606
|
+
node.macAddress = mac;
|
|
1607
|
+
}
|
|
1608
|
+
if (endpoint.ipAddress && !node.ipAddress) {
|
|
1609
|
+
node.ipAddress = endpoint.ipAddress;
|
|
1610
|
+
}
|
|
1611
|
+
if (typeof endpoint.vlanId === "number" && node.vlanId === undefined) {
|
|
1612
|
+
node.vlanId = endpoint.vlanId;
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
/*
|
|
1617
|
+
* Whether a switch that learned this device's MAC on an access port is
|
|
1618
|
+
* thereby its parent. True for anything that hangs off a switch; false
|
|
1619
|
+
* for a core-layer device (router, firewall, load balancer - or a
|
|
1620
|
+
* custom role the project marked core) and for another switch. The
|
|
1621
|
+
* configured flag wins where the project set one; the built-in core set
|
|
1622
|
+
* is the fallback, as everywhere else the stamp is read.
|
|
1623
|
+
*/
|
|
1624
|
+
private static isLearningSwitchTheParent(
|
|
1625
|
+
deviceNode: NetworkTopologyNode | undefined,
|
|
1626
|
+
): boolean {
|
|
1627
|
+
if (!deviceNode) {
|
|
1628
|
+
return true;
|
|
1629
|
+
}
|
|
1630
|
+
|
|
1631
|
+
const isCore: boolean =
|
|
1632
|
+
deviceNode.isCoreLayerRole !== undefined
|
|
1633
|
+
? deviceNode.isCoreLayerRole
|
|
1634
|
+
: BUILT_IN_CORE_LAYER_ROLES.has(deviceNode.role || "unknown");
|
|
1635
|
+
if (isCore) {
|
|
1636
|
+
return false;
|
|
1637
|
+
}
|
|
1638
|
+
|
|
1639
|
+
const roleKey: string = (deviceNode.roleKey || deviceNode.role || "")
|
|
1640
|
+
.trim()
|
|
1641
|
+
.toLowerCase();
|
|
1642
|
+
return roleKey !== "switch";
|
|
1643
|
+
}
|
|
1644
|
+
|
|
962
1645
|
/*
|
|
963
1646
|
* Both protocols' neighbor entries, normalized. LLDP first so its
|
|
964
1647
|
* (usually richer) identifiers win the first-report slots; CDP then
|
|
@@ -1237,6 +1920,16 @@ export default class NetworkTopologyUtil {
|
|
|
1237
1920
|
}
|
|
1238
1921
|
}
|
|
1239
1922
|
|
|
1923
|
+
/*
|
|
1924
|
+
* The declared MAC too. A ping-only device has no interface walk to
|
|
1925
|
+
* report its MACs from, so this is the only MAC it can answer to when
|
|
1926
|
+
* a neighbour advertises it as an LLDP chassis id.
|
|
1927
|
+
*/
|
|
1928
|
+
const declaredMac: string | undefined = normalizeMac(device.macAddress);
|
|
1929
|
+
if (declaredMac) {
|
|
1930
|
+
add({ kind: "mac", value: declaredMac });
|
|
1931
|
+
}
|
|
1932
|
+
|
|
1240
1933
|
return keys;
|
|
1241
1934
|
}
|
|
1242
1935
|
|