@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
|
@@ -12,6 +12,8 @@ import BadDataException from "../../Types/Exception/BadDataException";
|
|
|
12
12
|
import CommonAPI from "./CommonAPI";
|
|
13
13
|
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
14
14
|
import TelemetryType from "../../Types/Telemetry/TelemetryType";
|
|
15
|
+
import { parseExceptionSpanScope } from "../../Types/Telemetry/ExceptionSpanScope";
|
|
16
|
+
import ServiceType from "../../Types/Telemetry/ServiceType";
|
|
15
17
|
import TelemetryAttributeService from "../Services/TelemetryAttributeService";
|
|
16
18
|
import TelemetrySourceMapService from "../Services/TelemetrySourceMapService";
|
|
17
19
|
import SourceMapResolver, {
|
|
@@ -104,10 +106,11 @@ import RumSession from "../../Models/AnalyticsModels/RumSession";
|
|
|
104
106
|
import ObjectID from "../../Types/ObjectID";
|
|
105
107
|
import OneUptimeDate from "../../Types/Date";
|
|
106
108
|
import { JSONArray, JSONObject } from "../../Types/JSON";
|
|
107
|
-
import ResourceFacetResolver
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
} from "../Utils/Telemetry/
|
|
109
|
+
import ResourceFacetResolver from "../Utils/Telemetry/ResourceFacetResolver";
|
|
110
|
+
import ResourceFacetPlanner, {
|
|
111
|
+
ListedResourceFacets,
|
|
112
|
+
} from "../Utils/Telemetry/ResourceFacetPlanner";
|
|
113
|
+
import { RESOURCE_FACET_CATALOG_KEYS } from "../../Types/Telemetry/ResourceFacetCatalog";
|
|
111
114
|
import ResourceEntityFilter, {
|
|
112
115
|
ResourceEntityScope,
|
|
113
116
|
} from "../Utils/Telemetry/ResourceEntityFilter";
|
|
@@ -130,6 +133,8 @@ import SessionReplayReadService, {
|
|
|
130
133
|
DEFAULT_SESSION_REPLAY_USERS_LIMIT,
|
|
131
134
|
MAX_SESSION_REPLAY_FOR_EXCEPTION_LIMIT,
|
|
132
135
|
MAX_SESSION_REPLAY_LIST_LIMIT,
|
|
136
|
+
MAX_SESSION_REPLAY_SESSION_ID_LENGTH,
|
|
137
|
+
MAX_SESSION_REPLAY_SUMMARIES_BATCH_SIZE,
|
|
133
138
|
MAX_SESSION_REPLAY_USERS_LIMIT,
|
|
134
139
|
SESSION_REPLAY_EXCEPTION_WINDOW_PADDING_MS,
|
|
135
140
|
SessionReplayApplicationActivitySummary,
|
|
@@ -142,6 +147,7 @@ import SessionReplayReadService, {
|
|
|
142
147
|
SessionReplayManifest,
|
|
143
148
|
SessionReplaySessionHeader,
|
|
144
149
|
SessionReplaySessionIdentity,
|
|
150
|
+
SessionReplaySummary,
|
|
145
151
|
SessionReplayUsersCursor,
|
|
146
152
|
SessionReplayUsersResult,
|
|
147
153
|
} from "../Utils/SessionReplay/SessionReplayReadService";
|
|
@@ -760,9 +766,10 @@ router.post(
|
|
|
760
766
|
|
|
761
767
|
/*
|
|
762
768
|
* Per-facet partial-match filter applied at the Postgres source-of-truth
|
|
763
|
-
* lookup stage. Only consulted for resource facets (primaryEntityId
|
|
764
|
-
* hostId /
|
|
765
|
-
* to filter client-side over the loaded value
|
|
769
|
+
* lookup stage. Only consulted for resource facets (primaryEntityId and
|
|
770
|
+
* every ResourceFacetCatalog key — hostId / kubernetesClusterId / ...)
|
|
771
|
+
* — other facets continue to filter client-side over the loaded value
|
|
772
|
+
* list.
|
|
766
773
|
*/
|
|
767
774
|
const facetSearchText: Record<string, string> | undefined = body[
|
|
768
775
|
"facetSearchText"
|
|
@@ -780,79 +787,43 @@ router.post(
|
|
|
780
787
|
await resolveResourceScopesFromBody(body, projectId);
|
|
781
788
|
|
|
782
789
|
/*
|
|
783
|
-
*
|
|
784
|
-
* starve the endpoint
|
|
790
|
+
* One ClickHouse GROUP BY per facet, in parallel so a slow facet can't
|
|
791
|
+
* starve the endpoint; per-facet errors degrade gracefully to [].
|
|
792
|
+
* Resource facets come back as the Postgres source-of-truth list
|
|
793
|
+
* (filtered by facetSearchText, enriched with displayName) with those
|
|
794
|
+
* counts merged in, so low-volume resources stay visible and search
|
|
795
|
+
* reaches resources outside the window. Their lists are fetched FIRST:
|
|
796
|
+
* a resource type the project has none of skips its ClickHouse scan
|
|
797
|
+
* entirely (see ResourceFacetPlanner).
|
|
785
798
|
*/
|
|
786
|
-
const
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
entityKeys,
|
|
801
|
-
resourceScopes,
|
|
802
|
-
severityTexts,
|
|
803
|
-
bodySearchText,
|
|
804
|
-
traceIds,
|
|
805
|
-
spanIds,
|
|
806
|
-
sessionIds,
|
|
807
|
-
attributes,
|
|
808
|
-
};
|
|
809
|
-
const values: Array<FacetValue> =
|
|
810
|
-
await LogAggregationService.getFacetValues(request);
|
|
811
|
-
return [facetKey, values] as const;
|
|
812
|
-
} catch {
|
|
813
|
-
return [facetKey, [] as Array<FacetValue>] as const;
|
|
814
|
-
}
|
|
815
|
-
},
|
|
816
|
-
),
|
|
817
|
-
);
|
|
818
|
-
|
|
819
|
-
const facets: Record<string, Array<FacetValue>> = Object.fromEntries(
|
|
820
|
-
facetResults,
|
|
821
|
-
);
|
|
822
|
-
|
|
823
|
-
/*
|
|
824
|
-
* Replace resource-facet results with the Postgres source-of-truth list
|
|
825
|
-
* (filtered by facetSearchText and enriched with displayName). See the
|
|
826
|
-
* trace facets handler above for the rationale — same pattern, same
|
|
827
|
-
* benefit: low-volume resources stay visible and search can reach
|
|
828
|
-
* resources outside the ClickHouse sample window.
|
|
829
|
-
*/
|
|
830
|
-
const resourceSpecs: Array<ResourceFacetSpec> = facetKeys
|
|
831
|
-
.filter((key: string): boolean => {
|
|
832
|
-
return ResourceFacetResolver.isResourceFacet(key);
|
|
833
|
-
})
|
|
834
|
-
.map((key: string): ResourceFacetSpec => {
|
|
835
|
-
const counts: Map<string, number> = new Map();
|
|
836
|
-
for (const fv of facets[key] || []) {
|
|
837
|
-
counts.set(fv.value, fv.count);
|
|
838
|
-
}
|
|
839
|
-
return {
|
|
840
|
-
facetKey: key,
|
|
841
|
-
counts,
|
|
842
|
-
searchText: facetSearchText?.[key],
|
|
799
|
+
const facets: Record<
|
|
800
|
+
string,
|
|
801
|
+
Array<FacetValue>
|
|
802
|
+
> = await ResourceFacetPlanner.countPerFacet({
|
|
803
|
+
projectId,
|
|
804
|
+
facetKeys,
|
|
805
|
+
facetSearchText,
|
|
806
|
+
limit,
|
|
807
|
+
countFacet: (facetKey: string): Promise<Array<FacetValue>> => {
|
|
808
|
+
const request: FacetRequest = {
|
|
809
|
+
projectId,
|
|
810
|
+
startTime,
|
|
811
|
+
endTime,
|
|
812
|
+
facetKey,
|
|
843
813
|
limit,
|
|
814
|
+
serviceIds,
|
|
815
|
+
entityKeys,
|
|
816
|
+
resourceScopes,
|
|
817
|
+
severityTexts,
|
|
818
|
+
bodySearchText,
|
|
819
|
+
traceIds,
|
|
820
|
+
spanIds,
|
|
821
|
+
sessionIds,
|
|
822
|
+
attributes,
|
|
844
823
|
};
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
const resolved: Record<
|
|
849
|
-
string,
|
|
850
|
-
Array<ResolvedFacetValue>
|
|
851
|
-
> = await ResourceFacetResolver.resolve(projectId, resourceSpecs);
|
|
852
|
-
for (const key of Object.keys(resolved)) {
|
|
853
|
-
facets[key] = resolved[key] as Array<FacetValue>;
|
|
854
|
-
}
|
|
855
|
-
}
|
|
824
|
+
return LogAggregationService.getFacetValues(request);
|
|
825
|
+
},
|
|
826
|
+
});
|
|
856
827
|
|
|
857
828
|
return Response.sendJsonObjectResponse(req, res, {
|
|
858
829
|
facets: facets as unknown as JSONObject,
|
|
@@ -865,13 +836,16 @@ router.post(
|
|
|
865
836
|
|
|
866
837
|
/**
|
|
867
838
|
* Resolve the `resourceFilters` field — the explorers' non-Service resource
|
|
868
|
-
* facet selections (
|
|
869
|
-
*
|
|
839
|
+
* facet selections (any ResourceFacetCatalog type: host / Kubernetes cluster
|
|
840
|
+
* / Proxmox cluster / serverless function / ...), sent as Postgres ids —
|
|
841
|
+
* into the scopes the aggregation services compile.
|
|
870
842
|
*
|
|
871
843
|
* Kept out of the sync body parsers because turning an id into an entity
|
|
872
844
|
* key needs a Postgres round trip: the id names a row whose identifying
|
|
873
|
-
* value (`
|
|
874
|
-
* `entityKeys
|
|
845
|
+
* value (`hostIdentifier` / `clusterIdentifier` / a cluster `name` / ...) is
|
|
846
|
+
* what ingest hashed into `entityKeys` and stamped as a resource attribute.
|
|
847
|
+
* Types without such an identity keep an id-only scope (see
|
|
848
|
+
* ResourceEntityFilter).
|
|
875
849
|
*
|
|
876
850
|
* Returns undefined when nothing was selected so the request field stays
|
|
877
851
|
* absent rather than becoming an empty array.
|
|
@@ -967,6 +941,30 @@ function parseAttributeFilterRecord(
|
|
|
967
941
|
return filters;
|
|
968
942
|
}
|
|
969
943
|
|
|
944
|
+
/*
|
|
945
|
+
* An exception scope that is present but malformed is a client bug, and
|
|
946
|
+
* dropping it would silently chart every span in the project under an
|
|
947
|
+
* exception's heading — so it is refused instead.
|
|
948
|
+
*/
|
|
949
|
+
function parseTraceExceptionScope(
|
|
950
|
+
raw: unknown,
|
|
951
|
+
): TraceFilters["exceptionScope"] {
|
|
952
|
+
if (raw === undefined || raw === null) {
|
|
953
|
+
return undefined;
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
const scope: TraceFilters["exceptionScope"] | null =
|
|
957
|
+
parseExceptionSpanScope(raw);
|
|
958
|
+
|
|
959
|
+
if (!scope) {
|
|
960
|
+
throw new BadDataException(
|
|
961
|
+
"exceptionScope must have a fingerprint and, optionally, a primaryEntityId UUID.",
|
|
962
|
+
);
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
return scope;
|
|
966
|
+
}
|
|
967
|
+
|
|
970
968
|
/*
|
|
971
969
|
* Shared body parsing for every trace aggregation endpoint (histogram,
|
|
972
970
|
* facets, analytics). Defensive about shapes: arrays are validated and
|
|
@@ -1064,6 +1062,7 @@ function parseTraceFilterBody(body: JSONObject): TraceFilters {
|
|
|
1064
1062
|
typeof body["hasException"] === "boolean"
|
|
1065
1063
|
? (body["hasException"] as boolean)
|
|
1066
1064
|
: undefined,
|
|
1065
|
+
exceptionScope: parseTraceExceptionScope(body["exceptionScope"]),
|
|
1067
1066
|
minDurationNano:
|
|
1068
1067
|
typeof body["minDurationNano"] === "number"
|
|
1069
1068
|
? (body["minDurationNano"] as number)
|
|
@@ -1195,9 +1194,10 @@ router.post(
|
|
|
1195
1194
|
|
|
1196
1195
|
/*
|
|
1197
1196
|
* Per-facet partial-match filter applied at the Postgres source-of-truth
|
|
1198
|
-
* lookup stage. Only consulted for resource facets (primaryEntityId
|
|
1199
|
-
* hostId /
|
|
1200
|
-
* to filter client-side over the loaded value
|
|
1197
|
+
* lookup stage. Only consulted for resource facets (primaryEntityId and
|
|
1198
|
+
* every ResourceFacetCatalog key — hostId / kubernetesClusterId / ...)
|
|
1199
|
+
* — other facets continue to filter client-side over the loaded value
|
|
1200
|
+
* list.
|
|
1201
1201
|
*/
|
|
1202
1202
|
const facetSearchText: Record<string, string> | undefined = body[
|
|
1203
1203
|
"facetSearchText"
|
|
@@ -1221,9 +1221,8 @@ router.post(
|
|
|
1221
1221
|
};
|
|
1222
1222
|
|
|
1223
1223
|
/*
|
|
1224
|
-
* Resource facets (primaryEntityId
|
|
1225
|
-
*
|
|
1226
|
-
* projection-backed GROUP BY
|
|
1224
|
+
* Resource facets (primaryEntityId and every ResourceFacetCatalog key)
|
|
1225
|
+
* and statusCode are counted with an exact, projection-backed GROUP BY
|
|
1227
1226
|
* in getResourceFacetCounts(). The recent-N sample below saturates with
|
|
1228
1227
|
* whichever service is chattiest right now and reports 0 for every other
|
|
1229
1228
|
* service regardless of its true volume over the window — the "top 1000"
|
|
@@ -1242,10 +1241,20 @@ router.post(
|
|
|
1242
1241
|
},
|
|
1243
1242
|
);
|
|
1244
1243
|
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1244
|
+
/*
|
|
1245
|
+
* Resource facets list their Postgres rows FIRST. The exact counts are
|
|
1246
|
+
* one shared GROUP BY for statusCode and every resource facet, so it
|
|
1247
|
+
* only runs when statusCode is requested or some requested resource
|
|
1248
|
+
* facet listed a row to merge counts into — a sidebar whose resource
|
|
1249
|
+
* types the project has none of skips the scan entirely. The listing
|
|
1250
|
+
* still overlaps the sample / root-span / exception queries.
|
|
1251
|
+
*/
|
|
1252
|
+
const resourceListing: Promise<ListedResourceFacets> =
|
|
1253
|
+
ResourceFacetPlanner.listResourceFacets({
|
|
1254
|
+
projectId: databaseProps.tenantId,
|
|
1255
|
+
facetKeys,
|
|
1256
|
+
facetSearchText,
|
|
1257
|
+
limit,
|
|
1249
1258
|
});
|
|
1250
1259
|
const wantsRootSpan: boolean = facetKeys.includes("isRootSpan");
|
|
1251
1260
|
const wantsHasException: boolean = facetKeys.includes("hasException");
|
|
@@ -1266,8 +1275,15 @@ router.post(
|
|
|
1266
1275
|
* the projection-backed sample / resource / root-span queries keeps it
|
|
1267
1276
|
* off the critical path. Each query keeps its own degrade-to-empty catch.
|
|
1268
1277
|
*/
|
|
1269
|
-
const [
|
|
1278
|
+
const [
|
|
1279
|
+
sampledFacets,
|
|
1280
|
+
listedResourceFacets,
|
|
1281
|
+
accurate,
|
|
1282
|
+
rootSpanCounts,
|
|
1283
|
+
exceptionCounts,
|
|
1284
|
+
]: [
|
|
1270
1285
|
Record<string, Array<TraceFacetValue>>,
|
|
1286
|
+
ListedResourceFacets,
|
|
1271
1287
|
{
|
|
1272
1288
|
serviceCounts: Map<string, number>;
|
|
1273
1289
|
statusCounts: Map<string, number>;
|
|
@@ -1289,17 +1305,34 @@ router.post(
|
|
|
1289
1305
|
);
|
|
1290
1306
|
})
|
|
1291
1307
|
: Promise.resolve({} as Record<string, Array<TraceFacetValue>>),
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1308
|
+
resourceListing,
|
|
1309
|
+
resourceListing.then(
|
|
1310
|
+
(
|
|
1311
|
+
listed: ListedResourceFacets,
|
|
1312
|
+
): Promise<{
|
|
1313
|
+
serviceCounts: Map<string, number>;
|
|
1314
|
+
statusCounts: Map<string, number>;
|
|
1315
|
+
}> => {
|
|
1316
|
+
if (
|
|
1317
|
+
!ResourceFacetPlanner.needsTraceResourceFacetCounts({
|
|
1318
|
+
facetKeys,
|
|
1319
|
+
listed,
|
|
1320
|
+
})
|
|
1321
|
+
) {
|
|
1322
|
+
return Promise.resolve(emptyAccurate);
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
return TraceAggregationService.getResourceFacetCounts(
|
|
1326
|
+
multiRequest,
|
|
1327
|
+
).catch(() => {
|
|
1328
|
+
/*
|
|
1329
|
+
* Degrade gracefully: resource facets still enumerate via
|
|
1330
|
+
* Postgres (count 0), statusCode falls back to empty.
|
|
1331
|
+
*/
|
|
1332
|
+
return emptyAccurate;
|
|
1333
|
+
});
|
|
1334
|
+
},
|
|
1335
|
+
),
|
|
1303
1336
|
wantsRootSpan
|
|
1304
1337
|
? TraceAggregationService.getRootSpanCounts(multiRequest).catch(
|
|
1305
1338
|
() => {
|
|
@@ -1360,38 +1393,27 @@ router.post(
|
|
|
1360
1393
|
}
|
|
1361
1394
|
|
|
1362
1395
|
/*
|
|
1363
|
-
*
|
|
1396
|
+
* Resource facets answer with the Postgres source-of-truth list
|
|
1364
1397
|
* (filtered by facetSearchText and enriched with displayName). Every
|
|
1365
1398
|
* resource facet shares the same exact primaryEntityId -> count map;
|
|
1366
1399
|
* resource ids are globally unique, so each facet only ever resolves its own
|
|
1367
1400
|
* entities. Entities with no telemetry in the window surface with count
|
|
1368
1401
|
* 0 instead of being hidden, and the search box can find resources
|
|
1369
|
-
* beyond the loaded subset.
|
|
1402
|
+
* beyond the loaded subset. A facet that listed nothing answers [].
|
|
1370
1403
|
*/
|
|
1371
|
-
const
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
};
|
|
1382
|
-
});
|
|
1404
|
+
const resourceFacets: Record<
|
|
1405
|
+
string,
|
|
1406
|
+
Array<TraceFacetValue>
|
|
1407
|
+
> = ResourceFacetPlanner.mergeResourceFacetCounts({
|
|
1408
|
+
facetKeys,
|
|
1409
|
+
listed: listedResourceFacets,
|
|
1410
|
+
countsFor: (): Map<string, number> => {
|
|
1411
|
+
return serviceCounts;
|
|
1412
|
+
},
|
|
1413
|
+
});
|
|
1383
1414
|
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
string,
|
|
1387
|
-
Array<ResolvedFacetValue>
|
|
1388
|
-
> = await ResourceFacetResolver.resolve(
|
|
1389
|
-
databaseProps.tenantId,
|
|
1390
|
-
resourceSpecs,
|
|
1391
|
-
);
|
|
1392
|
-
for (const key of Object.keys(resolved)) {
|
|
1393
|
-
facets[key] = resolved[key] as Array<TraceFacetValue>;
|
|
1394
|
-
}
|
|
1415
|
+
for (const key of Object.keys(resourceFacets)) {
|
|
1416
|
+
facets[key] = resourceFacets[key] || [];
|
|
1395
1417
|
}
|
|
1396
1418
|
|
|
1397
1419
|
return Response.sendJsonObjectResponse(req, res, {
|
|
@@ -1651,10 +1673,7 @@ router.post(
|
|
|
1651
1673
|
? (body["facetKeys"] as Array<string>)
|
|
1652
1674
|
: [
|
|
1653
1675
|
"primaryEntityId",
|
|
1654
|
-
|
|
1655
|
-
"dockerHostId",
|
|
1656
|
-
"podmanHostId",
|
|
1657
|
-
"kubernetesClusterId",
|
|
1676
|
+
...RESOURCE_FACET_CATALOG_KEYS,
|
|
1658
1677
|
"exceptionType",
|
|
1659
1678
|
"environment",
|
|
1660
1679
|
];
|
|
@@ -1712,76 +1731,39 @@ router.post(
|
|
|
1712
1731
|
const projectId: ObjectID = databaseProps.tenantId;
|
|
1713
1732
|
|
|
1714
1733
|
/*
|
|
1715
|
-
* Per-facet ClickHouse query in parallel
|
|
1734
|
+
* Per-facet ClickHouse query in parallel; per-facet errors degrade
|
|
1716
1735
|
* gracefully to [] so a slow / failing facet can't block the others.
|
|
1736
|
+
* Resource facets answer with the Postgres source-of-truth list
|
|
1737
|
+
* (filtered by facetSearchText, enriched with displayName), listed
|
|
1738
|
+
* first so a type with no rows skips its count query. Same flow as the
|
|
1739
|
+
* log facets endpoint.
|
|
1717
1740
|
*/
|
|
1718
|
-
const facetResults: Array<readonly [string, Array<ExceptionFacetValue>]> =
|
|
1719
|
-
await Promise.all(
|
|
1720
|
-
facetKeys.map(
|
|
1721
|
-
async (
|
|
1722
|
-
facetKey: string,
|
|
1723
|
-
): Promise<readonly [string, Array<ExceptionFacetValue>]> => {
|
|
1724
|
-
try {
|
|
1725
|
-
const request: ExceptionFacetRequest = {
|
|
1726
|
-
projectId,
|
|
1727
|
-
startTime,
|
|
1728
|
-
endTime,
|
|
1729
|
-
facetKey,
|
|
1730
|
-
limit,
|
|
1731
|
-
serviceIds,
|
|
1732
|
-
exceptionTypes,
|
|
1733
|
-
environments,
|
|
1734
|
-
fingerprints,
|
|
1735
|
-
traceIds,
|
|
1736
|
-
escaped,
|
|
1737
|
-
messageSearchText,
|
|
1738
|
-
};
|
|
1739
|
-
const values: Array<ExceptionFacetValue> =
|
|
1740
|
-
await ExceptionAggregationService.getFacetValues(request);
|
|
1741
|
-
return [facetKey, values] as const;
|
|
1742
|
-
} catch {
|
|
1743
|
-
return [facetKey, [] as Array<ExceptionFacetValue>] as const;
|
|
1744
|
-
}
|
|
1745
|
-
},
|
|
1746
|
-
),
|
|
1747
|
-
);
|
|
1748
|
-
|
|
1749
1741
|
const facets: Record<
|
|
1750
1742
|
string,
|
|
1751
1743
|
Array<ExceptionFacetValue>
|
|
1752
|
-
> =
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
.map((key: string): ResourceFacetSpec => {
|
|
1764
|
-
const counts: Map<string, number> = new Map();
|
|
1765
|
-
for (const fv of facets[key] || []) {
|
|
1766
|
-
counts.set(fv.value, fv.count);
|
|
1767
|
-
}
|
|
1768
|
-
return {
|
|
1769
|
-
facetKey: key,
|
|
1770
|
-
counts,
|
|
1771
|
-
searchText: facetSearchText?.[key],
|
|
1744
|
+
> = await ResourceFacetPlanner.countPerFacet({
|
|
1745
|
+
projectId,
|
|
1746
|
+
facetKeys,
|
|
1747
|
+
facetSearchText,
|
|
1748
|
+
limit,
|
|
1749
|
+
countFacet: (facetKey: string): Promise<Array<ExceptionFacetValue>> => {
|
|
1750
|
+
const request: ExceptionFacetRequest = {
|
|
1751
|
+
projectId,
|
|
1752
|
+
startTime,
|
|
1753
|
+
endTime,
|
|
1754
|
+
facetKey,
|
|
1772
1755
|
limit,
|
|
1756
|
+
serviceIds,
|
|
1757
|
+
exceptionTypes,
|
|
1758
|
+
environments,
|
|
1759
|
+
fingerprints,
|
|
1760
|
+
traceIds,
|
|
1761
|
+
escaped,
|
|
1762
|
+
messageSearchText,
|
|
1773
1763
|
};
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
const resolved: Record<
|
|
1778
|
-
string,
|
|
1779
|
-
Array<ResolvedFacetValue>
|
|
1780
|
-
> = await ResourceFacetResolver.resolve(projectId, resourceSpecs);
|
|
1781
|
-
for (const key of Object.keys(resolved)) {
|
|
1782
|
-
facets[key] = resolved[key] as Array<ExceptionFacetValue>;
|
|
1783
|
-
}
|
|
1784
|
-
}
|
|
1764
|
+
return ExceptionAggregationService.getFacetValues(request);
|
|
1765
|
+
},
|
|
1766
|
+
});
|
|
1785
1767
|
|
|
1786
1768
|
return Response.sendJsonObjectResponse(req, res, {
|
|
1787
1769
|
facets: facets as unknown as JSONObject,
|
|
@@ -1818,13 +1800,7 @@ router.post(
|
|
|
1818
1800
|
|
|
1819
1801
|
const facetKeys: Array<string> = body["facetKeys"]
|
|
1820
1802
|
? (body["facetKeys"] as Array<string>)
|
|
1821
|
-
: [
|
|
1822
|
-
"primaryEntityId",
|
|
1823
|
-
"hostId",
|
|
1824
|
-
"dockerHostId",
|
|
1825
|
-
"podmanHostId",
|
|
1826
|
-
"kubernetesClusterId",
|
|
1827
|
-
];
|
|
1803
|
+
: ["primaryEntityId", ...RESOURCE_FACET_CATALOG_KEYS];
|
|
1828
1804
|
|
|
1829
1805
|
const startTime: Date = body["startTime"]
|
|
1830
1806
|
? OneUptimeDate.fromString(body["startTime"] as string)
|
|
@@ -1858,72 +1834,35 @@ router.post(
|
|
|
1858
1834
|
const projectId: ObjectID = databaseProps.tenantId;
|
|
1859
1835
|
|
|
1860
1836
|
/*
|
|
1861
|
-
* Per-facet ClickHouse GROUP BY in parallel
|
|
1862
|
-
* to [] so a slow facet doesn't block the rest.
|
|
1837
|
+
* Per-facet ClickHouse GROUP BY in parallel; per-facet errors degrade
|
|
1838
|
+
* to [] so a slow facet doesn't block the rest. Resource facets answer
|
|
1839
|
+
* with the Postgres source-of-truth list (filtered by facetSearchText,
|
|
1840
|
+
* enriched with displayName), listed first so a type with no rows
|
|
1841
|
+
* skips its count query. Same flow as the log / exception facets
|
|
1842
|
+
* endpoints.
|
|
1863
1843
|
*/
|
|
1864
|
-
const facetResults: Array<readonly [string, Array<MetricFacetValue>]> =
|
|
1865
|
-
await Promise.all(
|
|
1866
|
-
facetKeys.map(
|
|
1867
|
-
async (
|
|
1868
|
-
facetKey: string,
|
|
1869
|
-
): Promise<readonly [string, Array<MetricFacetValue>]> => {
|
|
1870
|
-
try {
|
|
1871
|
-
const request: MetricFacetRequest = {
|
|
1872
|
-
projectId,
|
|
1873
|
-
startTime,
|
|
1874
|
-
endTime,
|
|
1875
|
-
facetKey,
|
|
1876
|
-
limit,
|
|
1877
|
-
serviceIds,
|
|
1878
|
-
metricNames,
|
|
1879
|
-
attributes,
|
|
1880
|
-
};
|
|
1881
|
-
const values: Array<MetricFacetValue> =
|
|
1882
|
-
await MetricAggregationService.getFacetValues(request);
|
|
1883
|
-
return [facetKey, values] as const;
|
|
1884
|
-
} catch {
|
|
1885
|
-
return [facetKey, [] as Array<MetricFacetValue>] as const;
|
|
1886
|
-
}
|
|
1887
|
-
},
|
|
1888
|
-
),
|
|
1889
|
-
);
|
|
1890
|
-
|
|
1891
1844
|
const facets: Record<
|
|
1892
1845
|
string,
|
|
1893
1846
|
Array<MetricFacetValue>
|
|
1894
|
-
> =
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
.map((key: string): ResourceFacetSpec => {
|
|
1906
|
-
const counts: Map<string, number> = new Map();
|
|
1907
|
-
for (const fv of facets[key] || []) {
|
|
1908
|
-
counts.set(fv.value, fv.count);
|
|
1909
|
-
}
|
|
1910
|
-
return {
|
|
1911
|
-
facetKey: key,
|
|
1912
|
-
counts,
|
|
1913
|
-
searchText: facetSearchText?.[key],
|
|
1847
|
+
> = await ResourceFacetPlanner.countPerFacet({
|
|
1848
|
+
projectId,
|
|
1849
|
+
facetKeys,
|
|
1850
|
+
facetSearchText,
|
|
1851
|
+
limit,
|
|
1852
|
+
countFacet: (facetKey: string): Promise<Array<MetricFacetValue>> => {
|
|
1853
|
+
const request: MetricFacetRequest = {
|
|
1854
|
+
projectId,
|
|
1855
|
+
startTime,
|
|
1856
|
+
endTime,
|
|
1857
|
+
facetKey,
|
|
1914
1858
|
limit,
|
|
1859
|
+
serviceIds,
|
|
1860
|
+
metricNames,
|
|
1861
|
+
attributes,
|
|
1915
1862
|
};
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
const resolved: Record<
|
|
1920
|
-
string,
|
|
1921
|
-
Array<ResolvedFacetValue>
|
|
1922
|
-
> = await ResourceFacetResolver.resolve(projectId, resourceSpecs);
|
|
1923
|
-
for (const key of Object.keys(resolved)) {
|
|
1924
|
-
facets[key] = resolved[key] as Array<MetricFacetValue>;
|
|
1925
|
-
}
|
|
1926
|
-
}
|
|
1863
|
+
return MetricAggregationService.getFacetValues(request);
|
|
1864
|
+
},
|
|
1865
|
+
});
|
|
1927
1866
|
|
|
1928
1867
|
return Response.sendJsonObjectResponse(req, res, {
|
|
1929
1868
|
facets: facets as unknown as JSONObject,
|
|
@@ -3544,7 +3483,7 @@ router.post(
|
|
|
3544
3483
|
* Session replay playback
|
|
3545
3484
|
* ---------------------------------------------------------------------
|
|
3546
3485
|
*
|
|
3547
|
-
* These
|
|
3486
|
+
* These routes are the ONLY reader of RumSessionV1 / RumSessionChunkV1:
|
|
3548
3487
|
* both analytics models deliberately omit `crudApiPath`, so there is no
|
|
3549
3488
|
* generic CRUD surface for them and ModelPermission is NEVER invoked on
|
|
3550
3489
|
* this path.
|
|
@@ -3630,6 +3569,26 @@ const SESSION_REPLAY_LIST_PERMISSIONS: Array<Permission> = [
|
|
|
3630
3569
|
Permission.ReadRumSessionReplayPayload,
|
|
3631
3570
|
];
|
|
3632
3571
|
|
|
3572
|
+
/*
|
|
3573
|
+
* The optional audit-table enrichment must admit an audit-only reviewer so a
|
|
3574
|
+
* 403 from the shared browser API does not navigate them away from the audit
|
|
3575
|
+
* page. The handler still returns metadata only after a separate LIST-scope
|
|
3576
|
+
* check for the resolved application; audit access alone receives an empty,
|
|
3577
|
+
* successful response.
|
|
3578
|
+
*/
|
|
3579
|
+
const SESSION_REPLAY_SUMMARY_PERMISSIONS: Array<Permission> = [
|
|
3580
|
+
...SESSION_REPLAY_LIST_PERMISSIONS,
|
|
3581
|
+
Permission.ReadRumSessionReplayAudit,
|
|
3582
|
+
];
|
|
3583
|
+
|
|
3584
|
+
const requireSessionReplaySummaryAccess: Array<RequestHandler> = [
|
|
3585
|
+
UserMiddleware.getUserMiddleware,
|
|
3586
|
+
UserMiddleware.requireUserAuthentication,
|
|
3587
|
+
UserMiddleware.requirePermission({
|
|
3588
|
+
permissions: SESSION_REPLAY_SUMMARY_PERMISSIONS,
|
|
3589
|
+
}),
|
|
3590
|
+
];
|
|
3591
|
+
|
|
3633
3592
|
const SESSION_REPLAY_PAYLOAD_PERMISSIONS: Array<Permission> = [
|
|
3634
3593
|
Permission.ProjectOwner,
|
|
3635
3594
|
Permission.ProjectAdmin,
|
|
@@ -4075,6 +4034,40 @@ const canReadIdentifiedUserLabel: CanReadIdentifiedUserLabelFunction = (data: {
|
|
|
4075
4034
|
});
|
|
4076
4035
|
};
|
|
4077
4036
|
|
|
4037
|
+
type CanReadSessionReplayListMetadataFunction = (data: {
|
|
4038
|
+
databaseProps: DatabaseCommonInteractionProps;
|
|
4039
|
+
application: RumApplication;
|
|
4040
|
+
}) => boolean;
|
|
4041
|
+
|
|
4042
|
+
/*
|
|
4043
|
+
* Audit-only roles may load the summaries route so the optional request can
|
|
4044
|
+
* fail closed without a browser-wide forbidden redirect. They still must not
|
|
4045
|
+
* gain the session-list metadata this endpoint projects. Re-evaluate the
|
|
4046
|
+
* list scope against the already-resolved application and turn unsupported
|
|
4047
|
+
* scope shapes into "no metadata" rather than an authorization error.
|
|
4048
|
+
*/
|
|
4049
|
+
const canReadSessionReplayListMetadata: CanReadSessionReplayListMetadataFunction =
|
|
4050
|
+
(data: {
|
|
4051
|
+
databaseProps: DatabaseCommonInteractionProps;
|
|
4052
|
+
application: RumApplication;
|
|
4053
|
+
}): boolean => {
|
|
4054
|
+
let scope: SessionReplayScope;
|
|
4055
|
+
|
|
4056
|
+
try {
|
|
4057
|
+
scope = getSessionReplayLabelScope(
|
|
4058
|
+
data.databaseProps,
|
|
4059
|
+
SESSION_REPLAY_LIST_PERMISSIONS,
|
|
4060
|
+
);
|
|
4061
|
+
} catch {
|
|
4062
|
+
return false;
|
|
4063
|
+
}
|
|
4064
|
+
|
|
4065
|
+
return isApplicationInSessionReplayScope({
|
|
4066
|
+
scope: scope,
|
|
4067
|
+
application: data.application,
|
|
4068
|
+
});
|
|
4069
|
+
};
|
|
4070
|
+
|
|
4078
4071
|
/*
|
|
4079
4072
|
* The set of applications a label-scoped caller may reach, for the
|
|
4080
4073
|
* project-wide exception lookup which has no single application to
|
|
@@ -4559,8 +4552,6 @@ type ReadSessionIdFromBodyFunction = (body: JSONObject) => string;
|
|
|
4559
4552
|
* callers exist - but it is a cap: an unbounded caller-supplied string
|
|
4560
4553
|
* reaches ClickHouse as a bound parameter on a hot path.
|
|
4561
4554
|
*/
|
|
4562
|
-
const MAX_SESSION_REPLAY_SESSION_ID_LENGTH: number = 128;
|
|
4563
|
-
|
|
4564
4555
|
const readSessionIdFromBody: ReadSessionIdFromBodyFunction = (
|
|
4565
4556
|
body: JSONObject,
|
|
4566
4557
|
): string => {
|
|
@@ -4579,6 +4570,51 @@ const readSessionIdFromBody: ReadSessionIdFromBodyFunction = (
|
|
|
4579
4570
|
return sessionId;
|
|
4580
4571
|
};
|
|
4581
4572
|
|
|
4573
|
+
type ReadSessionIdsFromBodyFunction = (body: JSONObject) => Array<string>;
|
|
4574
|
+
|
|
4575
|
+
/*
|
|
4576
|
+
* The summaries route accepts one audit-table page at a time. Validate the
|
|
4577
|
+
* raw array before de-duplicating it so repeated values cannot be used to
|
|
4578
|
+
* bypass the request-size ceiling, then preserve first-occurrence order.
|
|
4579
|
+
*/
|
|
4580
|
+
const readSessionIdsFromBody: ReadSessionIdsFromBodyFunction = (
|
|
4581
|
+
body: JSONObject,
|
|
4582
|
+
): Array<string> => {
|
|
4583
|
+
const value: unknown = body["sessionIds"];
|
|
4584
|
+
|
|
4585
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
4586
|
+
throw new BadDataException("sessionIds must be a non-empty array");
|
|
4587
|
+
}
|
|
4588
|
+
|
|
4589
|
+
if (value.length > MAX_SESSION_REPLAY_SUMMARIES_BATCH_SIZE) {
|
|
4590
|
+
throw new BadDataException(
|
|
4591
|
+
`sessionIds must contain at most ${MAX_SESSION_REPLAY_SUMMARIES_BATCH_SIZE} ids`,
|
|
4592
|
+
);
|
|
4593
|
+
}
|
|
4594
|
+
|
|
4595
|
+
const sessionIds: Array<string> = [];
|
|
4596
|
+
const seen: Set<string> = new Set<string>();
|
|
4597
|
+
|
|
4598
|
+
for (const sessionId of value) {
|
|
4599
|
+
if (typeof sessionId !== "string" || sessionId.length === 0) {
|
|
4600
|
+
throw new BadDataException("Every sessionId must be a non-empty string");
|
|
4601
|
+
}
|
|
4602
|
+
|
|
4603
|
+
if (sessionId.length > MAX_SESSION_REPLAY_SESSION_ID_LENGTH) {
|
|
4604
|
+
throw new BadDataException(
|
|
4605
|
+
`Every sessionId must be at most ${MAX_SESSION_REPLAY_SESSION_ID_LENGTH} characters.`,
|
|
4606
|
+
);
|
|
4607
|
+
}
|
|
4608
|
+
|
|
4609
|
+
if (!seen.has(sessionId)) {
|
|
4610
|
+
seen.add(sessionId);
|
|
4611
|
+
sessionIds.push(sessionId);
|
|
4612
|
+
}
|
|
4613
|
+
}
|
|
4614
|
+
|
|
4615
|
+
return sessionIds;
|
|
4616
|
+
};
|
|
4617
|
+
|
|
4582
4618
|
/*
|
|
4583
4619
|
* Caps on the list's filter inputs.
|
|
4584
4620
|
*
|
|
@@ -5133,6 +5169,79 @@ router.post(
|
|
|
5133
5169
|
},
|
|
5134
5170
|
);
|
|
5135
5171
|
|
|
5172
|
+
// --- Session Replay Summary Batch Endpoint ---
|
|
5173
|
+
|
|
5174
|
+
/*
|
|
5175
|
+
* Audit rows store only the session id. Resolve one page of those ids into
|
|
5176
|
+
* compact, non-identity session context. Audit-only callers receive an empty
|
|
5177
|
+
* success; session-list metadata is returned only after the resolved
|
|
5178
|
+
* application passes the list scope. The service performs one
|
|
5179
|
+
* application-pinned argMax query, so this route never turns an audit page
|
|
5180
|
+
* into an N+1 ClickHouse workload.
|
|
5181
|
+
*/
|
|
5182
|
+
router.post(
|
|
5183
|
+
"/telemetry/rum/session-replay/summaries",
|
|
5184
|
+
...requireSessionReplaySummaryAccess,
|
|
5185
|
+
async (
|
|
5186
|
+
req: ExpressRequest,
|
|
5187
|
+
res: ExpressResponse,
|
|
5188
|
+
next: NextFunction,
|
|
5189
|
+
): Promise<void> => {
|
|
5190
|
+
try {
|
|
5191
|
+
const databaseProps: DatabaseCommonInteractionProps =
|
|
5192
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
5193
|
+
|
|
5194
|
+
if (!databaseProps?.tenantId) {
|
|
5195
|
+
return Response.sendErrorResponse(
|
|
5196
|
+
req,
|
|
5197
|
+
res,
|
|
5198
|
+
new BadDataException("Invalid Project ID"),
|
|
5199
|
+
);
|
|
5200
|
+
}
|
|
5201
|
+
|
|
5202
|
+
assertSessionReplayPlan(databaseProps);
|
|
5203
|
+
|
|
5204
|
+
const projectId: ObjectID = databaseProps.tenantId;
|
|
5205
|
+
const body: JSONObject = req.body as JSONObject;
|
|
5206
|
+
const rumApplicationId: ObjectID = readObjectIdFromBody(
|
|
5207
|
+
body,
|
|
5208
|
+
"rumApplicationId",
|
|
5209
|
+
);
|
|
5210
|
+
const sessionIds: Array<string> = readSessionIdsFromBody(body);
|
|
5211
|
+
|
|
5212
|
+
const application: RumApplication =
|
|
5213
|
+
await assertSessionReplayApplicationAccess({
|
|
5214
|
+
projectId: projectId,
|
|
5215
|
+
rumApplicationId: rumApplicationId,
|
|
5216
|
+
databaseProps: databaseProps,
|
|
5217
|
+
permissions: SESSION_REPLAY_SUMMARY_PERMISSIONS,
|
|
5218
|
+
});
|
|
5219
|
+
|
|
5220
|
+
if (
|
|
5221
|
+
!canReadSessionReplayListMetadata({
|
|
5222
|
+
databaseProps: databaseProps,
|
|
5223
|
+
application: application,
|
|
5224
|
+
})
|
|
5225
|
+
) {
|
|
5226
|
+
return Response.sendJsonObjectResponse(req, res, { sessions: [] });
|
|
5227
|
+
}
|
|
5228
|
+
|
|
5229
|
+
const sessions: Array<SessionReplaySummary> =
|
|
5230
|
+
await SessionReplayReadService.getSessionSummaries({
|
|
5231
|
+
projectId: projectId,
|
|
5232
|
+
rumApplicationId: rumApplicationId,
|
|
5233
|
+
sessionIds: sessionIds,
|
|
5234
|
+
});
|
|
5235
|
+
|
|
5236
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
5237
|
+
sessions: sessions as unknown as JSONArray,
|
|
5238
|
+
});
|
|
5239
|
+
} catch (err: unknown) {
|
|
5240
|
+
next(err);
|
|
5241
|
+
}
|
|
5242
|
+
},
|
|
5243
|
+
);
|
|
5244
|
+
|
|
5136
5245
|
// --- Session Replay Users Endpoint ---
|
|
5137
5246
|
|
|
5138
5247
|
/*
|
|
@@ -6056,6 +6165,32 @@ router.post(
|
|
|
6056
6165
|
);
|
|
6057
6166
|
}
|
|
6058
6167
|
|
|
6168
|
+
const primaryEntityId: ObjectID | undefined =
|
|
6169
|
+
readOptionalObjectIdFromBody(body, "primaryEntityId");
|
|
6170
|
+
const rawPrimaryEntityType: unknown = body["primaryEntityType"];
|
|
6171
|
+
let primaryEntityType: ServiceType | undefined = undefined;
|
|
6172
|
+
|
|
6173
|
+
if (
|
|
6174
|
+
rawPrimaryEntityType !== undefined &&
|
|
6175
|
+
rawPrimaryEntityType !== null &&
|
|
6176
|
+
rawPrimaryEntityType !== ""
|
|
6177
|
+
) {
|
|
6178
|
+
if (
|
|
6179
|
+
typeof rawPrimaryEntityType !== "string" ||
|
|
6180
|
+
!Object.values(ServiceType).includes(
|
|
6181
|
+
rawPrimaryEntityType as ServiceType,
|
|
6182
|
+
)
|
|
6183
|
+
) {
|
|
6184
|
+
throw new BadDataException("primaryEntityType is not valid");
|
|
6185
|
+
}
|
|
6186
|
+
|
|
6187
|
+
primaryEntityType = rawPrimaryEntityType as ServiceType;
|
|
6188
|
+
}
|
|
6189
|
+
|
|
6190
|
+
if (primaryEntityId === undefined && primaryEntityType !== undefined) {
|
|
6191
|
+
throw new BadDataException("primaryEntityId is required with its type");
|
|
6192
|
+
}
|
|
6193
|
+
|
|
6059
6194
|
/*
|
|
6060
6195
|
* An exception is not scoped to a RUM application, so there is no
|
|
6061
6196
|
* single application to authorize against. Restrict the query to
|
|
@@ -6116,6 +6251,8 @@ router.post(
|
|
|
6116
6251
|
await SessionReplayReadService.getSessionsForException({
|
|
6117
6252
|
projectId: projectId,
|
|
6118
6253
|
exceptionFingerprint: fingerprint,
|
|
6254
|
+
...(primaryEntityId !== undefined && { primaryEntityId }),
|
|
6255
|
+
...(primaryEntityType !== undefined && { primaryEntityType }),
|
|
6119
6256
|
accessibleRumApplicationIds: accessibleApplications.applicationIds,
|
|
6120
6257
|
...(startTime !== undefined && { startTime }),
|
|
6121
6258
|
...(endTime !== undefined && { endTime }),
|