@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
|
@@ -0,0 +1,439 @@
|
|
|
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 {
|
|
9
|
+
DETECTION_FINDING_CLASS_NAME,
|
|
10
|
+
DETECTION_FINDING_CLASS_UID,
|
|
11
|
+
} from "../../../Types/SecurityEvent/DetectionFindingConstants";
|
|
12
|
+
import SecurityEventConnectorProvider from "../../../Types/SecurityEvent/Connectors/SecurityEventConnectorProvider";
|
|
13
|
+
import {
|
|
14
|
+
SecurityEventConnectorDefinition,
|
|
15
|
+
getSecurityEventConnectorDefinition,
|
|
16
|
+
} from "../../../Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog";
|
|
17
|
+
import {
|
|
18
|
+
buildObservables,
|
|
19
|
+
contentHashEventUid,
|
|
20
|
+
flattenPayload,
|
|
21
|
+
parseEventTime,
|
|
22
|
+
} from "../NormalizerHelpers";
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* Splunk Enterprise Security notable event (one `result` row of a JSON
|
|
26
|
+
* export over index=notable) -> OCSF Detection Finding (class 2004).
|
|
27
|
+
*
|
|
28
|
+
* Field contract, from Splunk's developer documentation on notable events
|
|
29
|
+
* (https://dev.splunk.com/enterprise/docs/devtools/enterprisesecurity/notableeventsplunkes/usingnotableeventsinsearch):
|
|
30
|
+
* every indexed notable carries `_time`, `host`, `source`, `sourcetype`
|
|
31
|
+
* plus the correlation search fields `rule_name` and `severity`; the
|
|
32
|
+
* stash fields `orig_sid` / `orig_rid` identify the search run; and
|
|
33
|
+
* `event_id` is "Assigned at search time by the `notable` macro" — so a
|
|
34
|
+
* plain index=notable read may not carry it, which is why the uid falls
|
|
35
|
+
* back to Splunk's own bucket/offset identity and then to a content hash.
|
|
36
|
+
* `urgency` is one of informational, low, medium, high, critical
|
|
37
|
+
* (https://help.splunk.com/en/splunk-enterprise-security-7/user-guide/7.3/incident-review/how-urgency-is-assigned-to-notable-events-in-splunk-enterprise-security);
|
|
38
|
+
* `status_label` is "The short form description of the notable event
|
|
39
|
+
* status". `rule_title` / `rule_description` are the notable's title and
|
|
40
|
+
* description; `src`, `dest`, `user`, `src_user`, `dest_user` are the CIM
|
|
41
|
+
* entity fields correlation searches populate; MITRE annotations arrive
|
|
42
|
+
* as `annotations.mitre_attack` (technique ids such as T1078) and the
|
|
43
|
+
* expanded `annotations.mitre_attack.mitre_technique_id` /
|
|
44
|
+
* `annotations.mitre_attack.mitre_tactic` fields
|
|
45
|
+
* (https://help.splunk.com/en/splunk-enterprise-security-7/risk-based-alerting/7.3/identify-threat/how-risk-annotations-provide-additional-context-in-splunk-enterprise-security).
|
|
46
|
+
*
|
|
47
|
+
* Splunk keys are flat strings that may themselves contain dots
|
|
48
|
+
* ("annotations.mitre_attack" is one field, not a nested object), and a
|
|
49
|
+
* multivalue field is exported as a JSON array. Fields are therefore read
|
|
50
|
+
* by exact key, never by dot path.
|
|
51
|
+
*
|
|
52
|
+
* Pure and isomorphic: no server imports.
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
const MAX_OBSERVABLES: number = 200;
|
|
56
|
+
|
|
57
|
+
/*
|
|
58
|
+
* Default Splunk ES review statuses (reviewstatuses.conf ships these
|
|
59
|
+
* numeric ids). Used only when the export carries the numeric `status`
|
|
60
|
+
* but not the label the `notable` macro would have added.
|
|
61
|
+
*/
|
|
62
|
+
const STATUS_LABEL_BY_ID: Record<string, string> = {
|
|
63
|
+
"0": "Unassigned",
|
|
64
|
+
"1": "New",
|
|
65
|
+
"2": "In Progress",
|
|
66
|
+
"3": "Pending",
|
|
67
|
+
"4": "Resolved",
|
|
68
|
+
"5": "Closed",
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/*
|
|
72
|
+
* MITRE ATT&CK enterprise tactics by name, for annotations that carry the
|
|
73
|
+
* tactic as prose ("Initial Access") rather than its id.
|
|
74
|
+
* https://attack.mitre.org/tactics/enterprise/
|
|
75
|
+
*/
|
|
76
|
+
const TACTIC_ID_BY_NAME: Record<string, string> = {
|
|
77
|
+
reconnaissance: "TA0043",
|
|
78
|
+
resourcedevelopment: "TA0042",
|
|
79
|
+
initialaccess: "TA0001",
|
|
80
|
+
execution: "TA0002",
|
|
81
|
+
persistence: "TA0003",
|
|
82
|
+
privilegeescalation: "TA0004",
|
|
83
|
+
defenseevasion: "TA0005",
|
|
84
|
+
credentialaccess: "TA0006",
|
|
85
|
+
discovery: "TA0007",
|
|
86
|
+
lateralmovement: "TA0008",
|
|
87
|
+
collection: "TA0009",
|
|
88
|
+
commandandcontrol: "TA0011",
|
|
89
|
+
exfiltration: "TA0010",
|
|
90
|
+
impact: "TA0040",
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const TECHNIQUE_ID_REGEX: RegExp = /^T\d{4}(?:\.\d{3})?$/;
|
|
94
|
+
const TACTIC_ID_REGEX: RegExp = /^TA\d{4}$/;
|
|
95
|
+
|
|
96
|
+
const IPV4_REGEX: RegExp =
|
|
97
|
+
/^(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)$/;
|
|
98
|
+
// Loose IPv6: hex groups and colons, at least two colons; enough to tell an address from a hostname.
|
|
99
|
+
const IPV6_REGEX: RegExp = /^[0-9a-fA-F:]*:[0-9a-fA-F:]*:[0-9a-fA-F:.]*$/;
|
|
100
|
+
|
|
101
|
+
function isObject(value: unknown): value is JSONObject {
|
|
102
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/*
|
|
106
|
+
* Read a Splunk field by its exact key. A multivalue field is a JSON
|
|
107
|
+
* array; the first scalar wins for single-valued columns.
|
|
108
|
+
*/
|
|
109
|
+
function field(payload: JSONObject, key: string): string {
|
|
110
|
+
const value: JSONValue = payload[key] as JSONValue;
|
|
111
|
+
|
|
112
|
+
if (value === null || value === undefined) {
|
|
113
|
+
return "";
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (Array.isArray(value)) {
|
|
117
|
+
const first: JSONValue | undefined = value.find(
|
|
118
|
+
(item: JSONValue): boolean => {
|
|
119
|
+
return item !== null && item !== undefined && typeof item !== "object";
|
|
120
|
+
},
|
|
121
|
+
);
|
|
122
|
+
return first === undefined ? "" : String(first).trim();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (typeof value === "object") {
|
|
126
|
+
return "";
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return String(value).trim();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/*
|
|
133
|
+
* Every scalar of a field, splitting comma-joined strings too: ES
|
|
134
|
+
* annotations are stored as JSON in savedsearches.conf and surface as
|
|
135
|
+
* either an array or a single joined string depending on the search.
|
|
136
|
+
*/
|
|
137
|
+
function fieldValues(payload: JSONObject, key: string): Array<string> {
|
|
138
|
+
const value: JSONValue = payload[key] as JSONValue;
|
|
139
|
+
|
|
140
|
+
if (value === null || value === undefined) {
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (Array.isArray(value)) {
|
|
145
|
+
return value
|
|
146
|
+
.filter((item: JSONValue): boolean => {
|
|
147
|
+
return item !== null && item !== undefined && typeof item !== "object";
|
|
148
|
+
})
|
|
149
|
+
.map((item: JSONValue): string => {
|
|
150
|
+
return String(item).trim();
|
|
151
|
+
})
|
|
152
|
+
.filter((item: string): boolean => {
|
|
153
|
+
return item.length > 0;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (typeof value === "object") {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return String(value)
|
|
162
|
+
.split(",")
|
|
163
|
+
.map((item: string): string => {
|
|
164
|
+
return item.trim();
|
|
165
|
+
})
|
|
166
|
+
.filter((item: string): boolean => {
|
|
167
|
+
return item.length > 0;
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function firstField(payload: JSONObject, keys: Array<string>): string {
|
|
172
|
+
for (const key of keys) {
|
|
173
|
+
const value: string = field(payload, key);
|
|
174
|
+
|
|
175
|
+
if (value) {
|
|
176
|
+
return value;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return "";
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export function isIpAddress(value: string): boolean {
|
|
184
|
+
const trimmed: string = (value || "").trim();
|
|
185
|
+
|
|
186
|
+
if (!trimmed) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return IPV4_REGEX.test(trimmed) || IPV6_REGEX.test(trimmed);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
interface Endpoint {
|
|
194
|
+
ip: string;
|
|
195
|
+
host: string;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/*
|
|
199
|
+
* CIM `src` / `dest` hold "the host, IP or name"; `src_ip` / `dest_ip`
|
|
200
|
+
* are always addresses. The address column gets the explicit IP field,
|
|
201
|
+
* else `src`/`dest` when it looks like one; the host column gets
|
|
202
|
+
* `src_host`/`dest_host`, else `src`/`dest` when it does not.
|
|
203
|
+
*/
|
|
204
|
+
function pickEndpoint(
|
|
205
|
+
payload: JSONObject,
|
|
206
|
+
generic: string,
|
|
207
|
+
ipKey: string,
|
|
208
|
+
hostKeys: Array<string>,
|
|
209
|
+
): Endpoint {
|
|
210
|
+
const genericValue: string = field(payload, generic);
|
|
211
|
+
const explicitIp: string = field(payload, ipKey);
|
|
212
|
+
const explicitHost: string = firstField(payload, hostKeys);
|
|
213
|
+
|
|
214
|
+
let ip: string = explicitIp;
|
|
215
|
+
let host: string = explicitHost;
|
|
216
|
+
|
|
217
|
+
if (genericValue) {
|
|
218
|
+
if (isIpAddress(genericValue)) {
|
|
219
|
+
ip = ip || genericValue;
|
|
220
|
+
} else {
|
|
221
|
+
host = host || genericValue;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return { ip, host };
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function mapTechniques(payload: JSONObject): Array<string> {
|
|
229
|
+
const candidates: Array<string> = [
|
|
230
|
+
...fieldValues(payload, "annotations.mitre_attack"),
|
|
231
|
+
...fieldValues(payload, "annotations.mitre_attack.mitre_technique_id"),
|
|
232
|
+
...fieldValues(payload, "mitre_technique_id"),
|
|
233
|
+
...fieldValues(payload, "mitre_technique"),
|
|
234
|
+
];
|
|
235
|
+
const techniques: Array<string> = [];
|
|
236
|
+
|
|
237
|
+
for (const candidate of candidates) {
|
|
238
|
+
const id: string = candidate.toUpperCase();
|
|
239
|
+
|
|
240
|
+
if (TECHNIQUE_ID_REGEX.test(id) && !techniques.includes(id)) {
|
|
241
|
+
techniques.push(id);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return techniques;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
function mapTactics(payload: JSONObject): Array<string> {
|
|
249
|
+
const candidates: Array<string> = [
|
|
250
|
+
...fieldValues(payload, "annotations.mitre_attack.mitre_tactic_id"),
|
|
251
|
+
...fieldValues(payload, "annotations.mitre_attack.mitre_tactic"),
|
|
252
|
+
...fieldValues(payload, "mitre_tactic_id"),
|
|
253
|
+
...fieldValues(payload, "mitre_tactic"),
|
|
254
|
+
// The technique list may carry tactic ids too; harmless to scan.
|
|
255
|
+
...fieldValues(payload, "annotations.mitre_attack"),
|
|
256
|
+
];
|
|
257
|
+
const tactics: Array<string> = [];
|
|
258
|
+
|
|
259
|
+
for (const candidate of candidates) {
|
|
260
|
+
const upper: string = candidate.toUpperCase();
|
|
261
|
+
let id: string = "";
|
|
262
|
+
|
|
263
|
+
if (TACTIC_ID_REGEX.test(upper)) {
|
|
264
|
+
id = upper;
|
|
265
|
+
} else {
|
|
266
|
+
const key: string = candidate.toLowerCase().replace(/[^a-z]/g, "");
|
|
267
|
+
id = TACTIC_ID_BY_NAME[key] || "";
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (id && !tactics.includes(id)) {
|
|
271
|
+
tactics.push(id);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return tactics;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/*
|
|
279
|
+
* The notable's own identity. `event_id` when the `notable` macro (or
|
|
280
|
+
* the correlation search's eval) supplied it; else Splunk's bucket +
|
|
281
|
+
* offset pair, which uniquely names an indexed event and survives
|
|
282
|
+
* re-reads of the same window; else a hash of the row.
|
|
283
|
+
*/
|
|
284
|
+
function eventUid(payload: JSONObject): string {
|
|
285
|
+
const eventId: string = field(payload, "event_id");
|
|
286
|
+
|
|
287
|
+
if (eventId) {
|
|
288
|
+
return eventId;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const bucket: string = field(payload, "_bkt");
|
|
292
|
+
const offset: string = field(payload, "_cd");
|
|
293
|
+
|
|
294
|
+
if (bucket && offset) {
|
|
295
|
+
return `splunk:${bucket}:${offset}`;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return contentHashEventUid(payload);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function statusName(payload: JSONObject): string {
|
|
302
|
+
const label: string = firstField(payload, [
|
|
303
|
+
"status_label",
|
|
304
|
+
"status_description",
|
|
305
|
+
]);
|
|
306
|
+
|
|
307
|
+
if (label) {
|
|
308
|
+
return label;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const status: string = field(payload, "status");
|
|
312
|
+
|
|
313
|
+
return STATUS_LABEL_BY_ID[status] || status;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
export default class SplunkNormalizer {
|
|
317
|
+
/*
|
|
318
|
+
* A row from a Splunk export always carries `_time`; a notable also
|
|
319
|
+
* names its correlation search. Anything without either is not an
|
|
320
|
+
* event Splunk produced, so it is rejected rather than hashed into a
|
|
321
|
+
* row with nothing in it.
|
|
322
|
+
*/
|
|
323
|
+
public static isRecognized(payload: JSONObject): boolean {
|
|
324
|
+
if (!isObject(payload)) {
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return Boolean(
|
|
329
|
+
field(payload, "_time") ||
|
|
330
|
+
field(payload, "event_id") ||
|
|
331
|
+
field(payload, "rule_name") ||
|
|
332
|
+
field(payload, "search_name"),
|
|
333
|
+
);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
public static normalize(payload: JSONObject): NormalizedSecurityEvent {
|
|
337
|
+
const definition: SecurityEventConnectorDefinition | undefined =
|
|
338
|
+
getSecurityEventConnectorDefinition(
|
|
339
|
+
SecurityEventConnectorProvider.SplunkEnterpriseSecurity,
|
|
340
|
+
);
|
|
341
|
+
|
|
342
|
+
/*
|
|
343
|
+
* Urgency is what Incident Review shows and already folds in asset
|
|
344
|
+
* and identity priority; the raw correlation-search severity is the
|
|
345
|
+
* fallback. "unknown" maps to Unknown rather than to null.
|
|
346
|
+
*/
|
|
347
|
+
const severityName: OcsfSeverity =
|
|
348
|
+
normalizeOcsfSeverity(field(payload, "urgency")) ||
|
|
349
|
+
normalizeOcsfSeverity(field(payload, "severity")) ||
|
|
350
|
+
OcsfSeverity.Unknown;
|
|
351
|
+
|
|
352
|
+
/*
|
|
353
|
+
* `_time` of a notable is when the correlation search created it; the
|
|
354
|
+
* export renders it as ISO 8601 with offset, an epoch string appears
|
|
355
|
+
* when a search reformats it. Both parse.
|
|
356
|
+
*/
|
|
357
|
+
const time: Date | null = parseEventTime(payload["_time"] as JSONValue);
|
|
358
|
+
|
|
359
|
+
const ruleName: string = firstField(payload, [
|
|
360
|
+
"rule_name",
|
|
361
|
+
"search_name",
|
|
362
|
+
"source",
|
|
363
|
+
]);
|
|
364
|
+
|
|
365
|
+
const source: Endpoint = pickEndpoint(payload, "src", "src_ip", [
|
|
366
|
+
"src_host",
|
|
367
|
+
"src_nt_host",
|
|
368
|
+
]);
|
|
369
|
+
const destination: Endpoint = pickEndpoint(payload, "dest", "dest_ip", [
|
|
370
|
+
"dest_host",
|
|
371
|
+
"dest_nt_host",
|
|
372
|
+
]);
|
|
373
|
+
|
|
374
|
+
const principalUser: string = firstField(payload, ["user", "src_user"]);
|
|
375
|
+
const targetUser: string = field(payload, "dest_user");
|
|
376
|
+
const principalProcess: string = firstField(payload, [
|
|
377
|
+
"process",
|
|
378
|
+
"process_name",
|
|
379
|
+
"parent_process",
|
|
380
|
+
]);
|
|
381
|
+
const targetPort: number = Number(field(payload, "dest_port"));
|
|
382
|
+
|
|
383
|
+
const { categoryUid, categoryName } = ocsfCategoryForClassUid(
|
|
384
|
+
DETECTION_FINDING_CLASS_UID,
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
return {
|
|
388
|
+
time: time || new Date(),
|
|
389
|
+
eventUid: eventUid(payload),
|
|
390
|
+
categoryUid,
|
|
391
|
+
categoryName,
|
|
392
|
+
classUid: DETECTION_FINDING_CLASS_UID,
|
|
393
|
+
className: DETECTION_FINDING_CLASS_NAME,
|
|
394
|
+
activityName: "Create",
|
|
395
|
+
severityId: OcsfSeverityId[severityName],
|
|
396
|
+
severityName,
|
|
397
|
+
statusName: statusName(payload),
|
|
398
|
+
message:
|
|
399
|
+
firstField(payload, ["rule_title", "rule_description"]) ||
|
|
400
|
+
ruleName ||
|
|
401
|
+
"Splunk Enterprise Security notable event",
|
|
402
|
+
vendorName: definition?.vendorName || "Splunk",
|
|
403
|
+
productName: definition?.productName || "Splunk Enterprise Security",
|
|
404
|
+
// The correlation search name is the stable rule identity in Splunk.
|
|
405
|
+
ruleId: firstField(payload, ["search_name", "source", "rule_name"]),
|
|
406
|
+
ruleName,
|
|
407
|
+
mitreTactics: mapTactics(payload),
|
|
408
|
+
mitreTechniques: mapTechniques(payload),
|
|
409
|
+
principalUser,
|
|
410
|
+
principalHost: source.host,
|
|
411
|
+
principalIp: source.ip,
|
|
412
|
+
principalProcess,
|
|
413
|
+
targetUser,
|
|
414
|
+
targetHost: destination.host,
|
|
415
|
+
targetIp: destination.ip,
|
|
416
|
+
targetPort:
|
|
417
|
+
Number.isFinite(targetPort) && targetPort > 0 ? targetPort : 0,
|
|
418
|
+
targetResource: firstField(payload, ["file_path", "url", "risk_object"]),
|
|
419
|
+
observables: buildObservables([
|
|
420
|
+
principalUser,
|
|
421
|
+
field(payload, "src_user"),
|
|
422
|
+
targetUser,
|
|
423
|
+
source.host,
|
|
424
|
+
destination.host,
|
|
425
|
+
source.ip,
|
|
426
|
+
destination.ip,
|
|
427
|
+
field(payload, "dvc"),
|
|
428
|
+
field(payload, "host"),
|
|
429
|
+
field(payload, "file_hash"),
|
|
430
|
+
field(payload, "file_name"),
|
|
431
|
+
field(payload, "url"),
|
|
432
|
+
field(payload, "domain"),
|
|
433
|
+
field(payload, "query"),
|
|
434
|
+
field(payload, "risk_object"),
|
|
435
|
+
]).slice(0, MAX_OBSERVABLES),
|
|
436
|
+
attributes: flattenPayload(payload),
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
}
|
|
@@ -19,12 +19,21 @@ import {
|
|
|
19
19
|
* Google SecOps (Chronicle) detection/alert payload -> a Detection Finding
|
|
20
20
|
* (OCSF class 2004).
|
|
21
21
|
*
|
|
22
|
-
* This is the shape a SecOps SOAR playbook webhook
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
22
|
+
* This is the shape a SecOps SOAR playbook webhook, the detections stream
|
|
23
|
+
* (legacyStreamDetectionAlerts), the alerts view (legacyFetchAlertsView)
|
|
24
|
+
* and the detections search (legacySearchDetections) all deliver: a
|
|
25
|
+
* Collection with rule metadata in a `detection` array plus the matched
|
|
26
|
+
* UDM events in `collectionElements`. The matched sample events are run
|
|
27
|
+
* through the UDM entity extraction so the finding row inherits their
|
|
28
|
+
* observables — that is what makes a detection joinable to the hosts/users
|
|
29
|
+
* it fired on.
|
|
30
|
+
*
|
|
31
|
+
* Not every Collection is a rule detection. Google documents six types
|
|
32
|
+
* (https://docs.cloud.google.com/chronicle/docs/reference/rest/v1alpha/Collection):
|
|
33
|
+
* RULE_DETECTION, GCTI_FINDING, TELEMETRY_ALERT, UPPERCASE_ALERT,
|
|
34
|
+
* MACHINE_INTELLIGENCE_ALERT and SOAR_ALERT. Only the first carries rule
|
|
35
|
+
* metadata; the others still have an id, timestamps, tags and (for SOAR)
|
|
36
|
+
* the originating system, which is enough for a finding row.
|
|
28
37
|
*/
|
|
29
38
|
|
|
30
39
|
const DETECTION_FINDING_CLASS_UID: number = 2004;
|
|
@@ -36,6 +45,20 @@ const DETECTION_FINDING_CLASS_UID: number = 2004;
|
|
|
36
45
|
*/
|
|
37
46
|
const MAX_SAMPLE_EVENTS: number = 25;
|
|
38
47
|
|
|
48
|
+
/*
|
|
49
|
+
* Every documented Collection.type. A payload carrying one of these and a
|
|
50
|
+
* string id is a Google SecOps record even when it has no `detection`
|
|
51
|
+
* entry — telemetry alerts and SOAR alerts never do.
|
|
52
|
+
*/
|
|
53
|
+
const COLLECTION_TYPES: Array<string> = [
|
|
54
|
+
"RULE_DETECTION",
|
|
55
|
+
"GCTI_FINDING",
|
|
56
|
+
"TELEMETRY_ALERT",
|
|
57
|
+
"UPPERCASE_ALERT",
|
|
58
|
+
"MACHINE_INTELLIGENCE_ALERT",
|
|
59
|
+
"SOAR_ALERT",
|
|
60
|
+
];
|
|
61
|
+
|
|
39
62
|
function collectSampleEvents(payload: JSONObject): Array<JSONObject> {
|
|
40
63
|
const events: Array<JSONObject> = [];
|
|
41
64
|
|
|
@@ -99,15 +122,101 @@ function readDetectionEntry(payload: JSONObject): JSONObject | null {
|
|
|
99
122
|
return null;
|
|
100
123
|
}
|
|
101
124
|
|
|
125
|
+
function readCollectionType(payload: JSONObject): string {
|
|
126
|
+
return readString(payload, "type").toUpperCase();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function readTags(payload: JSONObject): Array<string> {
|
|
130
|
+
const tags: JSONValue = readValue(payload, "tags");
|
|
131
|
+
|
|
132
|
+
if (!Array.isArray(tags)) {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return tags.filter((tag: JSONValue): boolean => {
|
|
137
|
+
return typeof tag === "string" && tag.trim() !== "";
|
|
138
|
+
}) as Array<string>;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/*
|
|
142
|
+
* A readable label for a Collection that carries no rule name: the SOAR
|
|
143
|
+
* source rule or system, then the tags Google set on the finding, then
|
|
144
|
+
* the type itself ("Google SecOps telemetry alert").
|
|
145
|
+
*/
|
|
146
|
+
function describeNonRuleCollection(payload: JSONObject): string {
|
|
147
|
+
const sourceRule: string =
|
|
148
|
+
readString(payload, "soarAlertMetadata.sourceRule") ||
|
|
149
|
+
readString(payload, "soar_alert_metadata.source_rule");
|
|
150
|
+
|
|
151
|
+
if (sourceRule) {
|
|
152
|
+
return sourceRule;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const sourceSystem: string = [
|
|
156
|
+
readString(payload, "soarAlertMetadata.vendor") ||
|
|
157
|
+
readString(payload, "soar_alert_metadata.vendor"),
|
|
158
|
+
readString(payload, "soarAlertMetadata.product") ||
|
|
159
|
+
readString(payload, "soar_alert_metadata.product"),
|
|
160
|
+
readString(payload, "soarAlertMetadata.sourceSystem") ||
|
|
161
|
+
readString(payload, "soar_alert_metadata.source_system"),
|
|
162
|
+
]
|
|
163
|
+
.filter((part: string): boolean => {
|
|
164
|
+
return part !== "";
|
|
165
|
+
})
|
|
166
|
+
.join(" ");
|
|
167
|
+
|
|
168
|
+
if (sourceSystem) {
|
|
169
|
+
return `${sourceSystem} alert`;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const tags: Array<string> = readTags(payload);
|
|
173
|
+
|
|
174
|
+
if (tags.length > 0) {
|
|
175
|
+
return tags.join(", ");
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const type: string = readCollectionType(payload);
|
|
179
|
+
|
|
180
|
+
/*
|
|
181
|
+
* A rule detection with no rule detail keeps the generic label the
|
|
182
|
+
* ingest path has always produced; only the other types get named.
|
|
183
|
+
*/
|
|
184
|
+
if (type && !type.includes("RULE_DETECTION")) {
|
|
185
|
+
return `Google SecOps ${type.toLowerCase().split("_").join(" ")}`;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return "";
|
|
189
|
+
}
|
|
190
|
+
|
|
102
191
|
export default class GoogleSecOpsAlertNormalizer {
|
|
103
192
|
public static isGoogleSecOpsAlert(payload: JSONObject): boolean {
|
|
104
|
-
const type: string =
|
|
193
|
+
const type: string = readCollectionType(payload);
|
|
105
194
|
|
|
106
|
-
|
|
195
|
+
/*
|
|
196
|
+
* The markers a rule detection carries. These are accepted with or
|
|
197
|
+
* without an id because the ingest endpoint's dialect detection has
|
|
198
|
+
* always recognized webhook bodies this way.
|
|
199
|
+
*/
|
|
200
|
+
if (
|
|
107
201
|
readDetectionEntry(payload) ||
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
202
|
+
type.includes("RULE_DETECTION") ||
|
|
203
|
+
readValue(payload, "collectionElements") ||
|
|
204
|
+
readValue(payload, "collection_elements")
|
|
205
|
+
) {
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/*
|
|
210
|
+
* The other documented Collection types have no detection entry. A
|
|
211
|
+
* string id is required alongside the type so an unrelated object that
|
|
212
|
+
* happens to carry a `type` key is still rejected.
|
|
213
|
+
*/
|
|
214
|
+
const id: JSONValue = readValue(payload, "id");
|
|
215
|
+
|
|
216
|
+
return (
|
|
217
|
+
typeof id === "string" &&
|
|
218
|
+
id.trim() !== "" &&
|
|
219
|
+
COLLECTION_TYPES.includes(type)
|
|
111
220
|
);
|
|
112
221
|
}
|
|
113
222
|
|
|
@@ -167,7 +276,10 @@ export default class GoogleSecOpsAlertNormalizer {
|
|
|
167
276
|
: "";
|
|
168
277
|
|
|
169
278
|
const message: string =
|
|
170
|
-
ruleName ||
|
|
279
|
+
ruleName ||
|
|
280
|
+
description ||
|
|
281
|
+
describeNonRuleCollection(payload) ||
|
|
282
|
+
"Google SecOps detection";
|
|
171
283
|
|
|
172
284
|
return {
|
|
173
285
|
time: time || new Date(),
|
|
@@ -44,9 +44,12 @@ const PERCENT: RegExp = /%/;
|
|
|
44
44
|
* `attributes.<key>` for telemetry attributes (dots in <key> are kept —
|
|
45
45
|
* only the first "attributes." prefix is stripped). A `body` chip is the
|
|
46
46
|
* one whose value compiles to a CONTAINS match rather than an equality
|
|
47
|
-
* (LogsCrossSignalPivot.applyLogsFacetFiltersToQuery). `
|
|
48
|
-
*
|
|
49
|
-
*
|
|
47
|
+
* (LogsCrossSignalPivot.applyLogsFacetFiltersToQuery). An `attributes.`
|
|
48
|
+
* chip value is re-parsed by the shared search grammar when the explorer
|
|
49
|
+
* compiles it, so it is escaped by that grammar's buildSearchTokenValue
|
|
50
|
+
* here, like the traces chips. `range` is a TimeRange enum value; a
|
|
51
|
+
* Custom range additionally needs `start` and `end` (parsed with
|
|
52
|
+
* `new Date(...)`). There is no `search` param.
|
|
50
53
|
*
|
|
51
54
|
* - Traces explorer (App/FeatureSet/Dashboard/src/Components/Traces/
|
|
52
55
|
* TracesViewer.tsx, readInitialUrlState + TracesSearchCompile): `search`
|
|
@@ -292,10 +295,12 @@ function resolveTimeWindow(
|
|
|
292
295
|
*
|
|
293
296
|
* Field support: serviceIds -> `primaryEntityId` filter tuple, severityTexts
|
|
294
297
|
* -> `severityText` (canonicalized casing), traceIds -> `traceId`, spanIds
|
|
295
|
-
* -> `spanId`, attributes -> `attributes.<key>` tuples
|
|
296
|
-
*
|
|
297
|
-
*
|
|
298
|
-
* `
|
|
298
|
+
* -> `spanId`, attributes -> `attributes.<key>` tuples (values escaped with
|
|
299
|
+
* the search grammar's buildSearchTokenValue, because the explorer re-parses
|
|
300
|
+
* a chip value as grammar), bodyContains -> `body` (a contains-match chip),
|
|
301
|
+
* startTime+endTime -> `range=Custom` + `start`/`end`. Every scope field is
|
|
302
|
+
* expressible in the logs grammar, so `dropped` only ever reports a lone
|
|
303
|
+
* time endpoint.
|
|
299
304
|
*/
|
|
300
305
|
export function toLogsExplorerQueryParams(
|
|
301
306
|
scope: TelemetryCrossSignalScope,
|
|
@@ -349,7 +354,16 @@ export function toLogsExplorerQueryParams(
|
|
|
349
354
|
}
|
|
350
355
|
|
|
351
356
|
for (const [key, value] of sanitizeAttributeEntries(scope.attributes)) {
|
|
352
|
-
|
|
357
|
+
/*
|
|
358
|
+
* The logs explorer compiles an `attributes.<key>` chip through the
|
|
359
|
+
* search grammar (applyLogsFacetFiltersToQuery -> compileAttributeChipValues),
|
|
360
|
+
* exactly like a typed `@key:value`, so a raw `/api/*` arrived as a
|
|
361
|
+
* wildcard matching every path under /api and a raw `~internal` as a
|
|
362
|
+
* contains-match. Escaping with the grammar's own token builder makes the
|
|
363
|
+
* chip mean the literal value — the same treatment the traces serializer
|
|
364
|
+
* has always given its chips.
|
|
365
|
+
*/
|
|
366
|
+
tuples.push([`attributes.${key}`, [buildSearchTokenValue(value)]]);
|
|
353
367
|
}
|
|
354
368
|
|
|
355
369
|
const bodyContains: string = sanitizeBodyContains(scope.bodyContains);
|
|
@@ -60,6 +60,14 @@ const RULES: Record<string, EntityRelationshipType> = {
|
|
|
60
60
|
EntityRelationshipType.MemberOf,
|
|
61
61
|
[`${EntityType.KubernetesPod}|${EntityType.KubernetesCluster}`]:
|
|
62
62
|
EntityRelationshipType.MemberOf,
|
|
63
|
+
/*
|
|
64
|
+
* A pod reporting its deployment is one replica of it. Without this edge a
|
|
65
|
+
* workload's pods could only be grouped by the node they happen to run on,
|
|
66
|
+
* so a 12-replica deployment read as 12 unrelated pods scattered across
|
|
67
|
+
* nodes instead of one workload.
|
|
68
|
+
*/
|
|
69
|
+
[`${EntityType.KubernetesPod}|${EntityType.KubernetesDeployment}`]:
|
|
70
|
+
EntityRelationshipType.PartOf,
|
|
63
71
|
[`${EntityType.KubernetesNode}|${EntityType.KubernetesCluster}`]:
|
|
64
72
|
EntityRelationshipType.MemberOf,
|
|
65
73
|
[`${EntityType.KubernetesNamespace}|${EntityType.KubernetesCluster}`]:
|