@oneuptime/common 13.0.3 → 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/LoggerCore.test.ts +597 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +55 -2
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtil.test.ts +1109 -0
- 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/EntityRegistry.test.ts +711 -0
- 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 +868 -0
- package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +525 -0
- package/Tests/Server/Utils/Telemetry/TraceContextPropagation.test.ts +420 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilCorePaths.test.ts +1014 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveRotation.test.ts +9 -6
- package/Tests/Types/Rules/RuleCriteriaFieldRegistry.test.ts +276 -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/LlmConventions.test.ts +495 -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/SessionReplayHealth.test.ts +884 -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/OnCallDutyPolicy/Layer.ts +12 -0
- package/Types/Permission.ts +2 -2
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
- 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/OnCallDutyPolicy/Layer.js +11 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/Permission.js +2 -2
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +9 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.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
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import GoogleSecOpsRunExecutor, {
|
|
2
2
|
GOOGLE_SECOPS_RUN_JOB,
|
|
3
3
|
} from "../../../../../Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor";
|
|
4
|
+
import logger from "../../../../../Server/Utils/Logger";
|
|
5
|
+
import BadDataException from "../../../../../Types/Exception/BadDataException";
|
|
4
6
|
import GoogleSecOpsPoller from "../../../../../Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller";
|
|
5
7
|
import GoogleSecOpsConnectionRunService from "../../../../../Server/Services/GoogleSecOpsConnectionRunService";
|
|
6
8
|
import GoogleSecOpsConnectionService from "../../../../../Server/Services/GoogleSecOpsConnectionService";
|
|
@@ -48,7 +50,11 @@ jest.mock(
|
|
|
48
50
|
() => {
|
|
49
51
|
return {
|
|
50
52
|
__esModule: true,
|
|
51
|
-
default: {
|
|
53
|
+
default: {
|
|
54
|
+
findOneBy: jest.fn(),
|
|
55
|
+
findBy: jest.fn(),
|
|
56
|
+
updateOneById: jest.fn(),
|
|
57
|
+
},
|
|
52
58
|
};
|
|
53
59
|
},
|
|
54
60
|
);
|
|
@@ -370,6 +376,22 @@ test("reads run status after locking and scopes credential read to recorded proj
|
|
|
370
376
|
}),
|
|
371
377
|
);
|
|
372
378
|
});
|
|
379
|
+
test("loads the previous poll result with the connection, which carries the next catch-up chunk", async () => {
|
|
380
|
+
/*
|
|
381
|
+
* Review finding alerts-view-budget-pins-cursor-forever (F1): a poll's
|
|
382
|
+
* window length comes from lastPollResult.nextChunkMinutes, so the row
|
|
383
|
+
* handed to the poller must include it alongside the cursor.
|
|
384
|
+
*/
|
|
385
|
+
await GoogleSecOpsRunExecutor.executeRun(RUN);
|
|
386
|
+
expect(GoogleSecOpsConnectionService.findOneBy).toHaveBeenCalledWith(
|
|
387
|
+
expect.objectContaining({
|
|
388
|
+
select: expect.objectContaining({
|
|
389
|
+
cursor: true,
|
|
390
|
+
lastPollResult: true,
|
|
391
|
+
}),
|
|
392
|
+
}),
|
|
393
|
+
);
|
|
394
|
+
});
|
|
373
395
|
test.each(["success", "empty", "partial", "failed"])(
|
|
374
396
|
"does not repeat a terminal %s run",
|
|
375
397
|
async (status: string) => {
|
|
@@ -559,6 +581,96 @@ test("scheduler continues after a single connection fails admission", async () =
|
|
|
559
581
|
expect(spy).toHaveBeenCalledTimes(2);
|
|
560
582
|
});
|
|
561
583
|
|
|
584
|
+
test("an admission conflict stays quiet and leaves the connection row alone", async () => {
|
|
585
|
+
(GoogleSecOpsConnectionService.findBy as jest.Mock).mockResolvedValue([
|
|
586
|
+
connection,
|
|
587
|
+
]);
|
|
588
|
+
const errorLog: jest.SpyInstance = jest
|
|
589
|
+
.spyOn(logger, "error")
|
|
590
|
+
.mockImplementation(() => {});
|
|
591
|
+
const debugLog: jest.SpyInstance = jest
|
|
592
|
+
.spyOn(logger, "debug")
|
|
593
|
+
.mockImplementation(() => {});
|
|
594
|
+
jest
|
|
595
|
+
.spyOn(GoogleSecOpsRunExecutor, "enqueue")
|
|
596
|
+
.mockRejectedValueOnce(
|
|
597
|
+
new BadDataException(
|
|
598
|
+
"This connection already has a queued or running operation. Open run history for its progress.",
|
|
599
|
+
),
|
|
600
|
+
);
|
|
601
|
+
await GoogleSecOpsRunExecutor.enqueueDueConnections();
|
|
602
|
+
expect(debugLog).toHaveBeenCalled();
|
|
603
|
+
expect(errorLog).not.toHaveBeenCalled();
|
|
604
|
+
expect(GoogleSecOpsConnectionService.updateOneById).not.toHaveBeenCalled();
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
test("any other enqueue failure is logged at error and stamped on the connection, redacted", async () => {
|
|
608
|
+
(GoogleSecOpsConnectionService.findBy as jest.Mock).mockResolvedValue([
|
|
609
|
+
connection,
|
|
610
|
+
]);
|
|
611
|
+
const errorLog: jest.SpyInstance = jest
|
|
612
|
+
.spyOn(logger, "error")
|
|
613
|
+
.mockImplementation(() => {});
|
|
614
|
+
jest
|
|
615
|
+
.spyOn(GoogleSecOpsRunExecutor, "enqueue")
|
|
616
|
+
.mockRejectedValueOnce(
|
|
617
|
+
new Error(
|
|
618
|
+
'Redis client is not connected {"access_token":"ya29.leaked-token"}',
|
|
619
|
+
),
|
|
620
|
+
);
|
|
621
|
+
await GoogleSecOpsRunExecutor.enqueueDueConnections();
|
|
622
|
+
expect(errorLog).toHaveBeenCalledWith(
|
|
623
|
+
expect.stringContaining("could not queue the scheduled poll"),
|
|
624
|
+
);
|
|
625
|
+
expect(GoogleSecOpsConnectionService.updateOneById).toHaveBeenCalledWith({
|
|
626
|
+
id: CONNECTION,
|
|
627
|
+
data: {
|
|
628
|
+
lastError: expect.stringMatching(
|
|
629
|
+
/^Scheduler could not queue a poll: Redis client is not connected/,
|
|
630
|
+
),
|
|
631
|
+
},
|
|
632
|
+
props: { isRoot: true },
|
|
633
|
+
});
|
|
634
|
+
const stamped: string = (
|
|
635
|
+
(GoogleSecOpsConnectionService.updateOneById as jest.Mock).mock
|
|
636
|
+
.calls[0]![0] as { data: { lastError: string } }
|
|
637
|
+
).data.lastError;
|
|
638
|
+
expect(stamped).not.toContain("leaked-token");
|
|
639
|
+
});
|
|
640
|
+
|
|
641
|
+
test("a failed stamp write does not stop the scheduler tick", async () => {
|
|
642
|
+
const nextConnection: GoogleSecOpsConnection = new GoogleSecOpsConnection();
|
|
643
|
+
nextConnection.id = USER;
|
|
644
|
+
nextConnection.projectId = PROJECT;
|
|
645
|
+
(GoogleSecOpsConnectionService.findBy as jest.Mock).mockResolvedValue([
|
|
646
|
+
connection,
|
|
647
|
+
nextConnection,
|
|
648
|
+
]);
|
|
649
|
+
jest.spyOn(logger, "error").mockImplementation(() => {});
|
|
650
|
+
(GoogleSecOpsConnectionService.updateOneById as jest.Mock).mockRejectedValue(
|
|
651
|
+
new Error("database unavailable"),
|
|
652
|
+
);
|
|
653
|
+
const spy: jest.SpyInstance = jest
|
|
654
|
+
.spyOn(GoogleSecOpsRunExecutor, "enqueue")
|
|
655
|
+
.mockRejectedValueOnce(new Error("Redis client is not connected"))
|
|
656
|
+
.mockResolvedValueOnce(RUN);
|
|
657
|
+
await GoogleSecOpsRunExecutor.enqueueDueConnections();
|
|
658
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
test("markRunFailed stamps a failed status, completion time and reason on the run", async () => {
|
|
662
|
+
await GoogleSecOpsRunExecutor.markRunFailed(RUN, "lock timed out");
|
|
663
|
+
expect(GoogleSecOpsConnectionRunService.updateOneById).toHaveBeenCalledWith({
|
|
664
|
+
id: RUN,
|
|
665
|
+
data: {
|
|
666
|
+
status: "failed",
|
|
667
|
+
completedAt: expect.any(Date),
|
|
668
|
+
error: "lock timed out",
|
|
669
|
+
},
|
|
670
|
+
props: { isRoot: true },
|
|
671
|
+
});
|
|
672
|
+
});
|
|
673
|
+
|
|
562
674
|
function useCoordinatedLocks(): void {
|
|
563
675
|
const pending: Map<string, Promise<void>> = new Map<string, Promise<void>>();
|
|
564
676
|
(Semaphore.lock as jest.Mock).mockImplementation(
|
|
@@ -213,7 +213,11 @@ describe("GoogleSecOpsClient.fetchDetectionAlerts", () => {
|
|
|
213
213
|
test("exchanges a signed JWT assertion for a token, then calls the alerts view with Bearer auth", async () => {
|
|
214
214
|
const { client, requests } = makeClient([
|
|
215
215
|
tokenResponse(),
|
|
216
|
-
{
|
|
216
|
+
{
|
|
217
|
+
status: 200,
|
|
218
|
+
// complete: true, or the client re-issues the GET for an unfinished stream.
|
|
219
|
+
body: JSON.stringify({ alerts: [{ id: "a-1" }], complete: true }),
|
|
220
|
+
},
|
|
217
221
|
]);
|
|
218
222
|
|
|
219
223
|
const result: FetchAlertsResult = await client.fetchDetectionAlerts({
|
|
@@ -7,6 +7,7 @@ import OTelIngestService from "../../../../Server/Services/OpenTelemetryIngestSe
|
|
|
7
7
|
import SecurityEventService from "../../../../Server/Services/SecurityEventService";
|
|
8
8
|
import GoogleSecOpsClient, {
|
|
9
9
|
FetchAlertsResult,
|
|
10
|
+
SearchDetectionsResult,
|
|
10
11
|
} from "../../../../Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient";
|
|
11
12
|
import GoogleSecOpsPoller, {
|
|
12
13
|
GOOGLE_SECOPS_SOURCE_LOCK_NAMESPACE,
|
|
@@ -96,6 +97,10 @@ function client(
|
|
|
96
97
|
let index: number = 0;
|
|
97
98
|
return {
|
|
98
99
|
testAuthentication: jest.fn(async (): Promise<void> => {}),
|
|
100
|
+
// The created-time passes answer quietly; these cases drive the alerts view.
|
|
101
|
+
searchDetections: jest.fn(async (): Promise<SearchDetectionsResult> => {
|
|
102
|
+
return { detections: [], nextPageToken: null, truncated: false };
|
|
103
|
+
}),
|
|
99
104
|
fetchDetectionAlerts: jest.fn(async (): Promise<FetchAlertsResult> => {
|
|
100
105
|
return results[Math.min(index++, results.length - 1)]!;
|
|
101
106
|
}),
|
|
@@ -170,9 +175,24 @@ describe("Google SecOps connection diagnostics and replay", () => {
|
|
|
170
175
|
).toEqual([
|
|
171
176
|
"Validate configuration",
|
|
172
177
|
"Authenticate with Google",
|
|
173
|
-
"Read detections
|
|
178
|
+
"Read rule detections by created time",
|
|
179
|
+
"Read curated rule detections by created time",
|
|
180
|
+
"Read alerts view by detection time",
|
|
174
181
|
"Normalize detections",
|
|
175
182
|
]);
|
|
183
|
+
// One record per pass: the search probes ask for a single-item page.
|
|
184
|
+
expect(api.searchDetections).toHaveBeenCalledTimes(2);
|
|
185
|
+
expect(api.searchDetections).toHaveBeenCalledWith(
|
|
186
|
+
expect.objectContaining({
|
|
187
|
+
listBasis: "CREATED_TIME",
|
|
188
|
+
alertingOnly: true,
|
|
189
|
+
pageSize: 1,
|
|
190
|
+
curated: false,
|
|
191
|
+
}),
|
|
192
|
+
);
|
|
193
|
+
expect(api.searchDetections).toHaveBeenCalledWith(
|
|
194
|
+
expect.objectContaining({ curated: true, pageSize: 1 }),
|
|
195
|
+
);
|
|
176
196
|
expect(api.testAuthentication).toHaveBeenCalledTimes(1);
|
|
177
197
|
expect(api.fetchDetectionAlerts).toHaveBeenCalledWith(
|
|
178
198
|
expect.objectContaining({
|
|
@@ -238,7 +258,7 @@ describe("Google SecOps connection diagnostics and replay", () => {
|
|
|
238
258
|
expect(result.status).toBe("failed");
|
|
239
259
|
expect(result.checks[1]?.status).toBe("success");
|
|
240
260
|
expect(result.checks[result.checks.length - 1]?.name).toMatch(
|
|
241
|
-
/Read
|
|
261
|
+
/Read alerts view/,
|
|
242
262
|
);
|
|
243
263
|
expect(result.error).toContain("403");
|
|
244
264
|
});
|
|
@@ -363,7 +383,7 @@ describe("Google SecOps connection diagnostics and replay", () => {
|
|
|
363
383
|
expect(lastUpdate()["lastError"]).toMatch(/complete/);
|
|
364
384
|
});
|
|
365
385
|
|
|
366
|
-
test("a partial first poll anchors its window so a delayed retry
|
|
386
|
+
test("a partial first poll anchors its window so a delayed retry re-covers it from the same start in half the chunk", async (): Promise<void> => {
|
|
367
387
|
const item: GoogleSecOpsConnection = connection();
|
|
368
388
|
delete item.cursor;
|
|
369
389
|
const first: GoogleSecOpsRunResult =
|
|
@@ -372,7 +392,11 @@ describe("Google SecOps connection diagnostics and replay", () => {
|
|
|
372
392
|
{ type: "poll" },
|
|
373
393
|
client([fetched([], { complete: false })]),
|
|
374
394
|
);
|
|
395
|
+
expect(first.chunkMinutes).toBe(24 * 60);
|
|
396
|
+
expect(first.nextChunkMinutes).toBe(12 * 60);
|
|
375
397
|
item.cursor = String(lastUpdate()["cursor"]);
|
|
398
|
+
// The row is reloaded with the result it was written with.
|
|
399
|
+
item.lastPollResult = lastUpdate()["lastPollResult"] as JSONObject;
|
|
376
400
|
getJestSpyOn(OneUptimeDate, "getCurrentDate").mockReturnValue(
|
|
377
401
|
new Date("2026-09-10T14:00:00Z"),
|
|
378
402
|
);
|
|
@@ -383,7 +407,16 @@ describe("Google SecOps connection diagnostics and replay", () => {
|
|
|
383
407
|
client([fetched()]),
|
|
384
408
|
);
|
|
385
409
|
expect(retry.windowStart).toBe(first.windowStart);
|
|
386
|
-
|
|
410
|
+
/*
|
|
411
|
+
* Review finding alerts-view-budget-pins-cursor-forever (F1): the retry
|
|
412
|
+
* used to re-read exactly the same day, which on a busy tenant never
|
|
413
|
+
* fitted and pinned the cursor for good. It now keeps the start and
|
|
414
|
+
* reads half the chunk, measured from the anchored cursor.
|
|
415
|
+
*/
|
|
416
|
+
expect(retry.windowEnd).toBe("2026-09-10T00:01:00.000Z");
|
|
417
|
+
expect(retry.chunkMinutes).toBe(12 * 60);
|
|
418
|
+
expect(retry.warnings.join(" ")).toMatch(/12 hour windows/);
|
|
419
|
+
expect(lastUpdate()["cursor"]).toBe("2026-09-10T00:01:00.000Z");
|
|
387
420
|
});
|
|
388
421
|
|
|
389
422
|
test("a mixed normalization failure preserves retry coverage even after other records import", async (): Promise<void> => {
|
|
@@ -412,19 +445,31 @@ describe("Google SecOps connection diagnostics and replay", () => {
|
|
|
412
445
|
expect(lastUpdate()).not.toHaveProperty("cursor");
|
|
413
446
|
});
|
|
414
447
|
|
|
415
|
-
test("unrecognized payloads are
|
|
448
|
+
test("unrecognized payloads are counted and warned without holding the cursor", async (): Promise<void> => {
|
|
416
449
|
const result: GoogleSecOpsRunResult =
|
|
417
450
|
await GoogleSecOpsPoller.executeConnection(
|
|
418
451
|
connection(),
|
|
419
452
|
{ type: "poll" },
|
|
420
453
|
client([fetched([{ arbitrary: "envelope" }, detection()])]),
|
|
421
454
|
);
|
|
455
|
+
/*
|
|
456
|
+
* A permanently unrecognizable object used to hold the cursor, which
|
|
457
|
+
* pinned the window until the 24 hour chunk could never reach the
|
|
458
|
+
* present. It is now counted, warned, and shown as a "warn" check.
|
|
459
|
+
*/
|
|
422
460
|
expect(result).toMatchObject({
|
|
423
|
-
status: "
|
|
461
|
+
status: "success",
|
|
462
|
+
complete: true,
|
|
424
463
|
rejectedCount: 1,
|
|
425
464
|
ingestedCount: 1,
|
|
426
465
|
});
|
|
427
|
-
expect(
|
|
466
|
+
expect(result.warnings.join(" ")).toMatch(/discarded/);
|
|
467
|
+
expect(
|
|
468
|
+
result.checks.find((check: GoogleSecOpsDiagnosticCheck): boolean => {
|
|
469
|
+
return check.name === "Normalize detections";
|
|
470
|
+
})?.status,
|
|
471
|
+
).toBe("warn");
|
|
472
|
+
expect(lastUpdate()["cursor"]).toBe(NOW.toISOString());
|
|
428
473
|
});
|
|
429
474
|
|
|
430
475
|
test("replaying a previously imported alert skips its persisted event uid", async (): Promise<void> => {
|
|
@@ -498,12 +543,18 @@ describe("Google SecOps connection diagnostics and replay", () => {
|
|
|
498
543
|
{ type: "poll" },
|
|
499
544
|
api,
|
|
500
545
|
);
|
|
546
|
+
// Two search passes plus three alerts-view requests.
|
|
501
547
|
expect(result).toMatchObject({
|
|
502
548
|
complete: true,
|
|
503
549
|
status: "success",
|
|
504
550
|
fetchedCount: 2,
|
|
505
551
|
ingestedCount: 2,
|
|
506
|
-
requestCount:
|
|
552
|
+
requestCount: 5,
|
|
553
|
+
sourceCounts: {
|
|
554
|
+
ruleDetections: 0,
|
|
555
|
+
curatedDetections: 0,
|
|
556
|
+
alertsView: 3,
|
|
557
|
+
},
|
|
507
558
|
});
|
|
508
559
|
const calls: Array<Array<{ startTime: Date; endTime: Date }>> =
|
|
509
560
|
getJestSpyOn(api, "fetchDetectionAlerts").mock.calls;
|
|
@@ -522,28 +573,49 @@ describe("Google SecOps connection diagnostics and replay", () => {
|
|
|
522
573
|
]);
|
|
523
574
|
const result: GoogleSecOpsRunResult =
|
|
524
575
|
await GoogleSecOpsPoller.executeConnection(connection(), RANGE, api);
|
|
576
|
+
// Four search requests (two bases per pass for a preview) plus three alerts-view requests.
|
|
525
577
|
expect(result).toMatchObject({
|
|
526
578
|
complete: true,
|
|
527
579
|
fetchedCount: 2,
|
|
528
|
-
requestCount:
|
|
580
|
+
requestCount: 7,
|
|
581
|
+
basis: "detection-time",
|
|
529
582
|
});
|
|
530
583
|
});
|
|
531
584
|
|
|
532
|
-
test("perpetually truncated responses stop at
|
|
585
|
+
test("perpetually truncated responses stop at the alerts view budget, hold the cursor and narrow the next chunk", async (): Promise<void> => {
|
|
533
586
|
const result: GoogleSecOpsRunResult =
|
|
534
587
|
await GoogleSecOpsPoller.executeConnection(
|
|
535
588
|
connection(),
|
|
536
589
|
{ type: "poll" },
|
|
537
590
|
client([fetched([detection()], { truncatedByCount: true })]),
|
|
538
591
|
);
|
|
592
|
+
/*
|
|
593
|
+
* Review findings alerts-view-budget-pins-cursor-forever and
|
|
594
|
+
* budget-skipped-passes-reported-success (F1b): the alerts view has its
|
|
595
|
+
* own sixteen requests next to the two search pages, its check says the
|
|
596
|
+
* budget stopped it, and the old "Narrow the time range" advice is gone.
|
|
597
|
+
*/
|
|
539
598
|
expect(result).toMatchObject({
|
|
540
599
|
status: "partial",
|
|
541
|
-
requestCount:
|
|
600
|
+
requestCount: 18,
|
|
542
601
|
ingestedCount: 1,
|
|
543
602
|
complete: false,
|
|
603
|
+
chunkMinutes: 5,
|
|
604
|
+
nextChunkMinutes: 2,
|
|
544
605
|
});
|
|
606
|
+
const alertsCheck: GoogleSecOpsDiagnosticCheck | undefined =
|
|
607
|
+
result.checks.find((check: GoogleSecOpsDiagnosticCheck): boolean => {
|
|
608
|
+
return check.name === "Read alerts view by detection time";
|
|
609
|
+
});
|
|
610
|
+
expect(alertsCheck?.status).toBe("warn");
|
|
611
|
+
expect(alertsCheck?.message).toContain(
|
|
612
|
+
"stopped by the request budget after 16 requests",
|
|
613
|
+
);
|
|
545
614
|
expect(lastUpdate()).not.toHaveProperty("cursor");
|
|
546
|
-
expect(result.warnings.join(" ")).toMatch(/request limit/);
|
|
615
|
+
expect(result.warnings.join(" ")).not.toMatch(/request limit/);
|
|
616
|
+
expect(lastUpdate()["lastError"]).toContain(
|
|
617
|
+
"This window holds more records than one poll can read; the next poll reads a 2 minute window from the same starting point.",
|
|
618
|
+
);
|
|
547
619
|
});
|
|
548
620
|
|
|
549
621
|
test("stale cursors process the earliest backlog instead of skipping to yesterday", async (): Promise<void> => {
|
|
@@ -556,7 +628,8 @@ describe("Google SecOps connection diagnostics and replay", () => {
|
|
|
556
628
|
client([fetched()]),
|
|
557
629
|
);
|
|
558
630
|
expect(result.windowStart).toBe("2026-09-01T11:59:00.000Z");
|
|
559
|
-
|
|
631
|
+
// F1: the 24 hour chunk is measured from the cursor, not the overlapped start.
|
|
632
|
+
expect(result.windowEnd).toBe("2026-09-02T12:00:00.000Z");
|
|
560
633
|
expect(lastUpdate()["cursor"]).toBe(result.windowEnd);
|
|
561
634
|
});
|
|
562
635
|
|
|
@@ -756,6 +829,13 @@ describe("Google SecOps connection diagnostics and replay", () => {
|
|
|
756
829
|
expect(result.windowStart).toBe("2026-09-10T11:57:00.000Z");
|
|
757
830
|
expect(result.includeNonAlertingDetections).toBe(true);
|
|
758
831
|
expect(Semaphore.release).toHaveBeenCalledTimes(1);
|
|
832
|
+
// The next chunk length lives on the previous result, so it is reloaded too.
|
|
833
|
+
expect(
|
|
834
|
+
getJestSpyOn(GoogleSecOpsConnectionService, "findOneById").mock
|
|
835
|
+
.calls[0]![0],
|
|
836
|
+
).toMatchObject({
|
|
837
|
+
select: { cursor: true, lastPollResult: true },
|
|
838
|
+
});
|
|
759
839
|
});
|
|
760
840
|
});
|
|
761
841
|
|
|
@@ -46,6 +46,14 @@ const SERVICE_ACCOUNT_EMAIL: string = "poller@example.iam.gserviceaccount.com";
|
|
|
46
46
|
const INSTANCE: string =
|
|
47
47
|
"projects/test-project/locations/us/instances/test-instance";
|
|
48
48
|
const ALERTS_PATH: string = `/v1alpha/${INSTANCE}/legacy:legacyFetchAlertsView`;
|
|
49
|
+
/*
|
|
50
|
+
* The created-time passes the poller now runs first. The simulator answers
|
|
51
|
+
* them with an empty page so these cases keep describing the alerts view.
|
|
52
|
+
*/
|
|
53
|
+
const SEARCH_PATHS: Array<string> = [
|
|
54
|
+
`/v1alpha/${INSTANCE}/legacy:legacySearchDetections`,
|
|
55
|
+
`/v1alpha/${INSTANCE}/legacy:legacySearchCuratedDetections`,
|
|
56
|
+
];
|
|
49
57
|
const SERVICE_ACCOUNT_JSON: string = JSON.stringify({
|
|
50
58
|
client_email: SERVICE_ACCOUNT_EMAIL,
|
|
51
59
|
private_key: privateKey,
|
|
@@ -192,6 +200,19 @@ describe("Google SecOps alerts HTTP integration", () => {
|
|
|
192
200
|
return;
|
|
193
201
|
}
|
|
194
202
|
|
|
203
|
+
if (SEARCH_PATHS.includes(url.pathname) && request.method === "GET") {
|
|
204
|
+
if (
|
|
205
|
+
request.headers["authorization"] !== "Bearer local-verified-token"
|
|
206
|
+
) {
|
|
207
|
+
response.writeHead(401);
|
|
208
|
+
response.end("Bearer token required");
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
response.writeHead(200, { "Content-Type": "application/json" });
|
|
212
|
+
response.end("{}");
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
195
216
|
alertsRequests.push(url);
|
|
196
217
|
if (url.pathname !== ALERTS_PATH || request.method !== "GET") {
|
|
197
218
|
response.writeHead(404);
|
|
@@ -284,7 +305,8 @@ describe("Google SecOps alerts HTTP integration", () => {
|
|
|
284
305
|
url !== TOKEN_URL &&
|
|
285
306
|
!(
|
|
286
307
|
destination.origin === "https://us-chronicle.googleapis.com" &&
|
|
287
|
-
destination.pathname === ALERTS_PATH
|
|
308
|
+
(destination.pathname === ALERTS_PATH ||
|
|
309
|
+
SEARCH_PATHS.includes(destination.pathname))
|
|
288
310
|
)
|
|
289
311
|
) {
|
|
290
312
|
return Promise.reject(new Error(`Unexpected outbound URL: ${url}`));
|
|
@@ -7,6 +7,7 @@ import OTelIngestService, {
|
|
|
7
7
|
import SecurityEventService from "../../../../Server/Services/SecurityEventService";
|
|
8
8
|
import GoogleSecOpsClient, {
|
|
9
9
|
FetchAlertsResult,
|
|
10
|
+
SearchDetectionsResult,
|
|
10
11
|
} from "../../../../Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient";
|
|
11
12
|
import GoogleSecOpsPoller from "../../../../Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller";
|
|
12
13
|
import { MAX_CONNECTOR_ERROR_MESSAGE_LENGTH } from "../../../../Server/Utils/SecurityEvent/ConnectorErrorMessage";
|
|
@@ -83,6 +84,17 @@ function makeFakeClient(alerts: Array<JSONObject>): {
|
|
|
83
84
|
const calls: Array<{ startTime: Date; endTime: Date }> = [];
|
|
84
85
|
|
|
85
86
|
const client: GoogleSecOpsClient = {
|
|
87
|
+
/*
|
|
88
|
+
* The created-time passes answer quietly so these tests keep
|
|
89
|
+
* exercising the alerts-view path they were written against.
|
|
90
|
+
*/
|
|
91
|
+
searchDetections: (): Promise<SearchDetectionsResult> => {
|
|
92
|
+
return Promise.resolve({
|
|
93
|
+
detections: [],
|
|
94
|
+
nextPageToken: null,
|
|
95
|
+
truncated: false,
|
|
96
|
+
});
|
|
97
|
+
},
|
|
86
98
|
fetchDetectionAlerts: (data: {
|
|
87
99
|
startTime: Date;
|
|
88
100
|
endTime: Date;
|
|
@@ -169,7 +181,7 @@ describe("GoogleSecOpsPoller.pollConnection", () => {
|
|
|
169
181
|
expect(updateData["lastError"]).toBeNull();
|
|
170
182
|
});
|
|
171
183
|
|
|
172
|
-
test("first poll (no cursor) looks back
|
|
184
|
+
test("first poll (no cursor) looks back 24 hours; cursor polls overlap by a minute", async () => {
|
|
173
185
|
const connection: GoogleSecOpsConnection = makeConnection();
|
|
174
186
|
const { client, calls } = makeFakeClient([]);
|
|
175
187
|
|
|
@@ -179,7 +191,7 @@ describe("GoogleSecOpsPoller.pollConnection", () => {
|
|
|
179
191
|
const firstWindowMinutes: number =
|
|
180
192
|
(calls[0]!.endTime.getTime() - calls[0]!.startTime.getTime()) /
|
|
181
193
|
(60 * 1000);
|
|
182
|
-
expect(Math.round(firstWindowMinutes)).toBe(
|
|
194
|
+
expect(Math.round(firstWindowMinutes)).toBe(24 * 60);
|
|
183
195
|
|
|
184
196
|
/*
|
|
185
197
|
* Second poll with a cursor five minutes ago: window starts one
|
|
@@ -206,10 +218,20 @@ describe("GoogleSecOpsPoller.pollConnection", () => {
|
|
|
206
218
|
|
|
207
219
|
await GoogleSecOpsPoller.pollConnection(connection, client);
|
|
208
220
|
|
|
221
|
+
/*
|
|
222
|
+
* Review finding alerts-view-budget-pins-cursor-forever (F1): the
|
|
223
|
+
* catch-up chunk is now measured from the cursor rather than from the
|
|
224
|
+
* overlapped window start, so a narrowed chunk no longer than the
|
|
225
|
+
* overlap still reads past the cursor. A full chunk therefore reads 24
|
|
226
|
+
* hours of new time plus the one minute overlap.
|
|
227
|
+
*/
|
|
209
228
|
const windowMinutes: number =
|
|
210
229
|
(calls[0]!.endTime.getTime() - calls[0]!.startTime.getTime()) /
|
|
211
230
|
(60 * 1000);
|
|
212
|
-
expect(Math.round(windowMinutes)).toBe(24 * 60);
|
|
231
|
+
expect(Math.round(windowMinutes)).toBe(24 * 60 + 1);
|
|
232
|
+
expect(calls[0]!.endTime.getTime()).toBe(
|
|
233
|
+
new Date(connection.cursor).getTime() + 24 * 60 * 60 * 1000,
|
|
234
|
+
);
|
|
213
235
|
});
|
|
214
236
|
|
|
215
237
|
test("an unparseable alert is skipped without failing the batch", async () => {
|
|
@@ -192,6 +192,7 @@ function okTokenResponse(): StubbedResponse {
|
|
|
192
192
|
function alertsResponseWithOneAlert(): StubbedResponse {
|
|
193
193
|
return {
|
|
194
194
|
status: 200,
|
|
195
|
+
// complete: true, or the client re-issues the GET for an unfinished stream.
|
|
195
196
|
body: JSON.stringify({
|
|
196
197
|
alerts: [
|
|
197
198
|
{
|
|
@@ -199,6 +200,7 @@ function alertsResponseWithOneAlert(): StubbedResponse {
|
|
|
199
200
|
detection: [{ ruleName: "Brute force", severity: "HIGH" }],
|
|
200
201
|
},
|
|
201
202
|
],
|
|
203
|
+
complete: true,
|
|
202
204
|
}),
|
|
203
205
|
};
|
|
204
206
|
}
|
|
@@ -227,8 +229,17 @@ function makeFetch(responses: {
|
|
|
227
229
|
): Promise<FetchResponseLike> => {
|
|
228
230
|
requests.push({ url: url, method: init.method });
|
|
229
231
|
|
|
232
|
+
/*
|
|
233
|
+
* The created-time search passes answer with an empty page: every
|
|
234
|
+
* fixture here describes a failure of the token exchange, the alerts
|
|
235
|
+
* view, or OneUptime's own store, and the search passes stay quiet.
|
|
236
|
+
*/
|
|
230
237
|
const response: StubbedResponse =
|
|
231
|
-
url === GOOGLE_TOKEN_URI
|
|
238
|
+
url === GOOGLE_TOKEN_URI
|
|
239
|
+
? responses.token
|
|
240
|
+
: url.includes("legacySearch")
|
|
241
|
+
? { status: 200, body: "{}" }
|
|
242
|
+
: responses.alerts;
|
|
232
243
|
|
|
233
244
|
return Promise.resolve({
|
|
234
245
|
ok: response.status >= 200 && response.status < 300,
|
|
@@ -658,10 +669,13 @@ describe("GoogleSecOpsPoller lastError failure taxonomy", () => {
|
|
|
658
669
|
expect(lastError.startsWith(tokenExchangePrefix)).toBe(false);
|
|
659
670
|
expect(lastError).toContain("PERMISSION_DENIED");
|
|
660
671
|
|
|
661
|
-
|
|
662
|
-
|
|
672
|
+
/*
|
|
673
|
+
* Token endpoint first, then Chronicle three times (two quiet search
|
|
674
|
+
* passes, then the alerts view that failed): the failure is theirs.
|
|
675
|
+
*/
|
|
676
|
+
expect(run.requests).toHaveLength(4);
|
|
663
677
|
expect(run.requests[0]!.url).toBe(GOOGLE_TOKEN_URI);
|
|
664
|
-
expect(run.requests[
|
|
678
|
+
expect(run.requests[3]!.url.startsWith(run.client.getApiBaseUrl())).toBe(
|
|
665
679
|
true,
|
|
666
680
|
);
|
|
667
681
|
|
|
@@ -685,10 +699,10 @@ describe("GoogleSecOpsPoller lastError failure taxonomy", () => {
|
|
|
685
699
|
const run: PollRun = await telemetryStoreFailureRun();
|
|
686
700
|
const lastError: string = recordedLastError(run);
|
|
687
701
|
|
|
688
|
-
// The alerts really did arrive —
|
|
689
|
-
expect(run.requests).toHaveLength(
|
|
702
|
+
// The alerts really did arrive — every Google call succeeded...
|
|
703
|
+
expect(run.requests).toHaveLength(4);
|
|
690
704
|
expect(run.requests[0]!.url).toBe(GOOGLE_TOKEN_URI);
|
|
691
|
-
expect(run.requests[
|
|
705
|
+
expect(run.requests[3]!.url.startsWith(run.client.getApiBaseUrl())).toBe(
|
|
692
706
|
true,
|
|
693
707
|
);
|
|
694
708
|
|
|
@@ -735,7 +749,7 @@ describe("GoogleSecOpsPoller lastError failure taxonomy", () => {
|
|
|
735
749
|
expect(lastError).not.toContain("(HTTP");
|
|
736
750
|
|
|
737
751
|
// The request did reach Chronicle; the body it returned was unusable.
|
|
738
|
-
expect(run.requests).toHaveLength(
|
|
752
|
+
expect(run.requests).toHaveLength(4);
|
|
739
753
|
expect(run.insertedBatches).toHaveLength(0);
|
|
740
754
|
});
|
|
741
755
|
|