@oneuptime/common 12.0.33 → 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/DatabaseModels/AlertCustomField.ts +77 -3
- package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
- package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
- package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
- package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
- package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
- package/Models/DatabaseModels/RumApplication.ts +6 -6
- package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
- package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamMember.ts +0 -9
- package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
- package/Models/DatabaseModels/TeamPermission.ts +3 -24
- package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
- package/Models/DatabaseModels/UserTelegram.ts +0 -4
- package/Scripts/benchmark-fanin-capacity.js +181 -0
- package/Server/API/TelemetryAPI.ts +1284 -164
- package/Server/API/UserNotificationSettingAPI.ts +55 -0
- package/Server/API/UserTelegramAPI.ts +48 -4
- package/Server/EnvironmentConfig.ts +35 -2
- 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 +8 -0
- package/Server/Infrastructure/QueueWorker.ts +20 -14
- package/Server/Infrastructure/Semaphore.ts +2 -0
- package/Server/Middleware/TelemetryIngest.ts +453 -7
- package/Server/Services/AccessTokenService.ts +1 -0
- package/Server/Services/AlertCustomFieldService.ts +98 -0
- package/Server/Services/AlertService.ts +37 -0
- package/Server/Services/ApiKeyPermissionService.ts +461 -29
- package/Server/Services/CustomFieldMappingService.ts +879 -0
- package/Server/Services/GlobalConfigService.ts +194 -0
- package/Server/Services/IncidentCustomFieldService.ts +98 -0
- package/Server/Services/IncidentService.ts +35 -0
- package/Server/Services/MetricService.ts +194 -0
- package/Server/Services/MonitorService.ts +32 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +78 -25
- package/Server/Services/ProjectService.ts +22 -0
- package/Server/Services/RoutineEmailSettingsService.ts +73 -0
- package/Server/Services/RumSessionReplayViewService.ts +104 -24
- package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
- package/Server/Services/ScheduledMaintenanceService.ts +32 -0
- package/Server/Services/TeamMemberService.ts +78 -0
- package/Server/Services/TeamPermissionService.ts +235 -3
- package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
- package/Server/Services/UserNotificationSettingService.ts +34 -6
- package/Server/Services/UserTelegramService.ts +326 -5
- package/Server/Types/Database/QueryHelper.ts +2 -0
- package/Server/Utils/APIKey/AccessPermission.ts +5 -2
- package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
- package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
- package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
- package/Server/Utils/DataSource/EgressGuard.ts +177 -8
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +57 -4
- package/Server/Utils/FrontendEnvironment.ts +40 -0
- package/Server/Utils/LogRedaction.ts +20 -0
- package/Server/Utils/Logger.ts +11 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +338 -77
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
- package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +110 -15
- package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
- package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
- package/Server/Utils/SSRFProtection.ts +217 -10
- package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
- package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
- package/Server/Utils/StartServer.ts +2 -17
- package/Server/Utils/TelegramVerificationToken.ts +185 -0
- package/Server/Utils/Telemetry/PinServiceName.ts +197 -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/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +975 -95
- package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
- package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
- package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
- package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
- package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
- package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
- package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
- package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
- package/Tests/ResponsiveVisibility.test.ts +115 -0
- package/Tests/ResponsiveVisibility.ts +183 -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/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
- package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
- package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
- package/Tests/Server/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/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
- package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
- package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
- package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
- package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +226 -1
- package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
- package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
- package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
- package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
- package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
- package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
- package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
- 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/Monitor/Criteria/CompareCriteriaAggregation.test.ts +584 -0
- package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
- package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
- package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
- package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
- package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
- package/Tests/Server/Utils/Telemetry/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/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/DockerAlertTemplates.test.ts +495 -15
- package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
- package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
- package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
- package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
- package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
- package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
- package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
- package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
- package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
- package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
- package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
- package/Tests/Types/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/WebsiteRequest.test.ts +285 -3
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
- package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
- package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
- package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
- package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
- package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
- package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
- package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
- package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
- package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
- package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
- package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
- package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
- package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
- package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
- package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
- package/Tests/UI/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/Utils/API.test.ts +308 -0
- package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
- package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
- package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
- package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
- package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
- package/Tests/Utils/ValueFormatter.test.ts +148 -0
- package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
- package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
- package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/JSONFunctions.ts +189 -43
- package/Types/Monitor/CephAlertTemplates.ts +157 -195
- package/Types/Monitor/DockerAlertTemplates.ts +338 -128
- package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
- package/Types/Monitor/HostAlertTemplates.ts +302 -130
- package/Types/Monitor/IotAlertTemplates.ts +112 -104
- package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
- package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
- package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
- package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
- package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
- package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
- package/Types/Monitor/RumAlertTemplates.ts +46 -7
- package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
- package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
- package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
- package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
- package/Types/Rum/SessionReplay.ts +209 -0
- package/Types/Rum/SessionReplayApi.ts +722 -0
- package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
- package/Types/Rum/SessionReplayConsentMode.ts +11 -7
- package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
- package/Types/Rum/SessionReplayHealth.ts +238 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
- package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
- package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
- package/Types/WebsiteRequest.ts +85 -3
- package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
- package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
- package/UI/Components/Charts/Line/LineChart.tsx +13 -2
- package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
- package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
- package/UI/Components/Charts/Utils/XAxis.ts +217 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +143 -25
- package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
- package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
- package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
- package/UI/Components/Header/Header.tsx +25 -9
- package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
- package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
- package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
- package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
- package/UI/Components/Icon/Icon.tsx +11 -0
- package/UI/Components/JSONTable/JSONTable.tsx +2 -2
- package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
- package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
- package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
- package/UI/Components/ModelTable/Column.ts +15 -0
- package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
- package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
- package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
- package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
- package/UI/Components/Table/CellClassName.ts +81 -0
- package/UI/Components/Table/TableRow.tsx +20 -14
- package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
- package/UI/Components/Table/Types/Column.ts +36 -0
- package/UI/Components/Tooltip/Tooltip.tsx +11 -1
- package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
- package/UI/Components/Workflow/NodePlacement.ts +57 -0
- package/UI/Components/Workflow/Workflow.tsx +47 -18
- package/UI/Config.ts +15 -33
- package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
- package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
- package/UI/Utils/Telemetry/Telemetry.ts +10 -8
- package/Utils/API.ts +129 -3
- package/Utils/HTTPResponseBodyReader.ts +221 -0
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
- package/Utils/Rum/ChunkMath.ts +106 -0
- package/Utils/Rum/SessionReplayHealth.ts +732 -0
- package/Utils/Rum/SessionReplayStringMap.ts +226 -0
- package/Utils/Schema/ModelSchema.ts +1 -0
- package/Utils/StatusPage/ResourceSearch.ts +290 -0
- package/Utils/Telemetry/OriginAllowList.ts +355 -0
- package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
- package/Utils/ValueFormatter.ts +35 -1
- package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
- package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
- package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
- package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
- package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
- package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
- package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
- package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +769 -109
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
- package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
- package/build/dist/Server/API/UserTelegramAPI.js +28 -6
- package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +29 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AccessTokenService.js +1 -0
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
- package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +34 -0
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
- package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
- package/build/dist/Server/Services/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/MetricService.js +163 -0
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +29 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +79 -27
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +22 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
- package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
- package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
- package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
- package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +62 -2
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamPermissionService.js +166 -3
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserTelegramService.js +257 -4
- package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
- package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +44 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
- package/build/dist/Server/Utils/LogRedaction.js +20 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +10 -0
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +287 -68
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +88 -13
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
- package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
- package/build/dist/Server/Utils/SSRFProtection.js +136 -9
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +3 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
- package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
- package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
- package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Types/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/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/DockerAlertTemplates.js +286 -121
- package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
- package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
- package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
- package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
- package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
- package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
- package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
- package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
- package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
- package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +117 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
- package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
- package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
- package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
- package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
- package/build/dist/Types/WebsiteRequest.js +55 -3
- package/build/dist/Types/WebsiteRequest.js.map +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +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/Graphs/DayUptimeGraph.js +112 -7
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
- package/build/dist/UI/Components/Header/Header.js +2 -3
- package/build/dist/UI/Components/Header/Header.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
- package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
- package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +5 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
- package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
- package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
- package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
- package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
- package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
- package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
- package/build/dist/UI/Components/Table/CellClassName.js +55 -0
- package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
- package/build/dist/UI/Components/Table/TableRow.js +16 -13
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
- package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
- package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
- package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
- package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
- package/build/dist/UI/Config.js +10 -20
- package/build/dist/UI/Config.js.map +1 -1
- package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
- package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
- package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
- package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Utils/API.js +67 -5
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
- package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
- package/build/dist/Utils/Rum/ChunkMath.js +76 -0
- package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
- package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
- package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
- package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js +1 -0
- package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
- package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
- package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
- package/build/dist/Utils/ValueFormatter.js +32 -1
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,6 +2,8 @@ import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
|
|
|
2
2
|
import { IsBillingEnabled } from "../../../../Server/EnvironmentConfig";
|
|
3
3
|
import DataSourceEgressGuard, {
|
|
4
4
|
AddressVerdict,
|
|
5
|
+
EgressGuardOptions,
|
|
6
|
+
EgressLookupFunction,
|
|
5
7
|
EgressResolveFunction,
|
|
6
8
|
ResolvedAddress,
|
|
7
9
|
} from "../../../../Server/Utils/DataSource/EgressGuard";
|
|
@@ -74,11 +76,39 @@ const captureRejection: CaptureRejectionFunction = async (
|
|
|
74
76
|
|
|
75
77
|
const bothFlags: Array<boolean> = [true, false];
|
|
76
78
|
|
|
79
|
+
interface LookupResult {
|
|
80
|
+
error: NodeJS.ErrnoException | null;
|
|
81
|
+
address: string | Array<ResolvedAddress>;
|
|
82
|
+
family?: number | undefined;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function callLookup(
|
|
86
|
+
lookup: EgressLookupFunction,
|
|
87
|
+
options: { all?: boolean | undefined; family?: number | undefined },
|
|
88
|
+
): Promise<LookupResult> {
|
|
89
|
+
return new Promise((resolve: (result: LookupResult) => void) => {
|
|
90
|
+
lookup(
|
|
91
|
+
"validated.example.com",
|
|
92
|
+
options,
|
|
93
|
+
(
|
|
94
|
+
error: NodeJS.ErrnoException | null,
|
|
95
|
+
address: string | Array<ResolvedAddress>,
|
|
96
|
+
family?: number,
|
|
97
|
+
): void => {
|
|
98
|
+
resolve({ error: error, address: address, family: family });
|
|
99
|
+
},
|
|
100
|
+
);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
77
104
|
describe("DataSourceEgressGuard.checkAddress - IPv4 always blocked", () => {
|
|
78
105
|
const alwaysBlockedIpv4: Array<[string, string]> = [
|
|
79
106
|
["127.0.0.1", "loopback address"],
|
|
80
107
|
["127.255.255.254", "loopback address"],
|
|
81
108
|
["169.254.169.254", "link-local address (cloud metadata range)"],
|
|
109
|
+
["100.100.100.200", "cloud metadata address"],
|
|
110
|
+
["168.63.129.16", "cloud platform metadata address"],
|
|
111
|
+
["192.0.0.192", "cloud metadata address"],
|
|
82
112
|
["0.0.0.0", "unspecified address"],
|
|
83
113
|
["224.0.0.1", "multicast address"],
|
|
84
114
|
["240.0.0.1", "reserved address"],
|
|
@@ -169,6 +199,13 @@ describe("DataSourceEgressGuard.checkAddress - IPv6 always blocked", () => {
|
|
|
169
199
|
["ff02::1", "multicast address"],
|
|
170
200
|
["::ffff:127.0.0.1", "loopback address"],
|
|
171
201
|
["64:ff9b::7f00:0001", "loopback address"],
|
|
202
|
+
["fd00:ec2::23", "cloud metadata address"],
|
|
203
|
+
["fd00:ec2::254", "cloud metadata address"],
|
|
204
|
+
["fd00:ec2:ffff:ffff:ffff:ffff:ffff:ffff", "cloud metadata address"],
|
|
205
|
+
["fd20:ce::254", "cloud metadata address"],
|
|
206
|
+
["64:ff9b:1::", "IPv4 translation address"],
|
|
207
|
+
["64:ff9b:1:7f00:0:100::", "IPv4 translation address"],
|
|
208
|
+
["::ffff:0:7f00:1", "IPv4 translation address"],
|
|
172
209
|
];
|
|
173
210
|
|
|
174
211
|
for (const entry of alwaysBlockedIpv6) {
|
|
@@ -194,12 +231,27 @@ describe("DataSourceEgressGuard.checkAddress - IPv6 always blocked", () => {
|
|
|
194
231
|
expect(verdict.reason).toBeDefined();
|
|
195
232
|
});
|
|
196
233
|
}
|
|
234
|
+
|
|
235
|
+
test("addresses immediately outside AWS's cloud-local IPv6 prefix remain ordinary ULA addresses", () => {
|
|
236
|
+
for (const address of [
|
|
237
|
+
"fd00:ec1:ffff:ffff:ffff:ffff:ffff:ffff",
|
|
238
|
+
"fd00:ec3::",
|
|
239
|
+
]) {
|
|
240
|
+
expect(check(address, false)).toEqual({ blocked: false });
|
|
241
|
+
expect(check(address, true)).toEqual({
|
|
242
|
+
blocked: true,
|
|
243
|
+
reason: "private network address",
|
|
244
|
+
isPrivateNetwork: true,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
});
|
|
197
248
|
});
|
|
198
249
|
|
|
199
250
|
describe("DataSourceEgressGuard.checkAddress - IPv6 private ranges", () => {
|
|
200
251
|
const privateIpv6: Array<[string, string]> = [
|
|
201
252
|
["fc00::1", "private network address"],
|
|
202
253
|
["fd12:3456::1", "private network address"],
|
|
254
|
+
["fec0::1", "private network address"],
|
|
203
255
|
["2001:db8::1", "documentation address"],
|
|
204
256
|
["::ffff:10.0.0.1", "private network address"],
|
|
205
257
|
["64:ff9b::0a00:0001", "private network address"],
|
|
@@ -231,6 +283,80 @@ describe("DataSourceEgressGuard.checkAddress - IPv6 private ranges", () => {
|
|
|
231
283
|
}
|
|
232
284
|
});
|
|
233
285
|
|
|
286
|
+
describe("DataSourceEgressGuard.checkAddress - IPv6 transition mechanisms", () => {
|
|
287
|
+
const alwaysBlockedTransitionAddresses: Array<[string, string]> = [
|
|
288
|
+
["::127.0.0.1", "loopback address"],
|
|
289
|
+
["2002:7f00:0001::", "loopback address"],
|
|
290
|
+
["2002:a9fe:a9fe::", "link-local address (cloud metadata range)"],
|
|
291
|
+
["2001:0:7f00:0001:0:0:f7f7:f7f7", "loopback address"],
|
|
292
|
+
["2001:0:0808:0808:0:0:80ff:fffe", "loopback address"],
|
|
293
|
+
];
|
|
294
|
+
|
|
295
|
+
for (const entry of alwaysBlockedTransitionAddresses) {
|
|
296
|
+
const address: string = entry[0];
|
|
297
|
+
const expectedReason: string = entry[1];
|
|
298
|
+
|
|
299
|
+
for (const flag of bothFlags) {
|
|
300
|
+
test(`${address} cannot tunnel an always-blocked IPv4 address when blockPrivateAddresses=${flag}`, () => {
|
|
301
|
+
const verdict: AddressVerdict = check(address, flag);
|
|
302
|
+
expect(verdict).toEqual({
|
|
303
|
+
blocked: true,
|
|
304
|
+
reason: expectedReason,
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
const privateTransitionAddresses: Array<string> = [
|
|
311
|
+
"::10.0.0.1",
|
|
312
|
+
"2002:0a00:0001::",
|
|
313
|
+
// Teredo server address is 10.0.0.1; client address is public 8.8.8.8.
|
|
314
|
+
"2001:0:0a00:0001:0:0:f7f7:f7f7",
|
|
315
|
+
// Teredo server address is public; inverted client address is 10.0.0.1.
|
|
316
|
+
"2001:0:0808:0808:0:0:f5ff:fffe",
|
|
317
|
+
];
|
|
318
|
+
|
|
319
|
+
for (const address of privateTransitionAddresses) {
|
|
320
|
+
test(`${address} is blocked as private when private networks are disabled`, () => {
|
|
321
|
+
expect(check(address, true)).toEqual({
|
|
322
|
+
blocked: true,
|
|
323
|
+
reason: "private network address",
|
|
324
|
+
isPrivateNetwork: true,
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
test(`${address} is allowed when private networks are enabled`, () => {
|
|
329
|
+
expect(check(address, false)).toEqual({ blocked: false });
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
const publicTransitionAddresses: Array<string> = [
|
|
334
|
+
"::8.8.8.8",
|
|
335
|
+
"2002:0808:0808::",
|
|
336
|
+
"2001:0:0808:0808:0:0:f7f7:f7f7",
|
|
337
|
+
];
|
|
338
|
+
|
|
339
|
+
for (const address of publicTransitionAddresses) {
|
|
340
|
+
for (const flag of bothFlags) {
|
|
341
|
+
test(`${address} remains public when blockPrivateAddresses=${flag}`, () => {
|
|
342
|
+
expect(check(address, flag)).toEqual({ blocked: false });
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
test("an always-blocked Teredo endpoint takes precedence over a private endpoint", () => {
|
|
348
|
+
/*
|
|
349
|
+
* The server is private 10.0.0.1 and the inverted client is loopback
|
|
350
|
+
* 127.0.0.1. The loopback verdict must win so operator guidance never
|
|
351
|
+
* suggests that the private-network switch could make this route safe.
|
|
352
|
+
*/
|
|
353
|
+
expect(check("2001:0:0a00:0001:0:0:80ff:fffe", true)).toEqual({
|
|
354
|
+
blocked: true,
|
|
355
|
+
reason: "loopback address",
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
|
|
234
360
|
describe("DataSourceEgressGuard.checkAddress - invalid input", () => {
|
|
235
361
|
const garbageAddresses: Array<string> = ["not-an-ip", "1.2.3.4.5"];
|
|
236
362
|
|
|
@@ -316,6 +442,66 @@ describe("DataSourceEgressGuard.assertHostnameAllowed", () => {
|
|
|
316
442
|
expect(error.message).toContain("private network");
|
|
317
443
|
});
|
|
318
444
|
|
|
445
|
+
test("appends operator guidance when a private address is rejected", async () => {
|
|
446
|
+
const privateNetworkHint: string =
|
|
447
|
+
" Enable private monitor targets on a trusted probe to allow this range.";
|
|
448
|
+
const error: Error = await captureRejection(
|
|
449
|
+
DataSourceEgressGuard.assertHostnameAllowed("10.0.0.5", {
|
|
450
|
+
blockPrivateAddresses: true,
|
|
451
|
+
targetLabel: "Monitor target",
|
|
452
|
+
privateNetworkHint: privateNetworkHint,
|
|
453
|
+
}),
|
|
454
|
+
);
|
|
455
|
+
|
|
456
|
+
expect(error instanceof BadDataException).toBe(true);
|
|
457
|
+
expect(error.message).toBe(
|
|
458
|
+
`Monitor target host 10.0.0.5 is not allowed: private network address.${privateNetworkHint}`,
|
|
459
|
+
);
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
test("appends operator guidance for a private IPv4 destination tunneled through IPv6", async () => {
|
|
463
|
+
const privateNetworkHint: string = " Configure a private probe.";
|
|
464
|
+
const error: Error = await captureRejection(
|
|
465
|
+
DataSourceEgressGuard.assertHostnameAllowed("2002:0a00:0001::", {
|
|
466
|
+
blockPrivateAddresses: true,
|
|
467
|
+
targetLabel: "Monitor target",
|
|
468
|
+
privateNetworkHint: privateNetworkHint,
|
|
469
|
+
}),
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
expect(error.message).toContain(privateNetworkHint);
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
test("does not append private-network guidance for an always-blocked address", async () => {
|
|
476
|
+
const privateNetworkHint: string =
|
|
477
|
+
" THIS_HINT_MUST_NOT_APPEAR_FOR_LOOPBACK.";
|
|
478
|
+
const error: Error = await captureRejection(
|
|
479
|
+
DataSourceEgressGuard.assertHostnameAllowed("127.0.0.1", {
|
|
480
|
+
blockPrivateAddresses: true,
|
|
481
|
+
targetLabel: "Monitor target",
|
|
482
|
+
privateNetworkHint: privateNetworkHint,
|
|
483
|
+
}),
|
|
484
|
+
);
|
|
485
|
+
|
|
486
|
+
expect(error.message).toContain("loopback address");
|
|
487
|
+
expect(error.message).not.toContain(privateNetworkHint);
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
test("does not append private-network guidance for a tunneled metadata address", async () => {
|
|
491
|
+
const privateNetworkHint: string =
|
|
492
|
+
" THIS_HINT_MUST_NOT_APPEAR_FOR_METADATA.";
|
|
493
|
+
const error: Error = await captureRejection(
|
|
494
|
+
DataSourceEgressGuard.assertHostnameAllowed("2002:a9fe:a9fe::", {
|
|
495
|
+
blockPrivateAddresses: true,
|
|
496
|
+
targetLabel: "Monitor target",
|
|
497
|
+
privateNetworkHint: privateNetworkHint,
|
|
498
|
+
}),
|
|
499
|
+
);
|
|
500
|
+
|
|
501
|
+
expect(error.message).toContain("link-local address");
|
|
502
|
+
expect(error.message).not.toContain(privateNetworkHint);
|
|
503
|
+
});
|
|
504
|
+
|
|
319
505
|
test("resolves a hostname through the injected resolver and returns all public addresses", async () => {
|
|
320
506
|
const resolvedAddresses: Array<ResolvedAddress> = [
|
|
321
507
|
{ address: "93.184.216.34", family: 4 },
|
|
@@ -348,6 +534,68 @@ describe("DataSourceEgressGuard.assertHostnameAllowed", () => {
|
|
|
348
534
|
expect(error.message).toContain("private network");
|
|
349
535
|
});
|
|
350
536
|
|
|
537
|
+
test("makes blocked, missing, and empty DNS answers indistinguishable to tenant-facing callers", async () => {
|
|
538
|
+
const privateResolver: Resolver = makeResolver([
|
|
539
|
+
{ address: "10.23.45.67", family: 4 },
|
|
540
|
+
]);
|
|
541
|
+
const missingResolveFunction: EgressResolveFunction = (
|
|
542
|
+
_hostname: string,
|
|
543
|
+
): Promise<Array<ResolvedAddress>> => {
|
|
544
|
+
return Promise.reject(new Error("getaddrinfo ENOTFOUND"));
|
|
545
|
+
};
|
|
546
|
+
const emptyResolver: Resolver = makeResolver([]);
|
|
547
|
+
const safeOptions: EgressGuardOptions = {
|
|
548
|
+
blockPrivateAddresses: true,
|
|
549
|
+
targetLabel: "Monitor target",
|
|
550
|
+
includeResolvedAddressInError: false,
|
|
551
|
+
};
|
|
552
|
+
const hostname: string = "service-name.example.com";
|
|
553
|
+
|
|
554
|
+
const blockedError: Error = await captureRejection(
|
|
555
|
+
DataSourceEgressGuard.assertHostnameAllowed(hostname, {
|
|
556
|
+
...safeOptions,
|
|
557
|
+
resolveFunction: privateResolver.resolveFunction,
|
|
558
|
+
}),
|
|
559
|
+
);
|
|
560
|
+
const missingError: Error = await captureRejection(
|
|
561
|
+
DataSourceEgressGuard.assertHostnameAllowed(hostname, {
|
|
562
|
+
...safeOptions,
|
|
563
|
+
resolveFunction: missingResolveFunction,
|
|
564
|
+
}),
|
|
565
|
+
);
|
|
566
|
+
const emptyError: Error = await captureRejection(
|
|
567
|
+
DataSourceEgressGuard.assertHostnameAllowed(hostname, {
|
|
568
|
+
...safeOptions,
|
|
569
|
+
resolveFunction: emptyResolver.resolveFunction,
|
|
570
|
+
}),
|
|
571
|
+
);
|
|
572
|
+
|
|
573
|
+
const expectedMessage: string =
|
|
574
|
+
"Monitor target host service-name.example.com could not be reached.";
|
|
575
|
+
for (const error of [blockedError, missingError, emptyError]) {
|
|
576
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
577
|
+
expect(error.message).toBe(expectedMessage);
|
|
578
|
+
expect(error.message).not.toContain("10.23.45.67");
|
|
579
|
+
expect(error.message).not.toContain("ENOTFOUND");
|
|
580
|
+
expect(error.message).not.toContain("private network");
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
test("always blocks a hostname resolving to Oracle metadata even with the flag off", async () => {
|
|
585
|
+
const resolver: Resolver = makeResolver([
|
|
586
|
+
{ address: "192.0.0.192", family: 4 },
|
|
587
|
+
]);
|
|
588
|
+
const error: Error = await captureRejection(
|
|
589
|
+
DataSourceEgressGuard.assertHostnameAllowed("metadata.example.com", {
|
|
590
|
+
blockPrivateAddresses: false,
|
|
591
|
+
resolveFunction: resolver.resolveFunction,
|
|
592
|
+
}),
|
|
593
|
+
);
|
|
594
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
595
|
+
expect(error.message).toContain("192.0.0.192");
|
|
596
|
+
expect(error.message).toContain("cloud metadata");
|
|
597
|
+
});
|
|
598
|
+
|
|
351
599
|
test("allows a mixed public/private answer when the flag is off", async () => {
|
|
352
600
|
const resolver: Resolver = makeResolver([
|
|
353
601
|
{ address: "93.184.216.34", family: 4 },
|
|
@@ -529,17 +777,23 @@ describe("DataSourceEgressGuard.assertUrlAllowed", () => {
|
|
|
529
777
|
expect(error.message).toContain("192.168.1.1");
|
|
530
778
|
});
|
|
531
779
|
|
|
532
|
-
test(
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
780
|
+
test.each([
|
|
781
|
+
["169.254.169.254", "link-local"],
|
|
782
|
+
["192.0.0.192", "cloud metadata"],
|
|
783
|
+
])(
|
|
784
|
+
"always rejects cloud metadata host %s as a literal URL even with private networks enabled",
|
|
785
|
+
async (address: string, expectedReason: string) => {
|
|
786
|
+
const error: Error = await captureRejection(
|
|
787
|
+
DataSourceEgressGuard.assertUrlAllowed(
|
|
788
|
+
`http://${address}/latest/meta-data`,
|
|
789
|
+
{ blockPrivateAddresses: false },
|
|
790
|
+
),
|
|
791
|
+
);
|
|
792
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
793
|
+
expect(error.message).toContain(address);
|
|
794
|
+
expect(error.message).toContain(expectedReason);
|
|
795
|
+
},
|
|
796
|
+
);
|
|
543
797
|
|
|
544
798
|
test("rejects a bracketed IPv6 loopback URL host", async () => {
|
|
545
799
|
const error: Error = await captureRejection(
|
|
@@ -552,6 +806,41 @@ describe("DataSourceEgressGuard.assertUrlAllowed", () => {
|
|
|
552
806
|
});
|
|
553
807
|
});
|
|
554
808
|
|
|
809
|
+
describe("DataSourceEgressGuard.createPinnedLookup", () => {
|
|
810
|
+
const mixedAddresses: Array<ResolvedAddress> = [
|
|
811
|
+
{ address: "93.184.216.34", family: 4 },
|
|
812
|
+
{ address: "2606:2800:220:1:248:1893:25c8:1946", family: 6 },
|
|
813
|
+
];
|
|
814
|
+
|
|
815
|
+
test("honors the socket's requested address family for single and all-address lookups", async () => {
|
|
816
|
+
const lookup: EgressLookupFunction =
|
|
817
|
+
DataSourceEgressGuard.createPinnedLookup(mixedAddresses);
|
|
818
|
+
|
|
819
|
+
await expect(callLookup(lookup, { family: 6 })).resolves.toEqual({
|
|
820
|
+
error: null,
|
|
821
|
+
address: mixedAddresses[1]!.address,
|
|
822
|
+
family: 6,
|
|
823
|
+
});
|
|
824
|
+
await expect(callLookup(lookup, { family: 4, all: true })).resolves.toEqual(
|
|
825
|
+
{
|
|
826
|
+
error: null,
|
|
827
|
+
address: [mixedAddresses[0]],
|
|
828
|
+
family: undefined,
|
|
829
|
+
},
|
|
830
|
+
);
|
|
831
|
+
});
|
|
832
|
+
|
|
833
|
+
test("returns ENOTFOUND instead of dialing another family when none is available", async () => {
|
|
834
|
+
const result: LookupResult = await callLookup(
|
|
835
|
+
DataSourceEgressGuard.createPinnedLookup([mixedAddresses[0]!]),
|
|
836
|
+
{ family: 6 },
|
|
837
|
+
);
|
|
838
|
+
|
|
839
|
+
expect(result.error?.code).toBe("ENOTFOUND");
|
|
840
|
+
expect(result.address).toBe("");
|
|
841
|
+
});
|
|
842
|
+
});
|
|
843
|
+
|
|
555
844
|
describe("DataSourceEgressGuard.assertHostnameAllowed - numeric hostname encodings", () => {
|
|
556
845
|
/*
|
|
557
846
|
* These hostnames are not IP literals to net.isIP, so they take the
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BURST_THRESHOLD,
|
|
3
|
+
BURST_WINDOW_MINUTES,
|
|
4
|
+
CLAIM_EPOCH_MINUTES,
|
|
5
|
+
FLUSH_AFTER_MINUTES,
|
|
6
|
+
} from "../../../../Server/Utils/EmailRollup/EmailRollupConstants";
|
|
7
|
+
import { describe, expect, test } from "@jest/globals";
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* THE BURST WINDOW, SIZED AGAINST THE FLOOD THAT GOT THROUGH.
|
|
11
|
+
*
|
|
12
|
+
* EmailRollupWriter.test.ts pins the writer's MECHANISM against the
|
|
13
|
+
* constants symbolically, so it passes at any value of them. This suite pins
|
|
14
|
+
* the VALUE, in the units of the incident that chose it, so narrowing the
|
|
15
|
+
* window back fails loudly instead of silently reopening the blind spot.
|
|
16
|
+
*
|
|
17
|
+
* The incident: one Kubernetes monitor created from a OneUptime
|
|
18
|
+
* recommendation raised and resolved the same condition over and over -
|
|
19
|
+
* 39 owner emails, 19 open and 20 resolve, in under two hours. Both event
|
|
20
|
+
* types map to RollupCategory.Alerts, so they share one burst counter.
|
|
21
|
+
*
|
|
22
|
+
* That is about 3.3 emails per ten minutes: PERSISTENTLY UNDER a trip point
|
|
23
|
+
* of four. A slow flap is exactly the shape a short window cannot see, and it
|
|
24
|
+
* is the shape that actually reaches people's inboxes.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
// 19 open + 20 resolve, in under two hours.
|
|
28
|
+
const FLAP_EMAIL_COUNT: number = 39;
|
|
29
|
+
const FLAP_DURATION_MINUTES: number = 118;
|
|
30
|
+
|
|
31
|
+
function itemsPerWindow(windowMinutes: number): number {
|
|
32
|
+
return (FLAP_EMAIL_COUNT / FLAP_DURATION_MINUTES) * windowMinutes;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
describe("the burst window is sized to catch a slow flap", () => {
|
|
36
|
+
/*
|
|
37
|
+
* THE REGRESSION TEST. If someone puts the window back to ten minutes, or
|
|
38
|
+
* raises the threshold past what the observed rate reaches, this fails.
|
|
39
|
+
*/
|
|
40
|
+
test("the observed flap rate trips the throttle at the shipped window", () => {
|
|
41
|
+
expect(itemsPerWindow(BURST_WINDOW_MINUTES)).toBeGreaterThanOrEqual(
|
|
42
|
+
BURST_THRESHOLD,
|
|
43
|
+
);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* And the reason the window changed: at ten minutes the same flap never
|
|
48
|
+
* reaches the trip point, so every one of the 39 emails is sent
|
|
49
|
+
* immediately. This assertion is what makes the one above meaningful -
|
|
50
|
+
* without it, "the rate trips the throttle" would also pass at a window of
|
|
51
|
+
* ten if the threshold were lowered instead, which is a different and worse
|
|
52
|
+
* trade (it would coalesce ordinary incidents).
|
|
53
|
+
*/
|
|
54
|
+
test("a ten-minute window would have missed it entirely", () => {
|
|
55
|
+
expect(itemsPerWindow(10)).toBeLessThan(BURST_THRESHOLD);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("the shipped window is wider than the one that missed it", () => {
|
|
59
|
+
expect(BURST_WINDOW_MINUTES).toBeGreaterThan(10);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
/*
|
|
63
|
+
* The threshold is deliberately UNCHANGED: it still covers one incident's
|
|
64
|
+
* whole normal lifecycle (created -> acknowledged -> resolved) plus one
|
|
65
|
+
* more event, so a single real incident is never coalesced.
|
|
66
|
+
*/
|
|
67
|
+
test("one incident's full lifecycle still sends immediately", () => {
|
|
68
|
+
const CREATED_ACKNOWLEDGED_RESOLVED: number = 3;
|
|
69
|
+
|
|
70
|
+
expect(BURST_THRESHOLD).toBeGreaterThan(CREATED_ACKNOWLEDGED_RESOLVED);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
/*
|
|
74
|
+
* Widening the window must not have disturbed the flush invariant.
|
|
75
|
+
* CLAIM_EPOCH_MINUTES === FLUSH_AFTER_MINUTES is what makes "a legitimate
|
|
76
|
+
* consecutive flush always lands in a later epoch" true, and it is
|
|
77
|
+
* independent of the burst window.
|
|
78
|
+
*/
|
|
79
|
+
test("the flush invariant is untouched by the window change", () => {
|
|
80
|
+
expect(CLAIM_EPOCH_MINUTES).toBe(FLUSH_AFTER_MINUTES);
|
|
81
|
+
expect(FLUSH_AFTER_MINUTES).toBeLessThan(BURST_WINDOW_MINUTES);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
@@ -236,7 +236,7 @@ describe("EmailRollupFlushRunner - one flush", () => {
|
|
|
236
236
|
|
|
237
237
|
await EmailRollupFlushRunner.runSweep({ now: NOW });
|
|
238
238
|
|
|
239
|
-
expect(harness.callLog).toEqual(["stamp", "send"]);
|
|
239
|
+
expect(harness.callLog).toEqual(["preferences", "stamp", "send"]);
|
|
240
240
|
});
|
|
241
241
|
|
|
242
242
|
test("a throwing send leaves the items stamped, so a broken mailer cannot re-spam every epoch", async () => {
|