@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
|
@@ -0,0 +1,777 @@
|
|
|
1
|
+
import GoogleSecOpsConnection from "../../../../Models/DatabaseModels/GoogleSecOpsConnection";
|
|
2
|
+
import GoogleSecOpsConnectionRun from "../../../../Models/DatabaseModels/GoogleSecOpsConnectionRun";
|
|
3
|
+
import Includes from "../../../../Types/BaseDatabase/Includes";
|
|
4
|
+
import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
|
|
5
|
+
import OneUptimeDate from "../../../../Types/Date";
|
|
6
|
+
import { JSONObject } from "../../../../Types/JSON";
|
|
7
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
8
|
+
import {
|
|
9
|
+
ConnectorPlatformStatus,
|
|
10
|
+
SecurityConnectorCheck,
|
|
11
|
+
SecurityConnectorSample,
|
|
12
|
+
SecurityConnectorTestReport,
|
|
13
|
+
summarizeCheckStatuses,
|
|
14
|
+
} from "../../../../Types/SecurityEvent/Connectors/ConnectorDiagnostics";
|
|
15
|
+
import NormalizedSecurityEvent from "../../../../Types/SecurityEvent/NormalizedSecurityEvent";
|
|
16
|
+
import GoogleSecOpsAlertNormalizer from "../../../../Utils/SecurityEvent/GoogleSecOpsAlertNormalizer";
|
|
17
|
+
import {
|
|
18
|
+
parseEventTime,
|
|
19
|
+
readValue,
|
|
20
|
+
} from "../../../../Utils/SecurityEvent/NormalizerHelpers";
|
|
21
|
+
import GoogleSecOpsConnectionRunService from "../../../Services/GoogleSecOpsConnectionRunService";
|
|
22
|
+
import logger from "../../Logger";
|
|
23
|
+
import { redactLogString } from "../../LogRedaction";
|
|
24
|
+
import ConnectorErrorMessage from "../ConnectorErrorMessage";
|
|
25
|
+
import ConnectorPlatformHealth from "../Connectors/ConnectorPlatformHealth";
|
|
26
|
+
import { makeCheck } from "../Connectors/Types";
|
|
27
|
+
import SecurityEventDedupe from "../SecurityEventDedupe";
|
|
28
|
+
import GoogleSecOpsClient, {
|
|
29
|
+
FetchAlertsResult,
|
|
30
|
+
SearchDetectionsResult,
|
|
31
|
+
} from "./GoogleSecOpsClient";
|
|
32
|
+
|
|
33
|
+
export const GOOGLE_SECOPS_PROVIDER: string = "google-secops";
|
|
34
|
+
/*
|
|
35
|
+
* Shorter than the poller's 60 seconds: the person is waiting on a modal,
|
|
36
|
+
* and eight probes at a minute each would outlive the HTTP request.
|
|
37
|
+
*/
|
|
38
|
+
export const GOOGLE_SECOPS_CONNECTION_TEST_TIMEOUT_IN_MS: number = 20 * 1000;
|
|
39
|
+
|
|
40
|
+
const DAY_IN_MS: number = 24 * 60 * 60 * 1000;
|
|
41
|
+
const WEEK_IN_MS: number = 7 * DAY_IN_MS;
|
|
42
|
+
const AVAILABILITY_PAGE_SIZE: number = 1000;
|
|
43
|
+
// Same rule as the poller: these statuses mean "no curated rule access", not "broken".
|
|
44
|
+
const CURATED_OPTIONAL_STATUSES: Array<number> = [400, 403, 404];
|
|
45
|
+
/*
|
|
46
|
+
* Names the form control as it ships: a "Data to import" group where Alerts
|
|
47
|
+
* is fixed and a Detections checkbox widens the import. The earlier
|
|
48
|
+
* "switch the scope to Alerts and detections" named a control that no
|
|
49
|
+
* longer exists.
|
|
50
|
+
*/
|
|
51
|
+
const SCOPE_MISMATCH_REMEDIATION: string =
|
|
52
|
+
"Your rules create detections but alerting is not enabled on them. Edit the connection and select Detections under Data to import, or enable alerting on the rules in Google SecOps.";
|
|
53
|
+
const NO_DETECTIONS_MESSAGE: string =
|
|
54
|
+
"No detections were created in the last 7 days. Polling will import new detections as Google creates them.";
|
|
55
|
+
|
|
56
|
+
type ScopeLabel = "alerts-only" | "alerts-and-detections";
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* What one scope has to offer, bounded: the alerts view reports its
|
|
60
|
+
* matched count without returning records (maxReturnedAlerts=1), and the
|
|
61
|
+
* created-time search reads one page of up to 1000, reported as "1000+"
|
|
62
|
+
* when a further page exists.
|
|
63
|
+
*/
|
|
64
|
+
interface ScopeAvailability {
|
|
65
|
+
scope: ScopeLabel;
|
|
66
|
+
alertsViewLast24h: number;
|
|
67
|
+
alertsViewLast7d: number;
|
|
68
|
+
ruleDetectionsCreatedLast24h: string;
|
|
69
|
+
ruleDetectionsCreatedLast7d: string;
|
|
70
|
+
hasMoreLast7d: boolean;
|
|
71
|
+
totalLast7d: number;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
interface ReadProbeOutcome {
|
|
75
|
+
ok: boolean;
|
|
76
|
+
record: JSONObject | null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/*
|
|
80
|
+
* The synchronous "Test connection" for a Google SecOps connection.
|
|
81
|
+
*
|
|
82
|
+
* Runs in the API process, deliberately NOT through the Worker queue: the
|
|
83
|
+
* most common reason a connection never ingests is that no worker consumes
|
|
84
|
+
* the queue, and a test that itself needs a worker hangs in exactly that
|
|
85
|
+
* situation. Running here lets the report SAY "no worker is consuming the
|
|
86
|
+
* queue" instead of spinning in "queued".
|
|
87
|
+
*
|
|
88
|
+
* The provider checks mirror the poller's three read passes, then count
|
|
89
|
+
* what is available to import with AND without Detections selected under
|
|
90
|
+
* Data to import, because "connected but nothing ingests" is very often
|
|
91
|
+
* "the rules create detections, none of them alert, and only Alerts are
|
|
92
|
+
* imported". Platform and schedule checks are shared with every other
|
|
93
|
+
* connector. The tester never writes to ClickHouse and never moves the
|
|
94
|
+
* cursor.
|
|
95
|
+
*/
|
|
96
|
+
export default class GoogleSecOpsConnectionTester {
|
|
97
|
+
public static async test(data: {
|
|
98
|
+
connection: GoogleSecOpsConnection;
|
|
99
|
+
clientOverride?: GoogleSecOpsClient | undefined;
|
|
100
|
+
platformOverride?: ConnectorPlatformStatus | undefined;
|
|
101
|
+
now?: Date | undefined;
|
|
102
|
+
/*
|
|
103
|
+
* False when the connection carries unsaved edits (the API overlays
|
|
104
|
+
* the edit form's values onto the stored row): a run-history row would
|
|
105
|
+
* then describe settings the connection does not have. A connection
|
|
106
|
+
* without an id is never recorded, whatever this says.
|
|
107
|
+
*/
|
|
108
|
+
recordRun?: boolean | undefined;
|
|
109
|
+
}): Promise<SecurityConnectorTestReport> {
|
|
110
|
+
const startedMs: number = Date.now();
|
|
111
|
+
const now: Date = data.now || OneUptimeDate.getCurrentDate();
|
|
112
|
+
const connection: GoogleSecOpsConnection = data.connection;
|
|
113
|
+
const alertingOnly: boolean =
|
|
114
|
+
connection.includeNonAlertingDetections !== true;
|
|
115
|
+
const checks: Array<SecurityConnectorCheck> = [];
|
|
116
|
+
const samples: Array<SecurityConnectorSample> = [];
|
|
117
|
+
let counts: JSONObject | undefined = undefined;
|
|
118
|
+
|
|
119
|
+
const client: GoogleSecOpsClient | null = this.configurationCheck(
|
|
120
|
+
connection,
|
|
121
|
+
data.clientOverride,
|
|
122
|
+
checks,
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
if (client) {
|
|
126
|
+
const authenticated: boolean = await this.authenticationCheck(
|
|
127
|
+
client,
|
|
128
|
+
checks,
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
if (authenticated) {
|
|
132
|
+
const ruleRead: ReadProbeOutcome = await this.searchReadCheck(
|
|
133
|
+
client,
|
|
134
|
+
checks,
|
|
135
|
+
{ curated: false, now, alertingOnly },
|
|
136
|
+
);
|
|
137
|
+
await this.searchReadCheck(client, checks, {
|
|
138
|
+
curated: true,
|
|
139
|
+
now,
|
|
140
|
+
alertingOnly,
|
|
141
|
+
});
|
|
142
|
+
const alertsRead: ReadProbeOutcome = await this.alertsViewReadCheck(
|
|
143
|
+
client,
|
|
144
|
+
checks,
|
|
145
|
+
{ now, alertingOnly },
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
for (const record of [ruleRead.record, alertsRead.record]) {
|
|
149
|
+
const sample: SecurityConnectorSample | null = this.toSample(record);
|
|
150
|
+
if (sample) {
|
|
151
|
+
samples.push(sample);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (ruleRead.ok && alertsRead.ok) {
|
|
156
|
+
counts = await this.availabilityCheck(client, checks, {
|
|
157
|
+
now,
|
|
158
|
+
alertingOnly,
|
|
159
|
+
});
|
|
160
|
+
} else {
|
|
161
|
+
checks.push(
|
|
162
|
+
makeCheck({
|
|
163
|
+
key: "detections-available",
|
|
164
|
+
name: "Detections available to import",
|
|
165
|
+
status: "skip",
|
|
166
|
+
startedAtMs: Date.now(),
|
|
167
|
+
message:
|
|
168
|
+
"Skipped because a read check failed; fix that first and test again.",
|
|
169
|
+
}),
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
} else {
|
|
173
|
+
checks.push(
|
|
174
|
+
makeCheck({
|
|
175
|
+
key: "detections-available",
|
|
176
|
+
name: "Detections available to import",
|
|
177
|
+
status: "skip",
|
|
178
|
+
startedAtMs: Date.now(),
|
|
179
|
+
message: "Skipped because authentication failed.",
|
|
180
|
+
}),
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
} else {
|
|
184
|
+
checks.push(
|
|
185
|
+
makeCheck({
|
|
186
|
+
key: "authentication",
|
|
187
|
+
name: "Authenticate with Google",
|
|
188
|
+
status: "skip",
|
|
189
|
+
startedAtMs: Date.now(),
|
|
190
|
+
message: "Skipped because the configuration check failed.",
|
|
191
|
+
}),
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/*
|
|
196
|
+
* The storage probe runs the same duplicate lookup the poller runs before
|
|
197
|
+
* every insert (clusterAllReplicas over the security event table), so a
|
|
198
|
+
* cluster-name or replica problem that would fail every poll fails the
|
|
199
|
+
* test here, with a name, instead of surfacing as lastError an hour later.
|
|
200
|
+
*/
|
|
201
|
+
const platform: ConnectorPlatformStatus =
|
|
202
|
+
data.platformOverride ||
|
|
203
|
+
(await ConnectorPlatformHealth.getPlatformStatus({
|
|
204
|
+
storageProbeOverride: async (): Promise<boolean> => {
|
|
205
|
+
await SecurityEventDedupe.findExistingEventUids({
|
|
206
|
+
projectId:
|
|
207
|
+
connection.projectId ||
|
|
208
|
+
new ObjectID(ObjectID.generate().toString()),
|
|
209
|
+
vendorName: "Google",
|
|
210
|
+
productName: "Google SecOps",
|
|
211
|
+
ids: ["oneuptime-connection-test-probe"],
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
return true;
|
|
215
|
+
},
|
|
216
|
+
}));
|
|
217
|
+
checks.push(...ConnectorPlatformHealth.toPlatformChecks(platform));
|
|
218
|
+
|
|
219
|
+
if (connection.id) {
|
|
220
|
+
checks.push(await this.scheduleCheck(connection, now));
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const status: SecurityConnectorTestReport["status"] =
|
|
224
|
+
summarizeCheckStatuses(checks);
|
|
225
|
+
const completedMs: number = Date.now();
|
|
226
|
+
|
|
227
|
+
const report: SecurityConnectorTestReport = {
|
|
228
|
+
provider: GOOGLE_SECOPS_PROVIDER,
|
|
229
|
+
status,
|
|
230
|
+
startedAt: new Date(startedMs).toISOString(),
|
|
231
|
+
completedAt: new Date(completedMs).toISOString(),
|
|
232
|
+
durationMs: Math.max(0, completedMs - startedMs),
|
|
233
|
+
checks,
|
|
234
|
+
summary: this.summarize(status, checks),
|
|
235
|
+
platform,
|
|
236
|
+
...(counts ? { counts } : {}),
|
|
237
|
+
...(samples.length > 0 ? { samples } : {}),
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
if (connection.id && connection.projectId && data.recordRun !== false) {
|
|
241
|
+
await this.recordRun(connection, report);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return report;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
private static configurationCheck(
|
|
248
|
+
connection: GoogleSecOpsConnection,
|
|
249
|
+
clientOverride: GoogleSecOpsClient | undefined,
|
|
250
|
+
checks: Array<SecurityConnectorCheck>,
|
|
251
|
+
): GoogleSecOpsClient | null {
|
|
252
|
+
const startedAtMs: number = Date.now();
|
|
253
|
+
|
|
254
|
+
try {
|
|
255
|
+
const client: GoogleSecOpsClient =
|
|
256
|
+
clientOverride ||
|
|
257
|
+
new GoogleSecOpsClient({
|
|
258
|
+
region: connection.region || "",
|
|
259
|
+
instanceResourceName: connection.instanceResourceName || "",
|
|
260
|
+
serviceAccountJson: connection.serviceAccountJson || "",
|
|
261
|
+
requestTimeoutInMs: GOOGLE_SECOPS_CONNECTION_TEST_TIMEOUT_IN_MS,
|
|
262
|
+
});
|
|
263
|
+
checks.push(
|
|
264
|
+
makeCheck({
|
|
265
|
+
key: "configuration",
|
|
266
|
+
name: "Configuration",
|
|
267
|
+
status: "pass",
|
|
268
|
+
startedAtMs,
|
|
269
|
+
message:
|
|
270
|
+
"The region, instance resource name and service account key are well formed.",
|
|
271
|
+
}),
|
|
272
|
+
);
|
|
273
|
+
return client;
|
|
274
|
+
} catch (error) {
|
|
275
|
+
checks.push(
|
|
276
|
+
makeCheck({
|
|
277
|
+
key: "configuration",
|
|
278
|
+
name: "Configuration",
|
|
279
|
+
status: "fail",
|
|
280
|
+
startedAtMs,
|
|
281
|
+
message: redactLogString(ConnectorErrorMessage.toMessage(error)),
|
|
282
|
+
remediation:
|
|
283
|
+
"Correct the highlighted setting and test again. Nothing was contacted.",
|
|
284
|
+
}),
|
|
285
|
+
);
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
private static async authenticationCheck(
|
|
291
|
+
client: GoogleSecOpsClient,
|
|
292
|
+
checks: Array<SecurityConnectorCheck>,
|
|
293
|
+
): Promise<boolean> {
|
|
294
|
+
const startedAtMs: number = Date.now();
|
|
295
|
+
|
|
296
|
+
try {
|
|
297
|
+
await client.testAuthentication();
|
|
298
|
+
checks.push(
|
|
299
|
+
makeCheck({
|
|
300
|
+
key: "authentication",
|
|
301
|
+
name: "Authenticate with Google",
|
|
302
|
+
status: "pass",
|
|
303
|
+
startedAtMs,
|
|
304
|
+
message: "Google accepted the service account credentials.",
|
|
305
|
+
}),
|
|
306
|
+
);
|
|
307
|
+
return true;
|
|
308
|
+
} catch (error) {
|
|
309
|
+
checks.push(
|
|
310
|
+
makeCheck({
|
|
311
|
+
key: "authentication",
|
|
312
|
+
name: "Authenticate with Google",
|
|
313
|
+
status: "fail",
|
|
314
|
+
startedAtMs,
|
|
315
|
+
message: redactLogString(
|
|
316
|
+
ConnectorErrorMessage.toMessage(error, { truncate: false }),
|
|
317
|
+
),
|
|
318
|
+
remediation:
|
|
319
|
+
"The token exchange happens at Google's OAuth endpoint before Chronicle is contacted. Re-download the service account key, confirm it belongs to the project the instance is bound to, and check this host's clock.",
|
|
320
|
+
}),
|
|
321
|
+
);
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/*
|
|
327
|
+
* One created-time page of size 1 over the last 24 hours: proves the
|
|
328
|
+
* legacySearchDetections (or curated) permission without reading data.
|
|
329
|
+
*/
|
|
330
|
+
private static async searchReadCheck(
|
|
331
|
+
client: GoogleSecOpsClient,
|
|
332
|
+
checks: Array<SecurityConnectorCheck>,
|
|
333
|
+
options: { curated: boolean; now: Date; alertingOnly: boolean },
|
|
334
|
+
): Promise<ReadProbeOutcome> {
|
|
335
|
+
const startedAtMs: number = Date.now();
|
|
336
|
+
const key: string = options.curated
|
|
337
|
+
? "curated-detections-read"
|
|
338
|
+
: "rule-detections-read";
|
|
339
|
+
const name: string = options.curated
|
|
340
|
+
? "Read curated rule detections"
|
|
341
|
+
: "Read rule detections";
|
|
342
|
+
|
|
343
|
+
try {
|
|
344
|
+
const page: SearchDetectionsResult = await client.searchDetections({
|
|
345
|
+
startTime: new Date(options.now.getTime() - DAY_IN_MS),
|
|
346
|
+
endTime: options.now,
|
|
347
|
+
listBasis: "CREATED_TIME",
|
|
348
|
+
alertingOnly: options.alertingOnly,
|
|
349
|
+
pageSize: 1,
|
|
350
|
+
curated: options.curated,
|
|
351
|
+
});
|
|
352
|
+
checks.push(
|
|
353
|
+
makeCheck({
|
|
354
|
+
key,
|
|
355
|
+
name,
|
|
356
|
+
status: "pass",
|
|
357
|
+
startedAtMs,
|
|
358
|
+
message: `${options.curated ? "Curated rule" : "Rule"} detections can be read by created time (${page.detections.length} returned for a one-record probe over the last 24 hours).`,
|
|
359
|
+
details: { returned: page.detections.length },
|
|
360
|
+
}),
|
|
361
|
+
);
|
|
362
|
+
return { ok: true, record: page.detections[0] || null };
|
|
363
|
+
} catch (error) {
|
|
364
|
+
const status: number | null = GoogleSecOpsClient.readHttpStatus(error);
|
|
365
|
+
const message: string = redactLogString(
|
|
366
|
+
ConnectorErrorMessage.toMessage(error, { truncate: false }),
|
|
367
|
+
);
|
|
368
|
+
|
|
369
|
+
if (
|
|
370
|
+
options.curated &&
|
|
371
|
+
status !== null &&
|
|
372
|
+
CURATED_OPTIONAL_STATUSES.includes(status)
|
|
373
|
+
) {
|
|
374
|
+
checks.push(
|
|
375
|
+
makeCheck({
|
|
376
|
+
key,
|
|
377
|
+
name,
|
|
378
|
+
status: "warn",
|
|
379
|
+
startedAtMs,
|
|
380
|
+
message: `Curated rule detections are not readable on this tenant (HTTP ${status}). Polling continues with rule detections and the alerts view.`,
|
|
381
|
+
remediation:
|
|
382
|
+
"Curated (Google-authored) rule detections need that entitlement on the tenant. Nothing to fix unless you expect curated detections to be imported.",
|
|
383
|
+
details: { httpStatus: status, error: message },
|
|
384
|
+
}),
|
|
385
|
+
);
|
|
386
|
+
return { ok: true, record: null };
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
checks.push(
|
|
390
|
+
makeCheck({
|
|
391
|
+
key,
|
|
392
|
+
name,
|
|
393
|
+
status: "fail",
|
|
394
|
+
startedAtMs,
|
|
395
|
+
message,
|
|
396
|
+
remediation:
|
|
397
|
+
"Grant roles/chronicle.viewer on the instance to the service account (it includes chronicle.legacies.legacySearchDetections and legacySearchCuratedDetections), and confirm the instance resource name and region.",
|
|
398
|
+
}),
|
|
399
|
+
);
|
|
400
|
+
return { ok: false, record: null };
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/*
|
|
405
|
+
* One alerts-view read with maxReturnedAlerts=1 over the last 24 hours:
|
|
406
|
+
* proves the legacyFetchAlertsView permission the third poll pass needs.
|
|
407
|
+
*/
|
|
408
|
+
private static async alertsViewReadCheck(
|
|
409
|
+
client: GoogleSecOpsClient,
|
|
410
|
+
checks: Array<SecurityConnectorCheck>,
|
|
411
|
+
options: { now: Date; alertingOnly: boolean },
|
|
412
|
+
): Promise<ReadProbeOutcome> {
|
|
413
|
+
const startedAtMs: number = Date.now();
|
|
414
|
+
|
|
415
|
+
try {
|
|
416
|
+
const fetched: FetchAlertsResult = await client.fetchDetectionAlerts({
|
|
417
|
+
startTime: new Date(options.now.getTime() - DAY_IN_MS),
|
|
418
|
+
endTime: options.now,
|
|
419
|
+
maxAlerts: 1,
|
|
420
|
+
includeNonAlertingDetections: !options.alertingOnly,
|
|
421
|
+
});
|
|
422
|
+
checks.push(
|
|
423
|
+
makeCheck({
|
|
424
|
+
key: "alerts-view-read",
|
|
425
|
+
name: "Read the alerts view",
|
|
426
|
+
status: fetched.complete ? "pass" : "warn",
|
|
427
|
+
startedAtMs,
|
|
428
|
+
message: fetched.complete
|
|
429
|
+
? `The alerts view can be read by detection time (${fetched.baselineAlertsCount} matched in the last 24 hours).`
|
|
430
|
+
: "The alerts view answered but the stream ended without confirming it was complete. Reads work; a complete read is not confirmed.",
|
|
431
|
+
details: {
|
|
432
|
+
baselineAlertsCount: fetched.baselineAlertsCount,
|
|
433
|
+
complete: fetched.complete,
|
|
434
|
+
},
|
|
435
|
+
}),
|
|
436
|
+
);
|
|
437
|
+
return { ok: true, record: fetched.alerts[0] || null };
|
|
438
|
+
} catch (error) {
|
|
439
|
+
checks.push(
|
|
440
|
+
makeCheck({
|
|
441
|
+
key: "alerts-view-read",
|
|
442
|
+
name: "Read the alerts view",
|
|
443
|
+
status: "fail",
|
|
444
|
+
startedAtMs,
|
|
445
|
+
message: redactLogString(
|
|
446
|
+
ConnectorErrorMessage.toMessage(error, { truncate: false }),
|
|
447
|
+
),
|
|
448
|
+
remediation:
|
|
449
|
+
"Grant roles/chronicle.viewer on the instance to the service account (it includes chronicle.legacies.legacyFetchAlertsView), and confirm the instance resource name and region.",
|
|
450
|
+
}),
|
|
451
|
+
);
|
|
452
|
+
return { ok: false, record: null };
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
/*
|
|
457
|
+
* Counts under the saved Data to import selection AND the other one, over
|
|
458
|
+
* 24 hours and 7 days. The mismatch this exists to catch: rules create
|
|
459
|
+
* detections, none of them alert, Detections is not selected, and every
|
|
460
|
+
* poll is honestly empty.
|
|
461
|
+
*/
|
|
462
|
+
private static async availabilityCheck(
|
|
463
|
+
client: GoogleSecOpsClient,
|
|
464
|
+
checks: Array<SecurityConnectorCheck>,
|
|
465
|
+
options: { now: Date; alertingOnly: boolean },
|
|
466
|
+
): Promise<JSONObject | undefined> {
|
|
467
|
+
const startedAtMs: number = Date.now();
|
|
468
|
+
|
|
469
|
+
try {
|
|
470
|
+
const saved: ScopeAvailability = await this.probeScope(
|
|
471
|
+
client,
|
|
472
|
+
options.now,
|
|
473
|
+
options.alertingOnly,
|
|
474
|
+
);
|
|
475
|
+
const other: ScopeAvailability = await this.probeScope(
|
|
476
|
+
client,
|
|
477
|
+
options.now,
|
|
478
|
+
!options.alertingOnly,
|
|
479
|
+
);
|
|
480
|
+
const counts: JSONObject = {
|
|
481
|
+
scope: saved.scope,
|
|
482
|
+
alertsViewLast24h: saved.alertsViewLast24h,
|
|
483
|
+
alertsViewLast7d: saved.alertsViewLast7d,
|
|
484
|
+
ruleDetectionsCreatedLast24h: saved.ruleDetectionsCreatedLast24h,
|
|
485
|
+
ruleDetectionsCreatedLast7d: saved.ruleDetectionsCreatedLast7d,
|
|
486
|
+
hasMoreLast7d: saved.hasMoreLast7d,
|
|
487
|
+
otherScope: {
|
|
488
|
+
scope: other.scope,
|
|
489
|
+
alertsViewLast24h: other.alertsViewLast24h,
|
|
490
|
+
alertsViewLast7d: other.alertsViewLast7d,
|
|
491
|
+
ruleDetectionsCreatedLast24h: other.ruleDetectionsCreatedLast24h,
|
|
492
|
+
ruleDetectionsCreatedLast7d: other.ruleDetectionsCreatedLast7d,
|
|
493
|
+
hasMoreLast7d: other.hasMoreLast7d,
|
|
494
|
+
},
|
|
495
|
+
};
|
|
496
|
+
|
|
497
|
+
if (saved.totalLast7d > 0) {
|
|
498
|
+
checks.push(
|
|
499
|
+
makeCheck({
|
|
500
|
+
key: "detections-available",
|
|
501
|
+
name: "Detections available to import",
|
|
502
|
+
status: "pass",
|
|
503
|
+
startedAtMs,
|
|
504
|
+
message: `With the saved Data to import (${this.describeScope(saved.scope)}): last 24 hours ${saved.ruleDetectionsCreatedLast24h} rule detections created and ${saved.alertsViewLast24h} alerts in the alerts view; last 7 days ${saved.ruleDetectionsCreatedLast7d} and ${saved.alertsViewLast7d}.`,
|
|
505
|
+
details: counts,
|
|
506
|
+
}),
|
|
507
|
+
);
|
|
508
|
+
} else if (other.totalLast7d > 0) {
|
|
509
|
+
checks.push(
|
|
510
|
+
makeCheck({
|
|
511
|
+
key: "detections-available",
|
|
512
|
+
name: "Detections available to import",
|
|
513
|
+
status: "warn",
|
|
514
|
+
startedAtMs,
|
|
515
|
+
message: `Nothing is available with the saved Data to import (${this.describeScope(saved.scope)}) in the last 7 days, but ${other.ruleDetectionsCreatedLast7d} rule detections and ${other.alertsViewLast7d} alerts-view records exist with ${this.describeScope(other.scope)}.`,
|
|
516
|
+
remediation:
|
|
517
|
+
saved.scope === "alerts-only"
|
|
518
|
+
? SCOPE_MISMATCH_REMEDIATION
|
|
519
|
+
: "Reading Alerts only returned records that reading Alerts and Detections did not; re-run the test, and if it persists inspect the tenant's alerting configuration.",
|
|
520
|
+
details: counts,
|
|
521
|
+
}),
|
|
522
|
+
);
|
|
523
|
+
} else {
|
|
524
|
+
checks.push(
|
|
525
|
+
makeCheck({
|
|
526
|
+
key: "detections-available",
|
|
527
|
+
name: "Detections available to import",
|
|
528
|
+
status: "warn",
|
|
529
|
+
startedAtMs,
|
|
530
|
+
message: NO_DETECTIONS_MESSAGE,
|
|
531
|
+
remediation:
|
|
532
|
+
"Check that your rules are enabled and run on a schedule in Google SecOps. A quiet tenant is not a connector fault.",
|
|
533
|
+
details: counts,
|
|
534
|
+
}),
|
|
535
|
+
);
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
return counts;
|
|
539
|
+
} catch (error) {
|
|
540
|
+
checks.push(
|
|
541
|
+
makeCheck({
|
|
542
|
+
key: "detections-available",
|
|
543
|
+
name: "Detections available to import",
|
|
544
|
+
status: "warn",
|
|
545
|
+
startedAtMs,
|
|
546
|
+
message: `Could not count the detections available to import: ${redactLogString(ConnectorErrorMessage.toMessage(error, { truncate: false }))}`,
|
|
547
|
+
remediation:
|
|
548
|
+
"Reads work, so polling can proceed; re-run the test to retry the counts.",
|
|
549
|
+
}),
|
|
550
|
+
);
|
|
551
|
+
return undefined;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
private static async probeScope(
|
|
556
|
+
client: GoogleSecOpsClient,
|
|
557
|
+
now: Date,
|
|
558
|
+
alertingOnly: boolean,
|
|
559
|
+
): Promise<ScopeAvailability> {
|
|
560
|
+
const dayAgo: Date = new Date(now.getTime() - DAY_IN_MS);
|
|
561
|
+
const weekAgo: Date = new Date(now.getTime() - WEEK_IN_MS);
|
|
562
|
+
|
|
563
|
+
const alertsLast24h: FetchAlertsResult = await client.fetchDetectionAlerts({
|
|
564
|
+
startTime: dayAgo,
|
|
565
|
+
endTime: now,
|
|
566
|
+
maxAlerts: 1,
|
|
567
|
+
includeNonAlertingDetections: !alertingOnly,
|
|
568
|
+
});
|
|
569
|
+
const alertsLast7d: FetchAlertsResult = await client.fetchDetectionAlerts({
|
|
570
|
+
startTime: weekAgo,
|
|
571
|
+
endTime: now,
|
|
572
|
+
maxAlerts: 1,
|
|
573
|
+
includeNonAlertingDetections: !alertingOnly,
|
|
574
|
+
});
|
|
575
|
+
const rulesLast24h: SearchDetectionsResult = await client.searchDetections({
|
|
576
|
+
startTime: dayAgo,
|
|
577
|
+
endTime: now,
|
|
578
|
+
listBasis: "CREATED_TIME",
|
|
579
|
+
alertingOnly,
|
|
580
|
+
pageSize: AVAILABILITY_PAGE_SIZE,
|
|
581
|
+
});
|
|
582
|
+
const rulesLast7d: SearchDetectionsResult = await client.searchDetections({
|
|
583
|
+
startTime: weekAgo,
|
|
584
|
+
endTime: now,
|
|
585
|
+
listBasis: "CREATED_TIME",
|
|
586
|
+
alertingOnly,
|
|
587
|
+
pageSize: AVAILABILITY_PAGE_SIZE,
|
|
588
|
+
});
|
|
589
|
+
|
|
590
|
+
const alertsViewLast24h: number = this.matchedCount(alertsLast24h);
|
|
591
|
+
const alertsViewLast7d: number = this.matchedCount(alertsLast7d);
|
|
592
|
+
const hasMoreLast7d: boolean =
|
|
593
|
+
rulesLast7d.nextPageToken !== null || rulesLast7d.truncated;
|
|
594
|
+
|
|
595
|
+
return {
|
|
596
|
+
scope: alertingOnly ? "alerts-only" : "alerts-and-detections",
|
|
597
|
+
alertsViewLast24h,
|
|
598
|
+
alertsViewLast7d,
|
|
599
|
+
ruleDetectionsCreatedLast24h: this.boundedCount(rulesLast24h),
|
|
600
|
+
ruleDetectionsCreatedLast7d: this.boundedCount(rulesLast7d),
|
|
601
|
+
hasMoreLast7d,
|
|
602
|
+
totalLast7d: alertsViewLast7d + rulesLast7d.detections.length,
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/*
|
|
607
|
+
* The alerts view reports how many alerts matched even when only one is
|
|
608
|
+
* returned; a tenant answering without the count still counts the
|
|
609
|
+
* returned record.
|
|
610
|
+
*/
|
|
611
|
+
private static matchedCount(fetched: FetchAlertsResult): number {
|
|
612
|
+
return Math.max(
|
|
613
|
+
fetched.baselineAlertsCount,
|
|
614
|
+
fetched.filteredAlertsCount,
|
|
615
|
+
fetched.alerts.length,
|
|
616
|
+
);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
private static boundedCount(page: SearchDetectionsResult): string {
|
|
620
|
+
if (
|
|
621
|
+
page.nextPageToken !== null ||
|
|
622
|
+
page.truncated ||
|
|
623
|
+
page.detections.length >= AVAILABILITY_PAGE_SIZE
|
|
624
|
+
) {
|
|
625
|
+
return `${AVAILABILITY_PAGE_SIZE}+`;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
return String(page.detections.length);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
/*
|
|
632
|
+
* Read as "with <this>" in the messages above, so it names what the Data
|
|
633
|
+
* to import group has checked rather than a scope label the form no
|
|
634
|
+
* longer shows.
|
|
635
|
+
*/
|
|
636
|
+
private static describeScope(scope: ScopeLabel): string {
|
|
637
|
+
return scope === "alerts-only"
|
|
638
|
+
? "Alerts only"
|
|
639
|
+
: "Alerts and Detections selected";
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
private static toSample(
|
|
643
|
+
record: JSONObject | null,
|
|
644
|
+
): SecurityConnectorSample | null {
|
|
645
|
+
if (!record) {
|
|
646
|
+
return null;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
try {
|
|
650
|
+
if (!GoogleSecOpsAlertNormalizer.isGoogleSecOpsAlert(record)) {
|
|
651
|
+
return null;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
const event: NormalizedSecurityEvent =
|
|
655
|
+
GoogleSecOpsAlertNormalizer.normalize(record);
|
|
656
|
+
const createdTime: Date | null = parseEventTime(
|
|
657
|
+
readValue(record, "createdTime") ?? readValue(record, "created_time"),
|
|
658
|
+
);
|
|
659
|
+
const detectionTime: Date | null = parseEventTime(
|
|
660
|
+
readValue(record, "detectionTime") ??
|
|
661
|
+
readValue(record, "detection_time"),
|
|
662
|
+
);
|
|
663
|
+
|
|
664
|
+
return {
|
|
665
|
+
id: redactLogString(event.eventUid),
|
|
666
|
+
title: redactLogString(event.message),
|
|
667
|
+
severity: event.severityName,
|
|
668
|
+
...(createdTime ? { createdTime: createdTime.toISOString() } : {}),
|
|
669
|
+
...(detectionTime ? { eventTime: detectionTime.toISOString() } : {}),
|
|
670
|
+
};
|
|
671
|
+
} catch {
|
|
672
|
+
return null;
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
private static async scheduleCheck(
|
|
677
|
+
connection: GoogleSecOpsConnection,
|
|
678
|
+
now: Date,
|
|
679
|
+
): Promise<SecurityConnectorCheck> {
|
|
680
|
+
let pendingRunCreatedAt: Date | undefined = undefined;
|
|
681
|
+
|
|
682
|
+
try {
|
|
683
|
+
const pending: GoogleSecOpsConnectionRun | null =
|
|
684
|
+
await GoogleSecOpsConnectionRunService.findOneBy({
|
|
685
|
+
query: {
|
|
686
|
+
googleSecOpsConnectionId: connection.id!,
|
|
687
|
+
status: new Includes(["queued", "running"]),
|
|
688
|
+
},
|
|
689
|
+
select: { _id: true, createdAt: true },
|
|
690
|
+
sort: { createdAt: SortOrder.Ascending },
|
|
691
|
+
props: { isRoot: true },
|
|
692
|
+
});
|
|
693
|
+
pendingRunCreatedAt = pending?.createdAt;
|
|
694
|
+
} catch (error) {
|
|
695
|
+
logger.error(
|
|
696
|
+
"GoogleSecOpsConnectionTester: could not read pending runs.",
|
|
697
|
+
);
|
|
698
|
+
logger.error(error);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
return ConnectorPlatformHealth.toScheduleCheck(
|
|
702
|
+
{
|
|
703
|
+
isEnabled: connection.isEnabled !== false,
|
|
704
|
+
pollIntervalInMinutes: connection.pollIntervalInMinutes || 5,
|
|
705
|
+
createdAt: connection.createdAt,
|
|
706
|
+
lastPolledAt: connection.lastPolledAt,
|
|
707
|
+
lastSuccessfulPollAt: connection.lastSuccessfulPollAt,
|
|
708
|
+
lastEventIngestedAt: connection.lastEventIngestedAt,
|
|
709
|
+
lastError: connection.lastError,
|
|
710
|
+
pendingRunCreatedAt,
|
|
711
|
+
},
|
|
712
|
+
now,
|
|
713
|
+
);
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
private static summarize(
|
|
717
|
+
status: SecurityConnectorTestReport["status"],
|
|
718
|
+
checks: Array<SecurityConnectorCheck>,
|
|
719
|
+
): string {
|
|
720
|
+
const failed: Array<SecurityConnectorCheck> = checks.filter(
|
|
721
|
+
(check: SecurityConnectorCheck): boolean => {
|
|
722
|
+
return check.status === "fail";
|
|
723
|
+
},
|
|
724
|
+
);
|
|
725
|
+
const warned: Array<SecurityConnectorCheck> = checks.filter(
|
|
726
|
+
(check: SecurityConnectorCheck): boolean => {
|
|
727
|
+
return check.status === "warn";
|
|
728
|
+
},
|
|
729
|
+
);
|
|
730
|
+
|
|
731
|
+
if (status === "fail") {
|
|
732
|
+
return `${failed.length} check${failed.length === 1 ? "" : "s"} failed: ${failed
|
|
733
|
+
.map((check: SecurityConnectorCheck): string => {
|
|
734
|
+
return check.name;
|
|
735
|
+
})
|
|
736
|
+
.join(", ")}. Follow the remediation under each failed check.`;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
if (status === "warn") {
|
|
740
|
+
return `Google SecOps is reachable and readable. ${warned.length} check${warned.length === 1 ? " needs" : "s need"} attention: ${warned
|
|
741
|
+
.map((check: SecurityConnectorCheck): string => {
|
|
742
|
+
return check.name;
|
|
743
|
+
})
|
|
744
|
+
.join(", ")}.`;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
return "Google SecOps is reachable, credentials are accepted, detections can be read by created time and by detection time, there is something to import, and OneUptime's workers and scheduler are running.";
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
private static async recordRun(
|
|
751
|
+
connection: GoogleSecOpsConnection,
|
|
752
|
+
report: SecurityConnectorTestReport,
|
|
753
|
+
): Promise<void> {
|
|
754
|
+
try {
|
|
755
|
+
const run: GoogleSecOpsConnectionRun = new GoogleSecOpsConnectionRun();
|
|
756
|
+
run.projectId = connection.projectId as ObjectID;
|
|
757
|
+
run.googleSecOpsConnectionId = connection.id as ObjectID;
|
|
758
|
+
run.type = "test";
|
|
759
|
+
run.status = report.status === "fail" ? "failed" : "success";
|
|
760
|
+
run.startedAt = new Date(report.startedAt);
|
|
761
|
+
run.completedAt = new Date(report.completedAt);
|
|
762
|
+
run.request = { type: "test", synchronous: true };
|
|
763
|
+
run.result = report as unknown as JSONObject;
|
|
764
|
+
run.error = report.status === "fail" ? report.summary : "";
|
|
765
|
+
|
|
766
|
+
await GoogleSecOpsConnectionRunService.create({
|
|
767
|
+
data: run,
|
|
768
|
+
props: { isRoot: true },
|
|
769
|
+
});
|
|
770
|
+
} catch (error) {
|
|
771
|
+
logger.error(
|
|
772
|
+
`GoogleSecOpsConnectionTester: could not record the test run for ${connection.id?.toString()}.`,
|
|
773
|
+
);
|
|
774
|
+
logger.error(error);
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
}
|