@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
|
@@ -0,0 +1,814 @@
|
|
|
1
|
+
import { describe, expect, test, beforeEach } from "@jest/globals";
|
|
2
|
+
import { createHash } from "crypto";
|
|
3
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
4
|
+
import TelemetryIngestionKeyPolicy from "../../../Types/Telemetry/TelemetryIngestionKeyPolicy";
|
|
5
|
+
import TelemetryIngestionKeyType from "../../../Types/Telemetry/TelemetryIngestionKeyType";
|
|
6
|
+
import TelemetryIngestionKeyService from "../../../Server/Services/TelemetryIngestionKeyService";
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* Every TelemetryIngestionKey in every installation that exists today was
|
|
10
|
+
* written before this feature's seven columns did, so it reads back with all
|
|
11
|
+
* of them NULL. getPolicyFromSecretKey is the ONE place that turns such a row
|
|
12
|
+
* into the total TelemetryIngestionKeyPolicy the ingest guards are written
|
|
13
|
+
* against, which makes it the hinge the whole change swings on: if a NULL
|
|
14
|
+
* keyType resolved to anything but Server, or a NULL isEnabled to anything
|
|
15
|
+
* but true, every existing customer's telemetry would start being refused the
|
|
16
|
+
* moment this ships - and silently, because a refused ingest request is never
|
|
17
|
+
* replayed and the spans are simply gone.
|
|
18
|
+
*
|
|
19
|
+
* So this suite pins that resolution column by column, and then pins the
|
|
20
|
+
* three properties of the cache sitting in front of it that are easy to break
|
|
21
|
+
* without noticing:
|
|
22
|
+
*
|
|
23
|
+
* 1. the cache is keyed on a HASH of the token, never the token itself - an
|
|
24
|
+
* in-process Map is exactly what ends up in a heap snapshot or a core
|
|
25
|
+
* file, and a live ingestion secret must not be lying in one;
|
|
26
|
+
* 2. a cache HIT rehydrates real ObjectIDs and a real Date out of the
|
|
27
|
+
* primitive snapshot it stores. A hit that handed back expiresAt as a
|
|
28
|
+
* string would type-check everywhere and then blow up on the
|
|
29
|
+
* middleware's expiresAt.getTime() only after the first minute of
|
|
30
|
+
* traffic on that pod;
|
|
31
|
+
* 3. a caller that mutates the policy it was handed cannot poison what
|
|
32
|
+
* every other request on the pod sees for the rest of the TTL.
|
|
33
|
+
*
|
|
34
|
+
* It also pins two deliberate NON-behaviours, both of which a well-meaning
|
|
35
|
+
* change would break quietly: getProjectIdFromSecretKey stays a LOOKUP and
|
|
36
|
+
* resolves disabled and expired keys (its four callers refuse those
|
|
37
|
+
* themselves, each naming its own surface, and folding the check in here
|
|
38
|
+
* would make "unknown key" and "switched-off key" indistinguishable in all
|
|
39
|
+
* four), and markUsed stays throttled, hook-free and cache-preserving - a
|
|
40
|
+
* passive liveness stamp that invalidated the policy cache would send the
|
|
41
|
+
* hottest path in the product back to Postgres every five minutes for a
|
|
42
|
+
* column nobody reads more than once a quarter.
|
|
43
|
+
*
|
|
44
|
+
* Nothing here touches Postgres: the base DatabaseService is replaced by a
|
|
45
|
+
* fake whose accessors are jest mocks, while the real service module - cache,
|
|
46
|
+
* TTLs, hashing, normalisation - runs on top of it. That is the technique
|
|
47
|
+
* App/Tests/Telemetry/GrpcServerAuthCache.test.ts uses.
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
/*
|
|
51
|
+
* The base class is replaced rather than stubbed per-method because its
|
|
52
|
+
* import closure reaches PasswordHash, which does not compile under ts-jest
|
|
53
|
+
* locally, and because the only things this suite needs from it are the four
|
|
54
|
+
* data accessors below.
|
|
55
|
+
*/
|
|
56
|
+
jest.mock("../../../Server/Services/DatabaseService", () => {
|
|
57
|
+
class FakeDatabaseService {
|
|
58
|
+
public modelType: unknown;
|
|
59
|
+
|
|
60
|
+
public constructor(modelType: unknown) {
|
|
61
|
+
this.modelType = modelType;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Base-class configuration helpers a subclass constructor may call.
|
|
65
|
+
public hardDeleteItemsOlderThanInDays(): void {
|
|
66
|
+
// no-op
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public setDoNotAllowDelete(): void {
|
|
70
|
+
// no-op
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public async findOneBy(): Promise<unknown> {
|
|
74
|
+
throw new Error(
|
|
75
|
+
"findOneBy stub was not replaced - the test must install its own implementation.",
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public async updateColumnsByIdWithoutHooks(): Promise<unknown> {
|
|
80
|
+
throw new Error(
|
|
81
|
+
"updateColumnsByIdWithoutHooks stub was not replaced - the test must install its own implementation.",
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public async updateOneById(): Promise<unknown> {
|
|
86
|
+
throw new Error("A hooked write path must not be used on markUsed.");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public async updateBy(): Promise<unknown> {
|
|
90
|
+
throw new Error("A hooked write path must not be used on markUsed.");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
__esModule: true,
|
|
96
|
+
default: FakeDatabaseService,
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
/*
|
|
101
|
+
* CaptureSpan wraps decorated methods in OpenTelemetry spans; a pass-through
|
|
102
|
+
* decorator keeps the suite from standing up tracing infrastructure.
|
|
103
|
+
*/
|
|
104
|
+
jest.mock("../../../Server/Utils/Telemetry/CaptureSpan", () => {
|
|
105
|
+
return {
|
|
106
|
+
__esModule: true,
|
|
107
|
+
default: () => {
|
|
108
|
+
return (
|
|
109
|
+
_target: unknown,
|
|
110
|
+
_propertyKey: string,
|
|
111
|
+
descriptor: PropertyDescriptor,
|
|
112
|
+
): PropertyDescriptor => {
|
|
113
|
+
return descriptor;
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// markUsed logs on a swallowed failure; keep the suite output clean.
|
|
120
|
+
jest.mock("../../../Server/Utils/Logger", () => {
|
|
121
|
+
return {
|
|
122
|
+
__esModule: true,
|
|
123
|
+
default: {
|
|
124
|
+
error: jest.fn(),
|
|
125
|
+
warn: jest.fn(),
|
|
126
|
+
info: jest.fn(),
|
|
127
|
+
debug: jest.fn(),
|
|
128
|
+
trace: jest.fn(),
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
type MockFn = jest.Mock;
|
|
134
|
+
|
|
135
|
+
/*
|
|
136
|
+
* A row exactly as Postgres hands it back - deliberately untyped, because
|
|
137
|
+
* half the point of this suite is what happens when a column holds something
|
|
138
|
+
* the model type says it cannot (a NULL keyType, a string allowedOrigins).
|
|
139
|
+
*/
|
|
140
|
+
type FakeRow = Record<string, unknown>;
|
|
141
|
+
|
|
142
|
+
/*
|
|
143
|
+
* The private surfaces this suite reaches into: the service's own accessors
|
|
144
|
+
* (which the fake base class defines and each test replaces) and the policy
|
|
145
|
+
* cache, whose KEYS are an assertion target - a raw secret must never be one.
|
|
146
|
+
*/
|
|
147
|
+
type ServiceInternals = {
|
|
148
|
+
findOneBy: MockFn;
|
|
149
|
+
updateColumnsByIdWithoutHooks: MockFn;
|
|
150
|
+
updateOneById: MockFn;
|
|
151
|
+
updateBy: MockFn;
|
|
152
|
+
policyCache: { store: Map<string, unknown> };
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
const internals: () => ServiceInternals = (): ServiceInternals => {
|
|
156
|
+
return TelemetryIngestionKeyService as unknown as ServiceInternals;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/*
|
|
160
|
+
* Install a counting findOneBy that resolves the given tokens to the given
|
|
161
|
+
* rows; every other token resolves to "no row", as the real accessor does.
|
|
162
|
+
*/
|
|
163
|
+
const installRows: (rows: Record<string, FakeRow>) => MockFn = (
|
|
164
|
+
rows: Record<string, FakeRow>,
|
|
165
|
+
): MockFn => {
|
|
166
|
+
const findOneByMock: MockFn = jest
|
|
167
|
+
.fn()
|
|
168
|
+
.mockImplementation((findOneBy: unknown): Promise<unknown> => {
|
|
169
|
+
const query: Record<string, unknown> = (
|
|
170
|
+
findOneBy as { query: Record<string, unknown> }
|
|
171
|
+
).query;
|
|
172
|
+
|
|
173
|
+
const queriedKey: string | undefined = (
|
|
174
|
+
query["secretKey"] as ObjectID | undefined
|
|
175
|
+
)?.toString();
|
|
176
|
+
|
|
177
|
+
const row: FakeRow | undefined = queriedKey
|
|
178
|
+
? rows[queriedKey]
|
|
179
|
+
: undefined;
|
|
180
|
+
|
|
181
|
+
return Promise.resolve(row ?? null);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
internals().findOneBy = findOneByMock;
|
|
185
|
+
|
|
186
|
+
return findOneByMock;
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
/*
|
|
190
|
+
* Resolve one row through the real service. Each call mints a fresh token so
|
|
191
|
+
* that the module-level policy cache (a singleton shared by every test in
|
|
192
|
+
* this file) can never serve one case's answer to another.
|
|
193
|
+
*/
|
|
194
|
+
const resolveRow: (
|
|
195
|
+
row: FakeRow,
|
|
196
|
+
) => Promise<TelemetryIngestionKeyPolicy> = async (
|
|
197
|
+
row: FakeRow,
|
|
198
|
+
): Promise<TelemetryIngestionKeyPolicy> => {
|
|
199
|
+
const token: string = ObjectID.generate().toString();
|
|
200
|
+
installRows({ [token]: row });
|
|
201
|
+
|
|
202
|
+
const policy: TelemetryIngestionKeyPolicy | null =
|
|
203
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(token);
|
|
204
|
+
|
|
205
|
+
expect(policy).not.toBeNull();
|
|
206
|
+
|
|
207
|
+
return policy as TelemetryIngestionKeyPolicy;
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
const policyCacheKeys: () => Array<string> = (): Array<string> => {
|
|
211
|
+
return Array.from(internals().policyCache.store.keys());
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
const hashOf: (token: string) => string = (token: string): string => {
|
|
215
|
+
return createHash("sha256").update(token).digest("hex");
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
describe("TelemetryIngestionKeyService policy resolution", () => {
|
|
219
|
+
beforeEach(() => {
|
|
220
|
+
jest.clearAllMocks();
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
describe("backwards compatibility with rows written before the feature", () => {
|
|
224
|
+
test("a NULL keyType is a Server key", async () => {
|
|
225
|
+
const nullKeyType: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
226
|
+
_id: ObjectID.generate(),
|
|
227
|
+
projectId: ObjectID.generate(),
|
|
228
|
+
keyType: null,
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
expect(nullKeyType.keyType).toBe(TelemetryIngestionKeyType.Server);
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
test("an absent keyType column is a Server key", async () => {
|
|
235
|
+
const absentKeyType: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
236
|
+
_id: ObjectID.generate(),
|
|
237
|
+
projectId: ObjectID.generate(),
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
expect(absentKeyType.keyType).toBe(TelemetryIngestionKeyType.Server);
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test("a keyType the code does not recognise is a Server key, never a Browser key", async () => {
|
|
244
|
+
/*
|
|
245
|
+
* A typo, a truncated column, a half-applied migration or a hand-edited
|
|
246
|
+
* row must all fail towards "behaves as it always did". The one value
|
|
247
|
+
* that grants the restrictive treatment is the exact string "Browser";
|
|
248
|
+
* everything else - including its lowercase form - is Server.
|
|
249
|
+
*/
|
|
250
|
+
const unrecognisedValues: Array<unknown> = [
|
|
251
|
+
"browser",
|
|
252
|
+
"BROWSER",
|
|
253
|
+
"Public",
|
|
254
|
+
"Serverr",
|
|
255
|
+
"",
|
|
256
|
+
0,
|
|
257
|
+
1,
|
|
258
|
+
true,
|
|
259
|
+
{},
|
|
260
|
+
[],
|
|
261
|
+
];
|
|
262
|
+
|
|
263
|
+
for (const unrecognisedValue of unrecognisedValues) {
|
|
264
|
+
const policy: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
265
|
+
_id: ObjectID.generate(),
|
|
266
|
+
projectId: ObjectID.generate(),
|
|
267
|
+
keyType: unrecognisedValue,
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
expect(policy.keyType).toBe(TelemetryIngestionKeyType.Server);
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
test("the exact string Browser is the only value that produces a Browser key", async () => {
|
|
275
|
+
const browserKey: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
276
|
+
_id: ObjectID.generate(),
|
|
277
|
+
projectId: ObjectID.generate(),
|
|
278
|
+
keyType: TelemetryIngestionKeyType.Browser,
|
|
279
|
+
allowedOrigins: ["https://app.example.com"],
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
expect(browserKey.keyType).toBe(TelemetryIngestionKeyType.Browser);
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test("a NULL or absent isEnabled leaves the key enabled", async () => {
|
|
286
|
+
const nullIsEnabled: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
287
|
+
_id: ObjectID.generate(),
|
|
288
|
+
projectId: ObjectID.generate(),
|
|
289
|
+
isEnabled: null,
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
const absentIsEnabled: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
293
|
+
_id: ObjectID.generate(),
|
|
294
|
+
projectId: ObjectID.generate(),
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
expect(nullIsEnabled.isEnabled).toBe(true);
|
|
298
|
+
expect(absentIsEnabled.isEnabled).toBe(true);
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
test("only an explicit false switches a key off", async () => {
|
|
302
|
+
const disabled: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
303
|
+
_id: ObjectID.generate(),
|
|
304
|
+
projectId: ObjectID.generate(),
|
|
305
|
+
isEnabled: false,
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
expect(disabled.isEnabled).toBe(false);
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
test("allowedOrigins that is missing, NULL or not a list resolves to an empty list", async () => {
|
|
312
|
+
const notLists: Array<unknown> = [
|
|
313
|
+
null,
|
|
314
|
+
undefined,
|
|
315
|
+
"https://app.example.com",
|
|
316
|
+
{ "0": "https://app.example.com" },
|
|
317
|
+
7,
|
|
318
|
+
true,
|
|
319
|
+
];
|
|
320
|
+
|
|
321
|
+
for (const notList of notLists) {
|
|
322
|
+
const policy: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
323
|
+
_id: ObjectID.generate(),
|
|
324
|
+
projectId: ObjectID.generate(),
|
|
325
|
+
allowedOrigins: notList,
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
expect(Array.isArray(policy.allowedOrigins)).toBe(true);
|
|
329
|
+
expect(policy.allowedOrigins).toEqual([]);
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
test("blank and non-string entries are dropped from allowedOrigins so a non-empty list always has a pattern that can match", async () => {
|
|
334
|
+
/*
|
|
335
|
+
* The Browser guard reads "the list is non-empty" as "this key is
|
|
336
|
+
* configured". A list of [""] would satisfy that while matching
|
|
337
|
+
* nothing, which is a key that silently accepts nobody.
|
|
338
|
+
*/
|
|
339
|
+
const policy: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
340
|
+
_id: ObjectID.generate(),
|
|
341
|
+
projectId: ObjectID.generate(),
|
|
342
|
+
allowedOrigins: [
|
|
343
|
+
"https://app.example.com",
|
|
344
|
+
"",
|
|
345
|
+
" ",
|
|
346
|
+
null,
|
|
347
|
+
42,
|
|
348
|
+
"https://admin.example.com",
|
|
349
|
+
],
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
expect(policy.allowedOrigins).toEqual([
|
|
353
|
+
"https://app.example.com",
|
|
354
|
+
"https://admin.example.com",
|
|
355
|
+
]);
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
test("a blank pinnedServiceName resolves to null and a padded one is trimmed", async () => {
|
|
359
|
+
const empty: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
360
|
+
_id: ObjectID.generate(),
|
|
361
|
+
projectId: ObjectID.generate(),
|
|
362
|
+
pinnedServiceName: "",
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
const whitespace: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
366
|
+
_id: ObjectID.generate(),
|
|
367
|
+
projectId: ObjectID.generate(),
|
|
368
|
+
pinnedServiceName: " ",
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
const padded: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
372
|
+
_id: ObjectID.generate(),
|
|
373
|
+
projectId: ObjectID.generate(),
|
|
374
|
+
pinnedServiceName: " checkout-web ",
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
expect(empty.pinnedServiceName).toBeNull();
|
|
378
|
+
expect(whitespace.pinnedServiceName).toBeNull();
|
|
379
|
+
expect(padded.pinnedServiceName).toBe("checkout-web");
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
test("a NULL expiresAt means the key never expires", async () => {
|
|
383
|
+
const policy: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
384
|
+
_id: ObjectID.generate(),
|
|
385
|
+
projectId: ObjectID.generate(),
|
|
386
|
+
expiresAt: null,
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
expect(policy.expiresAt).toBeNull();
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
test("a NULL, zero or negative requestsPerMinuteLimit means no explicit limit, never a total block", async () => {
|
|
393
|
+
const noLimitValues: Array<unknown> = [null, undefined, 0, -1, NaN, "50"];
|
|
394
|
+
|
|
395
|
+
for (const noLimitValue of noLimitValues) {
|
|
396
|
+
const policy: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
397
|
+
_id: ObjectID.generate(),
|
|
398
|
+
projectId: ObjectID.generate(),
|
|
399
|
+
requestsPerMinuteLimit: noLimitValue,
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
expect(policy.requestsPerMinuteLimit).toBeNull();
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
test("a row carrying only _id and projectId - exactly a pre-migration row - is a fully populated, unrestricted Server key", async () => {
|
|
407
|
+
const ingestionKeyId: ObjectID = ObjectID.generate();
|
|
408
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
409
|
+
|
|
410
|
+
const policy: TelemetryIngestionKeyPolicy = await resolveRow({
|
|
411
|
+
_id: ingestionKeyId,
|
|
412
|
+
projectId: projectId,
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
expect(policy).toEqual({
|
|
416
|
+
ingestionKeyId: expect.any(ObjectID),
|
|
417
|
+
projectId: expect.any(ObjectID),
|
|
418
|
+
keyType: TelemetryIngestionKeyType.Server,
|
|
419
|
+
allowedOrigins: [],
|
|
420
|
+
pinnedServiceName: null,
|
|
421
|
+
isEnabled: true,
|
|
422
|
+
expiresAt: null,
|
|
423
|
+
requestsPerMinuteLimit: null,
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
expect(policy.ingestionKeyId.toString()).toBe(ingestionKeyId.toString());
|
|
427
|
+
expect(policy.projectId.toString()).toBe(projectId.toString());
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
|
|
431
|
+
describe("resolution and caching", () => {
|
|
432
|
+
test("a known token resolves to a policy carrying its project and key id", async () => {
|
|
433
|
+
const token: string = ObjectID.generate().toString();
|
|
434
|
+
const ingestionKeyId: ObjectID = ObjectID.generate();
|
|
435
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
436
|
+
|
|
437
|
+
installRows({
|
|
438
|
+
[token]: {
|
|
439
|
+
_id: ingestionKeyId,
|
|
440
|
+
projectId: projectId,
|
|
441
|
+
keyType: TelemetryIngestionKeyType.Browser,
|
|
442
|
+
allowedOrigins: ["https://app.example.com"],
|
|
443
|
+
pinnedServiceName: "checkout-web",
|
|
444
|
+
isEnabled: true,
|
|
445
|
+
requestsPerMinuteLimit: 120,
|
|
446
|
+
},
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
const policy: TelemetryIngestionKeyPolicy | null =
|
|
450
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(token);
|
|
451
|
+
|
|
452
|
+
expect(policy).not.toBeNull();
|
|
453
|
+
expect(policy!.ingestionKeyId.toString()).toBe(ingestionKeyId.toString());
|
|
454
|
+
expect(policy!.projectId.toString()).toBe(projectId.toString());
|
|
455
|
+
expect(policy!.keyType).toBe(TelemetryIngestionKeyType.Browser);
|
|
456
|
+
expect(policy!.allowedOrigins).toEqual(["https://app.example.com"]);
|
|
457
|
+
expect(policy!.pinnedServiceName).toBe("checkout-web");
|
|
458
|
+
expect(policy!.requestsPerMinuteLimit).toBe(120);
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
test("a token that is not a UUID is refused without ever reaching the database, and the refusal is cached", async () => {
|
|
462
|
+
const malformedToken: string = "not-a-uuid-just-junk-from-the-internet";
|
|
463
|
+
const findOneByMock: MockFn = installRows({});
|
|
464
|
+
|
|
465
|
+
const first: TelemetryIngestionKeyPolicy | null =
|
|
466
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(
|
|
467
|
+
malformedToken,
|
|
468
|
+
);
|
|
469
|
+
const second: TelemetryIngestionKeyPolicy | null =
|
|
470
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(
|
|
471
|
+
malformedToken,
|
|
472
|
+
);
|
|
473
|
+
|
|
474
|
+
expect(first).toBeNull();
|
|
475
|
+
expect(second).toBeNull();
|
|
476
|
+
|
|
477
|
+
/*
|
|
478
|
+
* Junk tokens arrive in volume - this endpoint is public - and must not
|
|
479
|
+
* turn into a Postgres query each.
|
|
480
|
+
*/
|
|
481
|
+
expect(findOneByMock).not.toHaveBeenCalled();
|
|
482
|
+
expect(policyCacheKeys()).toContain(hashOf(malformedToken));
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
test("a well-formed token with no matching row is negative cached, so a flood of dead keys queries once each", async () => {
|
|
486
|
+
const unknownToken: string = ObjectID.generate().toString();
|
|
487
|
+
const findOneByMock: MockFn = installRows({});
|
|
488
|
+
|
|
489
|
+
const first: TelemetryIngestionKeyPolicy | null =
|
|
490
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(unknownToken);
|
|
491
|
+
const second: TelemetryIngestionKeyPolicy | null =
|
|
492
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(unknownToken);
|
|
493
|
+
|
|
494
|
+
expect(first).toBeNull();
|
|
495
|
+
expect(second).toBeNull();
|
|
496
|
+
expect(findOneByMock).toHaveBeenCalledTimes(1);
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
test("a resolved key is cached: repeated ingest requests query the database once", async () => {
|
|
500
|
+
const token: string = ObjectID.generate().toString();
|
|
501
|
+
const findOneByMock: MockFn = installRows({
|
|
502
|
+
[token]: {
|
|
503
|
+
_id: ObjectID.generate(),
|
|
504
|
+
projectId: ObjectID.generate(),
|
|
505
|
+
},
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
for (let attempt: number = 0; attempt < 5; attempt++) {
|
|
509
|
+
const policy: TelemetryIngestionKeyPolicy | null =
|
|
510
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(token);
|
|
511
|
+
expect(policy).not.toBeNull();
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
expect(findOneByMock).toHaveBeenCalledTimes(1);
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
test("the cache is keyed on a hash of the token, so no live secret is left sitting in a map key", async () => {
|
|
518
|
+
const token: string = ObjectID.generate().toString();
|
|
519
|
+
installRows({
|
|
520
|
+
[token]: {
|
|
521
|
+
_id: ObjectID.generate(),
|
|
522
|
+
projectId: ObjectID.generate(),
|
|
523
|
+
},
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(token);
|
|
527
|
+
|
|
528
|
+
const keys: Array<string> = policyCacheKeys();
|
|
529
|
+
|
|
530
|
+
expect(keys).toContain(hashOf(token));
|
|
531
|
+
|
|
532
|
+
const keyLeakingTheToken: string | undefined = keys.find(
|
|
533
|
+
(key: string): boolean => {
|
|
534
|
+
return key.includes(token);
|
|
535
|
+
},
|
|
536
|
+
);
|
|
537
|
+
|
|
538
|
+
expect(keyLeakingTheToken).toBeUndefined();
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
test("two different tokens get two different policies and do not collide in the cache", async () => {
|
|
542
|
+
const firstToken: string = ObjectID.generate().toString();
|
|
543
|
+
const secondToken: string = ObjectID.generate().toString();
|
|
544
|
+
const firstProjectId: ObjectID = ObjectID.generate();
|
|
545
|
+
const secondProjectId: ObjectID = ObjectID.generate();
|
|
546
|
+
|
|
547
|
+
const findOneByMock: MockFn = installRows({
|
|
548
|
+
[firstToken]: {
|
|
549
|
+
_id: ObjectID.generate(),
|
|
550
|
+
projectId: firstProjectId,
|
|
551
|
+
},
|
|
552
|
+
[secondToken]: {
|
|
553
|
+
_id: ObjectID.generate(),
|
|
554
|
+
projectId: secondProjectId,
|
|
555
|
+
},
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
const firstPolicy: TelemetryIngestionKeyPolicy | null =
|
|
559
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(firstToken);
|
|
560
|
+
const secondPolicy: TelemetryIngestionKeyPolicy | null =
|
|
561
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(secondToken);
|
|
562
|
+
const firstPolicyAgain: TelemetryIngestionKeyPolicy | null =
|
|
563
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(firstToken);
|
|
564
|
+
|
|
565
|
+
expect(firstPolicy!.projectId.toString()).toBe(firstProjectId.toString());
|
|
566
|
+
expect(secondPolicy!.projectId.toString()).toBe(
|
|
567
|
+
secondProjectId.toString(),
|
|
568
|
+
);
|
|
569
|
+
expect(firstPolicyAgain!.projectId.toString()).toBe(
|
|
570
|
+
firstProjectId.toString(),
|
|
571
|
+
);
|
|
572
|
+
|
|
573
|
+
// One query per distinct token; the repeat of the first is a cache hit.
|
|
574
|
+
expect(findOneByMock).toHaveBeenCalledTimes(2);
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
test("a cache HIT returns live ObjectIDs and a real Date, not the strings the snapshot stores", async () => {
|
|
578
|
+
/*
|
|
579
|
+
* The cache holds primitives so it cannot be mutated through, which
|
|
580
|
+
* means every hit has to rehydrate. If it ever stopped, the middleware's
|
|
581
|
+
* policy.expiresAt.getTime() would throw - but only after the first
|
|
582
|
+
* request on a pod, which is the worst possible time to find out.
|
|
583
|
+
*/
|
|
584
|
+
const token: string = ObjectID.generate().toString();
|
|
585
|
+
const expiresAt: Date = new Date(Date.now() + 60 * 60 * 1000);
|
|
586
|
+
const findOneByMock: MockFn = installRows({
|
|
587
|
+
[token]: {
|
|
588
|
+
_id: ObjectID.generate(),
|
|
589
|
+
projectId: ObjectID.generate(),
|
|
590
|
+
expiresAt: expiresAt,
|
|
591
|
+
},
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(token);
|
|
595
|
+
|
|
596
|
+
const cachedPolicy: TelemetryIngestionKeyPolicy | null =
|
|
597
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(token);
|
|
598
|
+
|
|
599
|
+
expect(findOneByMock).toHaveBeenCalledTimes(1);
|
|
600
|
+
expect(cachedPolicy).not.toBeNull();
|
|
601
|
+
expect(cachedPolicy!.ingestionKeyId).toBeInstanceOf(ObjectID);
|
|
602
|
+
expect(cachedPolicy!.projectId).toBeInstanceOf(ObjectID);
|
|
603
|
+
expect(cachedPolicy!.expiresAt).toBeInstanceOf(Date);
|
|
604
|
+
expect(cachedPolicy!.expiresAt!.getTime()).toBe(expiresAt.getTime());
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
test("mutating a returned policy cannot poison the policy the next caller gets", async () => {
|
|
608
|
+
const token: string = ObjectID.generate().toString();
|
|
609
|
+
installRows({
|
|
610
|
+
[token]: {
|
|
611
|
+
_id: ObjectID.generate(),
|
|
612
|
+
projectId: ObjectID.generate(),
|
|
613
|
+
keyType: TelemetryIngestionKeyType.Browser,
|
|
614
|
+
allowedOrigins: ["https://app.example.com"],
|
|
615
|
+
},
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
const firstPolicy: TelemetryIngestionKeyPolicy | null =
|
|
619
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(token);
|
|
620
|
+
|
|
621
|
+
// An attacker-shaped mutation: widen the allowlist on the shared entry.
|
|
622
|
+
firstPolicy!.allowedOrigins.push("https://evil.example.com");
|
|
623
|
+
firstPolicy!.allowedOrigins[0] = "https://evil.example.com";
|
|
624
|
+
|
|
625
|
+
const secondPolicy: TelemetryIngestionKeyPolicy | null =
|
|
626
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(token);
|
|
627
|
+
|
|
628
|
+
expect(secondPolicy!.allowedOrigins).toEqual(["https://app.example.com"]);
|
|
629
|
+
expect(secondPolicy!.allowedOrigins).not.toBe(
|
|
630
|
+
firstPolicy!.allowedOrigins,
|
|
631
|
+
);
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
test("getProjectIdFromSecretKey answers for a DISABLED key - it is a lookup, not a decision", async () => {
|
|
635
|
+
const token: string = ObjectID.generate().toString();
|
|
636
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
637
|
+
|
|
638
|
+
installRows({
|
|
639
|
+
[token]: {
|
|
640
|
+
_id: ObjectID.generate(),
|
|
641
|
+
projectId: projectId,
|
|
642
|
+
isEnabled: false,
|
|
643
|
+
},
|
|
644
|
+
});
|
|
645
|
+
|
|
646
|
+
const resolvedProjectId: ObjectID | null =
|
|
647
|
+
await TelemetryIngestionKeyService.getProjectIdFromSecretKey(token);
|
|
648
|
+
|
|
649
|
+
expect(resolvedProjectId).not.toBeNull();
|
|
650
|
+
expect(resolvedProjectId!.toString()).toBe(projectId.toString());
|
|
651
|
+
});
|
|
652
|
+
|
|
653
|
+
test("getProjectIdFromSecretKey answers for an EXPIRED key - the four callers refuse it themselves, by surface", async () => {
|
|
654
|
+
const token: string = ObjectID.generate().toString();
|
|
655
|
+
const projectId: ObjectID = ObjectID.generate();
|
|
656
|
+
|
|
657
|
+
installRows({
|
|
658
|
+
[token]: {
|
|
659
|
+
_id: ObjectID.generate(),
|
|
660
|
+
projectId: projectId,
|
|
661
|
+
expiresAt: new Date(Date.now() - 60 * 60 * 1000),
|
|
662
|
+
},
|
|
663
|
+
});
|
|
664
|
+
|
|
665
|
+
const resolvedProjectId: ObjectID | null =
|
|
666
|
+
await TelemetryIngestionKeyService.getProjectIdFromSecretKey(token);
|
|
667
|
+
|
|
668
|
+
expect(resolvedProjectId).not.toBeNull();
|
|
669
|
+
expect(resolvedProjectId!.toString()).toBe(projectId.toString());
|
|
670
|
+
});
|
|
671
|
+
|
|
672
|
+
test("getProjectIdFromSecretKey still returns null for an unknown token", async () => {
|
|
673
|
+
const unknownToken: string = ObjectID.generate().toString();
|
|
674
|
+
installRows({});
|
|
675
|
+
|
|
676
|
+
const resolvedProjectId: ObjectID | null =
|
|
677
|
+
await TelemetryIngestionKeyService.getProjectIdFromSecretKey(
|
|
678
|
+
unknownToken,
|
|
679
|
+
);
|
|
680
|
+
|
|
681
|
+
expect(resolvedProjectId).toBeNull();
|
|
682
|
+
});
|
|
683
|
+
});
|
|
684
|
+
|
|
685
|
+
describe("markUsed", () => {
|
|
686
|
+
const installWriteMocks: () => {
|
|
687
|
+
write: MockFn;
|
|
688
|
+
hookedUpdateOneById: MockFn;
|
|
689
|
+
hookedUpdateBy: MockFn;
|
|
690
|
+
} = (): {
|
|
691
|
+
write: MockFn;
|
|
692
|
+
hookedUpdateOneById: MockFn;
|
|
693
|
+
hookedUpdateBy: MockFn;
|
|
694
|
+
} => {
|
|
695
|
+
const write: MockFn = jest.fn().mockResolvedValue(undefined);
|
|
696
|
+
const hookedUpdateOneById: MockFn = jest
|
|
697
|
+
.fn()
|
|
698
|
+
.mockResolvedValue(undefined);
|
|
699
|
+
const hookedUpdateBy: MockFn = jest.fn().mockResolvedValue(undefined);
|
|
700
|
+
|
|
701
|
+
internals().updateColumnsByIdWithoutHooks = write;
|
|
702
|
+
internals().updateOneById = hookedUpdateOneById;
|
|
703
|
+
internals().updateBy = hookedUpdateBy;
|
|
704
|
+
|
|
705
|
+
return {
|
|
706
|
+
write: write,
|
|
707
|
+
hookedUpdateOneById: hookedUpdateOneById,
|
|
708
|
+
hookedUpdateBy: hookedUpdateBy,
|
|
709
|
+
};
|
|
710
|
+
};
|
|
711
|
+
|
|
712
|
+
test("the first use stamps lastUsedAt without hooks and without touching updatedAt", async () => {
|
|
713
|
+
const ingestionKeyId: ObjectID = ObjectID.generate();
|
|
714
|
+
const { write } = installWriteMocks();
|
|
715
|
+
|
|
716
|
+
await TelemetryIngestionKeyService.markUsed(ingestionKeyId);
|
|
717
|
+
|
|
718
|
+
expect(write).toHaveBeenCalledTimes(1);
|
|
719
|
+
|
|
720
|
+
const writeArgument: {
|
|
721
|
+
id: ObjectID;
|
|
722
|
+
data: { lastUsedAt: Date };
|
|
723
|
+
skipUpdateDateColumn: boolean;
|
|
724
|
+
} = write.mock.calls[0]![0] as {
|
|
725
|
+
id: ObjectID;
|
|
726
|
+
data: { lastUsedAt: Date };
|
|
727
|
+
skipUpdateDateColumn: boolean;
|
|
728
|
+
};
|
|
729
|
+
|
|
730
|
+
expect(writeArgument.id.toString()).toBe(ingestionKeyId.toString());
|
|
731
|
+
expect(writeArgument.data.lastUsedAt).toBeInstanceOf(Date);
|
|
732
|
+
expect(writeArgument.skipUpdateDateColumn).toBe(true);
|
|
733
|
+
});
|
|
734
|
+
|
|
735
|
+
test("a second use of the same key inside the window issues no write at all", async () => {
|
|
736
|
+
const ingestionKeyId: ObjectID = ObjectID.generate();
|
|
737
|
+
const { write } = installWriteMocks();
|
|
738
|
+
|
|
739
|
+
await TelemetryIngestionKeyService.markUsed(ingestionKeyId);
|
|
740
|
+
await TelemetryIngestionKeyService.markUsed(ingestionKeyId);
|
|
741
|
+
await TelemetryIngestionKeyService.markUsed(ingestionKeyId);
|
|
742
|
+
|
|
743
|
+
/*
|
|
744
|
+
* Ingest runs this thousands of times a second per key. One UPDATE per
|
|
745
|
+
* key per five minutes is the whole point; a per-request UPDATE on the
|
|
746
|
+
* same row is a lock convoy.
|
|
747
|
+
*/
|
|
748
|
+
expect(write).toHaveBeenCalledTimes(1);
|
|
749
|
+
});
|
|
750
|
+
|
|
751
|
+
test("two different keys each get their own stamp", async () => {
|
|
752
|
+
const firstKeyId: ObjectID = ObjectID.generate();
|
|
753
|
+
const secondKeyId: ObjectID = ObjectID.generate();
|
|
754
|
+
const { write } = installWriteMocks();
|
|
755
|
+
|
|
756
|
+
await TelemetryIngestionKeyService.markUsed(firstKeyId);
|
|
757
|
+
await TelemetryIngestionKeyService.markUsed(secondKeyId);
|
|
758
|
+
|
|
759
|
+
expect(write).toHaveBeenCalledTimes(2);
|
|
760
|
+
|
|
761
|
+
const stampedIds: Array<string> = write.mock.calls.map(
|
|
762
|
+
(call: Array<unknown>): string => {
|
|
763
|
+
return (call[0] as { id: ObjectID }).id.toString();
|
|
764
|
+
},
|
|
765
|
+
);
|
|
766
|
+
|
|
767
|
+
expect(stampedIds).toEqual([
|
|
768
|
+
firstKeyId.toString(),
|
|
769
|
+
secondKeyId.toString(),
|
|
770
|
+
]);
|
|
771
|
+
});
|
|
772
|
+
|
|
773
|
+
test("a failed stamp is swallowed - a bookkeeping write must never reject accepted telemetry", async () => {
|
|
774
|
+
const ingestionKeyId: ObjectID = ObjectID.generate();
|
|
775
|
+
const { write } = installWriteMocks();
|
|
776
|
+
write.mockRejectedValue(new Error("connection terminated unexpectedly"));
|
|
777
|
+
|
|
778
|
+
await expect(
|
|
779
|
+
TelemetryIngestionKeyService.markUsed(ingestionKeyId),
|
|
780
|
+
).resolves.toBeUndefined();
|
|
781
|
+
});
|
|
782
|
+
|
|
783
|
+
test("stamping a key does not invalidate its cached policy", async () => {
|
|
784
|
+
const token: string = ObjectID.generate().toString();
|
|
785
|
+
const ingestionKeyId: ObjectID = ObjectID.generate();
|
|
786
|
+
const findOneByMock: MockFn = installRows({
|
|
787
|
+
[token]: {
|
|
788
|
+
_id: ingestionKeyId,
|
|
789
|
+
projectId: ObjectID.generate(),
|
|
790
|
+
},
|
|
791
|
+
});
|
|
792
|
+
const { write, hookedUpdateOneById, hookedUpdateBy } =
|
|
793
|
+
installWriteMocks();
|
|
794
|
+
|
|
795
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(token);
|
|
796
|
+
await TelemetryIngestionKeyService.markUsed(ingestionKeyId);
|
|
797
|
+
|
|
798
|
+
const policyAfterStamp: TelemetryIngestionKeyPolicy | null =
|
|
799
|
+
await TelemetryIngestionKeyService.getPolicyFromSecretKey(token);
|
|
800
|
+
|
|
801
|
+
expect(policyAfterStamp).not.toBeNull();
|
|
802
|
+
expect(write).toHaveBeenCalledTimes(1);
|
|
803
|
+
|
|
804
|
+
/*
|
|
805
|
+
* A hooked write would run onBeforeUpdate, which clears the whole
|
|
806
|
+
* policy cache - so every key on the pod would go back to Postgres
|
|
807
|
+
* every five minutes because of a column nobody reads.
|
|
808
|
+
*/
|
|
809
|
+
expect(hookedUpdateOneById).not.toHaveBeenCalled();
|
|
810
|
+
expect(hookedUpdateBy).not.toHaveBeenCalled();
|
|
811
|
+
expect(findOneByMock).toHaveBeenCalledTimes(1);
|
|
812
|
+
});
|
|
813
|
+
});
|
|
814
|
+
});
|