@oneuptime/common 13.0.4 → 13.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/RumApplication.ts +1 -1
- package/Models/DatabaseModels/SecurityEventConnection.ts +457 -0
- package/Models/DatabaseModels/SecurityEventConnectionRun.ts +263 -0
- package/Models/DatabaseModels/TelemetryIngestionKey.ts +2 -2
- package/Server/API/AIInvestigationAPI.ts +484 -24
- package/Server/API/GoogleSecOpsConnectionAPI.ts +249 -8
- package/Server/API/SecurityEventConnectionAPI.ts +250 -0
- package/Server/API/TelemetryAPI.ts +402 -265
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.ts +99 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/TelemetryIngest.ts +101 -6
- package/Server/Services/ExceptionAggregationService.ts +7 -16
- package/Server/Services/GoogleSecOpsConnectionService.ts +15 -0
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/InventoryItemService.ts +28 -0
- package/Server/Services/LogAggregationService.ts +17 -23
- package/Server/Services/MetricAggregationService.ts +4 -14
- package/Server/Services/SecurityEventConnectionRunService.ts +10 -0
- package/Server/Services/SecurityEventConnectionService.ts +538 -0
- package/Server/Services/TraceAggregationService.ts +77 -28
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +13 -1
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +15 -1
- package/Server/Utils/AI/SRE/InvestigationEvidence.ts +658 -0
- package/Server/Utils/AI/SRE/InvestigationReferences.ts +324 -0
- package/Server/Utils/AI/Toolbox/Index.ts +38 -0
- package/Server/Utils/AI/Toolbox/TimelineTools.ts +9 -2
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +80 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +5 -3
- package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.ts +1108 -0
- package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.ts +732 -0
- package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +495 -0
- package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.ts +689 -0
- package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.ts +767 -0
- package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.ts +571 -0
- package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.ts +827 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.ts +610 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.ts +549 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.ts +830 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.ts +684 -0
- package/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.ts +487 -0
- package/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.ts +778 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +1002 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +556 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +275 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +53 -0
- package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.ts +709 -0
- package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.ts +596 -0
- package/Server/Utils/SecurityEvent/Connectors/Types.ts +191 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +353 -65
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +777 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +747 -148
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +48 -2
- package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +81 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +741 -40
- package/Server/Utils/StartServer.ts +10 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +8 -0
- package/Server/Utils/Telemetry/KubernetesResourceAttributes.ts +108 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +174 -93
- package/Server/Utils/Telemetry/ResourceFacetPlanner.ts +251 -0
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +248 -413
- package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +668 -0
- package/Server/Utils/Telemetry/TraceContextPropagation.ts +348 -0
- package/Server/Utils/Telemetry.ts +18 -0
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +413 -0
- package/Tests/App/Dashboard/AIRootCauseFeedItem.test.tsx +285 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +242 -0
- package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +601 -15
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +835 -0
- package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +41 -0
- package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +604 -0
- package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +738 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +153 -6
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +165 -0
- package/Tests/App/Dashboard/EpisodeChangeState.test.tsx +1069 -0
- package/Tests/App/Dashboard/EpisodeMembersCard.test.tsx +772 -0
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +2354 -0
- package/Tests/App/Dashboard/EventOverviewSkeleton.test.tsx +210 -0
- package/Tests/App/Dashboard/EventStatBar.test.tsx +392 -0
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +247 -0
- package/Tests/App/Dashboard/ExceptionAIAssistance.test.tsx +606 -0
- package/Tests/App/Dashboard/ExceptionBreadcrumbTimeline.test.tsx +273 -0
- package/Tests/App/Dashboard/ExceptionDetailSideMenu.test.tsx +176 -0
- package/Tests/App/Dashboard/ExceptionOverviewCards.test.tsx +366 -0
- package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +371 -0
- package/Tests/App/Dashboard/ExceptionStackFrameViewer.test.tsx +440 -0
- package/Tests/App/Dashboard/ExceptionSummary.test.tsx +381 -0
- package/Tests/App/Dashboard/ExceptionTriage.test.tsx +306 -0
- package/Tests/App/Dashboard/ExceptionsResourceFacets.test.tsx +604 -0
- package/Tests/App/Dashboard/ExceptionsViewerEntityChips.test.tsx +706 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +32 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +838 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +18 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +297 -20
- package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +618 -13
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +254 -207
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +303 -135
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +1251 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +303 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +876 -8
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +35 -0
- package/Tests/App/Dashboard/InvestigationReferenceLink.test.tsx +177 -0
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +1295 -0
- package/Tests/App/Dashboard/KubernetesImageReferenceView.test.tsx +114 -0
- package/Tests/App/Dashboard/KubernetesLogsTabChips.test.tsx +285 -0
- package/Tests/App/Dashboard/LogsEntityChipNames.test.tsx +316 -0
- package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +361 -0
- package/Tests/App/Dashboard/ProfileTableEntityNames.test.tsx +432 -0
- package/Tests/App/Dashboard/ProfileViewEntityName.test.tsx +250 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +10 -0
- package/Tests/App/Dashboard/ResourceLogsTabsBareLayout.test.tsx +700 -0
- package/Tests/App/Dashboard/ResourcePageEntityNameProps.test.tsx +803 -0
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +11 -1
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeState.test.tsx +1026 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +436 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +1195 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1022 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +905 -0
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +247 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +375 -274
- package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +410 -0
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +774 -0
- package/Tests/App/Dashboard/TopErrorsPanelResourceNames.test.tsx +316 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +30 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +88 -24
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +1590 -0
- package/Tests/App/Dashboard/TraceWaterfall.test.tsx +488 -0
- package/Tests/App/Dashboard/TracesAnalyticsSeriesLabels.test.tsx +367 -0
- package/Tests/App/Dashboard/TracesEntityNames.test.tsx +585 -0
- package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +613 -0
- package/Tests/App/Dashboard/UseServiceNames.test.tsx +359 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +7 -0
- package/Tests/Models/InventoryItemNaming.test.ts +132 -16
- package/Tests/Models/SecurityDomainAccessControl.test.ts +61 -17
- package/Tests/Server/API/AIInvestigationAPI.test.ts +611 -2
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +1098 -0
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +409 -0
- package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +856 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +528 -1
- package/Tests/Server/API/TelemetryFacetsAPI.test.ts +810 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +240 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +229 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +66 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
- package/Tests/Server/Services/SecurityEventConnectionService.test.ts +1233 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +53 -0
- package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +218 -0
- package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +155 -1
- package/Tests/Server/Services/TraceAggregationExceptionScope.test.ts +142 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +85 -24
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +33 -0
- package/Tests/Server/Utils/AI/InvestigationEvidence.test.ts +1395 -0
- package/Tests/Server/Utils/AI/InvestigationReferences.test.ts +616 -0
- package/Tests/Server/Utils/AI/TimelineTools.test.ts +119 -0
- package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +151 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +65 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorExceptionScope.test.ts +224 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +55 -2
- package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.test.ts +1240 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.test.ts +1853 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +1129 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.test.ts +1066 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.test.ts +1568 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.test.ts +930 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.test.ts +1409 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.test.ts +763 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.test.ts +1296 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.test.ts +1102 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.test.ts +1174 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.test.ts +1032 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.test.ts +1558 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +3041 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +1168 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +906 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.test.ts +1068 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.test.ts +1004 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +784 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +113 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +5 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +93 -13
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +23 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +25 -3
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +22 -8
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +82 -16
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSearchDetections.test.ts +730 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +1577 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayOriginAllowlist.test.ts +41 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1453 -18
- package/Tests/Server/Utils/Telemetry/KubernetesResourceAttributes.test.ts +162 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +460 -13
- package/Tests/Server/Utils/Telemetry/ResourceFacetPlanner.test.ts +678 -0
- package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +348 -2
- package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +525 -0
- package/Tests/Server/Utils/Telemetry/TraceContextPropagation.test.ts +420 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +73 -0
- package/Tests/Types/Rum/SessionReplayTransportContracts.test.ts +95 -0
- package/Tests/Types/SecurityEvent/Connectors/ConnectorDiagnostics.test.ts +82 -0
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +314 -0
- package/Tests/Types/Telemetry/ExceptionSpanScope.test.ts +89 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +96 -0
- package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +304 -0
- package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +357 -0
- package/Tests/UI/Components/Card.test.tsx +312 -1
- package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +253 -0
- package/Tests/UI/Components/CardModelDetailRefresher.test.tsx +342 -0
- package/Tests/UI/Components/Checkbox.test.tsx +79 -0
- package/Tests/UI/Components/CopyTextButton.test.tsx +142 -0
- package/Tests/UI/Components/DetailCompactStyle.test.tsx +621 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +60 -0
- package/Tests/UI/Components/FacetSections.test.tsx +581 -0
- package/Tests/UI/Components/FacetSidebarControls.test.tsx +812 -0
- package/Tests/UI/Components/FacetVisibility.test.ts +429 -0
- package/Tests/UI/Components/LockedFilterActions.test.tsx +396 -0
- package/Tests/UI/Components/LockedFilterChip.test.tsx +651 -0
- package/Tests/UI/Components/LogsEntityNames.test.ts +1769 -0
- package/Tests/UI/Components/LogsEntityNamesComponents.test.tsx +696 -0
- package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +600 -0
- package/Tests/UI/Components/LogsViewerEntityNames.test.tsx +713 -0
- package/Tests/UI/Components/MarkdownInlineReferences.test.tsx +2079 -0
- package/Tests/UI/Components/MemberRoleAssignment.test.tsx +446 -0
- package/Tests/UI/Components/ModelDetailRefetch.test.tsx +397 -0
- package/Tests/UI/Components/ModelListRefetch.test.tsx +233 -0
- package/Tests/UI/Components/ModelPageModelChange.test.tsx +409 -0
- package/Tests/UI/Components/PaginationIntegration.test.tsx +25 -0
- package/Tests/UI/Components/ResourceFacetConfigs.test.ts +172 -0
- package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +32 -14
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +44 -1
- package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +304 -0
- package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +718 -0
- package/Tests/UI/Monitor/EvaluationLogList.test.tsx +303 -0
- package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +55 -1
- package/Tests/UI/Rum/FidelityNotices.test.ts +22 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +120 -136
- package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +988 -0
- package/Tests/UI/Rum/ReplayCard.test.tsx +32 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +709 -12
- package/Tests/UI/Rum/ReplayHeader.test.tsx +50 -1
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +67 -10
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +41 -12
- package/Tests/UI/Rum/ReplayStage.test.tsx +663 -1
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +173 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +189 -2
- package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +91 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +1 -1
- package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +585 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +844 -51
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +29 -1
- package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +288 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +31 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +6 -0
- package/Tests/UI/Utils/Clipboard.test.ts +154 -0
- package/Tests/UI/Utils/Navigation.test.ts +24 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +2205 -0
- package/Tests/UI/Utils/Telemetry/UseTelemetryEntityNames.test.tsx +844 -0
- package/Tests/Utils/AI/InvestigationReport.test.ts +2430 -0
- package/Tests/Utils/APIOutgoingRequestTracer.test.ts +137 -0
- package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +40 -0
- package/Tests/Utils/Rum/SessionReplayRecordingEnded.test.ts +619 -0
- package/Tests/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.test.ts +631 -0
- package/Tests/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.test.ts +479 -0
- package/Tests/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.test.ts +507 -0
- package/Tests/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.test.ts +686 -0
- package/Tests/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.test.ts +474 -0
- package/Tests/Utils/SecurityEvent/Connectors/OktaNormalizer.test.ts +736 -0
- package/Tests/Utils/SecurityEvent/Connectors/SplunkNormalizer.test.ts +407 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +129 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +57 -1
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +36 -0
- package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +600 -0
- package/Tests/Utils/Telemetry/NetworkHost.test.ts +48 -0
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +154 -0
- package/Tests/Utils/Traces/CriticalPath.test.ts +25 -0
- package/Types/AI/AIChatTypes.ts +8 -0
- package/Types/AI/InvestigationEvidence.ts +96 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +5 -0
- package/Types/Permission.ts +2 -2
- package/Types/Rum/SessionReplay.ts +109 -0
- package/Types/Rum/SessionReplayApi.ts +31 -0
- package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +111 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +87 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +492 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +41 -0
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -1
- package/Types/SecurityEvent/GoogleSecOpsRegion.ts +34 -0
- package/Types/Telemetry/EntityType.ts +14 -0
- package/Types/Telemetry/ExceptionSpanScope.ts +83 -0
- package/Types/Telemetry/LockedFilterDetail.ts +46 -0
- package/Types/Telemetry/ResourceEntityFacet.ts +17 -10
- package/Types/Telemetry/ResourceFacetCatalog.ts +171 -0
- package/UI/Components/Card/Card.tsx +118 -83
- package/UI/Components/Checkbox/Checkbox.tsx +8 -5
- package/UI/Components/CopyTextButton/CopyTextButton.tsx +7 -1
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +4 -1
- package/UI/Components/Detail/Detail.tsx +137 -22
- package/UI/Components/ErrorBoundary.tsx +38 -0
- package/UI/Components/LogsViewer/LogsEntityNames.ts +912 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +156 -77
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +28 -11
- package/UI/Components/LogsViewer/components/FacetSection.tsx +66 -79
- package/UI/Components/LogsViewer/components/FacetValueRow.tsx +17 -2
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +45 -5
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +100 -19
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +156 -39
- package/UI/Components/LogsViewer/components/LogsTable.tsx +30 -8
- package/UI/Components/LogsViewer/types.ts +6 -0
- package/UI/Components/Markdown.tsx/InlineReferences.tsx +628 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +385 -312
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +50 -22
- package/UI/Components/ModelDetail/CardModelDetail.tsx +15 -0
- package/UI/Components/ModelDetail/ModelDetail.tsx +64 -19
- package/UI/Components/ModelList/ModelList.tsx +33 -8
- package/UI/Components/Page/ModelPage.tsx +119 -54
- package/UI/Components/Table/Table.tsx +8 -0
- package/UI/Components/Table/TableRow.tsx +13 -5
- package/UI/Components/TelemetryViewer/FacetVisibility.ts +229 -0
- package/UI/Components/TelemetryViewer/ResourceFacetConfigs.ts +46 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +11 -0
- package/UI/Components/TelemetryViewer/components/FacetSearchInput.tsx +79 -0
- package/UI/Components/TelemetryViewer/components/FacetSectionHeader.tsx +69 -0
- package/UI/Components/TelemetryViewer/components/FacetShowMoreButton.tsx +36 -0
- package/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.tsx +88 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +205 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +496 -0
- package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +30 -10
- package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +203 -10
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSection.tsx +60 -73
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +94 -7
- package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +17 -2
- package/UI/Components/TelemetryViewer/types.ts +19 -0
- package/UI/Components/TelemetryViewer/useFacetSearchExemptions.ts +158 -0
- package/UI/Components/TelemetryViewer/useFacetSectionSearch.ts +102 -0
- package/UI/Utils/Clipboard.ts +68 -2
- package/UI/Utils/Navigation.ts +17 -2
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +620 -0
- package/UI/Utils/Telemetry/UseTelemetryEntityNames.ts +151 -0
- package/Utils/AI/InvestigationReport.ts +1789 -0
- package/Utils/API.ts +90 -1
- package/Utils/Rum/SessionReplayHealth.ts +11 -0
- package/Utils/Rum/SessionReplayRecordingEnded.ts +134 -0
- package/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.ts +427 -0
- package/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.ts +197 -0
- package/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.ts +464 -0
- package/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.ts +567 -0
- package/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.ts +299 -0
- package/Utils/SecurityEvent/Connectors/OktaNormalizer.ts +467 -0
- package/Utils/SecurityEvent/Connectors/SplunkNormalizer.ts +439 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +124 -12
- package/Utils/Telemetry/CrossSignalScope.ts +22 -8
- package/Utils/Telemetry/EntityRelationship.ts +8 -0
- package/Utils/Telemetry/LockedFilterSearch.ts +412 -0
- package/Utils/Telemetry/NetworkHost.ts +43 -0
- package/Utils/Telemetry/OriginAllowList.ts +139 -4
- package/Utils/Traces/CriticalPath.ts +10 -4
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +490 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js.map +1 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js +287 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +2 -2
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +336 -27
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +182 -7
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -1
- package/build/dist/Server/API/SecurityEventConnectionAPI.js +171 -0
- package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -0
- package/build/dist/Server/API/TelemetryAPI.js +248 -170
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +57 -4
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +7 -16
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +8 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +22 -0
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +8 -17
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +4 -14
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventConnectionRunService.js +9 -0
- package/build/dist/Server/Services/SecurityEventConnectionRunService.js.map +1 -0
- package/build/dist/Server/Services/SecurityEventConnectionService.js +356 -0
- package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -0
- package/build/dist/Server/Services/TraceAggregationService.js +51 -25
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +14 -7
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js +468 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js +230 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +32 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +6 -2
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +59 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +5 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js +752 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js +493 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +352 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js +405 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js +466 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js +344 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js +511 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js +406 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js +336 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js +474 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js +417 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js +314 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js +494 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +719 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +404 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +209 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +40 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js +494 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js +379 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +27 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +234 -61
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +537 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +572 -115
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +35 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +52 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +521 -32
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +10 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +8 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js +80 -0
- package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +122 -67
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js +146 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +174 -248
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +492 -0
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js +259 -0
- package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry.js +11 -5
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/InvestigationEvidence.js +2 -0
- package/build/dist/Types/AI/InvestigationEvidence.js.map +1 -0
- package/build/dist/Types/Permission.js +2 -2
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +95 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js +18 -0
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +2 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +374 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +35 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js +35 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +14 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ExceptionSpanScope.js +59 -0
- package/build/dist/Types/Telemetry/ExceptionSpanScope.js.map +1 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js +16 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js.map +1 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js +16 -10
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -1
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +119 -0
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -0
- package/build/dist/UI/Components/Card/Card.js +34 -17
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js +6 -4
- package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +63 -13
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +34 -0
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js +535 -0
- package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +117 -57
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +5 -7
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetSection.js +31 -44
- package/build/dist/UI/Components/LogsViewer/components/FacetSection.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +17 -3
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +19 -3
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +64 -18
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +100 -41
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +13 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js +403 -0
- package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +197 -179
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +30 -21
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +12 -0
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js +46 -12
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +26 -7
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelPage.js +62 -34
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/Table/Table.js +3 -1
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +8 -1
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +111 -0
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js +22 -0
- package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js +36 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js +21 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js +14 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js +27 -0
- package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +88 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +228 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +6 -6
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +111 -12
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js +27 -40
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +70 -10
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +17 -3
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/types.js +0 -4
- package/build/dist/UI/Components/TelemetryViewer/types.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js +70 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js +52 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js.map +1 -0
- package/build/dist/UI/Utils/Clipboard.js +59 -2
- package/build/dist/UI/Utils/Clipboard.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +11 -2
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +471 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js +113 -0
- package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js.map +1 -0
- package/build/dist/Utils/AI/InvestigationReport.js +1241 -0
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -0
- package/build/dist/Utils/API.js +25 -0
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayHealth.js +10 -0
- package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js +54 -0
- package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js +311 -0
- package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js +150 -0
- package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js +328 -0
- package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js +405 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js +212 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js +351 -0
- package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js +348 -0
- package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +103 -10
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +16 -5
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +7 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js +277 -0
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -0
- package/build/dist/Utils/Telemetry/NetworkHost.js +39 -0
- package/build/dist/Utils/Telemetry/NetworkHost.js.map +1 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js +105 -4
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
- package/build/dist/Utils/Traces/CriticalPath.js +9 -4
- package/build/dist/Utils/Traces/CriticalPath.js.map +1 -1
- package/package.json +1 -1
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +0 -600
- package/UI/Components/GanttChart/Bar/BarLabel.tsx +0 -17
- package/UI/Components/GanttChart/Bar/Index.tsx +0 -149
- package/UI/Components/GanttChart/ChartContainer.tsx +0 -50
- package/UI/Components/GanttChart/Index.tsx +0 -90
- package/UI/Components/GanttChart/Row/Index.tsx +0 -22
- package/UI/Components/GanttChart/Row/Row.tsx +0 -231
- package/UI/Components/GanttChart/Row/RowLabel.tsx +0 -30
- package/UI/Components/GanttChart/Rows.tsx +0 -59
- package/UI/Components/GanttChart/Timeline/Index.tsx +0 -46
- package/UI/Components/GanttChart/Timeline/TimelineInterval.tsx +0 -33
- package/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.tsx +0 -43
- package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js +0 -8
- package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Bar/Index.js +0 -77
- package/build/dist/UI/Components/GanttChart/Bar/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/ChartContainer.js +0 -33
- package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Index.js +0 -39
- package/build/dist/UI/Components/GanttChart/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/Index.js +0 -7
- package/build/dist/UI/Components/GanttChart/Row/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/Row.js +0 -106
- package/build/dist/UI/Components/GanttChart/Row/Row.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/RowLabel.js +0 -10
- package/build/dist/UI/Components/GanttChart/Row/RowLabel.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Rows.js +0 -19
- package/build/dist/UI/Components/GanttChart/Rows.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/Index.js +0 -16
- package/build/dist/UI/Components/GanttChart/Timeline/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js +0 -13
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js +0 -13
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js.map +0 -1
package/Utils/API.ts
CHANGED
|
@@ -140,6 +140,28 @@ export interface APIFetchOptions {
|
|
|
140
140
|
options?: RequestOptions;
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
+
/** One logical outgoing request, as seen by an OutgoingRequestTracer. */
|
|
144
|
+
export interface OutgoingRequest {
|
|
145
|
+
method: HTTPMethod;
|
|
146
|
+
url: string;
|
|
147
|
+
/*
|
|
148
|
+
* Extra headers to send. The tracer may add to this object (e.g. a W3C
|
|
149
|
+
* `traceparent`) before calling `send`; nothing else reads it.
|
|
150
|
+
*/
|
|
151
|
+
headers: Dictionary<string>;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/*
|
|
155
|
+
* Server-only seam for distributed tracing. The shared client stays free of
|
|
156
|
+
* any tracing SDK (it also runs in the browser, where the fetch/XHR
|
|
157
|
+
* instrumentations own propagation); a server process installs a tracer that
|
|
158
|
+
* wraps each request — every retry included — in a span and decides whether
|
|
159
|
+
* trace context may be sent to that destination at all.
|
|
160
|
+
*/
|
|
161
|
+
export interface OutgoingRequestTracer {
|
|
162
|
+
trace<T>(request: OutgoingRequest, send: () => Promise<T>): Promise<T>;
|
|
163
|
+
}
|
|
164
|
+
|
|
143
165
|
export interface AuthRetryContext {
|
|
144
166
|
error: HTTPErrorResponse;
|
|
145
167
|
request: {
|
|
@@ -172,6 +194,14 @@ export default class API {
|
|
|
172
194
|
429, // Too Many Requests
|
|
173
195
|
]);
|
|
174
196
|
|
|
197
|
+
private static outgoingRequestTracer: OutgoingRequestTracer | null = null;
|
|
198
|
+
|
|
199
|
+
public static setOutgoingRequestTracer(
|
|
200
|
+
tracer: OutgoingRequestTracer | null,
|
|
201
|
+
): void {
|
|
202
|
+
API.outgoingRequestTracer = tracer;
|
|
203
|
+
}
|
|
204
|
+
|
|
175
205
|
private _protocol: Protocol = Protocol.HTTPS;
|
|
176
206
|
public get protocol(): Protocol {
|
|
177
207
|
return this._protocol;
|
|
@@ -469,6 +499,58 @@ export default class API {
|
|
|
469
499
|
headers?: Headers,
|
|
470
500
|
params?: Dictionary<string>,
|
|
471
501
|
options?: RequestOptions,
|
|
502
|
+
): Promise<HTTPResponse<T> | HTTPErrorResponse> {
|
|
503
|
+
const tracer: OutgoingRequestTracer | null = API.outgoingRequestTracer;
|
|
504
|
+
|
|
505
|
+
if (!tracer) {
|
|
506
|
+
return await this.fetchUntraced<T>(
|
|
507
|
+
method,
|
|
508
|
+
url,
|
|
509
|
+
data,
|
|
510
|
+
headers,
|
|
511
|
+
params,
|
|
512
|
+
options,
|
|
513
|
+
);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
const tracingHeaders: Dictionary<string> = {};
|
|
517
|
+
|
|
518
|
+
return await tracer.trace<HTTPResponse<T> | HTTPErrorResponse>(
|
|
519
|
+
{
|
|
520
|
+
method,
|
|
521
|
+
url: options?.dispatchUrl ?? url.toString(),
|
|
522
|
+
headers: tracingHeaders,
|
|
523
|
+
},
|
|
524
|
+
() => {
|
|
525
|
+
return this.fetchUntraced<T>(
|
|
526
|
+
method,
|
|
527
|
+
url,
|
|
528
|
+
data,
|
|
529
|
+
Object.keys(tracingHeaders).length > 0
|
|
530
|
+
? { ...(headers || {}), ...tracingHeaders }
|
|
531
|
+
: headers,
|
|
532
|
+
params,
|
|
533
|
+
options,
|
|
534
|
+
);
|
|
535
|
+
},
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
private static async fetchUntraced<
|
|
540
|
+
T extends
|
|
541
|
+
| JSONObject
|
|
542
|
+
| JSONArray
|
|
543
|
+
| BaseModel
|
|
544
|
+
| Array<BaseModel>
|
|
545
|
+
| AnalyticsBaseModel
|
|
546
|
+
| Array<AnalyticsBaseModel>,
|
|
547
|
+
>(
|
|
548
|
+
method: HTTPMethod,
|
|
549
|
+
url: URL,
|
|
550
|
+
data?: JSONObject | JSONArray,
|
|
551
|
+
headers?: Headers,
|
|
552
|
+
params?: Dictionary<string>,
|
|
553
|
+
options?: RequestOptions,
|
|
472
554
|
): Promise<HTTPResponse<T> | HTTPErrorResponse> {
|
|
473
555
|
const apiHeaders: Headers = this.getHeaders(headers);
|
|
474
556
|
|
|
@@ -1020,7 +1102,14 @@ export default class API {
|
|
|
1020
1102
|
throw new APIException(`Request failed to ${url}. ${errorMessage}`, error);
|
|
1021
1103
|
}
|
|
1022
1104
|
|
|
1023
|
-
|
|
1105
|
+
/*
|
|
1106
|
+
* HTTPErrorResponse is accepted because it is what gets caught: ModelAPI and
|
|
1107
|
+
* the Dashboard's request helpers throw the error response itself, and its
|
|
1108
|
+
* `message` getter reads the server's error body.
|
|
1109
|
+
*/
|
|
1110
|
+
public static getFriendlyErrorMessage(
|
|
1111
|
+
error: AxiosError | Error | HTTPErrorResponse,
|
|
1112
|
+
): string {
|
|
1024
1113
|
let errorString: string = error.message || error.toString();
|
|
1025
1114
|
|
|
1026
1115
|
if (error instanceof APIException) {
|
|
@@ -421,6 +421,17 @@ const REFUSAL_COPY: Record<SessionReplayRefusalReason, RefusalCopy> = {
|
|
|
421
421
|
},
|
|
422
422
|
};
|
|
423
423
|
|
|
424
|
+
/*
|
|
425
|
+
* The short human label for a refusal reason ("origin not allowed"), or
|
|
426
|
+
* null for a string this build has no copy for. The health page prints it
|
|
427
|
+
* beside the reason code so the counter reads as a cause, not a slug.
|
|
428
|
+
*/
|
|
429
|
+
export function describeRefusalReason(reason: string): string | null {
|
|
430
|
+
return isSessionReplayRefusalReason(reason)
|
|
431
|
+
? REFUSAL_COPY[reason].label
|
|
432
|
+
: null;
|
|
433
|
+
}
|
|
434
|
+
|
|
424
435
|
function action(
|
|
425
436
|
label: string,
|
|
426
437
|
target: RecordingHealthActionTarget,
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MAX_SESSION_REPLAY_CHUNKS_PER_SESSION,
|
|
3
|
+
SESSION_REPLAY_ENDED_FINALIZE_GRACE_MS,
|
|
4
|
+
SESSION_REPLAY_ENDED_TRAILING_CHUNK_TOLERANCE_MS,
|
|
5
|
+
} from "../../Types/Rum/SessionReplay";
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* Has a recording ended, judged from its stored chunk rows?
|
|
9
|
+
*
|
|
10
|
+
* "Not finalized" and "still recording" are different facts. Finalization
|
|
11
|
+
* waits for the finalizer, while a tab that was closed said so the moment
|
|
12
|
+
* its final chunk landed. Treating the first as the second is how a closed
|
|
13
|
+
* tab kept its "Recording now" badge for 10-15 minutes.
|
|
14
|
+
*
|
|
15
|
+
* The rule is shared by the finalizer (which finalizes an ended session
|
|
16
|
+
* early) and the read path (which tells the Dashboard a session has ended
|
|
17
|
+
* before the finalizer has run), so the list never says "ended" about a
|
|
18
|
+
* session the finalizer would still wait on, and the other way round.
|
|
19
|
+
*
|
|
20
|
+
* Judged per TAB, never from the header's sealedReason. The session id is
|
|
21
|
+
* shared by every tab and page load of an origin, so in a multi-page app
|
|
22
|
+
* page A's final chunk sets the session's "final-chunk" reason while the
|
|
23
|
+
* user is already on page B. Only when every tab has ended, and the grace
|
|
24
|
+
* has passed without a new tab showing up, is the recording over.
|
|
25
|
+
*
|
|
26
|
+
* Pure and dependency-free apart from the shared constants.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* Read from the chunk table per (rumApplicationId, tabId) as
|
|
31
|
+
* max(toUInt8(isFinal)) -> hasFinalChunk
|
|
32
|
+
* toUnixTimestamp64Milli(maxIf(chunkEndTime, isFinal)) -> finalChunkEndUnixMs
|
|
33
|
+
* toUnixTimestamp64Milli(max(chunkStartTime)) -> lastChunkStartUnixMs
|
|
34
|
+
* max(chunkIndex) -> maxChunkIndex
|
|
35
|
+
* max(version) -> lastChunkStoredAtUnixMs
|
|
36
|
+
* Maxima are unaffected by a redelivered chunk's duplicate row, so no
|
|
37
|
+
* reader needs LIMIT 1 BY for these.
|
|
38
|
+
*/
|
|
39
|
+
export interface SessionReplayTabEndFacts {
|
|
40
|
+
/* Whether any stored chunk of this tab carried isFinal. */
|
|
41
|
+
hasFinalChunk: boolean;
|
|
42
|
+
/*
|
|
43
|
+
* Unix ms end of this tab's latest final chunk; ignored when
|
|
44
|
+
* hasFinalChunk is false. Client clock, like lastChunkStartUnixMs, so the
|
|
45
|
+
* two are comparable with each other and with nothing else.
|
|
46
|
+
*/
|
|
47
|
+
finalChunkEndUnixMs: number;
|
|
48
|
+
/* Unix ms start of this tab's latest-starting chunk, final or not. */
|
|
49
|
+
lastChunkStartUnixMs: number;
|
|
50
|
+
/* Highest chunk index stored for this tab. */
|
|
51
|
+
maxChunkIndex: number;
|
|
52
|
+
/*
|
|
53
|
+
* SERVER unix ms at which this tab's newest chunk row was written (the
|
|
54
|
+
* chunk row's `version`). The grace is measured on this clock, never on
|
|
55
|
+
* the device's.
|
|
56
|
+
*/
|
|
57
|
+
lastChunkStoredAtUnixMs: number;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
* A tab has ended when:
|
|
62
|
+
*
|
|
63
|
+
* - it sent a final chunk and no chunk started meaningfully after it (the
|
|
64
|
+
* tolerance absorbs the one trailing non-final chunk older recorders post
|
|
65
|
+
* at unload; see SESSION_REPLAY_ENDED_TRAILING_CHUNK_TOLERANCE_MS), or
|
|
66
|
+
* - it stored its last permitted chunk index. The ingest gate refuses every
|
|
67
|
+
* index at or past MAX_SESSION_REPLAY_CHUNKS_PER_SESSION, including the
|
|
68
|
+
* recorder's own truncation seal, so nothing more can ever land for it.
|
|
69
|
+
*/
|
|
70
|
+
export function hasTabRecordingEnded(tab: SessionReplayTabEndFacts): boolean {
|
|
71
|
+
if (
|
|
72
|
+
Number.isFinite(tab.maxChunkIndex) &&
|
|
73
|
+
tab.maxChunkIndex >= MAX_SESSION_REPLAY_CHUNKS_PER_SESSION - 1
|
|
74
|
+
) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (!tab.hasFinalChunk) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (
|
|
83
|
+
!Number.isFinite(tab.finalChunkEndUnixMs) ||
|
|
84
|
+
!Number.isFinite(tab.lastChunkStartUnixMs)
|
|
85
|
+
) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
tab.lastChunkStartUnixMs <=
|
|
91
|
+
tab.finalChunkEndUnixMs + SESSION_REPLAY_ENDED_TRAILING_CHUNK_TOLERANCE_MS
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
* A session (or one application's share of it) has ended when it has at
|
|
97
|
+
* least one tab, every one of them has ended, and the newest chunk of any
|
|
98
|
+
* of them was stored at least SESSION_REPLAY_ENDED_FINALIZE_GRACE_MS before
|
|
99
|
+
* nowUnixMs (server clock).
|
|
100
|
+
*
|
|
101
|
+
* The grace is what keeps a multi-page app's navigation from reading as
|
|
102
|
+
* "ended": page A's final chunk lands, and page B's first chunk follows up
|
|
103
|
+
* to a flush interval later under a new tab id. No tabs means nothing is
|
|
104
|
+
* known, which is not the same as "ended".
|
|
105
|
+
*/
|
|
106
|
+
export function hasSessionRecordingEnded(
|
|
107
|
+
tabs: ReadonlyArray<SessionReplayTabEndFacts>,
|
|
108
|
+
nowUnixMs: number,
|
|
109
|
+
): boolean {
|
|
110
|
+
if (tabs.length === 0 || !Number.isFinite(nowUnixMs)) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let newestStoredAtUnixMs: number = 0;
|
|
115
|
+
|
|
116
|
+
for (const tab of tabs) {
|
|
117
|
+
if (!hasTabRecordingEnded(tab)) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (!Number.isFinite(tab.lastChunkStoredAtUnixMs)) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
newestStoredAtUnixMs = Math.max(
|
|
126
|
+
newestStoredAtUnixMs,
|
|
127
|
+
tab.lastChunkStoredAtUnixMs,
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return (
|
|
132
|
+
newestStoredAtUnixMs <= nowUnixMs - SESSION_REPLAY_ENDED_FINALIZE_GRACE_MS
|
|
133
|
+
);
|
|
134
|
+
}
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { JSONObject, JSONValue } from "../../../Types/JSON";
|
|
2
|
+
import NormalizedSecurityEvent from "../../../Types/SecurityEvent/NormalizedSecurityEvent";
|
|
3
|
+
import OcsfSeverity, {
|
|
4
|
+
OcsfSeverityId,
|
|
5
|
+
normalizeOcsfSeverity,
|
|
6
|
+
} from "../../../Types/SecurityEvent/OcsfSeverity";
|
|
7
|
+
import { ocsfCategoryForClassUid } from "../../../Types/SecurityEvent/OcsfEventClass";
|
|
8
|
+
import SecurityEventConnectorProvider from "../../../Types/SecurityEvent/Connectors/SecurityEventConnectorProvider";
|
|
9
|
+
import {
|
|
10
|
+
SecurityEventConnectorDefinition,
|
|
11
|
+
getSecurityEventConnectorDefinition,
|
|
12
|
+
} from "../../../Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog";
|
|
13
|
+
import {
|
|
14
|
+
buildObservables,
|
|
15
|
+
contentHashEventUid,
|
|
16
|
+
flattenPayload,
|
|
17
|
+
parseEventTime,
|
|
18
|
+
readNumber,
|
|
19
|
+
readString,
|
|
20
|
+
readStringArray,
|
|
21
|
+
readValue,
|
|
22
|
+
} from "../NormalizerHelpers";
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* AWS Security Hub finding (AWS Security Finding Format, ASFF) -> OCSF
|
|
26
|
+
* Compliance Finding (class 2003) when the finding carries a Compliance
|
|
27
|
+
* object (a control check), otherwise Detection Finding (class 2004).
|
|
28
|
+
*
|
|
29
|
+
* The payload shape is the AwsSecurityFinding object returned by
|
|
30
|
+
* GetFindings, i.e. ASFF:
|
|
31
|
+
* https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-findings-format-syntax.html
|
|
32
|
+
* Fields read here, with their documented values:
|
|
33
|
+
* - Id (product-specific finding id, an ARN for AWS-generated findings),
|
|
34
|
+
* GeneratorId, ProductArn, ProductName, CompanyName, AwsAccountId, Region
|
|
35
|
+
* - CreatedAt / UpdatedAt / FirstObservedAt / LastObservedAt (ISO 8601)
|
|
36
|
+
* - Severity.Label: INFORMATIONAL | LOW | MEDIUM | HIGH | CRITICAL;
|
|
37
|
+
* Severity.Normalized 0..100 maps to those labels as 0, 1-39, 40-69,
|
|
38
|
+
* 70-89, 90-100 (API reference, Severity)
|
|
39
|
+
* - Types[]: "{namespace}/{category}/{classifier}"; the TTPs namespace's
|
|
40
|
+
* categories align with the MITRE ATT&CK enterprise tactics
|
|
41
|
+
* (asff-required-attributes, Types)
|
|
42
|
+
* - Compliance.Status: PASSED | WARNING | FAILED | NOT_AVAILABLE
|
|
43
|
+
* - Workflow.Status: NEW | NOTIFIED | RESOLVED | SUPPRESSED; the retired
|
|
44
|
+
* WorkflowState is read as a fallback
|
|
45
|
+
* - Resources[]: Type, Id, Region, Tags, Details
|
|
46
|
+
* - Network (retired but still delivered): SourceIpV4/V6,
|
|
47
|
+
* DestinationIpV4/V6, DestinationPort, Source/DestinationDomain
|
|
48
|
+
* - Process: Name, Path; Malware[]: Name, Path; ThreatIntelIndicators[]:
|
|
49
|
+
* Type, Value; UserDefinedFields
|
|
50
|
+
*
|
|
51
|
+
* Pure and isomorphic on purpose — this file imports only from
|
|
52
|
+
* Common/Types and Common/Utils so it runs unchanged in the server, in
|
|
53
|
+
* tests and in the browser if the dashboard ever previews raw findings.
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
export const AWS_SECURITY_HUB_DETECTION_CLASS_UID: number = 2004;
|
|
57
|
+
export const AWS_SECURITY_HUB_DETECTION_CLASS_NAME: string =
|
|
58
|
+
"Detection Finding";
|
|
59
|
+
export const AWS_SECURITY_HUB_COMPLIANCE_CLASS_UID: number = 2003;
|
|
60
|
+
export const AWS_SECURITY_HUB_COMPLIANCE_CLASS_NAME: string =
|
|
61
|
+
"Compliance Finding";
|
|
62
|
+
|
|
63
|
+
/*
|
|
64
|
+
* ASFF's TTPs categories are MITRE ATT&CK enterprise tactic names;
|
|
65
|
+
* NormalizedSecurityEvent.mitreTactics stores ATT&CK ids ("TA0001") so
|
|
66
|
+
* rows from every source join on the same key. Keyed by the name with
|
|
67
|
+
* everything but letters removed, lowercased.
|
|
68
|
+
*/
|
|
69
|
+
export const AWS_SECURITY_HUB_TACTIC_IDS: Record<string, string> = {
|
|
70
|
+
reconnaissance: "TA0043",
|
|
71
|
+
resourcedevelopment: "TA0042",
|
|
72
|
+
initialaccess: "TA0001",
|
|
73
|
+
execution: "TA0002",
|
|
74
|
+
persistence: "TA0003",
|
|
75
|
+
privilegeescalation: "TA0004",
|
|
76
|
+
defenseevasion: "TA0005",
|
|
77
|
+
credentialaccess: "TA0006",
|
|
78
|
+
discovery: "TA0007",
|
|
79
|
+
lateralmovement: "TA0008",
|
|
80
|
+
collection: "TA0009",
|
|
81
|
+
exfiltration: "TA0010",
|
|
82
|
+
commandandcontrol: "TA0011",
|
|
83
|
+
impact: "TA0040",
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const TTPS_NAMESPACE: string = "TTPs";
|
|
87
|
+
|
|
88
|
+
function definition(): SecurityEventConnectorDefinition {
|
|
89
|
+
const found: SecurityEventConnectorDefinition | undefined =
|
|
90
|
+
getSecurityEventConnectorDefinition(
|
|
91
|
+
SecurityEventConnectorProvider.AwsSecurityHub,
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
if (!found) {
|
|
95
|
+
/*
|
|
96
|
+
* The catalog is a static list that always carries this provider; the
|
|
97
|
+
* throw only exists so a future catalog edit cannot silently attribute
|
|
98
|
+
* events to an empty vendor and break the dedupe scope.
|
|
99
|
+
*/
|
|
100
|
+
throw new Error(
|
|
101
|
+
"AWS Security Hub is missing from SecurityEventConnectorCatalog.",
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return found;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function isObject(value: JSONValue): value is JSONObject {
|
|
109
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function objectArray(value: JSONValue): Array<JSONObject> {
|
|
113
|
+
if (!Array.isArray(value)) {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return (value as Array<JSONValue>).filter(isObject);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function uniqueNonEmpty(values: Array<string>): Array<string> {
|
|
121
|
+
const seen: Set<string> = new Set<string>();
|
|
122
|
+
const result: Array<string> = [];
|
|
123
|
+
|
|
124
|
+
for (const value of values) {
|
|
125
|
+
const trimmed: string = value.trim();
|
|
126
|
+
|
|
127
|
+
if (!trimmed || seen.has(trimmed)) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
seen.add(trimmed);
|
|
132
|
+
result.push(trimmed);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function mapTactic(name: string): string {
|
|
139
|
+
const key: string = name.replace(/[^A-Za-z]/g, "").toLowerCase();
|
|
140
|
+
|
|
141
|
+
return AWS_SECURITY_HUB_TACTIC_IDS[key] || name.trim();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/*
|
|
145
|
+
* Severity from Label, then from the deprecated Normalized score using
|
|
146
|
+
* the documented ranges, then Unknown. Label is what Security Hub itself
|
|
147
|
+
* populates on every finding, so the score path only serves partner
|
|
148
|
+
* products that sent a score alone.
|
|
149
|
+
*/
|
|
150
|
+
function severityOf(raw: JSONObject): OcsfSeverity {
|
|
151
|
+
const fromLabel: OcsfSeverity | null = normalizeOcsfSeverity(
|
|
152
|
+
readString(raw, "Severity.Label"),
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
if (fromLabel) {
|
|
156
|
+
return fromLabel;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const normalized: number | null = readNumber(raw, "Severity.Normalized");
|
|
160
|
+
|
|
161
|
+
if (normalized === null || normalized < 0) {
|
|
162
|
+
return OcsfSeverity.Unknown;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (normalized === 0) {
|
|
166
|
+
return OcsfSeverity.Informational;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (normalized < 40) {
|
|
170
|
+
return OcsfSeverity.Low;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (normalized < 70) {
|
|
174
|
+
return OcsfSeverity.Medium;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (normalized < 90) {
|
|
178
|
+
return OcsfSeverity.High;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return OcsfSeverity.Critical;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
interface MitreReferences {
|
|
185
|
+
tactics: Array<string>;
|
|
186
|
+
techniques: Array<string>;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/*
|
|
190
|
+
* Types entries under the TTPs namespace: "TTPs/{tactic}/{classifier}".
|
|
191
|
+
* The tactic maps to its ATT&CK id. The classifier is the product's own
|
|
192
|
+
* technique-level label (GuardDuty's "UnauthorizedAccess:EC2-SSHBruteForce",
|
|
193
|
+
* for example) rather than an ATT&CK technique id — ASFF defines no
|
|
194
|
+
* classifiers under TTPs — so it is kept verbatim: it is still the most
|
|
195
|
+
* specific "what happened" the finding offers, and it is searchable.
|
|
196
|
+
*/
|
|
197
|
+
function mitreOf(types: Array<string>): MitreReferences {
|
|
198
|
+
const tactics: Array<string> = [];
|
|
199
|
+
const techniques: Array<string> = [];
|
|
200
|
+
|
|
201
|
+
for (const type of types) {
|
|
202
|
+
const segments: Array<string> = type.split("/").map((segment: string) => {
|
|
203
|
+
return segment.trim();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
if (segments[0] !== TTPS_NAMESPACE) {
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (segments[1]) {
|
|
211
|
+
tactics.push(mapTactic(segments[1]));
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (segments[2]) {
|
|
215
|
+
techniques.push(segments.slice(2).join("/"));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return {
|
|
220
|
+
tactics: uniqueNonEmpty(tactics),
|
|
221
|
+
techniques: uniqueNonEmpty(techniques),
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
interface PrincipalIdentity {
|
|
226
|
+
user: string;
|
|
227
|
+
host: string;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/*
|
|
231
|
+
* The identity behind a finding lives inside Resources[].Details: IAM
|
|
232
|
+
* findings carry AwsIamAccessKey (PrincipalName / UserName) or AwsIamUser
|
|
233
|
+
* (UserName), EC2 findings carry the instance id as the resource Id. The
|
|
234
|
+
* first match wins; most findings name one resource.
|
|
235
|
+
*/
|
|
236
|
+
function principalOf(resources: Array<JSONObject>): PrincipalIdentity {
|
|
237
|
+
let user: string = "";
|
|
238
|
+
let host: string = "";
|
|
239
|
+
|
|
240
|
+
for (const resource of resources) {
|
|
241
|
+
if (!user) {
|
|
242
|
+
user =
|
|
243
|
+
readString(resource, "Details.AwsIamAccessKey.PrincipalName") ||
|
|
244
|
+
readString(resource, "Details.AwsIamAccessKey.UserName") ||
|
|
245
|
+
readString(resource, "Details.AwsIamUser.UserName");
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (!host && readString(resource, "Type") === "AwsEc2Instance") {
|
|
249
|
+
const id: string = readString(resource, "Id");
|
|
250
|
+
const index: number = id.lastIndexOf("/");
|
|
251
|
+
|
|
252
|
+
host = index === -1 ? id : id.substring(index + 1);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return { user, host };
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export default class AwsSecurityHubNormalizer {
|
|
260
|
+
/*
|
|
261
|
+
* A record is an ASFF finding when it carries a finding Id together
|
|
262
|
+
* with at least one of the other required top-level attributes
|
|
263
|
+
* (ProductArn, AwsAccountId, CreatedAt). Anything else — an error
|
|
264
|
+
* envelope that slipped into a page, a bare string — is rejected rather
|
|
265
|
+
* than turned into a meaningless row.
|
|
266
|
+
*/
|
|
267
|
+
public static isRecognized(raw: JSONObject): boolean {
|
|
268
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (!readString(raw, "Id")) {
|
|
273
|
+
return false;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
return Boolean(
|
|
277
|
+
readString(raw, "ProductArn") ||
|
|
278
|
+
readString(raw, "AwsAccountId") ||
|
|
279
|
+
readString(raw, "CreatedAt"),
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
public static isComplianceFinding(raw: JSONObject): boolean {
|
|
284
|
+
const compliance: JSONValue = readValue(raw, "Compliance");
|
|
285
|
+
|
|
286
|
+
return isObject(compliance) && Object.keys(compliance).length > 0;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
public static normalize(raw: JSONObject): NormalizedSecurityEvent {
|
|
290
|
+
const catalog: SecurityEventConnectorDefinition = definition();
|
|
291
|
+
|
|
292
|
+
const title: string = readString(raw, "Title");
|
|
293
|
+
const description: string = readString(raw, "Description");
|
|
294
|
+
|
|
295
|
+
/*
|
|
296
|
+
* Creation time is the poll basis, so it is also the row's time: the
|
|
297
|
+
* finding's own observation window (FirstObservedAt) can be hours or
|
|
298
|
+
* days earlier and is kept in attributes for anyone who needs it.
|
|
299
|
+
*/
|
|
300
|
+
const time: Date | null =
|
|
301
|
+
parseEventTime(readValue(raw, "CreatedAt")) ||
|
|
302
|
+
parseEventTime(readValue(raw, "UpdatedAt")) ||
|
|
303
|
+
parseEventTime(readValue(raw, "FirstObservedAt"));
|
|
304
|
+
|
|
305
|
+
// Id is stable across every GetFindings call, so it is the dedupe key.
|
|
306
|
+
const eventUid: string = readString(raw, "Id") || contentHashEventUid(raw);
|
|
307
|
+
|
|
308
|
+
const isCompliance: boolean =
|
|
309
|
+
AwsSecurityHubNormalizer.isComplianceFinding(raw);
|
|
310
|
+
const classUid: number = isCompliance
|
|
311
|
+
? AWS_SECURITY_HUB_COMPLIANCE_CLASS_UID
|
|
312
|
+
: AWS_SECURITY_HUB_DETECTION_CLASS_UID;
|
|
313
|
+
const className: string = isCompliance
|
|
314
|
+
? AWS_SECURITY_HUB_COMPLIANCE_CLASS_NAME
|
|
315
|
+
: AWS_SECURITY_HUB_DETECTION_CLASS_NAME;
|
|
316
|
+
const { categoryUid, categoryName } = ocsfCategoryForClassUid(classUid);
|
|
317
|
+
|
|
318
|
+
const severityName: OcsfSeverity = severityOf(raw);
|
|
319
|
+
|
|
320
|
+
const mitre: MitreReferences = mitreOf(readStringArray(raw, "Types"));
|
|
321
|
+
|
|
322
|
+
const resources: Array<JSONObject> = objectArray(
|
|
323
|
+
readValue(raw, "Resources"),
|
|
324
|
+
);
|
|
325
|
+
const resourceIds: Array<string> = resources.map(
|
|
326
|
+
(resource: JSONObject): string => {
|
|
327
|
+
return readString(resource, "Id");
|
|
328
|
+
},
|
|
329
|
+
);
|
|
330
|
+
const principal: PrincipalIdentity = principalOf(resources);
|
|
331
|
+
|
|
332
|
+
const sourceIp: string =
|
|
333
|
+
readString(raw, "Network.SourceIpV4") ||
|
|
334
|
+
readString(raw, "Network.SourceIpV6");
|
|
335
|
+
const destinationIp: string =
|
|
336
|
+
readString(raw, "Network.DestinationIpV4") ||
|
|
337
|
+
readString(raw, "Network.DestinationIpV6");
|
|
338
|
+
const destinationPort: number | null = readNumber(
|
|
339
|
+
raw,
|
|
340
|
+
"Network.DestinationPort",
|
|
341
|
+
);
|
|
342
|
+
const sourceDomain: string = readString(raw, "Network.SourceDomain");
|
|
343
|
+
const destinationDomain: string = readString(
|
|
344
|
+
raw,
|
|
345
|
+
"Network.DestinationDomain",
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
const processName: string = readString(raw, "Process.Name");
|
|
349
|
+
const processPath: string = readString(raw, "Process.Path");
|
|
350
|
+
|
|
351
|
+
const malwareNames: Array<string> = objectArray(
|
|
352
|
+
readValue(raw, "Malware"),
|
|
353
|
+
).map((malware: JSONObject): string => {
|
|
354
|
+
return readString(malware, "Name") || readString(malware, "Path");
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
const indicatorValues: Array<string> = objectArray(
|
|
358
|
+
readValue(raw, "ThreatIntelIndicators"),
|
|
359
|
+
).map((indicator: JSONObject): string => {
|
|
360
|
+
return readString(indicator, "Value");
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
const accountId: string = readString(raw, "AwsAccountId");
|
|
364
|
+
|
|
365
|
+
/*
|
|
366
|
+
* Workflow.Status is the investigation state a person manages;
|
|
367
|
+
* the retired WorkflowState is read when a partner product still
|
|
368
|
+
* sends only that. RecordState (ACTIVE/ARCHIVED) is not a status of
|
|
369
|
+
* the activity and stays in attributes.
|
|
370
|
+
*/
|
|
371
|
+
const statusName: string =
|
|
372
|
+
readString(raw, "Workflow.Status") || readString(raw, "WorkflowState");
|
|
373
|
+
|
|
374
|
+
const message: string =
|
|
375
|
+
title ||
|
|
376
|
+
description ||
|
|
377
|
+
(isCompliance
|
|
378
|
+
? "AWS Security Hub control finding"
|
|
379
|
+
: "AWS Security Hub finding");
|
|
380
|
+
|
|
381
|
+
return {
|
|
382
|
+
time: time || new Date(),
|
|
383
|
+
eventUid,
|
|
384
|
+
categoryUid,
|
|
385
|
+
categoryName,
|
|
386
|
+
classUid,
|
|
387
|
+
className,
|
|
388
|
+
activityName: "Create",
|
|
389
|
+
severityId: OcsfSeverityId[severityName],
|
|
390
|
+
severityName,
|
|
391
|
+
statusName,
|
|
392
|
+
message,
|
|
393
|
+
vendorName: catalog.vendorName,
|
|
394
|
+
productName: catalog.productName,
|
|
395
|
+
ruleId: readString(raw, "GeneratorId"),
|
|
396
|
+
ruleName: title,
|
|
397
|
+
mitreTactics: mitre.tactics,
|
|
398
|
+
mitreTechniques: mitre.techniques,
|
|
399
|
+
principalUser: principal.user,
|
|
400
|
+
principalHost: "",
|
|
401
|
+
principalIp: sourceIp,
|
|
402
|
+
principalProcess: processName || processPath,
|
|
403
|
+
targetUser: "",
|
|
404
|
+
targetHost: principal.host,
|
|
405
|
+
targetIp: destinationIp,
|
|
406
|
+
targetPort:
|
|
407
|
+
destinationPort !== null && destinationPort > 0
|
|
408
|
+
? Math.floor(destinationPort)
|
|
409
|
+
: 0,
|
|
410
|
+
targetResource: resourceIds[0] || "",
|
|
411
|
+
observables: buildObservables([
|
|
412
|
+
principal.user,
|
|
413
|
+
principal.host,
|
|
414
|
+
sourceIp,
|
|
415
|
+
destinationIp,
|
|
416
|
+
sourceDomain,
|
|
417
|
+
destinationDomain,
|
|
418
|
+
...resourceIds,
|
|
419
|
+
accountId,
|
|
420
|
+
processName,
|
|
421
|
+
...malwareNames,
|
|
422
|
+
...indicatorValues,
|
|
423
|
+
]),
|
|
424
|
+
attributes: flattenPayload(raw),
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
}
|