@oneuptime/common 13.0.4 → 13.0.5
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/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/RumApplication.ts +1 -1
- package/Models/DatabaseModels/SecurityEventConnection.ts +457 -0
- package/Models/DatabaseModels/SecurityEventConnectionRun.ts +263 -0
- package/Models/DatabaseModels/TelemetryIngestionKey.ts +2 -2
- package/Server/API/AIInvestigationAPI.ts +484 -24
- package/Server/API/GoogleSecOpsConnectionAPI.ts +249 -8
- package/Server/API/SecurityEventConnectionAPI.ts +250 -0
- package/Server/API/TelemetryAPI.ts +402 -265
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.ts +99 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/TelemetryIngest.ts +101 -6
- package/Server/Services/ExceptionAggregationService.ts +7 -16
- package/Server/Services/GoogleSecOpsConnectionService.ts +15 -0
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/InventoryItemService.ts +28 -0
- package/Server/Services/LogAggregationService.ts +17 -23
- package/Server/Services/MetricAggregationService.ts +4 -14
- package/Server/Services/SecurityEventConnectionRunService.ts +10 -0
- package/Server/Services/SecurityEventConnectionService.ts +538 -0
- package/Server/Services/TraceAggregationService.ts +77 -28
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +13 -1
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +15 -1
- package/Server/Utils/AI/SRE/InvestigationEvidence.ts +658 -0
- package/Server/Utils/AI/SRE/InvestigationReferences.ts +324 -0
- package/Server/Utils/AI/Toolbox/Index.ts +38 -0
- package/Server/Utils/AI/Toolbox/TimelineTools.ts +9 -2
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +80 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +5 -3
- package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.ts +1108 -0
- package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.ts +732 -0
- package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +495 -0
- package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.ts +689 -0
- package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.ts +767 -0
- package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.ts +571 -0
- package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.ts +827 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.ts +610 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.ts +549 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.ts +830 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.ts +684 -0
- package/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.ts +487 -0
- package/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.ts +778 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +1002 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +556 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +275 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +53 -0
- package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.ts +709 -0
- package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.ts +596 -0
- package/Server/Utils/SecurityEvent/Connectors/Types.ts +191 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +353 -65
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +777 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +747 -148
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +48 -2
- package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +81 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +741 -40
- package/Server/Utils/StartServer.ts +10 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +8 -0
- package/Server/Utils/Telemetry/KubernetesResourceAttributes.ts +108 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +174 -93
- package/Server/Utils/Telemetry/ResourceFacetPlanner.ts +251 -0
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +248 -413
- package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +668 -0
- package/Server/Utils/Telemetry/TraceContextPropagation.ts +348 -0
- package/Server/Utils/Telemetry.ts +18 -0
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +413 -0
- package/Tests/App/Dashboard/AIRootCauseFeedItem.test.tsx +285 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +242 -0
- package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +601 -15
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +835 -0
- package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +41 -0
- package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +604 -0
- package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +738 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +153 -6
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +165 -0
- package/Tests/App/Dashboard/EpisodeChangeState.test.tsx +1069 -0
- package/Tests/App/Dashboard/EpisodeMembersCard.test.tsx +772 -0
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +2354 -0
- package/Tests/App/Dashboard/EventOverviewSkeleton.test.tsx +210 -0
- package/Tests/App/Dashboard/EventStatBar.test.tsx +392 -0
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +247 -0
- package/Tests/App/Dashboard/ExceptionAIAssistance.test.tsx +606 -0
- package/Tests/App/Dashboard/ExceptionBreadcrumbTimeline.test.tsx +273 -0
- package/Tests/App/Dashboard/ExceptionDetailSideMenu.test.tsx +176 -0
- package/Tests/App/Dashboard/ExceptionOverviewCards.test.tsx +366 -0
- package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +371 -0
- package/Tests/App/Dashboard/ExceptionStackFrameViewer.test.tsx +440 -0
- package/Tests/App/Dashboard/ExceptionSummary.test.tsx +381 -0
- package/Tests/App/Dashboard/ExceptionTriage.test.tsx +306 -0
- package/Tests/App/Dashboard/ExceptionsResourceFacets.test.tsx +604 -0
- package/Tests/App/Dashboard/ExceptionsViewerEntityChips.test.tsx +706 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +32 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +838 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +18 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +297 -20
- package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +618 -13
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +254 -207
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +303 -135
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +1251 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +303 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +876 -8
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +35 -0
- package/Tests/App/Dashboard/InvestigationReferenceLink.test.tsx +177 -0
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +1295 -0
- package/Tests/App/Dashboard/KubernetesImageReferenceView.test.tsx +114 -0
- package/Tests/App/Dashboard/KubernetesLogsTabChips.test.tsx +285 -0
- package/Tests/App/Dashboard/LogsEntityChipNames.test.tsx +316 -0
- package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +361 -0
- package/Tests/App/Dashboard/ProfileTableEntityNames.test.tsx +432 -0
- package/Tests/App/Dashboard/ProfileViewEntityName.test.tsx +250 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +10 -0
- package/Tests/App/Dashboard/ResourceLogsTabsBareLayout.test.tsx +700 -0
- package/Tests/App/Dashboard/ResourcePageEntityNameProps.test.tsx +803 -0
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +11 -1
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeState.test.tsx +1026 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +436 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +1195 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1022 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +905 -0
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +247 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +375 -274
- package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +410 -0
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +774 -0
- package/Tests/App/Dashboard/TopErrorsPanelResourceNames.test.tsx +316 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +30 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +88 -24
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +1590 -0
- package/Tests/App/Dashboard/TraceWaterfall.test.tsx +488 -0
- package/Tests/App/Dashboard/TracesAnalyticsSeriesLabels.test.tsx +367 -0
- package/Tests/App/Dashboard/TracesEntityNames.test.tsx +585 -0
- package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +613 -0
- package/Tests/App/Dashboard/UseServiceNames.test.tsx +359 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +7 -0
- package/Tests/Models/InventoryItemNaming.test.ts +132 -16
- package/Tests/Models/SecurityDomainAccessControl.test.ts +61 -17
- package/Tests/Server/API/AIInvestigationAPI.test.ts +611 -2
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +1098 -0
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +409 -0
- package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +856 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +528 -1
- package/Tests/Server/API/TelemetryFacetsAPI.test.ts +810 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +240 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +229 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +66 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
- package/Tests/Server/Services/SecurityEventConnectionService.test.ts +1233 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +53 -0
- package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +218 -0
- package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +155 -1
- package/Tests/Server/Services/TraceAggregationExceptionScope.test.ts +142 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +85 -24
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +33 -0
- package/Tests/Server/Utils/AI/InvestigationEvidence.test.ts +1395 -0
- package/Tests/Server/Utils/AI/InvestigationReferences.test.ts +616 -0
- package/Tests/Server/Utils/AI/TimelineTools.test.ts +119 -0
- package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +151 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +65 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorExceptionScope.test.ts +224 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +55 -2
- package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.test.ts +1240 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.test.ts +1853 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +1129 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.test.ts +1066 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.test.ts +1568 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.test.ts +930 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.test.ts +1409 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.test.ts +763 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.test.ts +1296 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.test.ts +1102 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.test.ts +1174 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.test.ts +1032 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.test.ts +1558 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +3041 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +1168 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +906 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.test.ts +1068 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.test.ts +1004 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +784 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +113 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +5 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +93 -13
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +23 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +25 -3
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +22 -8
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +82 -16
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSearchDetections.test.ts +730 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +1577 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayOriginAllowlist.test.ts +41 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1453 -18
- package/Tests/Server/Utils/Telemetry/KubernetesResourceAttributes.test.ts +162 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +460 -13
- package/Tests/Server/Utils/Telemetry/ResourceFacetPlanner.test.ts +678 -0
- package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +348 -2
- package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +525 -0
- package/Tests/Server/Utils/Telemetry/TraceContextPropagation.test.ts +420 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +73 -0
- package/Tests/Types/Rum/SessionReplayTransportContracts.test.ts +95 -0
- package/Tests/Types/SecurityEvent/Connectors/ConnectorDiagnostics.test.ts +82 -0
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +314 -0
- package/Tests/Types/Telemetry/ExceptionSpanScope.test.ts +89 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +96 -0
- package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +304 -0
- package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +357 -0
- package/Tests/UI/Components/Card.test.tsx +312 -1
- package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +253 -0
- package/Tests/UI/Components/CardModelDetailRefresher.test.tsx +342 -0
- package/Tests/UI/Components/Checkbox.test.tsx +79 -0
- package/Tests/UI/Components/CopyTextButton.test.tsx +142 -0
- package/Tests/UI/Components/DetailCompactStyle.test.tsx +621 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +60 -0
- package/Tests/UI/Components/FacetSections.test.tsx +581 -0
- package/Tests/UI/Components/FacetSidebarControls.test.tsx +812 -0
- package/Tests/UI/Components/FacetVisibility.test.ts +429 -0
- package/Tests/UI/Components/LockedFilterActions.test.tsx +396 -0
- package/Tests/UI/Components/LockedFilterChip.test.tsx +651 -0
- package/Tests/UI/Components/LogsEntityNames.test.ts +1769 -0
- package/Tests/UI/Components/LogsEntityNamesComponents.test.tsx +696 -0
- package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +600 -0
- package/Tests/UI/Components/LogsViewerEntityNames.test.tsx +713 -0
- package/Tests/UI/Components/MarkdownInlineReferences.test.tsx +2079 -0
- package/Tests/UI/Components/MemberRoleAssignment.test.tsx +446 -0
- package/Tests/UI/Components/ModelDetailRefetch.test.tsx +397 -0
- package/Tests/UI/Components/ModelListRefetch.test.tsx +233 -0
- package/Tests/UI/Components/ModelPageModelChange.test.tsx +409 -0
- package/Tests/UI/Components/PaginationIntegration.test.tsx +25 -0
- package/Tests/UI/Components/ResourceFacetConfigs.test.ts +172 -0
- package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +32 -14
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +44 -1
- package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +304 -0
- package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +718 -0
- package/Tests/UI/Monitor/EvaluationLogList.test.tsx +303 -0
- package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +55 -1
- package/Tests/UI/Rum/FidelityNotices.test.ts +22 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +120 -136
- package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +988 -0
- package/Tests/UI/Rum/ReplayCard.test.tsx +32 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +709 -12
- package/Tests/UI/Rum/ReplayHeader.test.tsx +50 -1
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +67 -10
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +41 -12
- package/Tests/UI/Rum/ReplayStage.test.tsx +663 -1
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +173 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +189 -2
- package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +91 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +1 -1
- package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +585 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +844 -51
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +29 -1
- package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +288 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +31 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +6 -0
- package/Tests/UI/Utils/Clipboard.test.ts +154 -0
- package/Tests/UI/Utils/Navigation.test.ts +24 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +2205 -0
- package/Tests/UI/Utils/Telemetry/UseTelemetryEntityNames.test.tsx +844 -0
- package/Tests/Utils/AI/InvestigationReport.test.ts +2430 -0
- package/Tests/Utils/APIOutgoingRequestTracer.test.ts +137 -0
- package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +40 -0
- package/Tests/Utils/Rum/SessionReplayRecordingEnded.test.ts +619 -0
- package/Tests/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.test.ts +631 -0
- package/Tests/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.test.ts +479 -0
- package/Tests/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.test.ts +507 -0
- package/Tests/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.test.ts +686 -0
- package/Tests/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.test.ts +474 -0
- package/Tests/Utils/SecurityEvent/Connectors/OktaNormalizer.test.ts +736 -0
- package/Tests/Utils/SecurityEvent/Connectors/SplunkNormalizer.test.ts +407 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +129 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +57 -1
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +36 -0
- package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +600 -0
- package/Tests/Utils/Telemetry/NetworkHost.test.ts +48 -0
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +154 -0
- package/Tests/Utils/Traces/CriticalPath.test.ts +25 -0
- package/Types/AI/AIChatTypes.ts +8 -0
- package/Types/AI/InvestigationEvidence.ts +96 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +5 -0
- package/Types/Permission.ts +2 -2
- package/Types/Rum/SessionReplay.ts +109 -0
- package/Types/Rum/SessionReplayApi.ts +31 -0
- package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +111 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +87 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +492 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +41 -0
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -1
- package/Types/SecurityEvent/GoogleSecOpsRegion.ts +34 -0
- package/Types/Telemetry/EntityType.ts +14 -0
- package/Types/Telemetry/ExceptionSpanScope.ts +83 -0
- package/Types/Telemetry/LockedFilterDetail.ts +46 -0
- package/Types/Telemetry/ResourceEntityFacet.ts +17 -10
- package/Types/Telemetry/ResourceFacetCatalog.ts +171 -0
- package/UI/Components/Card/Card.tsx +118 -83
- package/UI/Components/Checkbox/Checkbox.tsx +8 -5
- package/UI/Components/CopyTextButton/CopyTextButton.tsx +7 -1
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +4 -1
- package/UI/Components/Detail/Detail.tsx +137 -22
- package/UI/Components/ErrorBoundary.tsx +38 -0
- package/UI/Components/LogsViewer/LogsEntityNames.ts +912 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +156 -77
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +28 -11
- package/UI/Components/LogsViewer/components/FacetSection.tsx +66 -79
- package/UI/Components/LogsViewer/components/FacetValueRow.tsx +17 -2
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +45 -5
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +100 -19
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +156 -39
- package/UI/Components/LogsViewer/components/LogsTable.tsx +30 -8
- package/UI/Components/LogsViewer/types.ts +6 -0
- package/UI/Components/Markdown.tsx/InlineReferences.tsx +628 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +385 -312
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +50 -22
- package/UI/Components/ModelDetail/CardModelDetail.tsx +15 -0
- package/UI/Components/ModelDetail/ModelDetail.tsx +64 -19
- package/UI/Components/ModelList/ModelList.tsx +33 -8
- package/UI/Components/Page/ModelPage.tsx +119 -54
- package/UI/Components/Table/Table.tsx +8 -0
- package/UI/Components/Table/TableRow.tsx +13 -5
- package/UI/Components/TelemetryViewer/FacetVisibility.ts +229 -0
- package/UI/Components/TelemetryViewer/ResourceFacetConfigs.ts +46 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +11 -0
- package/UI/Components/TelemetryViewer/components/FacetSearchInput.tsx +79 -0
- package/UI/Components/TelemetryViewer/components/FacetSectionHeader.tsx +69 -0
- package/UI/Components/TelemetryViewer/components/FacetShowMoreButton.tsx +36 -0
- package/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.tsx +88 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +205 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +496 -0
- package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +30 -10
- package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +203 -10
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSection.tsx +60 -73
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +94 -7
- package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +17 -2
- package/UI/Components/TelemetryViewer/types.ts +19 -0
- package/UI/Components/TelemetryViewer/useFacetSearchExemptions.ts +158 -0
- package/UI/Components/TelemetryViewer/useFacetSectionSearch.ts +102 -0
- package/UI/Utils/Clipboard.ts +68 -2
- package/UI/Utils/Navigation.ts +17 -2
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +620 -0
- package/UI/Utils/Telemetry/UseTelemetryEntityNames.ts +151 -0
- package/Utils/AI/InvestigationReport.ts +1789 -0
- package/Utils/API.ts +90 -1
- package/Utils/Rum/SessionReplayHealth.ts +11 -0
- package/Utils/Rum/SessionReplayRecordingEnded.ts +134 -0
- package/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.ts +427 -0
- package/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.ts +197 -0
- package/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.ts +464 -0
- package/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.ts +567 -0
- package/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.ts +299 -0
- package/Utils/SecurityEvent/Connectors/OktaNormalizer.ts +467 -0
- package/Utils/SecurityEvent/Connectors/SplunkNormalizer.ts +439 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +124 -12
- package/Utils/Telemetry/CrossSignalScope.ts +22 -8
- package/Utils/Telemetry/EntityRelationship.ts +8 -0
- package/Utils/Telemetry/LockedFilterSearch.ts +412 -0
- package/Utils/Telemetry/NetworkHost.ts +43 -0
- package/Utils/Telemetry/OriginAllowList.ts +139 -4
- package/Utils/Traces/CriticalPath.ts +10 -4
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +490 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js.map +1 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js +287 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +2 -2
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +336 -27
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +182 -7
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -1
- package/build/dist/Server/API/SecurityEventConnectionAPI.js +171 -0
- package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -0
- package/build/dist/Server/API/TelemetryAPI.js +248 -170
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +57 -4
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +7 -16
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +8 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +22 -0
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +8 -17
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +4 -14
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventConnectionRunService.js +9 -0
- package/build/dist/Server/Services/SecurityEventConnectionRunService.js.map +1 -0
- package/build/dist/Server/Services/SecurityEventConnectionService.js +356 -0
- package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -0
- package/build/dist/Server/Services/TraceAggregationService.js +51 -25
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +14 -7
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js +468 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js +230 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +32 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +6 -2
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +59 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +5 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js +752 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js +493 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +352 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js +405 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js +466 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js +344 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js +511 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js +406 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js +336 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js +474 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js +417 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js +314 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js +494 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +719 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +404 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +209 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +40 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js +494 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js +379 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +27 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +234 -61
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +537 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +572 -115
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +35 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +52 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +521 -32
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +10 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +8 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js +80 -0
- package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +122 -67
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js +146 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +174 -248
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +492 -0
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js +259 -0
- package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry.js +11 -5
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/InvestigationEvidence.js +2 -0
- package/build/dist/Types/AI/InvestigationEvidence.js.map +1 -0
- package/build/dist/Types/Permission.js +2 -2
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +95 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js +18 -0
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +2 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +374 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +35 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js +35 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +14 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ExceptionSpanScope.js +59 -0
- package/build/dist/Types/Telemetry/ExceptionSpanScope.js.map +1 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js +16 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js.map +1 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js +16 -10
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -1
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +119 -0
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -0
- package/build/dist/UI/Components/Card/Card.js +34 -17
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js +6 -4
- package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +63 -13
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +34 -0
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js +535 -0
- package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +117 -57
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +5 -7
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetSection.js +31 -44
- package/build/dist/UI/Components/LogsViewer/components/FacetSection.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +17 -3
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +19 -3
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +64 -18
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +100 -41
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +13 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js +403 -0
- package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +197 -179
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +30 -21
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +12 -0
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js +46 -12
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +26 -7
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelPage.js +62 -34
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/Table/Table.js +3 -1
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +8 -1
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +111 -0
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js +22 -0
- package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js +36 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js +21 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js +14 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js +27 -0
- package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +88 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +228 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +6 -6
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +111 -12
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js +27 -40
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +70 -10
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +17 -3
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/types.js +0 -4
- package/build/dist/UI/Components/TelemetryViewer/types.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js +70 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js +52 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js.map +1 -0
- package/build/dist/UI/Utils/Clipboard.js +59 -2
- package/build/dist/UI/Utils/Clipboard.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +11 -2
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +471 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js +113 -0
- package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js.map +1 -0
- package/build/dist/Utils/AI/InvestigationReport.js +1241 -0
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -0
- package/build/dist/Utils/API.js +25 -0
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayHealth.js +10 -0
- package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js +54 -0
- package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js +311 -0
- package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js +150 -0
- package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js +328 -0
- package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js +405 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js +212 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js +351 -0
- package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js +348 -0
- package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +103 -10
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +16 -5
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +7 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js +277 -0
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -0
- package/build/dist/Utils/Telemetry/NetworkHost.js +39 -0
- package/build/dist/Utils/Telemetry/NetworkHost.js.map +1 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js +105 -4
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
- package/build/dist/Utils/Traces/CriticalPath.js +9 -4
- package/build/dist/Utils/Traces/CriticalPath.js.map +1 -1
- package/package.json +1 -1
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +0 -600
- package/UI/Components/GanttChart/Bar/BarLabel.tsx +0 -17
- package/UI/Components/GanttChart/Bar/Index.tsx +0 -149
- package/UI/Components/GanttChart/ChartContainer.tsx +0 -50
- package/UI/Components/GanttChart/Index.tsx +0 -90
- package/UI/Components/GanttChart/Row/Index.tsx +0 -22
- package/UI/Components/GanttChart/Row/Row.tsx +0 -231
- package/UI/Components/GanttChart/Row/RowLabel.tsx +0 -30
- package/UI/Components/GanttChart/Rows.tsx +0 -59
- package/UI/Components/GanttChart/Timeline/Index.tsx +0 -46
- package/UI/Components/GanttChart/Timeline/TimelineInterval.tsx +0 -33
- package/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.tsx +0 -43
- package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js +0 -8
- package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Bar/Index.js +0 -77
- package/build/dist/UI/Components/GanttChart/Bar/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/ChartContainer.js +0 -33
- package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Index.js +0 -39
- package/build/dist/UI/Components/GanttChart/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/Index.js +0 -7
- package/build/dist/UI/Components/GanttChart/Row/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/Row.js +0 -106
- package/build/dist/UI/Components/GanttChart/Row/Row.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/RowLabel.js +0 -10
- package/build/dist/UI/Components/GanttChart/Row/RowLabel.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Rows.js +0 -19
- package/build/dist/UI/Components/GanttChart/Rows.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/Index.js +0 -16
- package/build/dist/UI/Components/GanttChart/Timeline/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js +0 -13
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js +0 -13
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js.map +0 -1
|
@@ -4,6 +4,8 @@ import Response from "../Utils/Response";
|
|
|
4
4
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
5
5
|
import CommonAPI from "./CommonAPI";
|
|
6
6
|
import TelemetryType from "../../Types/Telemetry/TelemetryType";
|
|
7
|
+
import { parseExceptionSpanScope } from "../../Types/Telemetry/ExceptionSpanScope";
|
|
8
|
+
import ServiceType from "../../Types/Telemetry/ServiceType";
|
|
7
9
|
import TelemetryAttributeService from "../Services/TelemetryAttributeService";
|
|
8
10
|
import TelemetrySourceMapService from "../Services/TelemetrySourceMapService";
|
|
9
11
|
import SourceMapResolver, { MAX_FRAMES_PER_RESOLVE_REQUEST, } from "../Utils/Telemetry/SourceMapResolver";
|
|
@@ -27,6 +29,8 @@ import RumSession from "../../Models/AnalyticsModels/RumSession";
|
|
|
27
29
|
import ObjectID from "../../Types/ObjectID";
|
|
28
30
|
import OneUptimeDate from "../../Types/Date";
|
|
29
31
|
import ResourceFacetResolver from "../Utils/Telemetry/ResourceFacetResolver";
|
|
32
|
+
import ResourceFacetPlanner from "../Utils/Telemetry/ResourceFacetPlanner";
|
|
33
|
+
import { RESOURCE_FACET_CATALOG_KEYS } from "../../Types/Telemetry/ResourceFacetCatalog";
|
|
30
34
|
import ResourceEntityFilter from "../Utils/Telemetry/ResourceEntityFilter";
|
|
31
35
|
import RumApplicationService from "../Services/RumApplicationService";
|
|
32
36
|
import ProjectService from "../Services/ProjectService";
|
|
@@ -35,7 +39,7 @@ import SessionIdentity from "../../Utils/Rum/SessionIdentity";
|
|
|
35
39
|
import SessionReplayTargeting from "../Utils/SessionReplay/SessionReplayTargeting";
|
|
36
40
|
import SessionReplayUsage from "../Utils/SessionReplay/SessionReplayUsage";
|
|
37
41
|
import RumSessionReplayViewService, { normalizeSecondsWatched, } from "../Services/RumSessionReplayViewService";
|
|
38
|
-
import SessionReplayReadService, { DEFAULT_SESSION_REPLAY_LIST_LIMIT, DEFAULT_SESSION_REPLAY_USERS_LIMIT, MAX_SESSION_REPLAY_FOR_EXCEPTION_LIMIT, MAX_SESSION_REPLAY_LIST_LIMIT, MAX_SESSION_REPLAY_USERS_LIMIT, SESSION_REPLAY_EXCEPTION_WINDOW_PADDING_MS, } from "../Utils/SessionReplay/SessionReplayReadService";
|
|
42
|
+
import SessionReplayReadService, { DEFAULT_SESSION_REPLAY_LIST_LIMIT, DEFAULT_SESSION_REPLAY_USERS_LIMIT, MAX_SESSION_REPLAY_FOR_EXCEPTION_LIMIT, MAX_SESSION_REPLAY_LIST_LIMIT, MAX_SESSION_REPLAY_SESSION_ID_LENGTH, MAX_SESSION_REPLAY_SUMMARIES_BATCH_SIZE, MAX_SESSION_REPLAY_USERS_LIMIT, SESSION_REPLAY_EXCEPTION_WINDOW_PADDING_MS, } from "../Utils/SessionReplay/SessionReplayReadService";
|
|
39
43
|
import SessionReplayHealthCounters from "../Utils/SessionReplay/SessionReplayHealthCounters";
|
|
40
44
|
import { isSessionErased } from "../Utils/SessionReplay/SessionReplayErasureTombstone";
|
|
41
45
|
import NotFoundException from "../../Types/Exception/NotFoundException";
|
|
@@ -375,9 +379,10 @@ router.post("/telemetry/logs/facets", ...requireLogReadAccess, async (req, res,
|
|
|
375
379
|
: undefined;
|
|
376
380
|
/*
|
|
377
381
|
* Per-facet partial-match filter applied at the Postgres source-of-truth
|
|
378
|
-
* lookup stage. Only consulted for resource facets (primaryEntityId
|
|
379
|
-
* hostId /
|
|
380
|
-
* to filter client-side over the loaded value
|
|
382
|
+
* lookup stage. Only consulted for resource facets (primaryEntityId and
|
|
383
|
+
* every ResourceFacetCatalog key — hostId / kubernetesClusterId / ...)
|
|
384
|
+
* — other facets continue to filter client-side over the loaded value
|
|
385
|
+
* list.
|
|
381
386
|
*/
|
|
382
387
|
const facetSearchText = body["facetSearchText"]
|
|
383
388
|
? body["facetSearchText"]
|
|
@@ -389,11 +394,21 @@ router.post("/telemetry/logs/facets", ...requireLogReadAccess, async (req, res,
|
|
|
389
394
|
const projectId = databaseProps.tenantId;
|
|
390
395
|
const resourceScopes = await resolveResourceScopesFromBody(body, projectId);
|
|
391
396
|
/*
|
|
392
|
-
*
|
|
393
|
-
* starve the endpoint
|
|
397
|
+
* One ClickHouse GROUP BY per facet, in parallel so a slow facet can't
|
|
398
|
+
* starve the endpoint; per-facet errors degrade gracefully to [].
|
|
399
|
+
* Resource facets come back as the Postgres source-of-truth list
|
|
400
|
+
* (filtered by facetSearchText, enriched with displayName) with those
|
|
401
|
+
* counts merged in, so low-volume resources stay visible and search
|
|
402
|
+
* reaches resources outside the window. Their lists are fetched FIRST:
|
|
403
|
+
* a resource type the project has none of skips its ClickHouse scan
|
|
404
|
+
* entirely (see ResourceFacetPlanner).
|
|
394
405
|
*/
|
|
395
|
-
const
|
|
396
|
-
|
|
406
|
+
const facets = await ResourceFacetPlanner.countPerFacet({
|
|
407
|
+
projectId,
|
|
408
|
+
facetKeys,
|
|
409
|
+
facetSearchText,
|
|
410
|
+
limit,
|
|
411
|
+
countFacet: (facetKey) => {
|
|
397
412
|
const request = {
|
|
398
413
|
projectId,
|
|
399
414
|
startTime,
|
|
@@ -410,43 +425,9 @@ router.post("/telemetry/logs/facets", ...requireLogReadAccess, async (req, res,
|
|
|
410
425
|
sessionIds,
|
|
411
426
|
attributes,
|
|
412
427
|
};
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
}
|
|
416
|
-
catch (_a) {
|
|
417
|
-
return [facetKey, []];
|
|
418
|
-
}
|
|
419
|
-
}));
|
|
420
|
-
const facets = Object.fromEntries(facetResults);
|
|
421
|
-
/*
|
|
422
|
-
* Replace resource-facet results with the Postgres source-of-truth list
|
|
423
|
-
* (filtered by facetSearchText and enriched with displayName). See the
|
|
424
|
-
* trace facets handler above for the rationale — same pattern, same
|
|
425
|
-
* benefit: low-volume resources stay visible and search can reach
|
|
426
|
-
* resources outside the ClickHouse sample window.
|
|
427
|
-
*/
|
|
428
|
-
const resourceSpecs = facetKeys
|
|
429
|
-
.filter((key) => {
|
|
430
|
-
return ResourceFacetResolver.isResourceFacet(key);
|
|
431
|
-
})
|
|
432
|
-
.map((key) => {
|
|
433
|
-
const counts = new Map();
|
|
434
|
-
for (const fv of facets[key] || []) {
|
|
435
|
-
counts.set(fv.value, fv.count);
|
|
436
|
-
}
|
|
437
|
-
return {
|
|
438
|
-
facetKey: key,
|
|
439
|
-
counts,
|
|
440
|
-
searchText: facetSearchText === null || facetSearchText === void 0 ? void 0 : facetSearchText[key],
|
|
441
|
-
limit,
|
|
442
|
-
};
|
|
428
|
+
return LogAggregationService.getFacetValues(request);
|
|
429
|
+
},
|
|
443
430
|
});
|
|
444
|
-
if (resourceSpecs.length > 0) {
|
|
445
|
-
const resolved = await ResourceFacetResolver.resolve(projectId, resourceSpecs);
|
|
446
|
-
for (const key of Object.keys(resolved)) {
|
|
447
|
-
facets[key] = resolved[key];
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
431
|
return Response.sendJsonObjectResponse(req, res, {
|
|
451
432
|
facets: facets,
|
|
452
433
|
});
|
|
@@ -457,13 +438,16 @@ router.post("/telemetry/logs/facets", ...requireLogReadAccess, async (req, res,
|
|
|
457
438
|
});
|
|
458
439
|
/**
|
|
459
440
|
* Resolve the `resourceFilters` field — the explorers' non-Service resource
|
|
460
|
-
* facet selections (
|
|
461
|
-
*
|
|
441
|
+
* facet selections (any ResourceFacetCatalog type: host / Kubernetes cluster
|
|
442
|
+
* / Proxmox cluster / serverless function / ...), sent as Postgres ids —
|
|
443
|
+
* into the scopes the aggregation services compile.
|
|
462
444
|
*
|
|
463
445
|
* Kept out of the sync body parsers because turning an id into an entity
|
|
464
446
|
* key needs a Postgres round trip: the id names a row whose identifying
|
|
465
|
-
* value (`
|
|
466
|
-
* `entityKeys
|
|
447
|
+
* value (`hostIdentifier` / `clusterIdentifier` / a cluster `name` / ...) is
|
|
448
|
+
* what ingest hashed into `entityKeys` and stamped as a resource attribute.
|
|
449
|
+
* Types without such an identity keep an id-only scope (see
|
|
450
|
+
* ResourceEntityFilter).
|
|
467
451
|
*
|
|
468
452
|
* Returns undefined when nothing was selected so the request field stays
|
|
469
453
|
* absent rather than becoming an empty array.
|
|
@@ -525,6 +509,21 @@ function parseAttributeFilterRecord(raw) {
|
|
|
525
509
|
}
|
|
526
510
|
return filters;
|
|
527
511
|
}
|
|
512
|
+
/*
|
|
513
|
+
* An exception scope that is present but malformed is a client bug, and
|
|
514
|
+
* dropping it would silently chart every span in the project under an
|
|
515
|
+
* exception's heading — so it is refused instead.
|
|
516
|
+
*/
|
|
517
|
+
function parseTraceExceptionScope(raw) {
|
|
518
|
+
if (raw === undefined || raw === null) {
|
|
519
|
+
return undefined;
|
|
520
|
+
}
|
|
521
|
+
const scope = parseExceptionSpanScope(raw);
|
|
522
|
+
if (!scope) {
|
|
523
|
+
throw new BadDataException("exceptionScope must have a fingerprint and, optionally, a primaryEntityId UUID.");
|
|
524
|
+
}
|
|
525
|
+
return scope;
|
|
526
|
+
}
|
|
528
527
|
/*
|
|
529
528
|
* Shared body parsing for every trace aggregation endpoint (histogram,
|
|
530
529
|
* facets, analytics). Defensive about shapes: arrays are validated and
|
|
@@ -606,6 +605,7 @@ function parseTraceFilterBody(body) {
|
|
|
606
605
|
hasException: typeof body["hasException"] === "boolean"
|
|
607
606
|
? body["hasException"]
|
|
608
607
|
: undefined,
|
|
608
|
+
exceptionScope: parseTraceExceptionScope(body["exceptionScope"]),
|
|
609
609
|
minDurationNano: typeof body["minDurationNano"] === "number"
|
|
610
610
|
? body["minDurationNano"]
|
|
611
611
|
: undefined,
|
|
@@ -670,9 +670,10 @@ router.post("/telemetry/traces/facets", ...requireTraceReadAccess, async (req, r
|
|
|
670
670
|
const traceFilters = Object.assign(Object.assign({}, parseTraceFilterBody(body)), { resourceScopes: await resolveResourceScopesFromBody(body, databaseProps.tenantId) });
|
|
671
671
|
/*
|
|
672
672
|
* Per-facet partial-match filter applied at the Postgres source-of-truth
|
|
673
|
-
* lookup stage. Only consulted for resource facets (primaryEntityId
|
|
674
|
-
* hostId /
|
|
675
|
-
* to filter client-side over the loaded value
|
|
673
|
+
* lookup stage. Only consulted for resource facets (primaryEntityId and
|
|
674
|
+
* every ResourceFacetCatalog key — hostId / kubernetesClusterId / ...)
|
|
675
|
+
* — other facets continue to filter client-side over the loaded value
|
|
676
|
+
* list.
|
|
676
677
|
*/
|
|
677
678
|
const facetSearchText = body["facetSearchText"]
|
|
678
679
|
? body["facetSearchText"]
|
|
@@ -688,9 +689,8 @@ router.post("/telemetry/traces/facets", ...requireTraceReadAccess, async (req, r
|
|
|
688
689
|
facetKeys,
|
|
689
690
|
limit }, traceFilters);
|
|
690
691
|
/*
|
|
691
|
-
* Resource facets (primaryEntityId
|
|
692
|
-
*
|
|
693
|
-
* projection-backed GROUP BY
|
|
692
|
+
* Resource facets (primaryEntityId and every ResourceFacetCatalog key)
|
|
693
|
+
* and statusCode are counted with an exact, projection-backed GROUP BY
|
|
694
694
|
* in getResourceFacetCounts(). The recent-N sample below saturates with
|
|
695
695
|
* whichever service is chattiest right now and reports 0 for every other
|
|
696
696
|
* service regardless of its true volume over the window — the "top 1000"
|
|
@@ -704,10 +704,20 @@ router.post("/telemetry/traces/facets", ...requireTraceReadAccess, async (req, r
|
|
|
704
704
|
key !== "isRootSpan" &&
|
|
705
705
|
key !== "hasException");
|
|
706
706
|
});
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
707
|
+
/*
|
|
708
|
+
* Resource facets list their Postgres rows FIRST. The exact counts are
|
|
709
|
+
* one shared GROUP BY for statusCode and every resource facet, so it
|
|
710
|
+
* only runs when statusCode is requested or some requested resource
|
|
711
|
+
* facet listed a row to merge counts into — a sidebar whose resource
|
|
712
|
+
* types the project has none of skips the scan entirely. The listing
|
|
713
|
+
* still overlaps the sample / root-span / exception queries.
|
|
714
|
+
*/
|
|
715
|
+
const resourceListing = ResourceFacetPlanner.listResourceFacets({
|
|
716
|
+
projectId: databaseProps.tenantId,
|
|
717
|
+
facetKeys,
|
|
718
|
+
facetSearchText,
|
|
719
|
+
limit,
|
|
720
|
+
});
|
|
711
721
|
const wantsRootSpan = facetKeys.includes("isRootSpan");
|
|
712
722
|
const wantsHasException = facetKeys.includes("hasException");
|
|
713
723
|
const emptyAccurate = {
|
|
@@ -722,7 +732,7 @@ router.post("/telemetry/traces/facets", ...requireTraceReadAccess, async (req, r
|
|
|
722
732
|
* the projection-backed sample / resource / root-span queries keeps it
|
|
723
733
|
* off the critical path. Each query keeps its own degrade-to-empty catch.
|
|
724
734
|
*/
|
|
725
|
-
const [sampledFacets, accurate, rootSpanCounts, exceptionCounts] = await Promise.all([
|
|
735
|
+
const [sampledFacets, listedResourceFacets, accurate, rootSpanCounts, exceptionCounts,] = await Promise.all([
|
|
726
736
|
sampledKeys.length > 0
|
|
727
737
|
? TraceAggregationService.getFacetValuesFromSample(Object.assign(Object.assign({}, multiRequest), { facetKeys: sampledKeys })).catch(() => {
|
|
728
738
|
return Object.fromEntries(sampledKeys.map((key) => {
|
|
@@ -730,15 +740,22 @@ router.post("/telemetry/traces/facets", ...requireTraceReadAccess, async (req, r
|
|
|
730
740
|
}));
|
|
731
741
|
})
|
|
732
742
|
: Promise.resolve({}),
|
|
733
|
-
|
|
734
|
-
|
|
743
|
+
resourceListing,
|
|
744
|
+
resourceListing.then((listed) => {
|
|
745
|
+
if (!ResourceFacetPlanner.needsTraceResourceFacetCounts({
|
|
746
|
+
facetKeys,
|
|
747
|
+
listed,
|
|
748
|
+
})) {
|
|
749
|
+
return Promise.resolve(emptyAccurate);
|
|
750
|
+
}
|
|
751
|
+
return TraceAggregationService.getResourceFacetCounts(multiRequest).catch(() => {
|
|
735
752
|
/*
|
|
736
753
|
* Degrade gracefully: resource facets still enumerate via
|
|
737
754
|
* Postgres (count 0), statusCode falls back to empty.
|
|
738
755
|
*/
|
|
739
756
|
return emptyAccurate;
|
|
740
|
-
})
|
|
741
|
-
|
|
757
|
+
});
|
|
758
|
+
}),
|
|
742
759
|
wantsRootSpan
|
|
743
760
|
? TraceAggregationService.getRootSpanCounts(multiRequest).catch(() => {
|
|
744
761
|
return null;
|
|
@@ -790,31 +807,23 @@ router.post("/telemetry/traces/facets", ...requireTraceReadAccess, async (req, r
|
|
|
790
807
|
: [];
|
|
791
808
|
}
|
|
792
809
|
/*
|
|
793
|
-
*
|
|
810
|
+
* Resource facets answer with the Postgres source-of-truth list
|
|
794
811
|
* (filtered by facetSearchText and enriched with displayName). Every
|
|
795
812
|
* resource facet shares the same exact primaryEntityId -> count map;
|
|
796
813
|
* resource ids are globally unique, so each facet only ever resolves its own
|
|
797
814
|
* entities. Entities with no telemetry in the window surface with count
|
|
798
815
|
* 0 instead of being hidden, and the search box can find resources
|
|
799
|
-
* beyond the loaded subset.
|
|
816
|
+
* beyond the loaded subset. A facet that listed nothing answers [].
|
|
800
817
|
*/
|
|
801
|
-
const
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
facetKey: key,
|
|
808
|
-
counts: serviceCounts,
|
|
809
|
-
searchText: facetSearchText === null || facetSearchText === void 0 ? void 0 : facetSearchText[key],
|
|
810
|
-
limit,
|
|
811
|
-
};
|
|
818
|
+
const resourceFacets = ResourceFacetPlanner.mergeResourceFacetCounts({
|
|
819
|
+
facetKeys,
|
|
820
|
+
listed: listedResourceFacets,
|
|
821
|
+
countsFor: () => {
|
|
822
|
+
return serviceCounts;
|
|
823
|
+
},
|
|
812
824
|
});
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
for (const key of Object.keys(resolved)) {
|
|
816
|
-
facets[key] = resolved[key];
|
|
817
|
-
}
|
|
825
|
+
for (const key of Object.keys(resourceFacets)) {
|
|
826
|
+
facets[key] = resourceFacets[key] || [];
|
|
818
827
|
}
|
|
819
828
|
return Response.sendJsonObjectResponse(req, res, {
|
|
820
829
|
facets: facets,
|
|
@@ -966,10 +975,7 @@ router.post("/telemetry/exceptions/facets", ...requireExceptionReadAccess, async
|
|
|
966
975
|
? body["facetKeys"]
|
|
967
976
|
: [
|
|
968
977
|
"primaryEntityId",
|
|
969
|
-
|
|
970
|
-
"dockerHostId",
|
|
971
|
-
"podmanHostId",
|
|
972
|
-
"kubernetesClusterId",
|
|
978
|
+
...RESOURCE_FACET_CATALOG_KEYS,
|
|
973
979
|
"exceptionType",
|
|
974
980
|
"environment",
|
|
975
981
|
];
|
|
@@ -1011,11 +1017,19 @@ router.post("/telemetry/exceptions/facets", ...requireExceptionReadAccess, async
|
|
|
1011
1017
|
: undefined;
|
|
1012
1018
|
const projectId = databaseProps.tenantId;
|
|
1013
1019
|
/*
|
|
1014
|
-
* Per-facet ClickHouse query in parallel
|
|
1020
|
+
* Per-facet ClickHouse query in parallel; per-facet errors degrade
|
|
1015
1021
|
* gracefully to [] so a slow / failing facet can't block the others.
|
|
1022
|
+
* Resource facets answer with the Postgres source-of-truth list
|
|
1023
|
+
* (filtered by facetSearchText, enriched with displayName), listed
|
|
1024
|
+
* first so a type with no rows skips its count query. Same flow as the
|
|
1025
|
+
* log facets endpoint.
|
|
1016
1026
|
*/
|
|
1017
|
-
const
|
|
1018
|
-
|
|
1027
|
+
const facets = await ResourceFacetPlanner.countPerFacet({
|
|
1028
|
+
projectId,
|
|
1029
|
+
facetKeys,
|
|
1030
|
+
facetSearchText,
|
|
1031
|
+
limit,
|
|
1032
|
+
countFacet: (facetKey) => {
|
|
1019
1033
|
const request = {
|
|
1020
1034
|
projectId,
|
|
1021
1035
|
startTime,
|
|
@@ -1030,41 +1044,9 @@ router.post("/telemetry/exceptions/facets", ...requireExceptionReadAccess, async
|
|
|
1030
1044
|
escaped,
|
|
1031
1045
|
messageSearchText,
|
|
1032
1046
|
};
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
}
|
|
1036
|
-
catch (_a) {
|
|
1037
|
-
return [facetKey, []];
|
|
1038
|
-
}
|
|
1039
|
-
}));
|
|
1040
|
-
const facets = Object.fromEntries(facetResults);
|
|
1041
|
-
/*
|
|
1042
|
-
* Replace resource-facet results with the Postgres source-of-truth list
|
|
1043
|
-
* (filtered by facetSearchText and enriched with displayName). Same
|
|
1044
|
-
* pattern as the trace/log facets endpoints.
|
|
1045
|
-
*/
|
|
1046
|
-
const resourceSpecs = facetKeys
|
|
1047
|
-
.filter((key) => {
|
|
1048
|
-
return ResourceFacetResolver.isResourceFacet(key);
|
|
1049
|
-
})
|
|
1050
|
-
.map((key) => {
|
|
1051
|
-
const counts = new Map();
|
|
1052
|
-
for (const fv of facets[key] || []) {
|
|
1053
|
-
counts.set(fv.value, fv.count);
|
|
1054
|
-
}
|
|
1055
|
-
return {
|
|
1056
|
-
facetKey: key,
|
|
1057
|
-
counts,
|
|
1058
|
-
searchText: facetSearchText === null || facetSearchText === void 0 ? void 0 : facetSearchText[key],
|
|
1059
|
-
limit,
|
|
1060
|
-
};
|
|
1047
|
+
return ExceptionAggregationService.getFacetValues(request);
|
|
1048
|
+
},
|
|
1061
1049
|
});
|
|
1062
|
-
if (resourceSpecs.length > 0) {
|
|
1063
|
-
const resolved = await ResourceFacetResolver.resolve(projectId, resourceSpecs);
|
|
1064
|
-
for (const key of Object.keys(resolved)) {
|
|
1065
|
-
facets[key] = resolved[key];
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
1050
|
return Response.sendJsonObjectResponse(req, res, {
|
|
1069
1051
|
facets: facets,
|
|
1070
1052
|
});
|
|
@@ -1083,13 +1065,7 @@ router.post("/telemetry/metrics/facets", ...requireMetricReadAccess, async (req,
|
|
|
1083
1065
|
const body = req.body;
|
|
1084
1066
|
const facetKeys = body["facetKeys"]
|
|
1085
1067
|
? body["facetKeys"]
|
|
1086
|
-
: [
|
|
1087
|
-
"primaryEntityId",
|
|
1088
|
-
"hostId",
|
|
1089
|
-
"dockerHostId",
|
|
1090
|
-
"podmanHostId",
|
|
1091
|
-
"kubernetesClusterId",
|
|
1092
|
-
];
|
|
1068
|
+
: ["primaryEntityId", ...RESOURCE_FACET_CATALOG_KEYS];
|
|
1093
1069
|
const startTime = body["startTime"]
|
|
1094
1070
|
? OneUptimeDate.fromString(body["startTime"])
|
|
1095
1071
|
: OneUptimeDate.addRemoveHours(OneUptimeDate.getCurrentDate(), -1);
|
|
@@ -1111,11 +1087,19 @@ router.post("/telemetry/metrics/facets", ...requireMetricReadAccess, async (req,
|
|
|
1111
1087
|
: undefined;
|
|
1112
1088
|
const projectId = databaseProps.tenantId;
|
|
1113
1089
|
/*
|
|
1114
|
-
* Per-facet ClickHouse GROUP BY in parallel
|
|
1115
|
-
* to [] so a slow facet doesn't block the rest.
|
|
1090
|
+
* Per-facet ClickHouse GROUP BY in parallel; per-facet errors degrade
|
|
1091
|
+
* to [] so a slow facet doesn't block the rest. Resource facets answer
|
|
1092
|
+
* with the Postgres source-of-truth list (filtered by facetSearchText,
|
|
1093
|
+
* enriched with displayName), listed first so a type with no rows
|
|
1094
|
+
* skips its count query. Same flow as the log / exception facets
|
|
1095
|
+
* endpoints.
|
|
1116
1096
|
*/
|
|
1117
|
-
const
|
|
1118
|
-
|
|
1097
|
+
const facets = await ResourceFacetPlanner.countPerFacet({
|
|
1098
|
+
projectId,
|
|
1099
|
+
facetKeys,
|
|
1100
|
+
facetSearchText,
|
|
1101
|
+
limit,
|
|
1102
|
+
countFacet: (facetKey) => {
|
|
1119
1103
|
const request = {
|
|
1120
1104
|
projectId,
|
|
1121
1105
|
startTime,
|
|
@@ -1126,41 +1110,9 @@ router.post("/telemetry/metrics/facets", ...requireMetricReadAccess, async (req,
|
|
|
1126
1110
|
metricNames,
|
|
1127
1111
|
attributes,
|
|
1128
1112
|
};
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
}
|
|
1132
|
-
catch (_a) {
|
|
1133
|
-
return [facetKey, []];
|
|
1134
|
-
}
|
|
1135
|
-
}));
|
|
1136
|
-
const facets = Object.fromEntries(facetResults);
|
|
1137
|
-
/*
|
|
1138
|
-
* Replace resource-facet results with the Postgres source-of-truth list
|
|
1139
|
-
* (filtered by facetSearchText and enriched with displayName). Same
|
|
1140
|
-
* pattern as the trace / log / exception facets endpoints.
|
|
1141
|
-
*/
|
|
1142
|
-
const resourceSpecs = facetKeys
|
|
1143
|
-
.filter((key) => {
|
|
1144
|
-
return ResourceFacetResolver.isResourceFacet(key);
|
|
1145
|
-
})
|
|
1146
|
-
.map((key) => {
|
|
1147
|
-
const counts = new Map();
|
|
1148
|
-
for (const fv of facets[key] || []) {
|
|
1149
|
-
counts.set(fv.value, fv.count);
|
|
1150
|
-
}
|
|
1151
|
-
return {
|
|
1152
|
-
facetKey: key,
|
|
1153
|
-
counts,
|
|
1154
|
-
searchText: facetSearchText === null || facetSearchText === void 0 ? void 0 : facetSearchText[key],
|
|
1155
|
-
limit,
|
|
1156
|
-
};
|
|
1113
|
+
return MetricAggregationService.getFacetValues(request);
|
|
1114
|
+
},
|
|
1157
1115
|
});
|
|
1158
|
-
if (resourceSpecs.length > 0) {
|
|
1159
|
-
const resolved = await ResourceFacetResolver.resolve(projectId, resourceSpecs);
|
|
1160
|
-
for (const key of Object.keys(resolved)) {
|
|
1161
|
-
facets[key] = resolved[key];
|
|
1162
|
-
}
|
|
1163
|
-
}
|
|
1164
1116
|
return Response.sendJsonObjectResponse(req, res, {
|
|
1165
1117
|
facets: facets,
|
|
1166
1118
|
});
|
|
@@ -2094,7 +2046,7 @@ router.post("/telemetry/profiles/trace-presence", ...requireProfileReadAccess, a
|
|
|
2094
2046
|
* Session replay playback
|
|
2095
2047
|
* ---------------------------------------------------------------------
|
|
2096
2048
|
*
|
|
2097
|
-
* These
|
|
2049
|
+
* These routes are the ONLY reader of RumSessionV1 / RumSessionChunkV1:
|
|
2098
2050
|
* both analytics models deliberately omit `crudApiPath`, so there is no
|
|
2099
2051
|
* generic CRUD surface for them and ModelPermission is NEVER invoked on
|
|
2100
2052
|
* this path.
|
|
@@ -2176,6 +2128,24 @@ const SESSION_REPLAY_LIST_PERMISSIONS = [
|
|
|
2176
2128
|
*/
|
|
2177
2129
|
Permission.ReadRumSessionReplayPayload,
|
|
2178
2130
|
];
|
|
2131
|
+
/*
|
|
2132
|
+
* The optional audit-table enrichment must admit an audit-only reviewer so a
|
|
2133
|
+
* 403 from the shared browser API does not navigate them away from the audit
|
|
2134
|
+
* page. The handler still returns metadata only after a separate LIST-scope
|
|
2135
|
+
* check for the resolved application; audit access alone receives an empty,
|
|
2136
|
+
* successful response.
|
|
2137
|
+
*/
|
|
2138
|
+
const SESSION_REPLAY_SUMMARY_PERMISSIONS = [
|
|
2139
|
+
...SESSION_REPLAY_LIST_PERMISSIONS,
|
|
2140
|
+
Permission.ReadRumSessionReplayAudit,
|
|
2141
|
+
];
|
|
2142
|
+
const requireSessionReplaySummaryAccess = [
|
|
2143
|
+
UserMiddleware.getUserMiddleware,
|
|
2144
|
+
UserMiddleware.requireUserAuthentication,
|
|
2145
|
+
UserMiddleware.requirePermission({
|
|
2146
|
+
permissions: SESSION_REPLAY_SUMMARY_PERMISSIONS,
|
|
2147
|
+
}),
|
|
2148
|
+
];
|
|
2179
2149
|
const SESSION_REPLAY_PAYLOAD_PERMISSIONS = [
|
|
2180
2150
|
Permission.ProjectOwner,
|
|
2181
2151
|
Permission.ProjectAdmin,
|
|
@@ -2383,6 +2353,26 @@ const canReadIdentifiedUserLabel = (data) => {
|
|
|
2383
2353
|
application: data.application,
|
|
2384
2354
|
});
|
|
2385
2355
|
};
|
|
2356
|
+
/*
|
|
2357
|
+
* Audit-only roles may load the summaries route so the optional request can
|
|
2358
|
+
* fail closed without a browser-wide forbidden redirect. They still must not
|
|
2359
|
+
* gain the session-list metadata this endpoint projects. Re-evaluate the
|
|
2360
|
+
* list scope against the already-resolved application and turn unsupported
|
|
2361
|
+
* scope shapes into "no metadata" rather than an authorization error.
|
|
2362
|
+
*/
|
|
2363
|
+
const canReadSessionReplayListMetadata = (data) => {
|
|
2364
|
+
let scope;
|
|
2365
|
+
try {
|
|
2366
|
+
scope = getSessionReplayLabelScope(data.databaseProps, SESSION_REPLAY_LIST_PERMISSIONS);
|
|
2367
|
+
}
|
|
2368
|
+
catch (_a) {
|
|
2369
|
+
return false;
|
|
2370
|
+
}
|
|
2371
|
+
return isApplicationInSessionReplayScope({
|
|
2372
|
+
scope: scope,
|
|
2373
|
+
application: data.application,
|
|
2374
|
+
});
|
|
2375
|
+
};
|
|
2386
2376
|
const resolveAccessibleRumApplicationIds = async (data) => {
|
|
2387
2377
|
const scope = getSessionReplayLabelScope(data.databaseProps, data.permissions);
|
|
2388
2378
|
if (scope.isUnrestricted) {
|
|
@@ -2618,7 +2608,6 @@ const readObjectIdFromBody = (body, key) => {
|
|
|
2618
2608
|
* callers exist - but it is a cap: an unbounded caller-supplied string
|
|
2619
2609
|
* reaches ClickHouse as a bound parameter on a hot path.
|
|
2620
2610
|
*/
|
|
2621
|
-
const MAX_SESSION_REPLAY_SESSION_ID_LENGTH = 128;
|
|
2622
2611
|
const readSessionIdFromBody = (body) => {
|
|
2623
2612
|
const sessionId = body["sessionId"];
|
|
2624
2613
|
if (typeof sessionId !== "string" || sessionId.length === 0) {
|
|
@@ -2629,6 +2618,35 @@ const readSessionIdFromBody = (body) => {
|
|
|
2629
2618
|
}
|
|
2630
2619
|
return sessionId;
|
|
2631
2620
|
};
|
|
2621
|
+
/*
|
|
2622
|
+
* The summaries route accepts one audit-table page at a time. Validate the
|
|
2623
|
+
* raw array before de-duplicating it so repeated values cannot be used to
|
|
2624
|
+
* bypass the request-size ceiling, then preserve first-occurrence order.
|
|
2625
|
+
*/
|
|
2626
|
+
const readSessionIdsFromBody = (body) => {
|
|
2627
|
+
const value = body["sessionIds"];
|
|
2628
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
2629
|
+
throw new BadDataException("sessionIds must be a non-empty array");
|
|
2630
|
+
}
|
|
2631
|
+
if (value.length > MAX_SESSION_REPLAY_SUMMARIES_BATCH_SIZE) {
|
|
2632
|
+
throw new BadDataException(`sessionIds must contain at most ${MAX_SESSION_REPLAY_SUMMARIES_BATCH_SIZE} ids`);
|
|
2633
|
+
}
|
|
2634
|
+
const sessionIds = [];
|
|
2635
|
+
const seen = new Set();
|
|
2636
|
+
for (const sessionId of value) {
|
|
2637
|
+
if (typeof sessionId !== "string" || sessionId.length === 0) {
|
|
2638
|
+
throw new BadDataException("Every sessionId must be a non-empty string");
|
|
2639
|
+
}
|
|
2640
|
+
if (sessionId.length > MAX_SESSION_REPLAY_SESSION_ID_LENGTH) {
|
|
2641
|
+
throw new BadDataException(`Every sessionId must be at most ${MAX_SESSION_REPLAY_SESSION_ID_LENGTH} characters.`);
|
|
2642
|
+
}
|
|
2643
|
+
if (!seen.has(sessionId)) {
|
|
2644
|
+
seen.add(sessionId);
|
|
2645
|
+
sessionIds.push(sessionId);
|
|
2646
|
+
}
|
|
2647
|
+
}
|
|
2648
|
+
return sessionIds;
|
|
2649
|
+
};
|
|
2632
2650
|
/*
|
|
2633
2651
|
* Caps on the list's filter inputs.
|
|
2634
2652
|
*
|
|
@@ -2931,6 +2949,51 @@ router.post("/telemetry/rum/session-replay/list", ...requireSessionReplayListAcc
|
|
|
2931
2949
|
next(err);
|
|
2932
2950
|
}
|
|
2933
2951
|
});
|
|
2952
|
+
// --- Session Replay Summary Batch Endpoint ---
|
|
2953
|
+
/*
|
|
2954
|
+
* Audit rows store only the session id. Resolve one page of those ids into
|
|
2955
|
+
* compact, non-identity session context. Audit-only callers receive an empty
|
|
2956
|
+
* success; session-list metadata is returned only after the resolved
|
|
2957
|
+
* application passes the list scope. The service performs one
|
|
2958
|
+
* application-pinned argMax query, so this route never turns an audit page
|
|
2959
|
+
* into an N+1 ClickHouse workload.
|
|
2960
|
+
*/
|
|
2961
|
+
router.post("/telemetry/rum/session-replay/summaries", ...requireSessionReplaySummaryAccess, async (req, res, next) => {
|
|
2962
|
+
try {
|
|
2963
|
+
const databaseProps = await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
2964
|
+
if (!(databaseProps === null || databaseProps === void 0 ? void 0 : databaseProps.tenantId)) {
|
|
2965
|
+
return Response.sendErrorResponse(req, res, new BadDataException("Invalid Project ID"));
|
|
2966
|
+
}
|
|
2967
|
+
assertSessionReplayPlan(databaseProps);
|
|
2968
|
+
const projectId = databaseProps.tenantId;
|
|
2969
|
+
const body = req.body;
|
|
2970
|
+
const rumApplicationId = readObjectIdFromBody(body, "rumApplicationId");
|
|
2971
|
+
const sessionIds = readSessionIdsFromBody(body);
|
|
2972
|
+
const application = await assertSessionReplayApplicationAccess({
|
|
2973
|
+
projectId: projectId,
|
|
2974
|
+
rumApplicationId: rumApplicationId,
|
|
2975
|
+
databaseProps: databaseProps,
|
|
2976
|
+
permissions: SESSION_REPLAY_SUMMARY_PERMISSIONS,
|
|
2977
|
+
});
|
|
2978
|
+
if (!canReadSessionReplayListMetadata({
|
|
2979
|
+
databaseProps: databaseProps,
|
|
2980
|
+
application: application,
|
|
2981
|
+
})) {
|
|
2982
|
+
return Response.sendJsonObjectResponse(req, res, { sessions: [] });
|
|
2983
|
+
}
|
|
2984
|
+
const sessions = await SessionReplayReadService.getSessionSummaries({
|
|
2985
|
+
projectId: projectId,
|
|
2986
|
+
rumApplicationId: rumApplicationId,
|
|
2987
|
+
sessionIds: sessionIds,
|
|
2988
|
+
});
|
|
2989
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
2990
|
+
sessions: sessions,
|
|
2991
|
+
});
|
|
2992
|
+
}
|
|
2993
|
+
catch (err) {
|
|
2994
|
+
next(err);
|
|
2995
|
+
}
|
|
2996
|
+
});
|
|
2934
2997
|
// --- Session Replay Users Endpoint ---
|
|
2935
2998
|
/*
|
|
2936
2999
|
* The cursor /users emits and accepts: the last row's "last seen" clock
|
|
@@ -3536,6 +3599,21 @@ router.post("/telemetry/rum/session-replay/for-exception", ...requireSessionRepl
|
|
|
3536
3599
|
if (typeof fingerprint !== "string" || fingerprint.length === 0) {
|
|
3537
3600
|
return Response.sendErrorResponse(req, res, new BadDataException("fingerprint is required"));
|
|
3538
3601
|
}
|
|
3602
|
+
const primaryEntityId = readOptionalObjectIdFromBody(body, "primaryEntityId");
|
|
3603
|
+
const rawPrimaryEntityType = body["primaryEntityType"];
|
|
3604
|
+
let primaryEntityType = undefined;
|
|
3605
|
+
if (rawPrimaryEntityType !== undefined &&
|
|
3606
|
+
rawPrimaryEntityType !== null &&
|
|
3607
|
+
rawPrimaryEntityType !== "") {
|
|
3608
|
+
if (typeof rawPrimaryEntityType !== "string" ||
|
|
3609
|
+
!Object.values(ServiceType).includes(rawPrimaryEntityType)) {
|
|
3610
|
+
throw new BadDataException("primaryEntityType is not valid");
|
|
3611
|
+
}
|
|
3612
|
+
primaryEntityType = rawPrimaryEntityType;
|
|
3613
|
+
}
|
|
3614
|
+
if (primaryEntityId === undefined && primaryEntityType !== undefined) {
|
|
3615
|
+
throw new BadDataException("primaryEntityId is required with its type");
|
|
3616
|
+
}
|
|
3539
3617
|
/*
|
|
3540
3618
|
* An exception is not scoped to a RUM application, so there is no
|
|
3541
3619
|
* single application to authorize against. Restrict the query to
|
|
@@ -3572,7 +3650,7 @@ router.post("/telemetry/rum/session-replay/for-exception", ...requireSessionRepl
|
|
|
3572
3650
|
}
|
|
3573
3651
|
/* Pin to the session the caller already knows threw, when it does. */
|
|
3574
3652
|
const pinnedSessionId = body["sessionId"];
|
|
3575
|
-
const sessions = await SessionReplayReadService.getSessionsForException(Object.assign(Object.assign(Object.assign(Object.assign({ projectId: projectId, exceptionFingerprint: fingerprint, accessibleRumApplicationIds: accessibleApplications.applicationIds }, (startTime !== undefined && { startTime })), (endTime !== undefined && { endTime })), (typeof pinnedSessionId === "string" &&
|
|
3653
|
+
const sessions = await SessionReplayReadService.getSessionsForException(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ projectId: projectId, exceptionFingerprint: fingerprint }, (primaryEntityId !== undefined && { primaryEntityId })), (primaryEntityType !== undefined && { primaryEntityType })), { accessibleRumApplicationIds: accessibleApplications.applicationIds }), (startTime !== undefined && { startTime })), (endTime !== undefined && { endTime })), (typeof pinnedSessionId === "string" &&
|
|
3576
3654
|
pinnedSessionId.length > 0 && { sessionId: pinnedSessionId })), { limit: readLimitFromBody(body, MAX_SESSION_REPLAY_FOR_EXCEPTION_LIMIT, MAX_SESSION_REPLAY_FOR_EXCEPTION_LIMIT) }));
|
|
3577
3655
|
return Response.sendJsonObjectResponse(req, res, {
|
|
3578
3656
|
sessions: sessions,
|