@oneuptime/common 13.0.1 → 13.0.3
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 +34 -0
- package/Models/DatabaseModels/AlertEpisodeLabelRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodeOnCallRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodeOwnerRule.ts +2 -2
- package/Models/DatabaseModels/AlertEpisodePrivacyRule.ts +2 -2
- package/Models/DatabaseModels/AlertGroupingRule.ts +2 -2
- package/Models/DatabaseModels/AlertLabelRule.ts +2 -2
- package/Models/DatabaseModels/AlertOnCallRule.ts +2 -2
- package/Models/DatabaseModels/AlertOwnerRule.ts +2 -2
- package/Models/DatabaseModels/AlertPrivacyRule.ts +2 -2
- package/Models/DatabaseModels/AlertReminderRule.ts +6 -4
- package/Models/DatabaseModels/AutoRemediationRule.ts +2 -2
- package/Models/DatabaseModels/CephClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/CephClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/CloudResourceLabelRule.ts +2 -2
- package/Models/DatabaseModels/CloudResourceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DashboardLabelRule.ts +2 -2
- package/Models/DatabaseModels/DashboardOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.ts +11 -0
- package/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.ts +44 -0
- package/Models/DatabaseModels/DockerHostLabelRule.ts +2 -2
- package/Models/DatabaseModels/DockerHostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/HostLabelRule.ts +2 -2
- package/Models/DatabaseModels/HostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeOnCallRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodeOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentEpisodePrivacyRule.ts +2 -2
- package/Models/DatabaseModels/IncidentGroupingRule.ts +2 -2
- package/Models/DatabaseModels/IncidentLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncidentOnCallRule.ts +2 -2
- package/Models/DatabaseModels/IncidentOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncidentPrivacyRule.ts +2 -2
- package/Models/DatabaseModels/IncidentReminderRule.ts +6 -4
- package/Models/DatabaseModels/IncidentSlaRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicy.ts +3 -4
- package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +2 -2
- package/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.ts +254 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/IoTFleetLabelRule.ts +2 -2
- package/Models/DatabaseModels/IoTFleetOwnerRule.ts +2 -2
- package/Models/DatabaseModels/KubernetesClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/KubernetesClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/MonitorLabelRule.ts +2 -2
- package/Models/DatabaseModels/MonitorOwnerRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceLabelRule.ts +2 -2
- package/Models/DatabaseModels/NetworkDeviceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +2 -2
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +2 -2
- package/Models/DatabaseModels/PodmanHostLabelRule.ts +2 -2
- package/Models/DatabaseModels/PodmanHostOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ProxmoxClusterLabelRule.ts +2 -2
- package/Models/DatabaseModels/ProxmoxClusterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RumApplicationLabelRule.ts +2 -2
- package/Models/DatabaseModels/RumApplicationOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RunbookLabelRule.ts +2 -2
- package/Models/DatabaseModels/RunbookOwnerRule.ts +2 -2
- package/Models/DatabaseModels/RunbookRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ScheduledMaintenanceReminderRule.ts +6 -4
- package/Models/DatabaseModels/ServerlessFunctionLabelRule.ts +2 -2
- package/Models/DatabaseModels/ServerlessFunctionOwnerRule.ts +2 -2
- package/Models/DatabaseModels/ServiceLabelRule.ts +2 -2
- package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +283 -4
- package/Models/DatabaseModels/ServiceOwnerRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageLabelRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageMonitorRule.ts +2 -2
- package/Models/DatabaseModels/StatusPageOwnerRule.ts +2 -2
- package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +2 -2
- package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +2 -2
- package/Models/DatabaseModels/WorkflowLabelRule.ts +2 -2
- package/Models/DatabaseModels/WorkflowOwnerRule.ts +2 -2
- package/Server/API/TelemetryAPI.ts +323 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.ts +111 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.ts +644 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/MultipartFormData.ts +46 -21
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +21 -0
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +21 -0
- package/Server/Services/AlertGroupingEngineService.ts +27 -0
- package/Server/Services/AlertLabelRuleEngineService.ts +27 -0
- package/Server/Services/AlertOnCallRuleEngineService.ts +27 -0
- package/Server/Services/AlertOwnerRuleEngineService.ts +27 -0
- package/Server/Services/AlertPrivacyRuleEngineService.ts +27 -0
- package/Server/Services/AlertReminderRuleService.ts +65 -33
- package/Server/Services/AutoRemediationRuleEngineService.ts +90 -8
- package/Server/Services/CephClusterLabelRuleEngineService.ts +20 -0
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +20 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +20 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DashboardLabelRuleEngineService.ts +20 -0
- package/Server/Services/DashboardOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DatabaseService.ts +409 -6
- package/Server/Services/DockerHostLabelRuleEngineService.ts +20 -0
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +20 -0
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +23 -0
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/HostLabelRuleEngineService.ts +13 -0
- package/Server/Services/HostOwnerRuleEngineService.ts +13 -0
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +21 -0
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +21 -0
- package/Server/Services/IncidentGroupingEngineService.ts +64 -13
- package/Server/Services/IncidentLabelRuleEngineService.ts +64 -9
- package/Server/Services/IncidentOnCallRuleEngineService.ts +64 -10
- package/Server/Services/IncidentOwnerRuleEngineService.ts +64 -10
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +64 -10
- package/Server/Services/IncidentReminderRuleService.ts +66 -34
- package/Server/Services/IncidentSlaRuleService.ts +55 -12
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +20 -0
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +20 -0
- package/Server/Services/IncomingCallPolicyPhoneNumberService.ts +184 -0
- package/Server/Services/IncomingCallPolicyService.ts +276 -5
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +20 -0
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +20 -0
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +23 -0
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +23 -0
- package/Server/Services/LabelService.ts +50 -7
- package/Server/Services/MonitorLabelRuleEngineService.ts +20 -0
- package/Server/Services/MonitorOwnerRuleEngineService.ts +20 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +2 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +93 -1
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +26 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +25 -0
- package/Server/Services/NetworkDeviceService.ts +2 -0
- package/Server/Services/NetworkSiteAssignmentRuleService.ts +90 -1
- package/Server/Services/NetworkSiteService.ts +242 -29
- package/Server/Services/NetworkSiteTypeService.ts +177 -77
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +20 -0
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +20 -0
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +22 -0
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +22 -0
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +20 -0
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +20 -0
- package/Server/Services/ProjectCallSMSConfigService.ts +156 -7
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +25 -0
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +25 -0
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +22 -0
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +22 -0
- package/Server/Services/RunbookLabelRuleEngineService.ts +20 -0
- package/Server/Services/RunbookOwnerRuleEngineService.ts +20 -0
- package/Server/Services/RunbookRuleEngineService.ts +18 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +62 -10
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +62 -11
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +48 -18
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +25 -0
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +25 -0
- package/Server/Services/ServiceLabelRuleEngineService.ts +20 -0
- package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +675 -12
- package/Server/Services/ServiceLevelObjectiveService.ts +55 -13
- package/Server/Services/ServiceOwnerRuleEngineService.ts +20 -0
- package/Server/Services/StatusPageLabelRuleEngineService.ts +20 -0
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +31 -2
- package/Server/Services/StatusPageMonitorRuleService.ts +34 -1
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +20 -0
- package/Server/Services/UserService.ts +23 -50
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +25 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +25 -0
- package/Server/Services/WorkflowLabelRuleEngineService.ts +20 -0
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +20 -0
- package/Server/Static/Brand/README.md +10 -5
- package/Server/Static/Brand/favicons/oneuptime-up-v1.svg +8 -0
- package/Server/Types/Database/QueryHelper.ts +88 -0
- package/Server/Utils/AI/Toolbox/SloTools.ts +19 -2
- package/Server/Utils/IncomingCallPhoneNumber.ts +29 -16
- package/Server/Utils/Profiling.ts +13 -1
- package/Server/Utils/Rules/MonitorRuleCriteriaCache.ts +38 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +498 -0
- package/Server/Utils/Telemetry.ts +3 -1
- package/Server/Utils/VendorAssets.ts +3 -0
- package/Tests/App/Dashboard/AIInsightViewTriage.test.tsx +348 -0
- package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +476 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +25 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +449 -24
- package/Tests/App/Dashboard/DashboardPersistentSideMenuLayouts.test.tsx +702 -0
- package/Tests/App/Dashboard/ExceptionsLandingRedirect.test.tsx +63 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +150 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +279 -100
- package/Tests/App/Dashboard/InventoryItemSideMenu.test.tsx +155 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +11 -0
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +215 -71
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +347 -0
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +263 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +413 -17
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +138 -0
- package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +940 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +378 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +735 -0
- package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +275 -108
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +13 -3
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +127 -4
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -4
- package/Tests/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.test.ts +362 -0
- package/Tests/Models/DatabaseModels/RuleBaseModel.test.ts +69 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +181 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +1303 -145
- package/Tests/Server/API/UserTwoFactorSelfService.test.ts +407 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +611 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +61 -3
- package/Tests/Server/Middleware/TelemetryIngestionDisabled.test.ts +211 -0
- package/Tests/Server/Services/AlertIncidentRuleCriteriaEngineServices.test.ts +651 -0
- package/Tests/Server/Services/AutoRemediationRuleEngineService.test.ts +79 -0
- package/Tests/Server/Services/DatabaseServiceRelationOnlyRuleRollout.test.ts +330 -0
- package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +522 -0
- package/Tests/Server/Services/IncidentSlaRuleCriteriaCorrelation.test.ts +99 -0
- package/Tests/Server/Services/IncomingCallPolicyPhoneNumberService.test.ts +1540 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +179 -2
- package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +170 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +559 -53
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +122 -55
- package/Tests/Server/Services/ReminderRuleCriteria.test.ts +173 -0
- package/Tests/Server/Services/ResourceRuleCriteriaEngineServices.test.ts +170 -0
- package/Tests/Server/Services/ScheduledMaintenanceRuleCriteriaCorrelation.test.ts +154 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +2450 -470
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +464 -121
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +281 -0
- package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +132 -0
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +159 -14
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +6 -8
- package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +203 -34
- package/Tests/Server/Types/Database/QueryHelperJsonArrayObjects.test.ts +128 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +190 -1
- package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +461 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +25 -0
- package/Tests/Server/Utils/Billing/BillingFailureNoticeThrottle.test.ts +359 -0
- package/Tests/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.test.ts +318 -0
- package/Tests/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.test.ts +220 -0
- package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +1043 -0
- package/Tests/Server/Utils/Execute.test.ts +302 -0
- package/Tests/Server/Utils/GracefulShutdown.test.ts +565 -0
- package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +36 -20
- package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +750 -0
- package/Tests/Server/Utils/ProductAnalytics.test.ts +404 -0
- package/Tests/Server/Utils/Profiling.test.ts +366 -0
- package/Tests/Server/Utils/Rules/MonitorRuleCriteriaCache.test.ts +99 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +558 -0
- package/Tests/Server/Utils/VendorAssets.test.ts +17 -0
- package/Tests/Types/Dashboard/DashboardTemplateEditorialInvariants.test.ts +659 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +97 -0
- package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +1179 -0
- package/Tests/Types/Database/AccessControl/OwnedThrough.test.ts +136 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +180 -1
- package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +13 -6
- package/Tests/UI/Components/Alert.test.tsx +532 -93
- package/Tests/UI/Components/Feed.test.tsx +241 -0
- package/Tests/UI/Components/Forms/BasicFormStepNavigation.test.tsx +368 -0
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +454 -0
- package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +290 -0
- package/Tests/UI/Components/Forms/ModelFormRuleCriteria.test.tsx +331 -0
- package/Tests/UI/Components/IconOpticalSize.test.tsx +79 -31
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +6 -6
- package/Tests/UI/Components/NavBar.test.tsx +91 -2
- package/Tests/UI/Components/PencilButton.test.tsx +211 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaBuilder.test.tsx +510 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +350 -0
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +50 -0
- package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +329 -0
- package/Tests/UI/Components/useFeedItems.test.tsx +107 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +401 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +1 -1
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +7 -1
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +2 -0
- package/Tests/UI/Rum/ReplayEngine.test.ts +1069 -5
- package/Tests/UI/Rum/ReplayHeader.test.tsx +579 -2
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +23 -5
- package/Tests/UI/Rum/ReplayRail.test.tsx +143 -1
- package/Tests/UI/Rum/ReplayRenderBudget.test.tsx +338 -0
- package/Tests/UI/Rum/ReplaySignals.test.ts +179 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +210 -3
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +180 -1
- package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +405 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +13 -16
- package/Tests/UI/Rum/SessionReplayFacets.test.tsx +199 -0
- package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +58 -21
- package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +2 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +717 -4
- package/Tests/UI/Rum/SessionReplayUsersPage.test.tsx +435 -0
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +577 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +1 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -1
- package/Tests/UI/Utils/LabelRuleImportExport.test.ts +192 -0
- package/Tests/UI/Utils/Navigation.test.ts +30 -0
- package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +880 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +158 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +93 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +138 -0
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +174 -0
- package/Tests/Utils/Rules/RuleCriteriaMatcher.test.ts +1424 -0
- package/Tests/Utils/Rum/SessionIdentity.test.ts +72 -0
- package/Tests/Utils/Slo/SloBurnRateRuleState.test.ts +374 -28
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +118 -0
- package/Types/Dashboard/DashboardTemplates.ts +465 -0
- package/Types/Rules/RuleCriteria.ts +51 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +437 -0
- package/Types/Rum/SessionReplay.ts +75 -0
- package/Types/Rum/SessionReplayApi.ts +93 -0
- package/UI/Components/Alerts/Alert.tsx +102 -72
- package/UI/Components/Button/Button.tsx +4 -1
- package/UI/Components/Dropdown/Dropdown.tsx +2 -0
- package/UI/Components/Feed/Feed.tsx +15 -0
- package/UI/Components/Feed/useFeedItems.ts +227 -0
- package/UI/Components/Forms/BasicForm.tsx +42 -21
- package/UI/Components/Forms/ModelForm.tsx +80 -1
- package/UI/Components/Icon/Icon.tsx +3 -35
- package/UI/Components/ModelTable/ModelTable.tsx +19 -0
- package/UI/Components/Navbar/NavBar.tsx +1 -0
- package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +735 -0
- package/UI/Components/RuleCriteria/RuleCriteriaModelForm.tsx +209 -0
- package/UI/Components/RuleCriteria/RuleCriteriaModelTable.tsx +205 -0
- package/UI/Components/RuleCriteria/RuleCriteriaSummary.tsx +123 -0
- package/UI/Components/Table/Table.tsx +3 -0
- package/UI/Components/Table/TableBody.tsx +3 -0
- package/UI/Components/Table/TableRow.tsx +8 -2
- package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +14 -2
- package/UI/Styles/Theme.css +1 -0
- package/UI/Utils/LabelRuleImportExport.ts +114 -6
- package/UI/Utils/Navigation.ts +1 -2
- package/UI/esbuild-config.js +46 -0
- package/Utils/Faker.ts +93 -6
- package/Utils/LabelRuleImportExport.ts +295 -2
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +108 -8
- package/Utils/NetworkSite/CidrMatchUtil.ts +102 -0
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +152 -2
- package/Utils/Rules/RuleCriteriaMatcher.ts +931 -0
- package/Utils/Rum/SessionIdentity.ts +16 -0
- package/Utils/Slo/SloBurnRateRuleState.ts +87 -33
- package/Utils/Telemetry/OriginAllowList.ts +74 -0
- package/build/dist/Models/AnalyticsModels/RumSession.js +32 -0
- package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/AlertReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AutoRemediationRule.js +2 -2
- package/build/dist/Models/DatabaseModels/AutoRemediationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DashboardLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js +12 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js +50 -0
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/HostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/HostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/HostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/IncidentReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSlaRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncidentSlaRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js +3 -4
- package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js +277 -0
- package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/MonitorLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +2 -2
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunbookRule.js +2 -2
- package/build/dist/Models/DatabaseModels/RunbookRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js +6 -5
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServiceLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +281 -4
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +2 -2
- package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +2 -2
- package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +211 -4
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js +301 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +38 -21
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +17 -0
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +21 -0
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +21 -0
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +44 -26
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +54 -11
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +235 -10
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +12 -0
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -0
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +17 -0
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +39 -13
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +39 -9
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +39 -10
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +44 -26
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +33 -12
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js +127 -0
- package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js.map +1 -0
- package/build/dist/Server/Services/IncomingCallPolicyService.js +187 -4
- package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +39 -7
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +2 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +57 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +17 -0
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +2 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +56 -1
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +187 -22
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +126 -51
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js +115 -6
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js +12 -0
- package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +38 -9
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +38 -10
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +32 -14
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +554 -12
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +50 -14
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +25 -2
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js +19 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +14 -49
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +16 -0
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +16 -0
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +67 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +21 -4
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/IncomingCallPhoneNumber.js +9 -3
- package/build/dist/Server/Utils/IncomingCallPhoneNumber.js.map +1 -1
- package/build/dist/Server/Utils/Profiling.js +10 -1
- package/build/dist/Server/Utils/Profiling.js.map +1 -1
- package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js +30 -0
- package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +344 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +1 -1
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +2 -0
- package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +425 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteria.js +18 -0
- package/build/dist/Types/Rules/RuleCriteria.js.map +1 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +426 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +64 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/UI/Components/Alerts/Alert.js +63 -41
- package/build/dist/UI/Components/Alerts/Alert.js.map +1 -1
- package/build/dist/UI/Components/Button/Button.js +3 -1
- package/build/dist/UI/Components/Button/Button.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Feed/Feed.js +4 -1
- package/build/dist/UI/Components/Feed/Feed.js.map +1 -1
- package/build/dist/UI/Components/Feed/useFeedItems.js +137 -0
- package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -0
- package/build/dist/UI/Components/Forms/BasicForm.js +38 -19
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +65 -1
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +3 -35
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +12 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +1 -0
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +383 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js +124 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js +126 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js +63 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +1 -1
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableBody.js +4 -2
- package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +3 -2
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +14 -2
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +1 -1
- package/build/dist/UI/Utils/LabelRuleImportExport.js +81 -5
- package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/Utils/Faker.js +76 -6
- package/build/dist/Utils/Faker.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +157 -3
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +81 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +77 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +109 -2
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -1
- package/build/dist/Utils/Rules/RuleCriteriaMatcher.js +526 -0
- package/build/dist/Utils/Rules/RuleCriteriaMatcher.js.map +1 -0
- package/build/dist/Utils/Rum/SessionIdentity.js +13 -1
- package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
- package/build/dist/Utils/Slo/SloBurnRateRuleState.js +28 -15
- package/build/dist/Utils/Slo/SloBurnRateRuleState.js.map +1 -1
- package/build/dist/Utils/Telemetry/OriginAllowList.js +61 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
- package/package.json +20 -20
|
@@ -30,6 +30,8 @@ import {
|
|
|
30
30
|
SESSION_REPLAY_SORT_BY_VALUES,
|
|
31
31
|
SessionReplaySortBy,
|
|
32
32
|
SessionReplaySortedListCursorDto,
|
|
33
|
+
SessionReplayUserKind,
|
|
34
|
+
SessionReplayUsersCursorDto,
|
|
33
35
|
} from "../../../Types/Rum/SessionReplayApi";
|
|
34
36
|
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
35
37
|
import CaptureSpan from "../Telemetry/CaptureSpan";
|
|
@@ -93,6 +95,15 @@ const READ_QUERY_SETTINGS: string = getQuerySettings({
|
|
|
93
95
|
export const DEFAULT_SESSION_REPLAY_LIST_LIMIT: number = 50;
|
|
94
96
|
export const MAX_SESSION_REPLAY_LIST_LIMIT: number = 200;
|
|
95
97
|
|
|
98
|
+
/*
|
|
99
|
+
* Page sizes for the per-user rollup (listUsers). Same figures as the
|
|
100
|
+
* list, but the cost model differs: every page of the rollup
|
|
101
|
+
* re-aggregates the whole window (see listUsers), so the cap bounds the
|
|
102
|
+
* response, not the work.
|
|
103
|
+
*/
|
|
104
|
+
export const DEFAULT_SESSION_REPLAY_USERS_LIMIT: number = 50;
|
|
105
|
+
export const MAX_SESSION_REPLAY_USERS_LIMIT: number = 200;
|
|
106
|
+
|
|
96
107
|
/* Sessions returned by the exception -> replay lookup. */
|
|
97
108
|
export const MAX_SESSION_REPLAY_FOR_EXCEPTION_LIMIT: number = 20;
|
|
98
109
|
|
|
@@ -163,6 +174,13 @@ export interface SessionReplayListFilters {
|
|
|
163
174
|
deviceTypes?: Array<string> | undefined;
|
|
164
175
|
countryCodes?: Array<string> | undefined;
|
|
165
176
|
identifiedUserKey?: string | undefined;
|
|
177
|
+
/*
|
|
178
|
+
* Exact match on the recorder-minted anonymous visitor id: "every
|
|
179
|
+
* session from this browser". The handler has already checked the
|
|
180
|
+
* shape. Like identifiedUserKey it is a random token the list returns
|
|
181
|
+
* to every caller on every row, so it carries no identity gate.
|
|
182
|
+
*/
|
|
183
|
+
visitorId?: string | undefined;
|
|
166
184
|
/* "sessions that hit /checkout" - matches the routes array. */
|
|
167
185
|
route?: string | undefined;
|
|
168
186
|
minDurationMs?: number | undefined;
|
|
@@ -234,6 +252,12 @@ export interface SessionReplayListItem {
|
|
|
234
252
|
viewportWidth: number;
|
|
235
253
|
viewportHeight: number;
|
|
236
254
|
identifiedUserKey: string;
|
|
255
|
+
/*
|
|
256
|
+
* The recorder's per-browser anonymous visitor id; "" for a session an
|
|
257
|
+
* older recorder produced. Under the ordinary session ACL like the
|
|
258
|
+
* digest above: it names a browser, never a person.
|
|
259
|
+
*/
|
|
260
|
+
visitorId: string;
|
|
237
261
|
/* Present only when the caller holds the narrower identity permission. */
|
|
238
262
|
identifiedUserLabel?: string | undefined;
|
|
239
263
|
identifiedUserTraits?: Record<string, string> | undefined;
|
|
@@ -264,6 +288,71 @@ export interface SessionReplayListResult {
|
|
|
264
288
|
/* Routes projected onto a list row; the table shows three and says "(N pages)". */
|
|
265
289
|
export const MAX_LIST_ROUTES: number = 5;
|
|
266
290
|
|
|
291
|
+
/* The keyset cursor the per-user rollup accepts and emits. */
|
|
292
|
+
export type SessionReplayUsersCursor = SessionReplayUsersCursorDto;
|
|
293
|
+
|
|
294
|
+
export interface SessionReplayUsersRequest {
|
|
295
|
+
projectId: ObjectID;
|
|
296
|
+
rumApplicationId: ObjectID;
|
|
297
|
+
startTime: Date;
|
|
298
|
+
endTime: Date;
|
|
299
|
+
limit: number;
|
|
300
|
+
cursor?: SessionReplayUsersCursor | undefined;
|
|
301
|
+
/*
|
|
302
|
+
* The same column-level identity ACL as SessionReplayListRequest: the
|
|
303
|
+
* label and traits are named at neither level of the statement unless
|
|
304
|
+
* the handler has already passed canReadIdentifiedUserLabel.
|
|
305
|
+
*/
|
|
306
|
+
includeIdentifiedUserLabel: boolean;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/*
|
|
310
|
+
* One person (or one browser, or the anonymous remainder) across every
|
|
311
|
+
* session of theirs in the window. Mirrors SessionReplayUserRollupDto
|
|
312
|
+
* field for field; the handler serialises it as-is.
|
|
313
|
+
*/
|
|
314
|
+
export interface SessionReplayUserRollup {
|
|
315
|
+
/*
|
|
316
|
+
* "u:<identifiedUserKey>" for an identified person, "v:<visitorId>" for
|
|
317
|
+
* a linked browser, "" for the anonymous bucket. The row key and the
|
|
318
|
+
* cursor tiebreak; opaque to the client.
|
|
319
|
+
*/
|
|
320
|
+
groupKey: string;
|
|
321
|
+
kind: SessionReplayUserKind;
|
|
322
|
+
/* "" unless kind is "identified". */
|
|
323
|
+
identifiedUserKey: string;
|
|
324
|
+
/* The visitor id of the newest session in the group; "" when it had none. */
|
|
325
|
+
visitorId: string;
|
|
326
|
+
/* Present only when the caller holds the narrower identity permission. */
|
|
327
|
+
identifiedUserLabel?: string | undefined;
|
|
328
|
+
identifiedUserTraits?: Record<string, string> | undefined;
|
|
329
|
+
sessionCount: number;
|
|
330
|
+
/* Sessions still being recorded (not finalized). */
|
|
331
|
+
liveSessionCount: number;
|
|
332
|
+
firstSeenUnixMs: number;
|
|
333
|
+
lastSeenUnixMs: number;
|
|
334
|
+
totalDurationMs: number;
|
|
335
|
+
/* Sums over the group's sessions. */
|
|
336
|
+
errorCount: number;
|
|
337
|
+
frustrationCount: number;
|
|
338
|
+
errorSessionCount: number;
|
|
339
|
+
pageCount: number;
|
|
340
|
+
/* The newest session, so "Watch latest" needs no second request. */
|
|
341
|
+
lastSessionId: string;
|
|
342
|
+
lastEntryUrl: string;
|
|
343
|
+
/* Device facts of the newest session. */
|
|
344
|
+
browserName: string;
|
|
345
|
+
browserVersion: string;
|
|
346
|
+
osName: string;
|
|
347
|
+
deviceType: string;
|
|
348
|
+
countryCode: string;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
export interface SessionReplayUsersResult {
|
|
352
|
+
users: Array<SessionReplayUserRollup>;
|
|
353
|
+
nextCursor: SessionReplayUsersCursor | null;
|
|
354
|
+
}
|
|
355
|
+
|
|
267
356
|
export interface SessionReplaySessionHeader {
|
|
268
357
|
sessionId: string;
|
|
269
358
|
projectId: string;
|
|
@@ -327,6 +416,15 @@ export interface SessionReplaySessionHeader {
|
|
|
327
416
|
* for recordings that predate the field.
|
|
328
417
|
*/
|
|
329
418
|
recorderCapabilities: Array<string>;
|
|
419
|
+
/*
|
|
420
|
+
* The pseudonymous identity digest ("" when the page never identified
|
|
421
|
+
* the user) and the per-browser visitor id ("" from an older recorder).
|
|
422
|
+
* Both are what the player hands back to /list to find this person's
|
|
423
|
+
* other sessions. Neither is identity-gated: the list already returns
|
|
424
|
+
* both to every list-capable caller, and neither names anyone.
|
|
425
|
+
*/
|
|
426
|
+
identifiedUserKey: string;
|
|
427
|
+
visitorId: string;
|
|
330
428
|
/*
|
|
331
429
|
* Never populated by getSessionHeader. The manifest handler fills them
|
|
332
430
|
* from getSessionIdentity ONLY after canReadIdentifiedUserLabel passes,
|
|
@@ -554,6 +652,12 @@ const HEADER_AGGREGATES: Array<AggregatedColumn> = [
|
|
|
554
652
|
alias: "aggIdentifiedUserKey",
|
|
555
653
|
expression: argMaxColumn("identifiedUserKey"),
|
|
556
654
|
},
|
|
655
|
+
/*
|
|
656
|
+
* The recorder-minted per-browser id. Under the ordinary session ACL
|
|
657
|
+
* beside the digest, NOT in IDENTITY_AGGREGATES: it is a random token
|
|
658
|
+
* that names a browser, never a person.
|
|
659
|
+
*/
|
|
660
|
+
{ alias: "aggVisitorId", expression: argMaxColumn("visitorId") },
|
|
557
661
|
{
|
|
558
662
|
alias: "aggSamplePercentage",
|
|
559
663
|
expression: argMaxNumeric("samplePercentageAtCapture"),
|
|
@@ -645,6 +749,164 @@ function toSelectList(columns: Array<AggregatedColumn>): string {
|
|
|
645
749
|
.join(",\n ");
|
|
646
750
|
}
|
|
647
751
|
|
|
752
|
+
/*
|
|
753
|
+
* The per-session facts the user rollup (listUsers) reads at the inner,
|
|
754
|
+
* per-session level of its statement. Picked out of HEADER_AGGREGATES by
|
|
755
|
+
* alias rather than re-declared, so the rollup can never disagree with
|
|
756
|
+
* the list about what a session's live duration or error count is.
|
|
757
|
+
*/
|
|
758
|
+
const USER_ROLLUP_SESSION_ALIASES: ReadonlyArray<string> = [
|
|
759
|
+
"aggStartTime",
|
|
760
|
+
"aggDurationMs",
|
|
761
|
+
"aggIsFinalized",
|
|
762
|
+
"aggHasError",
|
|
763
|
+
"aggErrorCount",
|
|
764
|
+
"aggRageClickCount",
|
|
765
|
+
"aggDeadClickCount",
|
|
766
|
+
"aggErrorClickCount",
|
|
767
|
+
"aggRefreshRageCount",
|
|
768
|
+
"aggPageCount",
|
|
769
|
+
"aggEntryUrl",
|
|
770
|
+
"aggBrowserName",
|
|
771
|
+
"aggBrowserVersion",
|
|
772
|
+
"aggOsName",
|
|
773
|
+
"aggDeviceType",
|
|
774
|
+
"aggCountryCode",
|
|
775
|
+
"aggIdentifiedUserKey",
|
|
776
|
+
"aggVisitorId",
|
|
777
|
+
];
|
|
778
|
+
|
|
779
|
+
const USER_ROLLUP_SESSION_AGGREGATES: Array<AggregatedColumn> =
|
|
780
|
+
USER_ROLLUP_SESSION_ALIASES.map((alias: string): AggregatedColumn => {
|
|
781
|
+
const column: AggregatedColumn | undefined = HEADER_AGGREGATES.find(
|
|
782
|
+
(candidate: AggregatedColumn): boolean => {
|
|
783
|
+
return candidate.alias === alias;
|
|
784
|
+
},
|
|
785
|
+
);
|
|
786
|
+
|
|
787
|
+
if (!column) {
|
|
788
|
+
throw new Error(`HEADER_AGGREGATES has no column aliased ${alias}`);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
return column;
|
|
792
|
+
});
|
|
793
|
+
|
|
794
|
+
/*
|
|
795
|
+
* How a de-duplicated session is filed under a person. An identified
|
|
796
|
+
* session belongs to its user whatever browser it came from; an
|
|
797
|
+
* unidentified one belongs to its browser; one an older recorder left
|
|
798
|
+
* with neither key goes in the single anonymous bucket (''). The
|
|
799
|
+
* prefixes keep a user key and a visitor id from ever colliding, and
|
|
800
|
+
* readUserRollupKind reads the kind straight back off them. Computed at
|
|
801
|
+
* the per-session level so the outer GROUP BY can name it.
|
|
802
|
+
*/
|
|
803
|
+
const USER_ROLLUP_IDENTIFIED_PREFIX: string = "u:";
|
|
804
|
+
const USER_ROLLUP_VISITOR_PREFIX: string = "v:";
|
|
805
|
+
const USER_ROLLUP_KEY_ALIAS: string = "rollupKey";
|
|
806
|
+
const USER_ROLLUP_KEY_EXPRESSION: string = `if(aggIdentifiedUserKey != '', concat('${USER_ROLLUP_IDENTIFIED_PREFIX}', aggIdentifiedUserKey), if(aggVisitorId != '', concat('${USER_ROLLUP_VISITOR_PREFIX}', aggVisitorId), ''))`;
|
|
807
|
+
|
|
808
|
+
/*
|
|
809
|
+
* The outer, per-person level. Every alias carries the `rollup` prefix
|
|
810
|
+
* for the reason the per-session ones carry `agg`: none may spell a
|
|
811
|
+
* physical column, so a WHERE on this level could never trip
|
|
812
|
+
* ILLEGAL_AGGREGATION. The inputs are the per-session aliases: already
|
|
813
|
+
* de-duplicated, and already Float64 unix milliseconds where they are
|
|
814
|
+
* clocks (argMaxDateTime), so min/max/sum need no further conversion.
|
|
815
|
+
* argMax over aggStartTime takes the newest session's value for the
|
|
816
|
+
* "last seen" facts.
|
|
817
|
+
*/
|
|
818
|
+
const USER_ROLLUP_AGGREGATES: Array<AggregatedColumn> = [
|
|
819
|
+
{ alias: "rollupSessionCount", expression: "toFloat64(count())" },
|
|
820
|
+
{
|
|
821
|
+
alias: "rollupLiveSessionCount",
|
|
822
|
+
expression: "toFloat64(countIf(aggIsFinalized = 0))",
|
|
823
|
+
},
|
|
824
|
+
{
|
|
825
|
+
alias: "rollupFirstSeenUnixMs",
|
|
826
|
+
expression: "toFloat64(min(aggStartTime))",
|
|
827
|
+
},
|
|
828
|
+
{ alias: "rollupLastSeenUnixMs", expression: "toFloat64(max(aggStartTime))" },
|
|
829
|
+
{
|
|
830
|
+
alias: "rollupTotalDurationMs",
|
|
831
|
+
expression: "toFloat64(sum(aggDurationMs))",
|
|
832
|
+
},
|
|
833
|
+
{ alias: "rollupErrorCount", expression: "toFloat64(sum(aggErrorCount))" },
|
|
834
|
+
{
|
|
835
|
+
alias: "rollupFrustrationCount",
|
|
836
|
+
expression: `toFloat64(sum${FRUSTRATION_TOTAL_EXPRESSION})`,
|
|
837
|
+
},
|
|
838
|
+
{
|
|
839
|
+
alias: "rollupErrorSessionCount",
|
|
840
|
+
expression: "toFloat64(countIf(aggHasError))",
|
|
841
|
+
},
|
|
842
|
+
{ alias: "rollupPageCount", expression: "toFloat64(sum(aggPageCount))" },
|
|
843
|
+
{
|
|
844
|
+
alias: "rollupLastSessionId",
|
|
845
|
+
expression: "argMax(sessionId, aggStartTime)",
|
|
846
|
+
},
|
|
847
|
+
{
|
|
848
|
+
alias: "rollupLastEntryUrl",
|
|
849
|
+
expression: "argMax(aggEntryUrl, aggStartTime)",
|
|
850
|
+
},
|
|
851
|
+
/*
|
|
852
|
+
* Constant within an identified group and '' in every other, so any
|
|
853
|
+
* row would do; argMax keeps it on the same footing as the rest.
|
|
854
|
+
*/
|
|
855
|
+
{
|
|
856
|
+
alias: "rollupIdentifiedUserKey",
|
|
857
|
+
expression: "argMax(aggIdentifiedUserKey, aggStartTime)",
|
|
858
|
+
},
|
|
859
|
+
{
|
|
860
|
+
alias: "rollupVisitorId",
|
|
861
|
+
expression: "argMax(aggVisitorId, aggStartTime)",
|
|
862
|
+
},
|
|
863
|
+
{
|
|
864
|
+
alias: "rollupBrowserName",
|
|
865
|
+
expression: "argMax(aggBrowserName, aggStartTime)",
|
|
866
|
+
},
|
|
867
|
+
{
|
|
868
|
+
alias: "rollupBrowserVersion",
|
|
869
|
+
expression: "argMax(aggBrowserVersion, aggStartTime)",
|
|
870
|
+
},
|
|
871
|
+
{ alias: "rollupOsName", expression: "argMax(aggOsName, aggStartTime)" },
|
|
872
|
+
{
|
|
873
|
+
alias: "rollupDeviceType",
|
|
874
|
+
expression: "argMax(aggDeviceType, aggStartTime)",
|
|
875
|
+
},
|
|
876
|
+
{
|
|
877
|
+
alias: "rollupCountryCode",
|
|
878
|
+
expression: "argMax(aggCountryCode, aggStartTime)",
|
|
879
|
+
},
|
|
880
|
+
];
|
|
881
|
+
|
|
882
|
+
/*
|
|
883
|
+
* The identity pair at the person level. Named ONLY when the inner level
|
|
884
|
+
* named IDENTITY_AGGREGATES, which is only behind the identity ACL.
|
|
885
|
+
*/
|
|
886
|
+
const USER_ROLLUP_IDENTITY_AGGREGATES: Array<AggregatedColumn> = [
|
|
887
|
+
{
|
|
888
|
+
alias: "rollupIdentifiedUserLabel",
|
|
889
|
+
expression: "argMax(aggIdentifiedUserLabel, aggStartTime)",
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
alias: "rollupIdentifiedUserTraits",
|
|
893
|
+
expression: "argMax(aggIdentifiedUserTraits, aggStartTime)",
|
|
894
|
+
},
|
|
895
|
+
];
|
|
896
|
+
|
|
897
|
+
/* The kind USER_ROLLUP_KEY_EXPRESSION encoded, read back off the prefix. */
|
|
898
|
+
function readUserRollupKind(groupKey: string): SessionReplayUserKind {
|
|
899
|
+
if (groupKey.startsWith(USER_ROLLUP_IDENTIFIED_PREFIX)) {
|
|
900
|
+
return "identified";
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
if (groupKey.startsWith(USER_ROLLUP_VISITOR_PREFIX)) {
|
|
904
|
+
return "visitor";
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
return "anonymous";
|
|
908
|
+
}
|
|
909
|
+
|
|
648
910
|
function readNumber(row: JSONObject, key: string): number {
|
|
649
911
|
const value: unknown = row[key];
|
|
650
912
|
|
|
@@ -1026,6 +1288,7 @@ export default class SessionReplayReadService {
|
|
|
1026
1288
|
viewportWidth: readNumber(row, "aggViewportWidth"),
|
|
1027
1289
|
viewportHeight: readNumber(row, "aggViewportHeight"),
|
|
1028
1290
|
identifiedUserKey: readString(row, "aggIdentifiedUserKey"),
|
|
1291
|
+
visitorId: readString(row, "aggVisitorId"),
|
|
1029
1292
|
samplePercentageAtCapture: readNumber(row, "aggSamplePercentage"),
|
|
1030
1293
|
routes: readStringArray(row, "aggRoutes").slice(0, MAX_LIST_ROUTES),
|
|
1031
1294
|
traceCount: readNumber(row, "aggTraceCount"),
|
|
@@ -1074,6 +1337,225 @@ export default class SessionReplayReadService {
|
|
|
1074
1337
|
};
|
|
1075
1338
|
}
|
|
1076
1339
|
|
|
1340
|
+
/*
|
|
1341
|
+
* The session list rolled up by person: one row per identified user,
|
|
1342
|
+
* one per anonymous visitor (a browser the recorder linked with a
|
|
1343
|
+
* visitor id), and at most one anonymous bucket (rollupKey '') for
|
|
1344
|
+
* sessions an older recorder left with neither key. The bucket is a row
|
|
1345
|
+
* like any other - the Dashboard shows it as "unlinked sessions" - so
|
|
1346
|
+
* nothing here filters it out.
|
|
1347
|
+
*
|
|
1348
|
+
* Two levels, and it has to be two. The inner SELECT is the list's own
|
|
1349
|
+
* shape - GROUP BY the replace key, argMax(col, version) per session -
|
|
1350
|
+
* because until a merge runs a session is physically several
|
|
1351
|
+
* ReplacingMergeTree rows (a provisional header, a finalized one, a
|
|
1352
|
+
* retry), and a rollup over the raw rows would count one session twice
|
|
1353
|
+
* and add its provisional zero to its finalized error count. Only once
|
|
1354
|
+
* each session is one row can the outer SELECT group those rows by
|
|
1355
|
+
* person and count, sum, and take the newest session's facts.
|
|
1356
|
+
*
|
|
1357
|
+
* It is its own read rather than a client-side fold of listSessions for
|
|
1358
|
+
* the same reason. A keyset page of sessions holds an arbitrary prefix
|
|
1359
|
+
* of a person's sessions: their newest three on this page, their older
|
|
1360
|
+
* twenty on the next. Grouping such a page gives a row that says "3
|
|
1361
|
+
* sessions, no errors" for a person who had 23 and an error in the
|
|
1362
|
+
* fourth, and the boundary moves with every page size - a wrong answer
|
|
1363
|
+
* that looks like a right one. The rollup has to see every session in
|
|
1364
|
+
* the window, so the window is the unit of work here.
|
|
1365
|
+
*
|
|
1366
|
+
* WHERE is the sort-key prefix plus retention, exactly as the list: the
|
|
1367
|
+
* identity keys are argMax'd like every other header column and are
|
|
1368
|
+
* only ever named in a SELECT list, never in a WHERE.
|
|
1369
|
+
*
|
|
1370
|
+
* The keyset cursor lives in the HAVING ONLY. The list can additionally
|
|
1371
|
+
* bound startTime in its WHERE because its sort key is a per-session
|
|
1372
|
+
* fact; here the sort key is max(startTime) over a person's sessions,
|
|
1373
|
+
* and a WHERE bound would cut a person who was on the previous page
|
|
1374
|
+
* down to their older sessions - a smaller "last seen" that slips under
|
|
1375
|
+
* the cursor and returns them as a phantom row with partial counts.
|
|
1376
|
+
* Every page therefore re-aggregates the window, which is what the page
|
|
1377
|
+
* cap and the handler's default window bound.
|
|
1378
|
+
*/
|
|
1379
|
+
@CaptureSpan()
|
|
1380
|
+
public static async listUsers(
|
|
1381
|
+
request: SessionReplayUsersRequest,
|
|
1382
|
+
): Promise<SessionReplayUsersResult> {
|
|
1383
|
+
const limit: number = Math.max(
|
|
1384
|
+
1,
|
|
1385
|
+
Math.min(request.limit, MAX_SESSION_REPLAY_USERS_LIMIT),
|
|
1386
|
+
);
|
|
1387
|
+
|
|
1388
|
+
const statement: Statement = SQL`
|
|
1389
|
+
SELECT
|
|
1390
|
+
`;
|
|
1391
|
+
|
|
1392
|
+
statement.append(
|
|
1393
|
+
` ${USER_ROLLUP_KEY_ALIAS},\n ${toSelectList(USER_ROLLUP_AGGREGATES)}`,
|
|
1394
|
+
);
|
|
1395
|
+
|
|
1396
|
+
if (request.includeIdentifiedUserLabel) {
|
|
1397
|
+
statement.append(
|
|
1398
|
+
`,\n ${toSelectList(USER_ROLLUP_IDENTITY_AGGREGATES)}`,
|
|
1399
|
+
);
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1402
|
+
statement.append(`
|
|
1403
|
+
FROM (
|
|
1404
|
+
SELECT
|
|
1405
|
+
sessionId,
|
|
1406
|
+
${toSelectList(USER_ROLLUP_SESSION_AGGREGATES)},
|
|
1407
|
+
${USER_ROLLUP_KEY_EXPRESSION} AS ${USER_ROLLUP_KEY_ALIAS}`);
|
|
1408
|
+
|
|
1409
|
+
if (request.includeIdentifiedUserLabel) {
|
|
1410
|
+
statement.append(`,\n ${toSelectList(IDENTITY_AGGREGATES)}`);
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
statement.append(SQL`
|
|
1414
|
+
FROM ${AnalyticsTableName.RumSession}
|
|
1415
|
+
WHERE projectId = ${{
|
|
1416
|
+
type: TableColumnType.ObjectID,
|
|
1417
|
+
value: request.projectId,
|
|
1418
|
+
}}
|
|
1419
|
+
AND rumApplicationId = ${{
|
|
1420
|
+
type: TableColumnType.ObjectID,
|
|
1421
|
+
value: request.rumApplicationId,
|
|
1422
|
+
}}
|
|
1423
|
+
AND startTime >= ${{
|
|
1424
|
+
type: TableColumnType.DateTime64,
|
|
1425
|
+
value: request.startTime,
|
|
1426
|
+
}}
|
|
1427
|
+
AND startTime <= ${{
|
|
1428
|
+
type: TableColumnType.DateTime64,
|
|
1429
|
+
value: request.endTime,
|
|
1430
|
+
}}
|
|
1431
|
+
`);
|
|
1432
|
+
|
|
1433
|
+
statement.append(RETENTION_FILTER);
|
|
1434
|
+
|
|
1435
|
+
statement.append(`
|
|
1436
|
+
GROUP BY projectId, rumApplicationId, sessionId
|
|
1437
|
+
)
|
|
1438
|
+
GROUP BY ${USER_ROLLUP_KEY_ALIAS}
|
|
1439
|
+
HAVING 1 = 1`);
|
|
1440
|
+
|
|
1441
|
+
if (request.cursor) {
|
|
1442
|
+
statement.append(" AND (rollupLastSeenUnixMs < ");
|
|
1443
|
+
statement.append(
|
|
1444
|
+
SQL`${{
|
|
1445
|
+
type: TableColumnType.Decimal,
|
|
1446
|
+
value: request.cursor.lastSeenUnixMs,
|
|
1447
|
+
}}`,
|
|
1448
|
+
);
|
|
1449
|
+
statement.append(" OR (rollupLastSeenUnixMs = ");
|
|
1450
|
+
statement.append(
|
|
1451
|
+
SQL`${{
|
|
1452
|
+
type: TableColumnType.Decimal,
|
|
1453
|
+
value: request.cursor.lastSeenUnixMs,
|
|
1454
|
+
}}`,
|
|
1455
|
+
);
|
|
1456
|
+
/*
|
|
1457
|
+
* The alias goes in as trusted SQL, never through the SQL template:
|
|
1458
|
+
* a plain string inside it is bound as an Identifier parameter, not
|
|
1459
|
+
* spelled into the statement.
|
|
1460
|
+
*/
|
|
1461
|
+
statement.append(` AND ${USER_ROLLUP_KEY_ALIAS} < `);
|
|
1462
|
+
statement.append(
|
|
1463
|
+
SQL`${{
|
|
1464
|
+
type: TableColumnType.Text,
|
|
1465
|
+
value: request.cursor.groupKey,
|
|
1466
|
+
}}))`,
|
|
1467
|
+
);
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1470
|
+
statement.append(
|
|
1471
|
+
` ORDER BY rollupLastSeenUnixMs DESC, ${USER_ROLLUP_KEY_ALIAS} DESC`,
|
|
1472
|
+
);
|
|
1473
|
+
statement.append(
|
|
1474
|
+
SQL` LIMIT ${{
|
|
1475
|
+
type: TableColumnType.Number,
|
|
1476
|
+
value: limit + 1,
|
|
1477
|
+
}}`,
|
|
1478
|
+
);
|
|
1479
|
+
|
|
1480
|
+
statement.append(READ_QUERY_SETTINGS);
|
|
1481
|
+
|
|
1482
|
+
const dbResult: Results = await RumSessionService.executeQuery(statement);
|
|
1483
|
+
const response: DbJSONResponse = await dbResult.json<{
|
|
1484
|
+
data?: Array<JSONObject>;
|
|
1485
|
+
}>();
|
|
1486
|
+
|
|
1487
|
+
const rows: Array<JSONObject> = response.data || [];
|
|
1488
|
+
|
|
1489
|
+
/* One row over the page size, for the same reason as the list. */
|
|
1490
|
+
const hasMore: boolean = rows.length > limit;
|
|
1491
|
+
const pageRows: Array<JSONObject> = hasMore ? rows.slice(0, limit) : rows;
|
|
1492
|
+
|
|
1493
|
+
const users: Array<SessionReplayUserRollup> = pageRows.map(
|
|
1494
|
+
(row: JSONObject): SessionReplayUserRollup => {
|
|
1495
|
+
const groupKey: string = readString(row, USER_ROLLUP_KEY_ALIAS);
|
|
1496
|
+
const kind: SessionReplayUserKind = readUserRollupKind(groupKey);
|
|
1497
|
+
|
|
1498
|
+
const user: SessionReplayUserRollup = {
|
|
1499
|
+
groupKey: groupKey,
|
|
1500
|
+
kind: kind,
|
|
1501
|
+
/*
|
|
1502
|
+
* The digest is '' for every session of a visitor or anonymous
|
|
1503
|
+
* group by construction of the key; the guard keeps the wire
|
|
1504
|
+
* promise ("" unless identified) even for a row that is not.
|
|
1505
|
+
*/
|
|
1506
|
+
identifiedUserKey:
|
|
1507
|
+
kind === "identified"
|
|
1508
|
+
? readString(row, "rollupIdentifiedUserKey")
|
|
1509
|
+
: "",
|
|
1510
|
+
visitorId: readString(row, "rollupVisitorId"),
|
|
1511
|
+
sessionCount: readNumber(row, "rollupSessionCount"),
|
|
1512
|
+
liveSessionCount: readNumber(row, "rollupLiveSessionCount"),
|
|
1513
|
+
firstSeenUnixMs: readNumber(row, "rollupFirstSeenUnixMs"),
|
|
1514
|
+
lastSeenUnixMs: readNumber(row, "rollupLastSeenUnixMs"),
|
|
1515
|
+
totalDurationMs: readNumber(row, "rollupTotalDurationMs"),
|
|
1516
|
+
errorCount: readNumber(row, "rollupErrorCount"),
|
|
1517
|
+
frustrationCount: readNumber(row, "rollupFrustrationCount"),
|
|
1518
|
+
errorSessionCount: readNumber(row, "rollupErrorSessionCount"),
|
|
1519
|
+
pageCount: readNumber(row, "rollupPageCount"),
|
|
1520
|
+
lastSessionId: readString(row, "rollupLastSessionId"),
|
|
1521
|
+
lastEntryUrl: readString(row, "rollupLastEntryUrl"),
|
|
1522
|
+
browserName: readString(row, "rollupBrowserName"),
|
|
1523
|
+
browserVersion: readString(row, "rollupBrowserVersion"),
|
|
1524
|
+
osName: readString(row, "rollupOsName"),
|
|
1525
|
+
deviceType: readString(row, "rollupDeviceType"),
|
|
1526
|
+
countryCode: readString(row, "rollupCountryCode"),
|
|
1527
|
+
};
|
|
1528
|
+
|
|
1529
|
+
if (request.includeIdentifiedUserLabel) {
|
|
1530
|
+
user.identifiedUserLabel = readString(
|
|
1531
|
+
row,
|
|
1532
|
+
"rollupIdentifiedUserLabel",
|
|
1533
|
+
);
|
|
1534
|
+
user.identifiedUserTraits = readStringMap(
|
|
1535
|
+
row,
|
|
1536
|
+
"rollupIdentifiedUserTraits",
|
|
1537
|
+
);
|
|
1538
|
+
}
|
|
1539
|
+
|
|
1540
|
+
return user;
|
|
1541
|
+
},
|
|
1542
|
+
);
|
|
1543
|
+
|
|
1544
|
+
const lastUser: SessionReplayUserRollup | undefined =
|
|
1545
|
+
users[users.length - 1];
|
|
1546
|
+
|
|
1547
|
+
return {
|
|
1548
|
+
users: users,
|
|
1549
|
+
nextCursor:
|
|
1550
|
+
hasMore && lastUser
|
|
1551
|
+
? {
|
|
1552
|
+
lastSeenUnixMs: lastUser.lastSeenUnixMs,
|
|
1553
|
+
groupKey: lastUser.groupKey,
|
|
1554
|
+
}
|
|
1555
|
+
: null,
|
|
1556
|
+
};
|
|
1557
|
+
}
|
|
1558
|
+
|
|
1077
1559
|
/*
|
|
1078
1560
|
* The single header row for one session, de-duplicated the same way the
|
|
1079
1561
|
* list is.
|
|
@@ -1235,6 +1717,8 @@ export default class SessionReplayReadService {
|
|
|
1235
1717
|
activeMs: readNumber(row, "aggActiveMs"),
|
|
1236
1718
|
firstErrorOffsetMs: readNumber(row, "aggFirstErrorOffsetMs"),
|
|
1237
1719
|
recorderCapabilities: readRecorderCapabilities(row),
|
|
1720
|
+
identifiedUserKey: readString(row, "aggIdentifiedUserKey"),
|
|
1721
|
+
visitorId: readString(row, "aggVisitorId"),
|
|
1238
1722
|
};
|
|
1239
1723
|
}
|
|
1240
1724
|
|
|
@@ -2454,6 +2938,20 @@ export default class SessionReplayReadService {
|
|
|
2454
2938
|
);
|
|
2455
2939
|
}
|
|
2456
2940
|
|
|
2941
|
+
if (filters.visitorId) {
|
|
2942
|
+
/*
|
|
2943
|
+
* Over the argMax alias like the digest above: the raw column would
|
|
2944
|
+
* match a superseded header version, and a provisional header
|
|
2945
|
+
* written before the recorder's first meta chunk carries no id.
|
|
2946
|
+
*/
|
|
2947
|
+
statement.append(
|
|
2948
|
+
SQL` AND aggVisitorId = ${{
|
|
2949
|
+
type: TableColumnType.Text,
|
|
2950
|
+
value: filters.visitorId,
|
|
2951
|
+
}}`,
|
|
2952
|
+
);
|
|
2953
|
+
}
|
|
2954
|
+
|
|
2457
2955
|
if (filters.route) {
|
|
2458
2956
|
/*
|
|
2459
2957
|
* `has`, not a Search/LIKE: exact membership is the cheap array
|
|
@@ -263,7 +263,9 @@ export default class Telemetry {
|
|
|
263
263
|
compression: CompressionAlgorithm.GZIP,
|
|
264
264
|
});
|
|
265
265
|
|
|
266
|
-
logRecordProcessors.push(
|
|
266
|
+
logRecordProcessors.push(
|
|
267
|
+
new BatchLogRecordProcessor({ exporter: logExporter }),
|
|
268
|
+
);
|
|
267
269
|
}
|
|
268
270
|
|
|
269
271
|
const loggerProviderConfig: LoggerProviderConfig = {
|
|
@@ -67,6 +67,9 @@ export const BrandAssetsPath: string = path.resolve(
|
|
|
67
67
|
/** Host-relative URL of the OneUptime wordmark, for use in a view's <img src>. */
|
|
68
68
|
export const OneUptimeLogoUrl: string = `${VendorAssetsRoute}/${BrandAssetsRouteSegment}/oneuptime-logo.svg`;
|
|
69
69
|
|
|
70
|
+
/** Cache-versioned, contrast-safe `Up.` mark used by browser tabs. */
|
|
71
|
+
export const OneUptimeFaviconUrl: string = `${VendorAssetsRoute}/${BrandAssetsRouteSegment}/favicons/oneuptime-up-v1.svg`;
|
|
72
|
+
|
|
70
73
|
/**
|
|
71
74
|
* Mermaid is a dependency of Common already (Common/UI renders diagrams in
|
|
72
75
|
* markdown with it), so it is on disk in every image and there is no reason to
|