@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
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
buildNetworkDeviceFromDiscoveredHost,
|
|
32
32
|
} from "../../Utils/NetworkDiscovery/DiscoveredDeviceBuilder";
|
|
33
33
|
import { normalizeDiscoveredHosts } from "../../Utils/NetworkDiscovery/DiscoveredHostUtil";
|
|
34
|
+
import { DISCOVERY_SCAN_IMPORTABLE_STATUSES } from "../../Utils/NetworkDiscovery/DiscoveryScanStatus";
|
|
34
35
|
import { NetworkDeviceMonitoringMethodUtil } from "../../Types/NetworkDevice/NetworkDeviceMonitoringMethod";
|
|
35
36
|
import NetworkDeviceMonitorTemplateUtil from "../../Utils/Monitor/NetworkDeviceMonitorTemplateUtil";
|
|
36
37
|
import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
|
|
@@ -41,7 +42,8 @@ import logger, { LogAttributes } from "../Utils/Logger";
|
|
|
41
42
|
|
|
42
43
|
/*
|
|
43
44
|
* The engine behind network device auto-import rules (issue #3378): reads a
|
|
44
|
-
*
|
|
45
|
+
* discovery scan's results — finished or still arriving from a running sweep,
|
|
46
|
+
* see DISCOVERY_SCAN_IMPORTABLE_STATUSES — asks the project's rules which hosts
|
|
45
47
|
* import, and creates the Network Devices the manual Review dialog would
|
|
46
48
|
* have — through the same builder, so a rule-imported host and a
|
|
47
49
|
* hand-imported host are the same device. Site assignment, owners and labels
|
|
@@ -182,24 +184,32 @@ export type ImportAttemptBudgetsByProjectId = Map<string, ImportAttemptBudget>;
|
|
|
182
184
|
|
|
183
185
|
class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
184
186
|
/**
|
|
185
|
-
* The automatic path: apply the project's enabled rules to one
|
|
186
|
-
*
|
|
187
|
+
* The automatic path: apply the project's enabled rules to one scan's
|
|
188
|
+
* stored results, then stamp the scan's autoImportProcessedAt marker.
|
|
189
|
+
*
|
|
190
|
+
* The scan may still be SWEEPING — see
|
|
191
|
+
* DISCOVERY_SCAN_IMPORTABLE_STATUSES. Its partial results are as real as
|
|
192
|
+
* a finished scan's (the probe found those hosts; it simply has more of the
|
|
193
|
+
* range to cover), and waiting for the whole sweep is what left 527
|
|
194
|
+
* discovered switches unimportable for a day in OneUptime issue #3599. The
|
|
195
|
+
* name is kept because it is the automatic path's identity across the
|
|
196
|
+
* worker, its tests and its logs.
|
|
187
197
|
*
|
|
188
198
|
* Returns null when there was nothing to do (scan gone, superseded,
|
|
189
199
|
* already processed, no import rules, or results too old) and the run's
|
|
190
200
|
* counters otherwise. Throws only on unexpected failures — the caller
|
|
191
201
|
* (the worker sweep) isolates those per scan.
|
|
192
202
|
*
|
|
193
|
-
* The marker protocol, and why every stamp is a compare-and-set on
|
|
194
|
-
*
|
|
195
|
-
* write that stores new results
|
|
196
|
-
* results now on the row have not been processed".
|
|
197
|
-
* while this pass is reading the old ones, the CAS
|
|
198
|
-
* stays NULL, and the next tick processes the new upload
|
|
199
|
-
* never retire results it did not see, and the jsonb
|
|
200
|
-
* clobber a newer host list. A truncated pass that
|
|
201
|
-
* stamps nothing on purpose: the NULL marker is what
|
|
202
|
-
* resume. (A truncated pass where every create FAILED stamps anyway — see
|
|
203
|
+
* The marker protocol, and why every stamp is a compare-and-set on the run
|
|
204
|
+
* state this pass read: the ingest endpoint clears the marker in the same
|
|
205
|
+
* write that stores new results — partial uploads included — so "marker is
|
|
206
|
+
* NULL" always means "the results now on the row have not been processed".
|
|
207
|
+
* If new results land while this pass is reading the old ones, the CAS
|
|
208
|
+
* misses, the marker stays NULL, and the next tick processes the new upload
|
|
209
|
+
* — the stamp can never retire results it did not see, and the jsonb
|
|
210
|
+
* write-back can never clobber a newer host list. A truncated pass that
|
|
211
|
+
* created something stamps nothing on purpose: the NULL marker is what
|
|
212
|
+
* makes the next tick resume. (A truncated pass where every create FAILED stamps anyway — see
|
|
203
213
|
* the zero-progress note at the stamp below.)
|
|
204
214
|
*/
|
|
205
215
|
@CaptureSpan()
|
|
@@ -213,13 +223,21 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
213
223
|
await NetworkDeviceDiscoveryScanService.findOneBy({
|
|
214
224
|
query: {
|
|
215
225
|
_id: data.scanId,
|
|
216
|
-
status:
|
|
226
|
+
status: QueryHelper.any(DISCOVERY_SCAN_IMPORTABLE_STATUSES),
|
|
217
227
|
},
|
|
218
228
|
select: {
|
|
219
229
|
_id: true,
|
|
220
230
|
projectId: true,
|
|
221
231
|
status: true,
|
|
222
232
|
completedAt: true,
|
|
233
|
+
/*
|
|
234
|
+
* The two counters a running scan's partial uploads move. They are
|
|
235
|
+
* not read for anything; they are the version token stampScan's
|
|
236
|
+
* compare-and-set uses to tell "the results I evaluated" from "the
|
|
237
|
+
* results that landed while I was evaluating".
|
|
238
|
+
*/
|
|
239
|
+
scannedHostCount: true,
|
|
240
|
+
respondedHostCount: true,
|
|
223
241
|
autoImportProcessedAt: true,
|
|
224
242
|
discoveredDevices: true,
|
|
225
243
|
...AUTO_IMPORT_SCAN_CREDENTIAL_SELECT,
|
|
@@ -538,11 +556,21 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
538
556
|
await NetworkDeviceDiscoveryScanService.findBy({
|
|
539
557
|
query: {
|
|
540
558
|
projectId: data.projectId,
|
|
541
|
-
|
|
559
|
+
/*
|
|
560
|
+
* A scan that is still sweeping counts too: its partial results are
|
|
561
|
+
* already on the row, and "Run Now found 25 hosts while 527 sat in
|
|
562
|
+
* the Devices list" was exactly the report (OneUptime issue #3599).
|
|
563
|
+
*/
|
|
564
|
+
status: QueryHelper.any(DISCOVERY_SCAN_IMPORTABLE_STATUSES),
|
|
542
565
|
},
|
|
543
566
|
select: {
|
|
544
567
|
_id: true,
|
|
545
568
|
},
|
|
569
|
+
/*
|
|
570
|
+
* Newest results first. An in-progress scan has no completedAt, and
|
|
571
|
+
* Postgres orders NULLs first under DESC — which is the right place
|
|
572
|
+
* for it: its results are the freshest the project has.
|
|
573
|
+
*/
|
|
546
574
|
sort: {
|
|
547
575
|
completedAt: SortOrder.Descending,
|
|
548
576
|
},
|
|
@@ -564,13 +592,16 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
564
592
|
query: {
|
|
565
593
|
_id: scanStub.id!,
|
|
566
594
|
projectId: data.projectId,
|
|
567
|
-
status:
|
|
595
|
+
status: QueryHelper.any(DISCOVERY_SCAN_IMPORTABLE_STATUSES),
|
|
568
596
|
},
|
|
569
597
|
select: {
|
|
570
598
|
_id: true,
|
|
571
599
|
projectId: true,
|
|
572
600
|
status: true,
|
|
573
601
|
completedAt: true,
|
|
602
|
+
// The version token stampScan's compare-and-set uses; see there.
|
|
603
|
+
scannedHostCount: true,
|
|
604
|
+
respondedHostCount: true,
|
|
574
605
|
discoveredDevices: true,
|
|
575
606
|
...AUTO_IMPORT_SCAN_CREDENTIAL_SELECT,
|
|
576
607
|
},
|
|
@@ -1566,20 +1597,20 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1566
1597
|
/*
|
|
1567
1598
|
* The one write this engine makes to the scan row: retire the consumed
|
|
1568
1599
|
* hosts in the stored jsonb (so the Review dialog stops offering them) and
|
|
1569
|
-
* stamp the processed marker — in a single hook-free compare-and-set on
|
|
1570
|
-
*
|
|
1600
|
+
* stamp the processed marker — in a single hook-free compare-and-set on the
|
|
1601
|
+
* run state that was read, for the reasons on processCompletedScan. The
|
|
1571
1602
|
* claim endpoint's hook-free contract is why this must never go through
|
|
1572
1603
|
* updateOneById: the scan service deliberately has no update-success hooks
|
|
1573
1604
|
* to piggyback on, and this write must not fire the full pipeline on every
|
|
1574
1605
|
* worker tick.
|
|
1575
1606
|
*
|
|
1576
1607
|
* The CAS defends against exactly one concurrent writer — the ingest
|
|
1577
|
-
* endpoint, which rewrites completedAt with
|
|
1578
|
-
*
|
|
1579
|
-
*
|
|
1580
|
-
* holds the sweep lock (the worker for its
|
|
1581
|
-
* real run; dry runs never write), so the
|
|
1582
|
-
* has the row's only engine writer. Weaken that invariant and this
|
|
1608
|
+
* endpoint, which rewrites completedAt with a final upload and the host
|
|
1609
|
+
* counters with a partial one. It cannot defend against another ENGINE
|
|
1610
|
+
* write (which changes none of those columns), and does not need to: every
|
|
1611
|
+
* path that reaches this method holds the sweep lock (the worker for its
|
|
1612
|
+
* whole sweep, Run Now for a real run; dry runs never write), so the
|
|
1613
|
+
* full-array replace below always has the row's only engine writer. Weaken that invariant and this
|
|
1583
1614
|
* becomes last-writer-wins on the isAlreadyRegistered flips.
|
|
1584
1615
|
*/
|
|
1585
1616
|
private async stampScan(data: {
|
|
@@ -1632,8 +1663,30 @@ class NetworkDeviceAutoImportRuleEngineServiceClass {
|
|
|
1632
1663
|
// Cast: the model's JSON column makes DeepPartial recursion blow up.
|
|
1633
1664
|
data: payload as unknown as QueryDeepPartialEntity<NetworkDeviceDiscoveryScan>,
|
|
1634
1665
|
expectedData: {
|
|
1635
|
-
|
|
1666
|
+
/*
|
|
1667
|
+
* The scan's own status, not the literal "Completed" this used to
|
|
1668
|
+
* pin. A scan that is still sweeping is importable now (issue
|
|
1669
|
+
* #3599), and its status is exactly the thing that changes when its
|
|
1670
|
+
* run ends — so reading it off the row keeps the guard doing what it
|
|
1671
|
+
* always did rather than making an In Progress stamp always miss.
|
|
1672
|
+
*/
|
|
1673
|
+
status: data.scan.status ?? null,
|
|
1636
1674
|
completedAt: data.scan.completedAt || null,
|
|
1675
|
+
/*
|
|
1676
|
+
* The counters a running scan's partial uploads move, so a partial
|
|
1677
|
+
* landing between the read and this write is caught the way a
|
|
1678
|
+
* completion is: the stamp misses, the marker stays NULL, and the
|
|
1679
|
+
* next tick processes the newer host list.
|
|
1680
|
+
*
|
|
1681
|
+
* Not a perfect version token for an in-progress scan — the
|
|
1682
|
+
* ICMP-filtered fallback pass finds hosts without advancing
|
|
1683
|
+
* scannedHostCount, so two partials can carry both counts unchanged.
|
|
1684
|
+
* The consequence is bounded and self-healing: one batch of hosts
|
|
1685
|
+
* waits for the next partial upload (which clears the marker again),
|
|
1686
|
+
* and the run's final result clears it unconditionally.
|
|
1687
|
+
*/
|
|
1688
|
+
scannedHostCount: data.scan.scannedHostCount ?? null,
|
|
1689
|
+
respondedHostCount: data.scan.respondedHostCount ?? null,
|
|
1637
1690
|
} as unknown as QueryDeepPartialEntity<NetworkDeviceDiscoveryScan>,
|
|
1638
1691
|
});
|
|
1639
1692
|
}
|
|
@@ -1653,6 +1653,28 @@ These are no longer recorded against the project and have to be cancelled by han
|
|
|
1653
1653
|
return createdItem;
|
|
1654
1654
|
}
|
|
1655
1655
|
|
|
1656
|
+
/*
|
|
1657
|
+
* NOTE ON THE TWO-TIER SCALE, and what it costs downstream.
|
|
1658
|
+
*
|
|
1659
|
+
* This seeds TWO alert severities (High 1 / Low 2) while
|
|
1660
|
+
* `addDefaultIncidentSeverity` immediately below seeds THREE
|
|
1661
|
+
* (Critical Incident 1 / Major Incident 2 / Minor Incident 3). That
|
|
1662
|
+
* asymmetry is load-bearing for monitor recommendations:
|
|
1663
|
+
* `MonitorRecommendationSeverityMapper` maps a recommendation's declared
|
|
1664
|
+
* `Critical` onto rank 1 and `Warning` onto rank 2, so on a default project
|
|
1665
|
+
* a Warning template opens a "Major Incident" but an alert whose severity
|
|
1666
|
+
* reads "Low" — which is how an alert email can say SEVERITY: Low for a
|
|
1667
|
+
* catalog card badged Warning.
|
|
1668
|
+
*
|
|
1669
|
+
* If a third alert tier is ever added here to close that gap, it CANNOT
|
|
1670
|
+
* ship alone. This function only seeds names a project does not already
|
|
1671
|
+
* have, so existing projects would keep the two-tier scale and map Warning
|
|
1672
|
+
* differently from new ones indefinitely. It needs a paired data migration
|
|
1673
|
+
* over every existing project — see
|
|
1674
|
+
* App/FeatureSet/Workers/DataMigrations/AddDefaultAlertSeverityAndStateToExistingProjects.ts
|
|
1675
|
+
* for the shape — and that migration has to decide what to do about the
|
|
1676
|
+
* `order` of a "Low" row a project may have reordered or renamed itself.
|
|
1677
|
+
*/
|
|
1656
1678
|
@CaptureSpan()
|
|
1657
1679
|
public async addDefaultAlertSeverity(createdItem: Model): Promise<Model> {
|
|
1658
1680
|
const projectId: ObjectID = createdItem.id!;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import DatabaseService, { EntityManager } from "./DatabaseService";
|
|
2
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
3
|
+
import UserNotificationSetting from "../../Models/DatabaseModels/UserNotificationSetting";
|
|
4
|
+
import { ROUTINE_EMAIL_EVENT_TYPES } from "../../Types/NotificationSetting/RoutineEmailEvents";
|
|
5
|
+
import ObjectID from "../../Types/ObjectID";
|
|
6
|
+
|
|
7
|
+
export class Service extends DatabaseService<UserNotificationSetting> {
|
|
8
|
+
public constructor() {
|
|
9
|
+
super(UserNotificationSetting);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
* The API authorizes the authenticated user's own settings before calling
|
|
14
|
+
* this method. Every statement remains scoped to that user and project.
|
|
15
|
+
*/
|
|
16
|
+
@CaptureSpan()
|
|
17
|
+
public async reduceRoutineEmails(data: {
|
|
18
|
+
userId: ObjectID;
|
|
19
|
+
projectId: ObjectID;
|
|
20
|
+
}): Promise<void> {
|
|
21
|
+
await this.executeTransaction(async (manager: EntityManager) => {
|
|
22
|
+
/*
|
|
23
|
+
* There is no unique constraint on (user, project, event). Serializing
|
|
24
|
+
* preset requests also protects the missing-row insert on a double click.
|
|
25
|
+
*/
|
|
26
|
+
await manager.query(
|
|
27
|
+
"SELECT pg_advisory_xact_lock(hashtextextended($1, 0))",
|
|
28
|
+
[
|
|
29
|
+
`routine-email-settings:${data.projectId.toString()}:${data.userId.toString()}`,
|
|
30
|
+
],
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
const parameters: [string, string, ReadonlyArray<string>] = [
|
|
34
|
+
data.userId.toString(),
|
|
35
|
+
data.projectId.toString(),
|
|
36
|
+
ROUTINE_EMAIL_EVENT_TYPES,
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
/*
|
|
40
|
+
* Update every matching row, including historical duplicates. Changing
|
|
41
|
+
* only email avoids overwriting another channel edited concurrently.
|
|
42
|
+
*/
|
|
43
|
+
await manager.query(
|
|
44
|
+
`UPDATE "UserNotificationSetting"
|
|
45
|
+
SET "alertByEmail" = false, "updatedAt" = now(), "version" = "version" + 1
|
|
46
|
+
WHERE "userId" = $1 AND "projectId" = $2
|
|
47
|
+
AND "eventType" = ANY($3::text[])
|
|
48
|
+
AND "deletedAt" IS NULL AND "alertByEmail" = true`,
|
|
49
|
+
parameters,
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
/*
|
|
53
|
+
* Persist an explicit opt-out for missing events so later default
|
|
54
|
+
* seeding sees the user's choice. Other channels keep their false defaults.
|
|
55
|
+
*/
|
|
56
|
+
await manager.query(
|
|
57
|
+
`INSERT INTO "UserNotificationSetting"
|
|
58
|
+
("userId", "projectId", "eventType", "alertByEmail", "createdByUserId", "version")
|
|
59
|
+
SELECT $1::uuid, $2::uuid, event."eventType", false, $1::uuid, 1
|
|
60
|
+
FROM unnest($3::text[]) AS event("eventType")
|
|
61
|
+
WHERE NOT EXISTS (
|
|
62
|
+
SELECT 1 FROM "UserNotificationSetting" setting
|
|
63
|
+
WHERE setting."userId" = $1 AND setting."projectId" = $2
|
|
64
|
+
AND setting."eventType" = event."eventType"
|
|
65
|
+
AND setting."deletedAt" IS NULL
|
|
66
|
+
)`,
|
|
67
|
+
parameters,
|
|
68
|
+
);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export default new Service();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import DatabaseService from "./DatabaseService";
|
|
2
2
|
import Model from "../../Models/DatabaseModels/RumSessionReplayView";
|
|
3
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
3
4
|
import ColumnLength from "../../Types/Database/ColumnLength";
|
|
4
5
|
import { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
5
6
|
import ObjectID from "../../Types/ObjectID";
|
|
@@ -19,6 +20,45 @@ import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
|
19
20
|
* modelled on, the whole point of the audit is that it outlives the
|
|
20
21
|
* recording it describes.
|
|
21
22
|
*/
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* The heartbeat cadence the player reports on. secondsWatched is floored
|
|
26
|
+
* to it so a chatty client costs at most one write per bucket, and the
|
|
27
|
+
* figure shown to viewers ("watched 1m 30s") never pretends to more
|
|
28
|
+
* precision than the heartbeat had.
|
|
29
|
+
*/
|
|
30
|
+
export const SESSION_REPLAY_WATCH_BUCKET_SECONDS: number = 15;
|
|
31
|
+
|
|
32
|
+
/*
|
|
33
|
+
* Ceiling on one view's watched time: the longest session the recorder
|
|
34
|
+
* will ever produce, at the slowest speed anyone would watch it, with
|
|
35
|
+
* headroom for pauses. A client cannot report more than this; the audit
|
|
36
|
+
* figure is a privacy control shown to other viewers, and an unbounded
|
|
37
|
+
* number would let a buggy or hostile client render a nonsense one.
|
|
38
|
+
*/
|
|
39
|
+
export const SESSION_REPLAY_MAX_SECONDS_WATCHED: number = 24 * 60 * 60;
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* Floor a client-reported figure to the heartbeat bucket and clamp it.
|
|
43
|
+
* Module-level so the route and the service agree on the one rounding
|
|
44
|
+
* rule without the route reaching for the class behind the instance.
|
|
45
|
+
*/
|
|
46
|
+
export function normalizeSecondsWatched(secondsWatched: number): number {
|
|
47
|
+
if (!Number.isFinite(secondsWatched) || secondsWatched <= 0) {
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const clamped: number = Math.min(
|
|
52
|
+
secondsWatched,
|
|
53
|
+
SESSION_REPLAY_MAX_SECONDS_WATCHED,
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
Math.floor(clamped / SESSION_REPLAY_WATCH_BUCKET_SECONDS) *
|
|
58
|
+
SESSION_REPLAY_WATCH_BUCKET_SECONDS
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
22
62
|
export class Service extends DatabaseService<Model> {
|
|
23
63
|
public constructor() {
|
|
24
64
|
super(Model);
|
|
@@ -64,12 +104,13 @@ export class Service extends DatabaseService<Model> {
|
|
|
64
104
|
}
|
|
65
105
|
|
|
66
106
|
/*
|
|
67
|
-
* All
|
|
107
|
+
* All four come straight off an untrusted request: a header, or a
|
|
68
108
|
* free-text field in the body. Truncated rather than validated because
|
|
69
109
|
* failing the audit write would fail the playback it is auditing, and
|
|
70
110
|
* DatabaseService.checkMaxLengthOfFields throws on anything longer
|
|
71
|
-
* than the column. An oversized user agent
|
|
72
|
-
* read from
|
|
111
|
+
* than the column. An oversized user agent - or a fingerprint longer
|
|
112
|
+
* than its ShortText column - must not be able to stop a read from
|
|
113
|
+
* being recorded.
|
|
73
114
|
*/
|
|
74
115
|
if (data.ipAddress) {
|
|
75
116
|
item.ipAddress = data.ipAddress.substring(0, ColumnLength.ShortText);
|
|
@@ -88,7 +129,8 @@ export class Service extends DatabaseService<Model> {
|
|
|
88
129
|
}
|
|
89
130
|
|
|
90
131
|
if (data.linkedExceptionFingerprint) {
|
|
91
|
-
item.linkedExceptionFingerprint =
|
|
132
|
+
item.linkedExceptionFingerprint =
|
|
133
|
+
data.linkedExceptionFingerprint.substring(0, ColumnLength.ShortText);
|
|
92
134
|
}
|
|
93
135
|
|
|
94
136
|
return await this.create({
|
|
@@ -98,47 +140,85 @@ export class Service extends DatabaseService<Model> {
|
|
|
98
140
|
}
|
|
99
141
|
|
|
100
142
|
/*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
143
|
+
* The caller's OWN view row, or null. The heartbeat and the manifest
|
|
144
|
+
* refresh both need "does this viewId belong to this user, this
|
|
145
|
+
* project, and (for the refresh) this session" answered in one lookup,
|
|
146
|
+
* and both must refuse somebody else's row indistinguishably from a
|
|
147
|
+
* missing one: secondsWatched is a privacy control, and the refresh
|
|
148
|
+
* would otherwise let a caller reuse a colleague's audit row.
|
|
107
149
|
*/
|
|
108
150
|
@CaptureSpan()
|
|
109
|
-
public async
|
|
151
|
+
public async findOwnView(data: {
|
|
110
152
|
viewId: ObjectID;
|
|
111
153
|
projectId: ObjectID;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const existing: Model | null = await this.findOneBy({
|
|
154
|
+
viewedByUserId: ObjectID;
|
|
155
|
+
sessionId?: string | undefined;
|
|
156
|
+
}): Promise<Model | null> {
|
|
157
|
+
return await this.findOneBy({
|
|
119
158
|
query: {
|
|
120
159
|
_id: data.viewId.toString(),
|
|
121
160
|
projectId: data.projectId,
|
|
161
|
+
viewedByUserId: data.viewedByUserId,
|
|
162
|
+
...(data.sessionId !== undefined && { sessionId: data.sessionId }),
|
|
122
163
|
},
|
|
123
164
|
select: {
|
|
124
165
|
_id: true,
|
|
166
|
+
rumApplicationId: true,
|
|
167
|
+
sessionId: true,
|
|
125
168
|
secondsWatched: true,
|
|
126
169
|
},
|
|
127
170
|
props: { isRoot: true },
|
|
128
171
|
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/*
|
|
175
|
+
* Advance how much of the recording was actually watched.
|
|
176
|
+
*
|
|
177
|
+
* SEMANTICS: secondsWatched is the cumulative number of seconds of
|
|
178
|
+
* footage the player has PLAYED for this view - accumulated client-side
|
|
179
|
+
* only while playback is running, scaled by speed - not the furthest
|
|
180
|
+
* offset the playhead reached. Dragging the scrubber to the end of a
|
|
181
|
+
* recording is not watching it, and the audit figure is shown to other
|
|
182
|
+
* viewers as "who watched how much", so it must not over-report.
|
|
183
|
+
*
|
|
184
|
+
* Monotonic on purpose: the heartbeat carries a cumulative total, and a
|
|
185
|
+
* player that reloads would otherwise walk the recorded figure back
|
|
186
|
+
* down and make a full viewing look like a glance. The guard is in the
|
|
187
|
+
* UPDATE's own predicate (secondsWatched < new value) rather than in a
|
|
188
|
+
* read-then-write, so two heartbeats racing for the same row cannot
|
|
189
|
+
* regress it; a heartbeat that does not advance writes nothing.
|
|
190
|
+
*
|
|
191
|
+
* When the caller already holds the row's current figure (the route
|
|
192
|
+
* reads it in the same lookup that proves ownership) it passes it as
|
|
193
|
+
* currentSecondsWatched and a non-advancing heartbeat costs no query at
|
|
194
|
+
* all.
|
|
195
|
+
*/
|
|
196
|
+
@CaptureSpan()
|
|
197
|
+
public async recordSecondsWatched(data: {
|
|
198
|
+
viewId: ObjectID;
|
|
199
|
+
projectId: ObjectID;
|
|
200
|
+
secondsWatched: number;
|
|
201
|
+
currentSecondsWatched?: number | undefined;
|
|
202
|
+
}): Promise<void> {
|
|
203
|
+
const seconds: number = normalizeSecondsWatched(data.secondsWatched);
|
|
129
204
|
|
|
130
|
-
if (
|
|
205
|
+
if (seconds <= 0) {
|
|
131
206
|
return;
|
|
132
207
|
}
|
|
133
208
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
209
|
+
if (
|
|
210
|
+
data.currentSecondsWatched !== undefined &&
|
|
211
|
+
data.currentSecondsWatched >= seconds
|
|
212
|
+
) {
|
|
137
213
|
return;
|
|
138
214
|
}
|
|
139
215
|
|
|
140
|
-
await this.
|
|
141
|
-
|
|
216
|
+
await this.updateOneBy({
|
|
217
|
+
query: {
|
|
218
|
+
_id: data.viewId.toString(),
|
|
219
|
+
projectId: data.projectId,
|
|
220
|
+
secondsWatched: QueryHelper.lessThanOrNull(seconds),
|
|
221
|
+
},
|
|
142
222
|
data: {
|
|
143
223
|
secondsWatched: seconds,
|
|
144
224
|
},
|
|
@@ -1,9 +1,107 @@
|
|
|
1
1
|
import DatabaseService from "./DatabaseService";
|
|
2
2
|
import Model from "../../Models/DatabaseModels/ScheduledMaintenanceCustomField";
|
|
3
|
+
import ObjectID from "../../Types/ObjectID";
|
|
4
|
+
import CreateBy from "../Types/Database/CreateBy";
|
|
5
|
+
import UpdateBy from "../Types/Database/UpdateBy";
|
|
6
|
+
import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
|
|
7
|
+
import { backfillMappedCustomFieldValues } from "../Utils/CustomField/CustomFieldDefinitionMappingHooks";
|
|
8
|
+
import {
|
|
9
|
+
validateCustomFieldMappingOnCreate,
|
|
10
|
+
validateCustomFieldMappingOnUpdate,
|
|
11
|
+
} from "../Utils/CustomField/CustomFieldMappingValidator";
|
|
12
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
3
13
|
|
|
14
|
+
/*
|
|
15
|
+
* A scheduled maintenance custom field can take its value from the same field
|
|
16
|
+
* on the event's monitors instead of being typed in again
|
|
17
|
+
* (OneUptime/oneuptime#3549). These hooks are the two halves of that
|
|
18
|
+
* configuration being saved: refusing a mapping that could never resolve, and
|
|
19
|
+
* filling in the events that already exist once one is saved.
|
|
20
|
+
*/
|
|
4
21
|
export class Service extends DatabaseService<Model> {
|
|
5
22
|
public constructor() {
|
|
6
23
|
super(Model);
|
|
7
24
|
}
|
|
25
|
+
|
|
26
|
+
@CaptureSpan()
|
|
27
|
+
protected override async onBeforeCreate(
|
|
28
|
+
createBy: CreateBy<Model>,
|
|
29
|
+
): Promise<OnCreate<Model>> {
|
|
30
|
+
await validateCustomFieldMappingOnCreate({
|
|
31
|
+
definitionModelType: Model,
|
|
32
|
+
createBy: createBy,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
return { createBy, carryForward: null };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@CaptureSpan()
|
|
39
|
+
protected override async onBeforeUpdate(
|
|
40
|
+
updateBy: UpdateBy<Model>,
|
|
41
|
+
): Promise<OnUpdate<Model>> {
|
|
42
|
+
await validateCustomFieldMappingOnUpdate({
|
|
43
|
+
definitionModelType: Model,
|
|
44
|
+
definitionService: this,
|
|
45
|
+
updateBy: updateBy,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
return { updateBy, carryForward: null };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@CaptureSpan()
|
|
52
|
+
protected override async onCreateSuccess(
|
|
53
|
+
_onCreate: OnCreate<Model>,
|
|
54
|
+
createdItem: Model,
|
|
55
|
+
): Promise<Model> {
|
|
56
|
+
backfillMappedCustomFieldValues({
|
|
57
|
+
definitionModelType: Model,
|
|
58
|
+
projectId: createdItem.projectId,
|
|
59
|
+
definitionName: "scheduled maintenance custom field",
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
return createdItem;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@CaptureSpan()
|
|
66
|
+
protected override async onUpdateSuccess(
|
|
67
|
+
onUpdate: OnUpdate<Model>,
|
|
68
|
+
updatedItemIds: Array<ObjectID>,
|
|
69
|
+
): Promise<OnUpdate<Model>> {
|
|
70
|
+
if (updatedItemIds.length > 0) {
|
|
71
|
+
backfillMappedCustomFieldValues({
|
|
72
|
+
definitionModelType: Model,
|
|
73
|
+
projectId: await this.getProjectIdForBackfill(onUpdate, updatedItemIds),
|
|
74
|
+
definitionName: "scheduled maintenance custom field",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return onUpdate;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/*
|
|
82
|
+
* `props.tenantId` is set on every dashboard write but not on internal
|
|
83
|
+
* root-scoped ones, so fall back to the row itself rather than skipping the
|
|
84
|
+
* backfill for a mapping that was changed by a script.
|
|
85
|
+
*/
|
|
86
|
+
private async getProjectIdForBackfill(
|
|
87
|
+
onUpdate: OnUpdate<Model>,
|
|
88
|
+
updatedItemIds: Array<ObjectID>,
|
|
89
|
+
): Promise<ObjectID | undefined> {
|
|
90
|
+
const tenantId: ObjectID | undefined = onUpdate.updateBy.props.tenantId as
|
|
91
|
+
| ObjectID
|
|
92
|
+
| undefined;
|
|
93
|
+
|
|
94
|
+
if (tenantId) {
|
|
95
|
+
return tenantId;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const item: Model | null = await this.findOneById({
|
|
99
|
+
id: updatedItemIds[0]!,
|
|
100
|
+
select: { projectId: true },
|
|
101
|
+
props: { isRoot: true },
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
return item?.projectId;
|
|
105
|
+
}
|
|
8
106
|
}
|
|
9
107
|
export default new Service();
|
|
@@ -6,6 +6,8 @@ import CreateBy from "../Types/Database/CreateBy";
|
|
|
6
6
|
import DeleteBy from "../Types/Database/DeleteBy";
|
|
7
7
|
import { OnCreate, OnDelete, OnUpdate } from "../Types/Database/Hooks";
|
|
8
8
|
import DatabaseService from "./DatabaseService";
|
|
9
|
+
import ScheduledMaintenanceCustomField from "../../Models/DatabaseModels/ScheduledMaintenanceCustomField";
|
|
10
|
+
import CustomFieldMappingService from "./CustomFieldMappingService";
|
|
9
11
|
import MonitorService from "./MonitorService";
|
|
10
12
|
import ScheduledMaintenanceOwnerTeamService from "./ScheduledMaintenanceOwnerTeamService";
|
|
11
13
|
import ScheduledMaintenanceOwnerUserService from "./ScheduledMaintenanceOwnerUserService";
|
|
@@ -609,6 +611,17 @@ ${resourcesAffected ? `**Resources Affected:** ${resourcesAffected}` : ""}
|
|
|
609
611
|
|
|
610
612
|
await this.validateProjectScopedReferences(updateBy);
|
|
611
613
|
|
|
614
|
+
/*
|
|
615
|
+
* Re-apply mapped custom field values. Covers the Custom Fields modal
|
|
616
|
+
* saving the whole bag back over a mapped value, and the event's monitors
|
|
617
|
+
* changing — both change what a mapped field should hold, and folding the
|
|
618
|
+
* answer into this payload keeps it one write with a truthful audit entry.
|
|
619
|
+
*/
|
|
620
|
+
await CustomFieldMappingService.applyMappingsToUpdate({
|
|
621
|
+
definitionModelType: ScheduledMaintenanceCustomField,
|
|
622
|
+
updateBy: updateBy,
|
|
623
|
+
});
|
|
624
|
+
|
|
612
625
|
return {
|
|
613
626
|
updateBy,
|
|
614
627
|
carryForward: null,
|
|
@@ -937,6 +950,19 @@ ${resourcesAffected ? `**Resources Affected:** ${resourcesAffected}` : ""}
|
|
|
937
950
|
StatusPageSubscriberNotificationStatus.Pending;
|
|
938
951
|
}
|
|
939
952
|
|
|
953
|
+
/*
|
|
954
|
+
* Custom fields configured to inherit from the event's monitors are
|
|
955
|
+
* stamped here rather than in onCreateSuccess: `customFields` is a column
|
|
956
|
+
* on this row and the onCreateSuccess chain is un-awaited, so a value
|
|
957
|
+
* written there would be missing from the event the caller gets back.
|
|
958
|
+
* Written not to throw — a field failing to inherit must not stop an event
|
|
959
|
+
* from being scheduled.
|
|
960
|
+
*/
|
|
961
|
+
await CustomFieldMappingService.applyMappingsToCreate({
|
|
962
|
+
definitionModelType: ScheduledMaintenanceCustomField,
|
|
963
|
+
createBy: createBy,
|
|
964
|
+
});
|
|
965
|
+
|
|
940
966
|
return { createBy, carryForward: null };
|
|
941
967
|
}
|
|
942
968
|
|
|
@@ -1562,6 +1588,12 @@ ${scheduledMaintenance.description || "No description provided."}
|
|
|
1562
1588
|
onUpdate: OnUpdate<Model>,
|
|
1563
1589
|
updatedItemIds: ObjectID[],
|
|
1564
1590
|
): Promise<OnUpdate<Model>> {
|
|
1591
|
+
CustomFieldMappingService.restampAfterMultiRowUpdate({
|
|
1592
|
+
definitionModelType: ScheduledMaintenanceCustomField,
|
|
1593
|
+
updateBy: onUpdate.updateBy,
|
|
1594
|
+
updatedItemIds: updatedItemIds,
|
|
1595
|
+
});
|
|
1596
|
+
|
|
1565
1597
|
/*
|
|
1566
1598
|
* Rescheduling the planned window is the whole point of making these
|
|
1567
1599
|
* fields editable, so the numbers derived from them have to move. Without
|