@oneuptime/common 12.0.32 → 12.0.34
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/AnalyticsModels/Span.ts +14 -0
- package/Models/DatabaseModels/AlertCustomField.ts +77 -3
- package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
- package/Models/DatabaseModels/Index.ts +10 -0
- package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +176 -1
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/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/TelemetryException.ts +119 -0
- package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
- package/Models/DatabaseModels/UserTelegram.ts +0 -4
- package/Scripts/benchmark-fanin-capacity.js +181 -0
- package/Server/API/EnterpriseLicenseAPI.ts +391 -64
- package/Server/API/LlmProviderAPI.ts +137 -22
- 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 +49 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/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/Index.ts +20 -0
- package/Server/Infrastructure/QueueWorker.ts +59 -23
- package/Server/Infrastructure/Semaphore.ts +2 -0
- package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
- package/Server/Middleware/ProjectAuthorization.ts +11 -0
- package/Server/Middleware/SCIMAuthorization.ts +12 -0
- package/Server/Middleware/TelemetryIngest.ts +464 -7
- package/Server/Services/AIBillingService.ts +101 -27
- 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/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/GlobalConfigService.ts +194 -0
- package/Server/Services/IncidentCustomFieldService.ts +98 -0
- package/Server/Services/IncidentService.ts +35 -0
- package/Server/Services/Index.ts +10 -0
- package/Server/Services/MetricService.ts +194 -0
- package/Server/Services/MonitorService.ts +175 -21
- package/Server/Services/MonitorStatusTimelineService.ts +150 -8
- package/Server/Services/MonitorTemplateService.ts +217 -1
- package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
- package/Server/Services/NetworkAlertPolicyService.ts +944 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +87 -35
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
- package/Server/Services/NetworkDeviceService.ts +1032 -73
- package/Server/Services/NetworkSiteService.ts +1502 -129
- package/Server/Services/NetworkSiteTypeService.ts +1216 -0
- package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
- package/Server/Services/NotificationService.ts +118 -28
- package/Server/Services/ProjectService.ts +127 -48
- 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/StatusPagePrivateUserService.ts +103 -3
- package/Server/Services/TeamMemberService.ts +78 -0
- package/Server/Services/TeamPermissionService.ts +235 -3
- package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
- package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
- package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
- package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
- package/Server/Services/UserNotificationSettingService.ts +90 -25
- package/Server/Services/UserService.ts +95 -0
- package/Server/Services/UserTelegramService.ts +326 -5
- package/Server/Types/Database/QueryHelper.ts +4 -2
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
- package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
- package/Server/Utils/APIKey/AccessPermission.ts +5 -2
- package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
- 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/DataSource/EgressGuard.ts +177 -8
- package/Server/Utils/DataSource/HttpFetch.ts +9 -2
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +131 -0
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +925 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
- package/Server/Utils/FrontendEnvironment.ts +40 -0
- package/Server/Utils/LLM/LLMService.ts +78 -0
- package/Server/Utils/LogRedaction.ts +28 -0
- package/Server/Utils/Logger.ts +90 -1
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +338 -77
- package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +159 -15
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
- package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +72 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
- package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
- package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
- package/Server/Utils/OutboundUserAgent.ts +152 -0
- package/Server/Utils/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 +53 -36
- package/Server/Utils/TelegramVerificationToken.ts +185 -0
- package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
- package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
- package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
- package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
- 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/Telemetry.ts +198 -51
- package/Server/Utils/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +975 -95
- package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
- package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +486 -9
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
- package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
- package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
- package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
- package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
- package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
- package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
- package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
- package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
- package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
- package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
- package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
- package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
- package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
- 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/NetworkSiteHierarchy.test.ts +41 -4
- package/Tests/ResponsiveVisibility.test.ts +115 -0
- package/Tests/ResponsiveVisibility.ts +183 -0
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
- package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -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/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +202 -0
- package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
- package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
- package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
- package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
- package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
- 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/BillingRechargeOwnerEmailGuards.test.ts +783 -0
- package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
- package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
- package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
- package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
- package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
- package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
- package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
- package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
- package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +273 -5
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
- package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
- package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
- package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
- package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
- package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
- package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
- package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
- package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -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/UserEmailChangePasswordResetExpiry.test.ts +472 -0
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +997 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +110 -1
- package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
- package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
- package/Tests/Server/Utils/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/Captcha.test.ts +422 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
- package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +828 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
- package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
- package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +584 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
- package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
- package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
- package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
- package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -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/ErrorClassResolver.test.ts +298 -0
- package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
- 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/Telemetry.test.ts +456 -66
- 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/JSONFunctions.test.ts +260 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
- package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
- 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/MonitorStepDatabaseMonitor.test.ts +243 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
- package/Tests/Types/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/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
- package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
- package/Tests/Types/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/ErrorClass.test.ts +483 -0
- package/Tests/Types/WebsiteRequest.test.ts +285 -3
- package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
- 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/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 +43 -12
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
- package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
- package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
- package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
- package/Tests/UI/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/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 +711 -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/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/ReplayTimeline.test.tsx +696 -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/GlobalKeyboardShortcut.test.ts +344 -0
- package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
- package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
- package/Tests/Utils/API.test.ts +308 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
- package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
- package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
- package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
- package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
- package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
- package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
- package/Tests/Utils/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/CaptureSpanExportGating.test.ts +145 -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/AI/ExceptionAIClassification.ts +10 -24
- package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
- package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
- package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
- package/Types/Exception/ApiException.ts +10 -0
- package/Types/Exception/BadDataException.ts +11 -0
- package/Types/Exception/BadRequestException.ts +11 -0
- package/Types/Exception/Exception.ts +65 -0
- package/Types/Exception/ForbiddenException.ts +10 -0
- package/Types/Exception/NotAuthenticatedException.ts +10 -0
- package/Types/Exception/NotAuthorizedException.ts +10 -0
- package/Types/Exception/NotFoundException.ts +11 -0
- package/Types/Exception/PayloadTooLargeException.ts +11 -0
- package/Types/Exception/PaymentRequiredException.ts +10 -0
- package/Types/Exception/ServiceUnavailableException.ts +10 -0
- package/Types/Exception/SsoAuthorizationException.ts +10 -0
- package/Types/Exception/TenantNotFoundException.ts +11 -0
- package/Types/Exception/TimeoutException.ts +10 -0
- package/Types/Exception/TooManyRequestsException.ts +10 -0
- package/Types/Exception/UnableToReachServer.ts +10 -0
- package/Types/Exception/WebsiteRequestException.ts +10 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/JSONFunctions.ts +189 -43
- package/Types/Monitor/CephAlertTemplates.ts +157 -195
- package/Types/Monitor/CriteriaFilter.ts +60 -2
- package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
- package/Types/Monitor/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/MonitorCriteriaInstance.ts +76 -0
- package/Types/Monitor/MonitorMetricType.ts +71 -0
- package/Types/Monitor/MonitorStep.ts +76 -0
- package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
- package/Types/Monitor/MonitorType.ts +47 -1
- package/Types/Monitor/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/NetworkDeviceAlertPack.ts +22 -1
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
- package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
- package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
- package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
- package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
- package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
- package/Types/Permission.ts +90 -0
- package/Types/Probe/ProbeMonitorResponse.ts +16 -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/Telemetry/ErrorClass.ts +274 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
- package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
- package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
- package/Types/Telemetry/UnitOfWork.ts +59 -0
- package/Types/WebsiteRequest.ts +85 -3
- 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/CommandPalette/CommandPalette.tsx +2 -8
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +143 -25
- package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +4 -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/Modal/Modal.tsx +2 -8
- 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 +88 -0
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/SideMenu.tsx +123 -5
- package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
- package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
- package/UI/Components/SideOver/SideOver.tsx +21 -20
- package/UI/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/PageScrollLock.ts +79 -3
- package/UI/Utils/PermissionGate.ts +61 -0
- package/UI/Utils/SensitiveUrlToken.ts +112 -0
- package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
- package/UI/Utils/Telemetry/Telemetry.ts +10 -8
- package/UI/Utils/TestLLMProvider.ts +11 -0
- package/Utils/API.ts +129 -3
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
- package/Utils/HTTPResponseBodyReader.ts +221 -0
- package/Utils/Monitor/MonitorMetricType.ts +153 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
- package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -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/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.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/EnterpriseLicense.js +59 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.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/Index.js +10 -0
- package/build/dist/Models/DatabaseModels/Index.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/Monitor.js +75 -0
- package/build/dist/Models/DatabaseModels/Monitor.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/NetworkAlertPolicy.js +713 -0
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
- package/build/dist/Models/DatabaseModels/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/TelemetryException.js +123 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.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/UserNotificationEmailRollupBatch.js +363 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
- package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/LlmProviderAPI.js +108 -13
- package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
- package/build/dist/Server/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 +41 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/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/Index.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +52 -12
- package/build/dist/Server/Infrastructure/QueueWorker.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/Middleware/BearerTokenAuthorization.js +12 -0
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +326 -8
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +70 -16
- package/build/dist/Server/Services/AIBillingService.js.map +1 -1
- package/build/dist/Server/Services/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/EnterpriseLicenseInstanceService.js +167 -0
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/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/Index.js +10 -0
- package/build/dist/Server/Services/Index.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 +148 -21
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +89 -36
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
- package/build/dist/Server/Services/NotificationService.js +80 -17
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +88 -30
- 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/StatusPagePrivateUserService.js +92 -2
- package/build/dist/Server/Services/StatusPagePrivateUserService.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/UserNotificationEmailRollupBatchService.js +76 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +66 -20
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +90 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserTelegramService.js +257 -4
- package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
- package/build/dist/Server/Utils/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/DataSource/EgressGuard.js +121 -7
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +124 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +733 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
- package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +28 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +73 -1
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +287 -68
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +125 -13
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +54 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
- package/build/dist/Server/Utils/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 +41 -28
- 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/CaptureSpan.js +28 -8
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/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/Telemetry.js +162 -46
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- 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/AI/ExceptionAIClassification.js +10 -24
- package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
- 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/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
- package/build/dist/Types/Exception/ApiException.js +9 -0
- package/build/dist/Types/Exception/ApiException.js.map +1 -1
- package/build/dist/Types/Exception/BadDataException.js +10 -0
- package/build/dist/Types/Exception/BadDataException.js.map +1 -1
- package/build/dist/Types/Exception/BadRequestException.js +10 -0
- package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
- package/build/dist/Types/Exception/Exception.js +56 -0
- package/build/dist/Types/Exception/Exception.js.map +1 -1
- package/build/dist/Types/Exception/ForbiddenException.js +9 -0
- package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
- package/build/dist/Types/Exception/NotFoundException.js +10 -0
- package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
- package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
- package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
- package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
- package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
- package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
- package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/TimeoutException.js +9 -0
- package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
- package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
- package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
- package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
- package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
- package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +118 -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/CriteriaFilter.js +45 -2
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
- package/build/dist/Types/Monitor/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/MonitorCriteriaInstance.js +70 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +54 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +45 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/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/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
- package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
- package/build/dist/Types/Permission.js +80 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/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/Telemetry/ErrorClass.js +216 -0
- package/build/dist/Types/Telemetry/ErrorClass.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/Telemetry/UnitOfWork.js +59 -0
- package/build/dist/Types/Telemetry/UnitOfWork.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/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/CommandPalette/CommandPalette.js +2 -7
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +80 -6
- 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/EditionLabel/EditionLabel.js +3 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- 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/Modal/Modal.js +2 -7
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- 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 +77 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/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/PageScrollLock.js +31 -3
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +42 -1
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
- package/build/dist/UI/Utils/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/UI/Utils/TestLLMProvider.js +4 -5
- package/build/dist/UI/Utils/TestLLMProvider.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/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
- package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
- package/build/dist/Utils/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/package.json +2 -2
|
@@ -0,0 +1,1163 @@
|
|
|
1
|
+
import { describe, expect, test, beforeEach, afterEach } from "@jest/globals";
|
|
2
|
+
import TelemetryIngest, {
|
|
3
|
+
getEffectiveRequestsPerMinuteLimit,
|
|
4
|
+
TelemetryRequest,
|
|
5
|
+
} from "../../../Server/Middleware/TelemetryIngest";
|
|
6
|
+
import TelemetryIngestionKeyService from "../../../Server/Services/TelemetryIngestionKeyService";
|
|
7
|
+
import Response from "../../../Server/Utils/Response";
|
|
8
|
+
import logger from "../../../Server/Utils/Logger";
|
|
9
|
+
import TelemetryIngestionKeyRateLimiter, {
|
|
10
|
+
TelemetryIngestionKeyLimitDecision,
|
|
11
|
+
TelemetryIngestionKeyLimitOutcome,
|
|
12
|
+
} from "../../../Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter";
|
|
13
|
+
import {
|
|
14
|
+
ExpressRequest,
|
|
15
|
+
ExpressResponse,
|
|
16
|
+
NextFunction,
|
|
17
|
+
} from "../../../Server/Utils/Express";
|
|
18
|
+
import NotAuthenticatedException from "../../../Types/Exception/NotAuthenticatedException";
|
|
19
|
+
import NotAuthorizedException from "../../../Types/Exception/NotAuthorizedException";
|
|
20
|
+
import TooManyRequestsException from "../../../Types/Exception/TooManyRequestsException";
|
|
21
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
22
|
+
import TelemetryIngestionKeyPolicy, {
|
|
23
|
+
DEFAULT_BROWSER_KEY_REQUESTS_PER_MINUTE,
|
|
24
|
+
} from "../../../Types/Telemetry/TelemetryIngestionKeyPolicy";
|
|
25
|
+
import TelemetryIngestionKeyType from "../../../Types/Telemetry/TelemetryIngestionKeyType";
|
|
26
|
+
import TelemetryIngestSurface, {
|
|
27
|
+
BROWSER_ALLOWED_INGEST_SURFACES,
|
|
28
|
+
getIngestSurfaceReadableName,
|
|
29
|
+
} from "../../../Types/Telemetry/TelemetryIngestSurface";
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
* The ingest guard is the ONLY thing standing between a telemetry ingestion
|
|
33
|
+
* key that is deliberately published in a customer's page source and the write
|
|
34
|
+
* side of their project. Everything else about browser keys - the origin
|
|
35
|
+
* allowlist column, the surface enum, the expiry, the kill switch - is inert
|
|
36
|
+
* configuration until this middleware reads it, so every constraint the
|
|
37
|
+
* feature claims has to be pinned HERE or it is not enforced anywhere.
|
|
38
|
+
*
|
|
39
|
+
* Four properties, in order of how expensive they are to get wrong:
|
|
40
|
+
*
|
|
41
|
+
* 1. A BROWSER KEY FAILS CLOSED ON EVERY AXIS. Wrong surface, wrong origin,
|
|
42
|
+
* missing Origin header and - the one that matters most - an EMPTY
|
|
43
|
+
* allowlist are all refusals. Empty-means-any-origin is the reading
|
|
44
|
+
* SessionReplayGateCache deliberately takes for its own column, and
|
|
45
|
+
* taking it here would recreate exactly the unbounded public write
|
|
46
|
+
* credential this feature exists to delete. The legacy unnamed-surface
|
|
47
|
+
* alias refuses browser keys too, so a route someone forgets to migrate
|
|
48
|
+
* is a support ticket rather than a hole.
|
|
49
|
+
*
|
|
50
|
+
* 2. A SERVER KEY BEHAVES EXACTLY AS IT DID BEFORE THIS SHIPPED. Every key
|
|
51
|
+
* that predates the feature resolves as Server, enabled, no expiry, no
|
|
52
|
+
* limit, and it must reach every surface, ignore the Origin header
|
|
53
|
+
* entirely, and - asserted explicitly - never touch the rate limiter,
|
|
54
|
+
* because that path fronts every OTLP payload the product accepts and is
|
|
55
|
+
* not allowed to grow a Redis round trip.
|
|
56
|
+
*
|
|
57
|
+
* 3. THE LIMITER FAILS OPEN. CounterUnavailable admits the request. That is
|
|
58
|
+
* a deliberate trade - a Redis blip must not become permanent,
|
|
59
|
+
* unreplayable customer data loss with their incident dashboards dark -
|
|
60
|
+
* and a future "hardening" pass would otherwise flip it silently.
|
|
61
|
+
*
|
|
62
|
+
* 4. THE TOKEN NEVER LEAKS. Ingestion keys are secrets; a refusal that
|
|
63
|
+
* echoes the presented value into a log line or a response body is a
|
|
64
|
+
* credential disclosure. Asserted across every refusal branch at once.
|
|
65
|
+
*
|
|
66
|
+
* Nothing here touches Postgres or Redis: the key resolver, the limiter and
|
|
67
|
+
* the responder are all mocked at the module boundary.
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
/*
|
|
71
|
+
* The token resolver is mocked so every key shape - disabled, expired,
|
|
72
|
+
* browser, server - can be forced without a database.
|
|
73
|
+
*/
|
|
74
|
+
jest.mock("../../../Server/Services/TelemetryIngestionKeyService", () => {
|
|
75
|
+
return {
|
|
76
|
+
__esModule: true,
|
|
77
|
+
default: {
|
|
78
|
+
getPolicyFromSecretKey: jest.fn(),
|
|
79
|
+
getProjectIdFromSecretKey: jest.fn(),
|
|
80
|
+
markUsed: jest.fn(),
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
jest.mock("../../../Server/Utils/Response", () => {
|
|
86
|
+
return {
|
|
87
|
+
__esModule: true,
|
|
88
|
+
default: {
|
|
89
|
+
sendErrorResponse: jest.fn(),
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
/*
|
|
95
|
+
* Only the default export (the class with consume()) is replaced. The real
|
|
96
|
+
* outcome enum is kept, because the middleware compares against it by value
|
|
97
|
+
* and a hand-rolled copy in the mock would let a renamed member pass this
|
|
98
|
+
* suite while breaking production.
|
|
99
|
+
*/
|
|
100
|
+
jest.mock(
|
|
101
|
+
"../../../Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter",
|
|
102
|
+
() => {
|
|
103
|
+
const actual: Record<string, unknown> = jest.requireActual(
|
|
104
|
+
"../../../Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter",
|
|
105
|
+
) as Record<string, unknown>;
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
__esModule: true,
|
|
109
|
+
...actual,
|
|
110
|
+
default: {
|
|
111
|
+
consume: jest.fn(),
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
type MockFn = jest.Mock;
|
|
118
|
+
|
|
119
|
+
const PROJECT_ID: string = "5d3b0f1a-0000-4000-8000-000000000001";
|
|
120
|
+
const INGESTION_KEY_ID: string = "5d3b0f1a-0000-4000-8000-000000000002";
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
* Shaped like a real (mistyped) ingestion key so the substring checks in the
|
|
124
|
+
* hygiene suite are meaningful.
|
|
125
|
+
*/
|
|
126
|
+
const SENTINEL_TOKEN: string = "sentinel-secret-ingestion-key-12345";
|
|
127
|
+
|
|
128
|
+
const ALLOWED_ORIGIN: string = "https://app.example.com";
|
|
129
|
+
|
|
130
|
+
const ALL_SURFACES: Array<TelemetryIngestSurface> = Object.values(
|
|
131
|
+
TelemetryIngestSurface,
|
|
132
|
+
) as Array<TelemetryIngestSurface>;
|
|
133
|
+
|
|
134
|
+
const BROWSER_DISALLOWED_SURFACES: Array<TelemetryIngestSurface> =
|
|
135
|
+
ALL_SURFACES.filter((surface: TelemetryIngestSurface): boolean => {
|
|
136
|
+
return !BROWSER_ALLOWED_INGEST_SURFACES.has(surface);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
type BuildPolicyFunction = (
|
|
140
|
+
overrides: Partial<TelemetryIngestionKeyPolicy>,
|
|
141
|
+
) => TelemetryIngestionKeyPolicy;
|
|
142
|
+
|
|
143
|
+
const buildPolicy: BuildPolicyFunction = (
|
|
144
|
+
overrides: Partial<TelemetryIngestionKeyPolicy>,
|
|
145
|
+
): TelemetryIngestionKeyPolicy => {
|
|
146
|
+
return {
|
|
147
|
+
ingestionKeyId: new ObjectID(INGESTION_KEY_ID),
|
|
148
|
+
projectId: new ObjectID(PROJECT_ID),
|
|
149
|
+
keyType: TelemetryIngestionKeyType.Server,
|
|
150
|
+
allowedOrigins: [],
|
|
151
|
+
pinnedServiceName: null,
|
|
152
|
+
isEnabled: true,
|
|
153
|
+
expiresAt: null,
|
|
154
|
+
requestsPerMinuteLimit: null,
|
|
155
|
+
...overrides,
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
const buildBrowserPolicy: BuildPolicyFunction = (
|
|
160
|
+
overrides: Partial<TelemetryIngestionKeyPolicy>,
|
|
161
|
+
): TelemetryIngestionKeyPolicy => {
|
|
162
|
+
return buildPolicy({
|
|
163
|
+
keyType: TelemetryIngestionKeyType.Browser,
|
|
164
|
+
allowedOrigins: [ALLOWED_ORIGIN],
|
|
165
|
+
...overrides,
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
type ResolveToFunction = (policy: TelemetryIngestionKeyPolicy | null) => void;
|
|
170
|
+
|
|
171
|
+
const resolveTo: ResolveToFunction = (
|
|
172
|
+
policy: TelemetryIngestionKeyPolicy | null,
|
|
173
|
+
): void => {
|
|
174
|
+
(
|
|
175
|
+
TelemetryIngestionKeyService.getPolicyFromSecretKey as MockFn
|
|
176
|
+
).mockResolvedValue(policy as never);
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
interface RunResult {
|
|
180
|
+
req: ExpressRequest;
|
|
181
|
+
res: ExpressResponse;
|
|
182
|
+
next: MockFn;
|
|
183
|
+
setHeader: MockFn;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
type RunFunction = (
|
|
187
|
+
surface: TelemetryIngestSurface | null,
|
|
188
|
+
headers: Record<string, string>,
|
|
189
|
+
) => Promise<RunResult>;
|
|
190
|
+
|
|
191
|
+
/*
|
|
192
|
+
* `surface === null` runs the legacy isAuthorizedServiceMiddleware alias,
|
|
193
|
+
* which is the un-migrated-route case rather than a separate code path.
|
|
194
|
+
*/
|
|
195
|
+
const run: RunFunction = async (
|
|
196
|
+
surface: TelemetryIngestSurface | null,
|
|
197
|
+
headers: Record<string, string>,
|
|
198
|
+
): Promise<RunResult> => {
|
|
199
|
+
const req: ExpressRequest = {
|
|
200
|
+
headers,
|
|
201
|
+
id: "test-request-id",
|
|
202
|
+
} as unknown as ExpressRequest;
|
|
203
|
+
|
|
204
|
+
const setHeader: MockFn = jest.fn();
|
|
205
|
+
const res: ExpressResponse = {
|
|
206
|
+
setHeader,
|
|
207
|
+
} as unknown as ExpressResponse;
|
|
208
|
+
const next: MockFn = jest.fn();
|
|
209
|
+
|
|
210
|
+
if (surface === null) {
|
|
211
|
+
await TelemetryIngest.isAuthorizedServiceMiddleware(
|
|
212
|
+
req,
|
|
213
|
+
res,
|
|
214
|
+
next as unknown as NextFunction,
|
|
215
|
+
);
|
|
216
|
+
} else {
|
|
217
|
+
await TelemetryIngest.forSurface(surface)(
|
|
218
|
+
req,
|
|
219
|
+
res,
|
|
220
|
+
next as unknown as NextFunction,
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return { req, res, next, setHeader };
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
type TokenHeadersFunction = (
|
|
228
|
+
extra?: Record<string, string>,
|
|
229
|
+
) => Record<string, string>;
|
|
230
|
+
|
|
231
|
+
const tokenHeaders: TokenHeadersFunction = (
|
|
232
|
+
extra?: Record<string, string>,
|
|
233
|
+
): Record<string, string> => {
|
|
234
|
+
return {
|
|
235
|
+
"x-oneuptime-token": SENTINEL_TOKEN,
|
|
236
|
+
...(extra || {}),
|
|
237
|
+
};
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
type RefusalFunction = () => Error;
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* The exception handed to Response.sendErrorResponse IS the status code:
|
|
244
|
+
* NotAuthenticatedException is 401, NotAuthorizedException 403,
|
|
245
|
+
* TooManyRequestsException 429. Asserting on the class is asserting on what
|
|
246
|
+
* the caller receives.
|
|
247
|
+
*/
|
|
248
|
+
const refusal: RefusalFunction = (): Error => {
|
|
249
|
+
const sendErrorResponse: MockFn = Response.sendErrorResponse as MockFn;
|
|
250
|
+
|
|
251
|
+
expect(sendErrorResponse).toHaveBeenCalledTimes(1);
|
|
252
|
+
|
|
253
|
+
return sendErrorResponse.mock.calls[0]?.[2] as Error;
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
type LimiterAnswersFunction = (
|
|
257
|
+
outcome: TelemetryIngestionKeyLimitOutcome,
|
|
258
|
+
extra?: Partial<TelemetryIngestionKeyLimitDecision>,
|
|
259
|
+
) => void;
|
|
260
|
+
|
|
261
|
+
const limiterAnswers: LimiterAnswersFunction = (
|
|
262
|
+
outcome: TelemetryIngestionKeyLimitOutcome,
|
|
263
|
+
extra?: Partial<TelemetryIngestionKeyLimitDecision>,
|
|
264
|
+
): void => {
|
|
265
|
+
(TelemetryIngestionKeyRateLimiter.consume as MockFn).mockResolvedValue({
|
|
266
|
+
outcome,
|
|
267
|
+
...(extra || {}),
|
|
268
|
+
} as never);
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
type ConsumeArgsFunction = () => Record<string, unknown>;
|
|
272
|
+
|
|
273
|
+
const firstConsumeCallArgs: ConsumeArgsFunction = (): Record<
|
|
274
|
+
string,
|
|
275
|
+
unknown
|
|
276
|
+
> => {
|
|
277
|
+
return (TelemetryIngestionKeyRateLimiter.consume as MockFn).mock
|
|
278
|
+
.calls[0]?.[0] as Record<string, unknown>;
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
type ArrangeDefaultsFunction = () => void;
|
|
282
|
+
|
|
283
|
+
const arrangeDefaults: ArrangeDefaultsFunction = (): void => {
|
|
284
|
+
/*
|
|
285
|
+
* markUsed is fire-and-forget with a .catch() attached, so it has to return
|
|
286
|
+
* a promise or the success path throws before it ever reaches next().
|
|
287
|
+
*/
|
|
288
|
+
(TelemetryIngestionKeyService.markUsed as MockFn).mockResolvedValue(
|
|
289
|
+
undefined as never,
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
limiterAnswers(TelemetryIngestionKeyLimitOutcome.Allowed);
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
describe("TelemetryIngest browser ingestion key guard", () => {
|
|
296
|
+
beforeEach(() => {
|
|
297
|
+
jest.clearAllMocks();
|
|
298
|
+
arrangeDefaults();
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
describe("token resolution", () => {
|
|
302
|
+
test("a request with no ingestion token is refused 401 without consulting the resolver", async () => {
|
|
303
|
+
const result: RunResult = await run(
|
|
304
|
+
TelemetryIngestSurface.OtelTraces,
|
|
305
|
+
{},
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
expect(
|
|
309
|
+
TelemetryIngestionKeyService.getPolicyFromSecretKey as MockFn,
|
|
310
|
+
).not.toHaveBeenCalled();
|
|
311
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
312
|
+
|
|
313
|
+
const error: Error = refusal();
|
|
314
|
+
expect(error).toBeInstanceOf(NotAuthenticatedException);
|
|
315
|
+
expect(error.message).toBe(
|
|
316
|
+
"Missing ingestion token. Send your OneUptime telemetry ingestion key in the x-oneuptime-token header.",
|
|
317
|
+
);
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
test("a token that resolves to no key is refused 401 with the unchanged invalid-token message", async () => {
|
|
321
|
+
resolveTo(null);
|
|
322
|
+
|
|
323
|
+
const result: RunResult = await run(
|
|
324
|
+
TelemetryIngestSurface.OtelTraces,
|
|
325
|
+
tokenHeaders(),
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
329
|
+
|
|
330
|
+
const error: Error = refusal();
|
|
331
|
+
expect(error).toBeInstanceOf(NotAuthenticatedException);
|
|
332
|
+
expect(error.message).toBe(
|
|
333
|
+
"Invalid ingestion token. Send a valid OneUptime telemetry ingestion key in the x-oneuptime-token header.",
|
|
334
|
+
);
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
test("all three accepted header names still carry the ingestion token", async () => {
|
|
338
|
+
for (const headerName of [
|
|
339
|
+
"x-oneuptime-token",
|
|
340
|
+
"x-oneuptime-service-token",
|
|
341
|
+
"x-oneuptime-ingestion-key",
|
|
342
|
+
]) {
|
|
343
|
+
jest.clearAllMocks();
|
|
344
|
+
arrangeDefaults();
|
|
345
|
+
resolveTo(buildPolicy({}));
|
|
346
|
+
|
|
347
|
+
const result: RunResult = await run(TelemetryIngestSurface.OtelTraces, {
|
|
348
|
+
[headerName]: SENTINEL_TOKEN,
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
expect(
|
|
352
|
+
TelemetryIngestionKeyService.getPolicyFromSecretKey as MockFn,
|
|
353
|
+
).toHaveBeenCalledWith(SENTINEL_TOKEN);
|
|
354
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
355
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
/*
|
|
361
|
+
* Everything in this block is behaviour that existed before browser keys
|
|
362
|
+
* did. A failure here is a regression for every installation on upgrade day,
|
|
363
|
+
* not a gap in a new feature.
|
|
364
|
+
*/
|
|
365
|
+
describe("server key backwards compatibility", () => {
|
|
366
|
+
test("an enabled server key is admitted on every ingest surface, with the project and policy put on the request", async () => {
|
|
367
|
+
for (const surface of ALL_SURFACES) {
|
|
368
|
+
jest.clearAllMocks();
|
|
369
|
+
arrangeDefaults();
|
|
370
|
+
|
|
371
|
+
const policy: TelemetryIngestionKeyPolicy = buildPolicy({});
|
|
372
|
+
resolveTo(policy);
|
|
373
|
+
|
|
374
|
+
const result: RunResult = await run(surface, tokenHeaders());
|
|
375
|
+
|
|
376
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
377
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
378
|
+
expect((result.req as TelemetryRequest).projectId.toString()).toBe(
|
|
379
|
+
PROJECT_ID,
|
|
380
|
+
);
|
|
381
|
+
expect((result.req as TelemetryRequest).ingestionKeyPolicy).toBe(
|
|
382
|
+
policy,
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
test("a server key with no configured limit never reaches the rate limiter at all", async () => {
|
|
388
|
+
resolveTo(buildPolicy({ requestsPerMinuteLimit: null }));
|
|
389
|
+
|
|
390
|
+
const result: RunResult = await run(
|
|
391
|
+
TelemetryIngestSurface.OtelTraces,
|
|
392
|
+
tokenHeaders(),
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
/*
|
|
396
|
+
* Not "is allowed" - never CALLED. The overwhelmingly common request in
|
|
397
|
+
* production is exactly this shape, and a Redis round trip added to it
|
|
398
|
+
* is latency on every OTLP payload the product accepts.
|
|
399
|
+
*/
|
|
400
|
+
expect(
|
|
401
|
+
TelemetryIngestionKeyRateLimiter.consume as MockFn,
|
|
402
|
+
).not.toHaveBeenCalled();
|
|
403
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
test("a server key is admitted when the request sends no Origin header", async () => {
|
|
407
|
+
resolveTo(buildPolicy({ allowedOrigins: [ALLOWED_ORIGIN] }));
|
|
408
|
+
|
|
409
|
+
const result: RunResult = await run(
|
|
410
|
+
TelemetryIngestSurface.OtelTraces,
|
|
411
|
+
tokenHeaders(),
|
|
412
|
+
);
|
|
413
|
+
|
|
414
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
415
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
test("a server key is admitted even when the request carries an Origin outside its allowlist", async () => {
|
|
419
|
+
resolveTo(buildPolicy({ allowedOrigins: [ALLOWED_ORIGIN] }));
|
|
420
|
+
|
|
421
|
+
const result: RunResult = await run(
|
|
422
|
+
TelemetryIngestSurface.OtelTraces,
|
|
423
|
+
tokenHeaders({ origin: "https://not-on-the-list.example.com" }),
|
|
424
|
+
);
|
|
425
|
+
|
|
426
|
+
/*
|
|
427
|
+
* A server key is never published, so an Origin header on a request
|
|
428
|
+
* carrying one says nothing about who is calling. Enforcing it would
|
|
429
|
+
* break every proxy and browser-adjacent server client that sends one.
|
|
430
|
+
*/
|
|
431
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
432
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
test("a policy whose key type is absent is treated as a server key, not as a browser key", async () => {
|
|
436
|
+
/*
|
|
437
|
+
* Every key that predates this feature reads back with keyType NULL.
|
|
438
|
+
* TelemetryIngestionKeyService resolves that to Server, but the guard
|
|
439
|
+
* carries its own copy of the rule (`keyType === Browser`), and that is
|
|
440
|
+
* the one that decides. Pinned here because getting it backwards - a
|
|
441
|
+
* missing type treated as Browser - would refuse every existing
|
|
442
|
+
* customer's server ingest the moment they upgraded: wrong surface,
|
|
443
|
+
* missing Origin header, closed allowlist, all at once.
|
|
444
|
+
*/
|
|
445
|
+
resolveTo(
|
|
446
|
+
buildPolicy({
|
|
447
|
+
keyType: null as unknown as TelemetryIngestionKeyType,
|
|
448
|
+
}),
|
|
449
|
+
);
|
|
450
|
+
|
|
451
|
+
const result: RunResult = await run(
|
|
452
|
+
TelemetryIngestSurface.Syslog,
|
|
453
|
+
tokenHeaders(),
|
|
454
|
+
);
|
|
455
|
+
|
|
456
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
457
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
458
|
+
expect(
|
|
459
|
+
TelemetryIngestionKeyRateLimiter.consume as MockFn,
|
|
460
|
+
).not.toHaveBeenCalled();
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
test("a server key with an explicitly configured limit is rate limited like any other key", async () => {
|
|
464
|
+
resolveTo(buildPolicy({ requestsPerMinuteLimit: 120 }));
|
|
465
|
+
|
|
466
|
+
const result: RunResult = await run(
|
|
467
|
+
TelemetryIngestSurface.OtelTraces,
|
|
468
|
+
tokenHeaders(),
|
|
469
|
+
);
|
|
470
|
+
|
|
471
|
+
expect(
|
|
472
|
+
TelemetryIngestionKeyRateLimiter.consume as MockFn,
|
|
473
|
+
).toHaveBeenCalledTimes(1);
|
|
474
|
+
|
|
475
|
+
const call: Record<string, unknown> = firstConsumeCallArgs();
|
|
476
|
+
expect(call["limitPerMinute"]).toBe(120);
|
|
477
|
+
expect(String(call["ingestionKeyId"])).toBe(INGESTION_KEY_ID);
|
|
478
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
479
|
+
});
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
describe("kill switch and expiry", () => {
|
|
483
|
+
test("a disabled key is refused 403 whatever its type", async () => {
|
|
484
|
+
for (const keyType of [
|
|
485
|
+
TelemetryIngestionKeyType.Server,
|
|
486
|
+
TelemetryIngestionKeyType.Browser,
|
|
487
|
+
]) {
|
|
488
|
+
jest.clearAllMocks();
|
|
489
|
+
arrangeDefaults();
|
|
490
|
+
resolveTo(
|
|
491
|
+
buildPolicy({
|
|
492
|
+
keyType,
|
|
493
|
+
isEnabled: false,
|
|
494
|
+
allowedOrigins: [ALLOWED_ORIGIN],
|
|
495
|
+
}),
|
|
496
|
+
);
|
|
497
|
+
|
|
498
|
+
const result: RunResult = await run(
|
|
499
|
+
TelemetryIngestSurface.OtelTraces,
|
|
500
|
+
tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
501
|
+
);
|
|
502
|
+
|
|
503
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
504
|
+
|
|
505
|
+
const error: Error = refusal();
|
|
506
|
+
expect(error).toBeInstanceOf(NotAuthorizedException);
|
|
507
|
+
expect(error.message).toBe(
|
|
508
|
+
"This telemetry ingestion key has been disabled.",
|
|
509
|
+
);
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
test("the kill switch is checked before the surface and origin rules, so disabling a leaked key always reports as disabled", async () => {
|
|
514
|
+
resolveTo(
|
|
515
|
+
buildBrowserPolicy({
|
|
516
|
+
isEnabled: false,
|
|
517
|
+
allowedOrigins: ["https://only-this.example.com"],
|
|
518
|
+
}),
|
|
519
|
+
);
|
|
520
|
+
|
|
521
|
+
/*
|
|
522
|
+
* Disallowed surface AND a disallowed origin AND disabled. Whichever
|
|
523
|
+
* refusal wins is what a customer sees while working out whether their
|
|
524
|
+
* kill switch actually took effect, so it has to be the disable.
|
|
525
|
+
*/
|
|
526
|
+
await run(
|
|
527
|
+
TelemetryIngestSurface.Syslog,
|
|
528
|
+
tokenHeaders({ origin: "https://somewhere-else.example.com" }),
|
|
529
|
+
);
|
|
530
|
+
|
|
531
|
+
const error: Error = refusal();
|
|
532
|
+
expect(error).toBeInstanceOf(NotAuthorizedException);
|
|
533
|
+
expect(error.message).toBe(
|
|
534
|
+
"This telemetry ingestion key has been disabled.",
|
|
535
|
+
);
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
test("a key whose expiry is in the past is refused 401", async () => {
|
|
539
|
+
resolveTo(buildPolicy({ expiresAt: new Date(Date.now() - 60 * 1000) }));
|
|
540
|
+
|
|
541
|
+
const result: RunResult = await run(
|
|
542
|
+
TelemetryIngestSurface.OtelTraces,
|
|
543
|
+
tokenHeaders(),
|
|
544
|
+
);
|
|
545
|
+
|
|
546
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
547
|
+
|
|
548
|
+
const error: Error = refusal();
|
|
549
|
+
expect(error).toBeInstanceOf(NotAuthenticatedException);
|
|
550
|
+
expect(error.message).toBe("This telemetry ingestion key expired.");
|
|
551
|
+
});
|
|
552
|
+
|
|
553
|
+
test("a key whose expiry is exactly now is refused rather than admitted on the boundary", async () => {
|
|
554
|
+
const frozenNow: number = new Date("2026-01-01T00:00:00.000Z").getTime();
|
|
555
|
+
const nowSpy: { mockRestore: () => void } = jest
|
|
556
|
+
.spyOn(Date, "now")
|
|
557
|
+
.mockReturnValue(frozenNow) as unknown as { mockRestore: () => void };
|
|
558
|
+
|
|
559
|
+
try {
|
|
560
|
+
resolveTo(buildPolicy({ expiresAt: new Date(frozenNow) }));
|
|
561
|
+
|
|
562
|
+
const result: RunResult = await run(
|
|
563
|
+
TelemetryIngestSurface.OtelTraces,
|
|
564
|
+
tokenHeaders(),
|
|
565
|
+
);
|
|
566
|
+
|
|
567
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
568
|
+
expect(refusal()).toBeInstanceOf(NotAuthenticatedException);
|
|
569
|
+
} finally {
|
|
570
|
+
nowSpy.mockRestore();
|
|
571
|
+
}
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
test("a key whose expiry is in the future is admitted", async () => {
|
|
575
|
+
resolveTo(
|
|
576
|
+
buildPolicy({ expiresAt: new Date(Date.now() + 60 * 60 * 1000) }),
|
|
577
|
+
);
|
|
578
|
+
|
|
579
|
+
const result: RunResult = await run(
|
|
580
|
+
TelemetryIngestSurface.OtelTraces,
|
|
581
|
+
tokenHeaders(),
|
|
582
|
+
);
|
|
583
|
+
|
|
584
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
585
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
test("a key with no expiry set never expires", async () => {
|
|
589
|
+
resolveTo(buildPolicy({ expiresAt: null }));
|
|
590
|
+
|
|
591
|
+
const result: RunResult = await run(
|
|
592
|
+
TelemetryIngestSurface.OtelTraces,
|
|
593
|
+
tokenHeaders(),
|
|
594
|
+
);
|
|
595
|
+
|
|
596
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
597
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
test("the expired-key refusal does not disclose when the key expired", async () => {
|
|
601
|
+
const expiredAt: Date = new Date("2021-03-04T05:06:07.000Z");
|
|
602
|
+
resolveTo(buildPolicy({ expiresAt: expiredAt }));
|
|
603
|
+
|
|
604
|
+
await run(TelemetryIngestSurface.OtelTraces, tokenHeaders());
|
|
605
|
+
|
|
606
|
+
const message: string = refusal().message;
|
|
607
|
+
|
|
608
|
+
/*
|
|
609
|
+
* Whoever is holding a dead key is not entitled to details of the
|
|
610
|
+
* project's credentials; the owner reads the expiry in the dashboard.
|
|
611
|
+
*/
|
|
612
|
+
expect(message).not.toContain(expiredAt.toISOString());
|
|
613
|
+
expect(message).not.toContain(String(expiredAt.getTime()));
|
|
614
|
+
expect(message).not.toContain("2021");
|
|
615
|
+
});
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
describe("browser key surface allowlist", () => {
|
|
619
|
+
test("a browser key is admitted on exactly the four surfaces a real browser agent emits", async () => {
|
|
620
|
+
expect(Array.from(BROWSER_ALLOWED_INGEST_SURFACES).sort()).toEqual(
|
|
621
|
+
[
|
|
622
|
+
TelemetryIngestSurface.OtelLogs,
|
|
623
|
+
TelemetryIngestSurface.OtelMetrics,
|
|
624
|
+
TelemetryIngestSurface.OtelTraces,
|
|
625
|
+
TelemetryIngestSurface.SessionReplay,
|
|
626
|
+
].sort(),
|
|
627
|
+
);
|
|
628
|
+
|
|
629
|
+
for (const surface of Array.from(BROWSER_ALLOWED_INGEST_SURFACES)) {
|
|
630
|
+
jest.clearAllMocks();
|
|
631
|
+
arrangeDefaults();
|
|
632
|
+
resolveTo(buildBrowserPolicy({}));
|
|
633
|
+
|
|
634
|
+
const result: RunResult = await run(
|
|
635
|
+
surface,
|
|
636
|
+
tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
637
|
+
);
|
|
638
|
+
|
|
639
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
640
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
641
|
+
}
|
|
642
|
+
});
|
|
643
|
+
|
|
644
|
+
test("a browser key is refused 403 on every other surface, naming the surface and pointing at a server key", async () => {
|
|
645
|
+
expect(BROWSER_DISALLOWED_SURFACES.length).toBe(10);
|
|
646
|
+
|
|
647
|
+
for (const surface of BROWSER_DISALLOWED_SURFACES) {
|
|
648
|
+
jest.clearAllMocks();
|
|
649
|
+
arrangeDefaults();
|
|
650
|
+
resolveTo(buildBrowserPolicy({}));
|
|
651
|
+
|
|
652
|
+
const result: RunResult = await run(
|
|
653
|
+
surface,
|
|
654
|
+
tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
655
|
+
);
|
|
656
|
+
|
|
657
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
658
|
+
|
|
659
|
+
const error: Error = refusal();
|
|
660
|
+
expect(error).toBeInstanceOf(NotAuthorizedException);
|
|
661
|
+
expect(error.message).toBe(
|
|
662
|
+
`A browser ingestion key cannot be used for ${getIngestSurfaceReadableName(
|
|
663
|
+
surface,
|
|
664
|
+
)}. Use a server ingestion key.`,
|
|
665
|
+
);
|
|
666
|
+
}
|
|
667
|
+
});
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
describe("browser key origin allowlist", () => {
|
|
671
|
+
test("a browser key is admitted from an origin on its allowlist", async () => {
|
|
672
|
+
resolveTo(buildBrowserPolicy({ allowedOrigins: [ALLOWED_ORIGIN] }));
|
|
673
|
+
|
|
674
|
+
const result: RunResult = await run(
|
|
675
|
+
TelemetryIngestSurface.OtelTraces,
|
|
676
|
+
tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
677
|
+
);
|
|
678
|
+
|
|
679
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
680
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
681
|
+
});
|
|
682
|
+
|
|
683
|
+
test("a browser key is admitted from a subdomain covered by a wildcard entry", async () => {
|
|
684
|
+
resolveTo(
|
|
685
|
+
buildBrowserPolicy({ allowedOrigins: ["https://*.example.com"] }),
|
|
686
|
+
);
|
|
687
|
+
|
|
688
|
+
const result: RunResult = await run(
|
|
689
|
+
TelemetryIngestSurface.OtelTraces,
|
|
690
|
+
tokenHeaders({ origin: "https://tenant-42.example.com" }),
|
|
691
|
+
);
|
|
692
|
+
|
|
693
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
694
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
695
|
+
});
|
|
696
|
+
|
|
697
|
+
test("a browser key is refused 403 from an origin outside its allowlist, and the refusal echoes the offending origin", async () => {
|
|
698
|
+
const offendingOrigin: string = "https://attacker.example.net";
|
|
699
|
+
resolveTo(buildBrowserPolicy({ allowedOrigins: [ALLOWED_ORIGIN] }));
|
|
700
|
+
|
|
701
|
+
const result: RunResult = await run(
|
|
702
|
+
TelemetryIngestSurface.OtelTraces,
|
|
703
|
+
tokenHeaders({ origin: offendingOrigin }),
|
|
704
|
+
);
|
|
705
|
+
|
|
706
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
707
|
+
|
|
708
|
+
const error: Error = refusal();
|
|
709
|
+
expect(error).toBeInstanceOf(NotAuthorizedException);
|
|
710
|
+
/*
|
|
711
|
+
* The origin is the caller's own value and never a secret, and a
|
|
712
|
+
* scheme / port / trailing-slash mismatch stays invisible until the two
|
|
713
|
+
* strings are put side by side.
|
|
714
|
+
*/
|
|
715
|
+
expect(error.message).toContain(offendingOrigin);
|
|
716
|
+
});
|
|
717
|
+
|
|
718
|
+
test("a browser key request with no Origin header is refused 403 and told the header was missing", async () => {
|
|
719
|
+
resolveTo(buildBrowserPolicy({ allowedOrigins: [ALLOWED_ORIGIN] }));
|
|
720
|
+
|
|
721
|
+
const result: RunResult = await run(
|
|
722
|
+
TelemetryIngestSurface.OtelTraces,
|
|
723
|
+
tokenHeaders(),
|
|
724
|
+
);
|
|
725
|
+
|
|
726
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
727
|
+
|
|
728
|
+
const error: Error = refusal();
|
|
729
|
+
expect(error).toBeInstanceOf(NotAuthorizedException);
|
|
730
|
+
expect(error.message).toContain("did not send an Origin header");
|
|
731
|
+
// "Origin is not allowed" reads like a bug and helps nobody.
|
|
732
|
+
expect(error.message).not.toContain("Origin is not allowed");
|
|
733
|
+
});
|
|
734
|
+
|
|
735
|
+
test("a browser key with an EMPTY allowlist is refused - empty fails closed, it does not mean any origin", async () => {
|
|
736
|
+
resolveTo(buildBrowserPolicy({ allowedOrigins: [] }));
|
|
737
|
+
|
|
738
|
+
const result: RunResult = await run(
|
|
739
|
+
TelemetryIngestSurface.OtelTraces,
|
|
740
|
+
tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
741
|
+
);
|
|
742
|
+
|
|
743
|
+
/*
|
|
744
|
+
* THE most important assertion in this file. SessionReplayGateCache
|
|
745
|
+
* reads an empty allowlist as "any origin" because that feature shipped
|
|
746
|
+
* that way; reading it the same way here would make a key published in
|
|
747
|
+
* a page usable from anywhere on the internet, which is precisely the
|
|
748
|
+
* credential this feature exists to remove.
|
|
749
|
+
*/
|
|
750
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
751
|
+
|
|
752
|
+
const error: Error = refusal();
|
|
753
|
+
expect(error).toBeInstanceOf(NotAuthorizedException);
|
|
754
|
+
});
|
|
755
|
+
});
|
|
756
|
+
|
|
757
|
+
describe("per-key rate limit", () => {
|
|
758
|
+
test("a browser key with no configured limit is held to the shipped browser default", async () => {
|
|
759
|
+
resolveTo(buildBrowserPolicy({ requestsPerMinuteLimit: null }));
|
|
760
|
+
|
|
761
|
+
await run(
|
|
762
|
+
TelemetryIngestSurface.OtelTraces,
|
|
763
|
+
tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
764
|
+
);
|
|
765
|
+
|
|
766
|
+
expect(
|
|
767
|
+
TelemetryIngestionKeyRateLimiter.consume as MockFn,
|
|
768
|
+
).toHaveBeenCalledTimes(1);
|
|
769
|
+
expect(firstConsumeCallArgs()["limitPerMinute"]).toBe(
|
|
770
|
+
DEFAULT_BROWSER_KEY_REQUESTS_PER_MINUTE,
|
|
771
|
+
);
|
|
772
|
+
expect(DEFAULT_BROWSER_KEY_REQUESTS_PER_MINUTE).toBe(6000);
|
|
773
|
+
});
|
|
774
|
+
|
|
775
|
+
test("an explicitly configured limit wins for both key types", async () => {
|
|
776
|
+
for (const keyType of [
|
|
777
|
+
TelemetryIngestionKeyType.Server,
|
|
778
|
+
TelemetryIngestionKeyType.Browser,
|
|
779
|
+
]) {
|
|
780
|
+
jest.clearAllMocks();
|
|
781
|
+
arrangeDefaults();
|
|
782
|
+
resolveTo(
|
|
783
|
+
buildPolicy({
|
|
784
|
+
keyType,
|
|
785
|
+
allowedOrigins: [ALLOWED_ORIGIN],
|
|
786
|
+
requestsPerMinuteLimit: 42,
|
|
787
|
+
}),
|
|
788
|
+
);
|
|
789
|
+
|
|
790
|
+
await run(
|
|
791
|
+
TelemetryIngestSurface.OtelTraces,
|
|
792
|
+
tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
793
|
+
);
|
|
794
|
+
|
|
795
|
+
expect(firstConsumeCallArgs()["limitPerMinute"]).toBe(42);
|
|
796
|
+
}
|
|
797
|
+
});
|
|
798
|
+
|
|
799
|
+
test("a key over its limit is refused 429 and told when to come back", async () => {
|
|
800
|
+
resolveTo(buildBrowserPolicy({ requestsPerMinuteLimit: 10 }));
|
|
801
|
+
limiterAnswers(TelemetryIngestionKeyLimitOutcome.RateLimited, {
|
|
802
|
+
retryAfterSeconds: 37,
|
|
803
|
+
isFirstRejectionInWindow: true,
|
|
804
|
+
});
|
|
805
|
+
|
|
806
|
+
const result: RunResult = await run(
|
|
807
|
+
TelemetryIngestSurface.OtelTraces,
|
|
808
|
+
tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
809
|
+
);
|
|
810
|
+
|
|
811
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
812
|
+
|
|
813
|
+
const error: Error = refusal();
|
|
814
|
+
expect(error).toBeInstanceOf(TooManyRequestsException);
|
|
815
|
+
expect(error.message).toBe(
|
|
816
|
+
"Too many telemetry requests for this ingestion key. Please retry later.",
|
|
817
|
+
);
|
|
818
|
+
|
|
819
|
+
/*
|
|
820
|
+
* Without Retry-After every refused client backs off by whatever
|
|
821
|
+
* constant it picked, in lockstep, and re-collides on the next window.
|
|
822
|
+
*/
|
|
823
|
+
expect(result.setHeader).toHaveBeenCalledWith("Retry-After", "37");
|
|
824
|
+
});
|
|
825
|
+
|
|
826
|
+
test("an unavailable rate limit counter FAILS OPEN and the telemetry is still accepted", async () => {
|
|
827
|
+
resolveTo(buildBrowserPolicy({ requestsPerMinuteLimit: 10 }));
|
|
828
|
+
limiterAnswers(TelemetryIngestionKeyLimitOutcome.CounterUnavailable);
|
|
829
|
+
|
|
830
|
+
const result: RunResult = await run(
|
|
831
|
+
TelemetryIngestSurface.OtelTraces,
|
|
832
|
+
tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
833
|
+
);
|
|
834
|
+
|
|
835
|
+
/*
|
|
836
|
+
* Deliberate and documented: a Redis blip must not become permanent,
|
|
837
|
+
* unreplayable customer data loss with their incident dashboards dark
|
|
838
|
+
* at exactly the wrong moment. A future "hardening" change that flips
|
|
839
|
+
* this to a refusal has to fail here first, loudly, rather than in a
|
|
840
|
+
* customer's outage.
|
|
841
|
+
*/
|
|
842
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
843
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
844
|
+
expect((result.req as TelemetryRequest).projectId.toString()).toBe(
|
|
845
|
+
PROJECT_ID,
|
|
846
|
+
);
|
|
847
|
+
});
|
|
848
|
+
});
|
|
849
|
+
|
|
850
|
+
/*
|
|
851
|
+
* The limit resolution is exported so its branches can be pinned without an
|
|
852
|
+
* Express request, a mocked service and a fake Redis standing between the
|
|
853
|
+
* test and an arithmetic decision.
|
|
854
|
+
*/
|
|
855
|
+
describe("getEffectiveRequestsPerMinuteLimit", () => {
|
|
856
|
+
test("a server key with no configured limit is unlimited", () => {
|
|
857
|
+
expect(
|
|
858
|
+
getEffectiveRequestsPerMinuteLimit(
|
|
859
|
+
buildPolicy({ requestsPerMinuteLimit: null }),
|
|
860
|
+
),
|
|
861
|
+
).toBeNull();
|
|
862
|
+
});
|
|
863
|
+
|
|
864
|
+
test("a server key with a configured limit gets the limit it asked for", () => {
|
|
865
|
+
expect(
|
|
866
|
+
getEffectiveRequestsPerMinuteLimit(
|
|
867
|
+
buildPolicy({ requestsPerMinuteLimit: 250 }),
|
|
868
|
+
),
|
|
869
|
+
).toBe(250);
|
|
870
|
+
});
|
|
871
|
+
|
|
872
|
+
test("a browser key with no configured limit falls back to the shipped default rather than to unlimited", () => {
|
|
873
|
+
expect(
|
|
874
|
+
getEffectiveRequestsPerMinuteLimit(
|
|
875
|
+
buildBrowserPolicy({ requestsPerMinuteLimit: null }),
|
|
876
|
+
),
|
|
877
|
+
).toBe(DEFAULT_BROWSER_KEY_REQUESTS_PER_MINUTE);
|
|
878
|
+
});
|
|
879
|
+
|
|
880
|
+
test("a browser key with a configured limit gets the limit it asked for", () => {
|
|
881
|
+
expect(
|
|
882
|
+
getEffectiveRequestsPerMinuteLimit(
|
|
883
|
+
buildBrowserPolicy({ requestsPerMinuteLimit: 3 }),
|
|
884
|
+
),
|
|
885
|
+
).toBe(3);
|
|
886
|
+
});
|
|
887
|
+
|
|
888
|
+
test("a zero, negative, infinite, NaN or non-numeric limit falls back to the key type's default instead of blocking the key", () => {
|
|
889
|
+
const degenerateValues: Array<number> = [
|
|
890
|
+
0,
|
|
891
|
+
-1,
|
|
892
|
+
Number.NaN,
|
|
893
|
+
Number.POSITIVE_INFINITY,
|
|
894
|
+
"100" as unknown as number,
|
|
895
|
+
];
|
|
896
|
+
|
|
897
|
+
for (const value of degenerateValues) {
|
|
898
|
+
/*
|
|
899
|
+
* A bad row must not be read as "block everything": that would black
|
|
900
|
+
* out a customer's ingest on a data problem. A Server key falls back
|
|
901
|
+
* to unlimited (its historical behaviour), a Browser key to the
|
|
902
|
+
* shipped ceiling - never to unlimited.
|
|
903
|
+
*/
|
|
904
|
+
expect(
|
|
905
|
+
getEffectiveRequestsPerMinuteLimit(
|
|
906
|
+
buildPolicy({ requestsPerMinuteLimit: value }),
|
|
907
|
+
),
|
|
908
|
+
).toBeNull();
|
|
909
|
+
|
|
910
|
+
expect(
|
|
911
|
+
getEffectiveRequestsPerMinuteLimit(
|
|
912
|
+
buildBrowserPolicy({ requestsPerMinuteLimit: value }),
|
|
913
|
+
),
|
|
914
|
+
).toBe(DEFAULT_BROWSER_KEY_REQUESTS_PER_MINUTE);
|
|
915
|
+
}
|
|
916
|
+
});
|
|
917
|
+
});
|
|
918
|
+
|
|
919
|
+
describe("legacy unnamed-surface alias", () => {
|
|
920
|
+
test("a route that has not been migrated to forSurface refuses a browser key", async () => {
|
|
921
|
+
resolveTo(buildBrowserPolicy({}));
|
|
922
|
+
|
|
923
|
+
const result: RunResult = await run(
|
|
924
|
+
null,
|
|
925
|
+
tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
926
|
+
);
|
|
927
|
+
|
|
928
|
+
/*
|
|
929
|
+
* Fail closed on the default. A missed browser-capable route is a
|
|
930
|
+
* public credential reaching an endpoint nobody decided it should
|
|
931
|
+
* reach; a missed server-only route is a support ticket.
|
|
932
|
+
*/
|
|
933
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
934
|
+
|
|
935
|
+
const error: Error = refusal();
|
|
936
|
+
expect(error).toBeInstanceOf(NotAuthorizedException);
|
|
937
|
+
expect(error.message).toBe(
|
|
938
|
+
"A browser ingestion key cannot be used for this ingest endpoint. Use a server ingestion key.",
|
|
939
|
+
);
|
|
940
|
+
});
|
|
941
|
+
|
|
942
|
+
test("a route that has not been migrated still works with a server key", async () => {
|
|
943
|
+
resolveTo(buildPolicy({}));
|
|
944
|
+
|
|
945
|
+
const result: RunResult = await run(null, tokenHeaders());
|
|
946
|
+
|
|
947
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
948
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
949
|
+
expect((result.req as TelemetryRequest).projectId.toString()).toBe(
|
|
950
|
+
PROJECT_ID,
|
|
951
|
+
);
|
|
952
|
+
});
|
|
953
|
+
});
|
|
954
|
+
|
|
955
|
+
/*
|
|
956
|
+
* An ingestion key is a secret. Every branch below refuses a request that
|
|
957
|
+
* PRESENTED one, and none of them may write it to a log line (which also
|
|
958
|
+
* lands in the in-process recentLogs ring buffer surfaced on the admin
|
|
959
|
+
* health pages) or echo it back in a response body.
|
|
960
|
+
*/
|
|
961
|
+
describe("token hygiene across every refusal branch", () => {
|
|
962
|
+
interface RefusalBranch {
|
|
963
|
+
name: string;
|
|
964
|
+
arrange: () => void;
|
|
965
|
+
surface: TelemetryIngestSurface | null;
|
|
966
|
+
headers: Record<string, string>;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
const branches: Array<RefusalBranch> = [
|
|
970
|
+
{
|
|
971
|
+
name: "unknown token",
|
|
972
|
+
arrange: (): void => {
|
|
973
|
+
resolveTo(null);
|
|
974
|
+
},
|
|
975
|
+
surface: TelemetryIngestSurface.OtelTraces,
|
|
976
|
+
headers: tokenHeaders(),
|
|
977
|
+
},
|
|
978
|
+
{
|
|
979
|
+
name: "disabled key",
|
|
980
|
+
arrange: (): void => {
|
|
981
|
+
resolveTo(buildPolicy({ isEnabled: false }));
|
|
982
|
+
},
|
|
983
|
+
surface: TelemetryIngestSurface.OtelTraces,
|
|
984
|
+
headers: tokenHeaders(),
|
|
985
|
+
},
|
|
986
|
+
{
|
|
987
|
+
name: "expired key",
|
|
988
|
+
arrange: (): void => {
|
|
989
|
+
resolveTo(
|
|
990
|
+
buildPolicy({ expiresAt: new Date(Date.now() - 60 * 1000) }),
|
|
991
|
+
);
|
|
992
|
+
},
|
|
993
|
+
surface: TelemetryIngestSurface.OtelTraces,
|
|
994
|
+
headers: tokenHeaders(),
|
|
995
|
+
},
|
|
996
|
+
{
|
|
997
|
+
name: "browser key on a disallowed surface",
|
|
998
|
+
arrange: (): void => {
|
|
999
|
+
resolveTo(buildBrowserPolicy({}));
|
|
1000
|
+
},
|
|
1001
|
+
surface: TelemetryIngestSurface.Syslog,
|
|
1002
|
+
headers: tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
1003
|
+
},
|
|
1004
|
+
{
|
|
1005
|
+
name: "browser key from a disallowed origin",
|
|
1006
|
+
arrange: (): void => {
|
|
1007
|
+
resolveTo(buildBrowserPolicy({}));
|
|
1008
|
+
},
|
|
1009
|
+
surface: TelemetryIngestSurface.OtelTraces,
|
|
1010
|
+
headers: tokenHeaders({ origin: "https://attacker.example.net" }),
|
|
1011
|
+
},
|
|
1012
|
+
{
|
|
1013
|
+
name: "browser key with no Origin header",
|
|
1014
|
+
arrange: (): void => {
|
|
1015
|
+
resolveTo(buildBrowserPolicy({}));
|
|
1016
|
+
},
|
|
1017
|
+
surface: TelemetryIngestSurface.OtelTraces,
|
|
1018
|
+
headers: tokenHeaders(),
|
|
1019
|
+
},
|
|
1020
|
+
{
|
|
1021
|
+
name: "browser key with an empty allowlist",
|
|
1022
|
+
arrange: (): void => {
|
|
1023
|
+
resolveTo(buildBrowserPolicy({ allowedOrigins: [] }));
|
|
1024
|
+
},
|
|
1025
|
+
surface: TelemetryIngestSurface.OtelTraces,
|
|
1026
|
+
headers: tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
1027
|
+
},
|
|
1028
|
+
{
|
|
1029
|
+
name: "rate limited key",
|
|
1030
|
+
arrange: (): void => {
|
|
1031
|
+
resolveTo(buildBrowserPolicy({ requestsPerMinuteLimit: 1 }));
|
|
1032
|
+
limiterAnswers(TelemetryIngestionKeyLimitOutcome.RateLimited, {
|
|
1033
|
+
retryAfterSeconds: 12,
|
|
1034
|
+
isFirstRejectionInWindow: true,
|
|
1035
|
+
});
|
|
1036
|
+
},
|
|
1037
|
+
surface: TelemetryIngestSurface.OtelTraces,
|
|
1038
|
+
headers: tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
1039
|
+
},
|
|
1040
|
+
{
|
|
1041
|
+
name: "browser key on the legacy unnamed-surface alias",
|
|
1042
|
+
arrange: (): void => {
|
|
1043
|
+
resolveTo(buildBrowserPolicy({}));
|
|
1044
|
+
},
|
|
1045
|
+
surface: null,
|
|
1046
|
+
headers: tokenHeaders({ origin: ALLOWED_ORIGIN }),
|
|
1047
|
+
},
|
|
1048
|
+
];
|
|
1049
|
+
|
|
1050
|
+
let loggedArgs: Array<Array<unknown>>;
|
|
1051
|
+
let spies: Array<{ mockRestore: () => void }>;
|
|
1052
|
+
|
|
1053
|
+
beforeEach(() => {
|
|
1054
|
+
loggedArgs = [];
|
|
1055
|
+
spies = ["error", "warn", "info", "debug", "trace"].map(
|
|
1056
|
+
(level: string): { mockRestore: () => void } => {
|
|
1057
|
+
return jest
|
|
1058
|
+
.spyOn(logger, level as "error")
|
|
1059
|
+
.mockImplementation((...args: Array<unknown>) => {
|
|
1060
|
+
loggedArgs.push(args);
|
|
1061
|
+
return undefined as never;
|
|
1062
|
+
}) as unknown as { mockRestore: () => void };
|
|
1063
|
+
},
|
|
1064
|
+
);
|
|
1065
|
+
});
|
|
1066
|
+
|
|
1067
|
+
afterEach(() => {
|
|
1068
|
+
for (const spy of spies) {
|
|
1069
|
+
spy.mockRestore();
|
|
1070
|
+
}
|
|
1071
|
+
});
|
|
1072
|
+
|
|
1073
|
+
test("no refusal branch writes the presented ingestion key to a log line or a response message", async () => {
|
|
1074
|
+
for (const branch of branches) {
|
|
1075
|
+
jest.clearAllMocks();
|
|
1076
|
+
arrangeDefaults();
|
|
1077
|
+
loggedArgs = [];
|
|
1078
|
+
branch.arrange();
|
|
1079
|
+
|
|
1080
|
+
const result: RunResult = await run(branch.surface, branch.headers);
|
|
1081
|
+
|
|
1082
|
+
// Every branch listed here must actually refuse.
|
|
1083
|
+
expect(result.next).not.toHaveBeenCalled();
|
|
1084
|
+
|
|
1085
|
+
const error: Error = refusal();
|
|
1086
|
+
expect(error.message).not.toContain(SENTINEL_TOKEN);
|
|
1087
|
+
|
|
1088
|
+
for (const args of loggedArgs) {
|
|
1089
|
+
expect(JSON.stringify(args)).not.toContain(SENTINEL_TOKEN);
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
});
|
|
1093
|
+
});
|
|
1094
|
+
|
|
1095
|
+
describe("last-used bookkeeping", () => {
|
|
1096
|
+
test("markUsed is recorded for the admitting key on success", async () => {
|
|
1097
|
+
resolveTo(buildPolicy({}));
|
|
1098
|
+
|
|
1099
|
+
await run(TelemetryIngestSurface.OtelTraces, tokenHeaders());
|
|
1100
|
+
|
|
1101
|
+
expect(
|
|
1102
|
+
TelemetryIngestionKeyService.markUsed as MockFn,
|
|
1103
|
+
).toHaveBeenCalledTimes(1);
|
|
1104
|
+
expect(
|
|
1105
|
+
String(
|
|
1106
|
+
(TelemetryIngestionKeyService.markUsed as MockFn).mock.calls[0]?.[0],
|
|
1107
|
+
),
|
|
1108
|
+
).toBe(INGESTION_KEY_ID);
|
|
1109
|
+
});
|
|
1110
|
+
|
|
1111
|
+
test("the request is not held up waiting for markUsed to finish", async () => {
|
|
1112
|
+
resolveTo(buildPolicy({}));
|
|
1113
|
+
|
|
1114
|
+
/*
|
|
1115
|
+
* A promise that never settles. If the middleware awaited the
|
|
1116
|
+
* bookkeeping write, next() would never be called and every ingested
|
|
1117
|
+
* payload would carry a database round trip for a column nobody reads
|
|
1118
|
+
* in real time.
|
|
1119
|
+
*/
|
|
1120
|
+
(TelemetryIngestionKeyService.markUsed as MockFn).mockReturnValue(
|
|
1121
|
+
new Promise<void>((): void => {}) as never,
|
|
1122
|
+
);
|
|
1123
|
+
|
|
1124
|
+
const result: RunResult = await run(
|
|
1125
|
+
TelemetryIngestSurface.OtelTraces,
|
|
1126
|
+
tokenHeaders(),
|
|
1127
|
+
);
|
|
1128
|
+
|
|
1129
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
1130
|
+
});
|
|
1131
|
+
|
|
1132
|
+
test("a failed markUsed write does not fail the ingest request", async () => {
|
|
1133
|
+
resolveTo(buildPolicy({}));
|
|
1134
|
+
(TelemetryIngestionKeyService.markUsed as MockFn).mockRejectedValue(
|
|
1135
|
+
new Error("database is having a bad day") as never,
|
|
1136
|
+
);
|
|
1137
|
+
|
|
1138
|
+
const warnSpy: { mockRestore: () => void } = jest
|
|
1139
|
+
.spyOn(logger, "warn")
|
|
1140
|
+
.mockImplementation(() => {
|
|
1141
|
+
return undefined as never;
|
|
1142
|
+
}) as unknown as { mockRestore: () => void };
|
|
1143
|
+
|
|
1144
|
+
try {
|
|
1145
|
+
const result: RunResult = await run(
|
|
1146
|
+
TelemetryIngestSurface.OtelTraces,
|
|
1147
|
+
tokenHeaders(),
|
|
1148
|
+
);
|
|
1149
|
+
|
|
1150
|
+
expect(Response.sendErrorResponse as MockFn).not.toHaveBeenCalled();
|
|
1151
|
+
expect(result.next).toHaveBeenCalledTimes(1);
|
|
1152
|
+
// next() with no arguments - an argument would be an Express error.
|
|
1153
|
+
expect(result.next.mock.calls[0]?.length || 0).toBe(0);
|
|
1154
|
+
|
|
1155
|
+
// Let the swallowed rejection settle so it cannot surface elsewhere.
|
|
1156
|
+
await Promise.resolve();
|
|
1157
|
+
await Promise.resolve();
|
|
1158
|
+
} finally {
|
|
1159
|
+
warnSpy.mockRestore();
|
|
1160
|
+
}
|
|
1161
|
+
});
|
|
1162
|
+
});
|
|
1163
|
+
});
|