@oneuptime/common 13.0.3 → 13.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/RumApplication.ts +1 -1
- package/Models/DatabaseModels/SecurityEventConnection.ts +457 -0
- package/Models/DatabaseModels/SecurityEventConnectionRun.ts +263 -0
- package/Models/DatabaseModels/TelemetryIngestionKey.ts +2 -2
- package/Server/API/AIInvestigationAPI.ts +484 -24
- package/Server/API/GoogleSecOpsConnectionAPI.ts +249 -8
- package/Server/API/SecurityEventConnectionAPI.ts +250 -0
- package/Server/API/TelemetryAPI.ts +402 -265
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.ts +99 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/TelemetryIngest.ts +101 -6
- package/Server/Services/ExceptionAggregationService.ts +7 -16
- package/Server/Services/GoogleSecOpsConnectionService.ts +15 -0
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/InventoryItemService.ts +28 -0
- package/Server/Services/LogAggregationService.ts +17 -23
- package/Server/Services/MetricAggregationService.ts +4 -14
- package/Server/Services/SecurityEventConnectionRunService.ts +10 -0
- package/Server/Services/SecurityEventConnectionService.ts +538 -0
- package/Server/Services/TraceAggregationService.ts +77 -28
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +13 -1
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +15 -1
- package/Server/Utils/AI/SRE/InvestigationEvidence.ts +658 -0
- package/Server/Utils/AI/SRE/InvestigationReferences.ts +324 -0
- package/Server/Utils/AI/Toolbox/Index.ts +38 -0
- package/Server/Utils/AI/Toolbox/TimelineTools.ts +9 -2
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +80 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +5 -3
- package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.ts +1108 -0
- package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.ts +732 -0
- package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +495 -0
- package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.ts +689 -0
- package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.ts +767 -0
- package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.ts +571 -0
- package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.ts +827 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.ts +610 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.ts +549 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.ts +830 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.ts +684 -0
- package/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.ts +487 -0
- package/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.ts +778 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +1002 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +556 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +275 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +53 -0
- package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.ts +709 -0
- package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.ts +596 -0
- package/Server/Utils/SecurityEvent/Connectors/Types.ts +191 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +353 -65
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +777 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +747 -148
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +48 -2
- package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +81 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +741 -40
- package/Server/Utils/StartServer.ts +10 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +8 -0
- package/Server/Utils/Telemetry/KubernetesResourceAttributes.ts +108 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +174 -93
- package/Server/Utils/Telemetry/ResourceFacetPlanner.ts +251 -0
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +248 -413
- package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +668 -0
- package/Server/Utils/Telemetry/TraceContextPropagation.ts +348 -0
- package/Server/Utils/Telemetry.ts +18 -0
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +413 -0
- package/Tests/App/Dashboard/AIRootCauseFeedItem.test.tsx +285 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +242 -0
- package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +601 -15
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +835 -0
- package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +41 -0
- package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +604 -0
- package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +738 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +153 -6
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +165 -0
- package/Tests/App/Dashboard/EpisodeChangeState.test.tsx +1069 -0
- package/Tests/App/Dashboard/EpisodeMembersCard.test.tsx +772 -0
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +2354 -0
- package/Tests/App/Dashboard/EventOverviewSkeleton.test.tsx +210 -0
- package/Tests/App/Dashboard/EventStatBar.test.tsx +392 -0
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +247 -0
- package/Tests/App/Dashboard/ExceptionAIAssistance.test.tsx +606 -0
- package/Tests/App/Dashboard/ExceptionBreadcrumbTimeline.test.tsx +273 -0
- package/Tests/App/Dashboard/ExceptionDetailSideMenu.test.tsx +176 -0
- package/Tests/App/Dashboard/ExceptionOverviewCards.test.tsx +366 -0
- package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +371 -0
- package/Tests/App/Dashboard/ExceptionStackFrameViewer.test.tsx +440 -0
- package/Tests/App/Dashboard/ExceptionSummary.test.tsx +381 -0
- package/Tests/App/Dashboard/ExceptionTriage.test.tsx +306 -0
- package/Tests/App/Dashboard/ExceptionsResourceFacets.test.tsx +604 -0
- package/Tests/App/Dashboard/ExceptionsViewerEntityChips.test.tsx +706 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +32 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +838 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +18 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +297 -20
- package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +618 -13
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +254 -207
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +303 -135
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +1251 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +303 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +876 -8
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +35 -0
- package/Tests/App/Dashboard/InvestigationReferenceLink.test.tsx +177 -0
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +1295 -0
- package/Tests/App/Dashboard/KubernetesImageReferenceView.test.tsx +114 -0
- package/Tests/App/Dashboard/KubernetesLogsTabChips.test.tsx +285 -0
- package/Tests/App/Dashboard/LogsEntityChipNames.test.tsx +316 -0
- package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +361 -0
- package/Tests/App/Dashboard/ProfileTableEntityNames.test.tsx +432 -0
- package/Tests/App/Dashboard/ProfileViewEntityName.test.tsx +250 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +10 -0
- package/Tests/App/Dashboard/ResourceLogsTabsBareLayout.test.tsx +700 -0
- package/Tests/App/Dashboard/ResourcePageEntityNameProps.test.tsx +803 -0
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +11 -1
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeState.test.tsx +1026 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +436 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +1195 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1022 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +905 -0
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +247 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +375 -274
- package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +410 -0
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +774 -0
- package/Tests/App/Dashboard/TopErrorsPanelResourceNames.test.tsx +316 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +30 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +88 -24
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +1590 -0
- package/Tests/App/Dashboard/TraceWaterfall.test.tsx +488 -0
- package/Tests/App/Dashboard/TracesAnalyticsSeriesLabels.test.tsx +367 -0
- package/Tests/App/Dashboard/TracesEntityNames.test.tsx +585 -0
- package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +613 -0
- package/Tests/App/Dashboard/UseServiceNames.test.tsx +359 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +7 -0
- package/Tests/Models/InventoryItemNaming.test.ts +132 -16
- package/Tests/Models/SecurityDomainAccessControl.test.ts +61 -17
- package/Tests/Server/API/AIInvestigationAPI.test.ts +611 -2
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +1098 -0
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +409 -0
- package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +856 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +528 -1
- package/Tests/Server/API/TelemetryFacetsAPI.test.ts +810 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +240 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +229 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +66 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
- package/Tests/Server/Services/SecurityEventConnectionService.test.ts +1233 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +53 -0
- package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +218 -0
- package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +155 -1
- package/Tests/Server/Services/TraceAggregationExceptionScope.test.ts +142 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +85 -24
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +33 -0
- package/Tests/Server/Utils/AI/InvestigationEvidence.test.ts +1395 -0
- package/Tests/Server/Utils/AI/InvestigationReferences.test.ts +616 -0
- package/Tests/Server/Utils/AI/TimelineTools.test.ts +119 -0
- package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +151 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +65 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorExceptionScope.test.ts +224 -0
- package/Tests/Server/Utils/LoggerCore.test.ts +597 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +55 -2
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtil.test.ts +1109 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.test.ts +1240 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.test.ts +1853 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +1129 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.test.ts +1066 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.test.ts +1568 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.test.ts +930 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.test.ts +1409 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.test.ts +763 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.test.ts +1296 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.test.ts +1102 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.test.ts +1174 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.test.ts +1032 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.test.ts +1558 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +3041 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +1168 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +906 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.test.ts +1068 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.test.ts +1004 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +784 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +113 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +5 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +93 -13
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +23 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +25 -3
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +22 -8
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +82 -16
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSearchDetections.test.ts +730 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +1577 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayOriginAllowlist.test.ts +41 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1453 -18
- package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +711 -0
- package/Tests/Server/Utils/Telemetry/KubernetesResourceAttributes.test.ts +162 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +460 -13
- package/Tests/Server/Utils/Telemetry/ResourceFacetPlanner.test.ts +678 -0
- package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +868 -0
- package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +525 -0
- package/Tests/Server/Utils/Telemetry/TraceContextPropagation.test.ts +420 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilCorePaths.test.ts +1014 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilExhaustiveRotation.test.ts +9 -6
- package/Tests/Types/Rules/RuleCriteriaFieldRegistry.test.ts +276 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +73 -0
- package/Tests/Types/Rum/SessionReplayTransportContracts.test.ts +95 -0
- package/Tests/Types/SecurityEvent/Connectors/ConnectorDiagnostics.test.ts +82 -0
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +314 -0
- package/Tests/Types/Telemetry/ExceptionSpanScope.test.ts +89 -0
- package/Tests/Types/Telemetry/LlmConventions.test.ts +495 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +96 -0
- package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +304 -0
- package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +357 -0
- package/Tests/UI/Components/Card.test.tsx +312 -1
- package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +253 -0
- package/Tests/UI/Components/CardModelDetailRefresher.test.tsx +342 -0
- package/Tests/UI/Components/Checkbox.test.tsx +79 -0
- package/Tests/UI/Components/CopyTextButton.test.tsx +142 -0
- package/Tests/UI/Components/DetailCompactStyle.test.tsx +621 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +60 -0
- package/Tests/UI/Components/FacetSections.test.tsx +581 -0
- package/Tests/UI/Components/FacetSidebarControls.test.tsx +812 -0
- package/Tests/UI/Components/FacetVisibility.test.ts +429 -0
- package/Tests/UI/Components/LockedFilterActions.test.tsx +396 -0
- package/Tests/UI/Components/LockedFilterChip.test.tsx +651 -0
- package/Tests/UI/Components/LogsEntityNames.test.ts +1769 -0
- package/Tests/UI/Components/LogsEntityNamesComponents.test.tsx +696 -0
- package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +600 -0
- package/Tests/UI/Components/LogsViewerEntityNames.test.tsx +713 -0
- package/Tests/UI/Components/MarkdownInlineReferences.test.tsx +2079 -0
- package/Tests/UI/Components/MemberRoleAssignment.test.tsx +446 -0
- package/Tests/UI/Components/ModelDetailRefetch.test.tsx +397 -0
- package/Tests/UI/Components/ModelListRefetch.test.tsx +233 -0
- package/Tests/UI/Components/ModelPageModelChange.test.tsx +409 -0
- package/Tests/UI/Components/PaginationIntegration.test.tsx +25 -0
- package/Tests/UI/Components/ResourceFacetConfigs.test.ts +172 -0
- package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +32 -14
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +44 -1
- package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +304 -0
- package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +718 -0
- package/Tests/UI/Monitor/EvaluationLogList.test.tsx +303 -0
- package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +55 -1
- package/Tests/UI/Rum/FidelityNotices.test.ts +22 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +120 -136
- package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +988 -0
- package/Tests/UI/Rum/ReplayCard.test.tsx +32 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +709 -12
- package/Tests/UI/Rum/ReplayHeader.test.tsx +50 -1
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +67 -10
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +41 -12
- package/Tests/UI/Rum/ReplayStage.test.tsx +663 -1
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +173 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +189 -2
- package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +91 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +1 -1
- package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +585 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +844 -51
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +29 -1
- package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +288 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +31 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +6 -0
- package/Tests/UI/Utils/Clipboard.test.ts +154 -0
- package/Tests/UI/Utils/Navigation.test.ts +24 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +2205 -0
- package/Tests/UI/Utils/Telemetry/UseTelemetryEntityNames.test.tsx +844 -0
- package/Tests/Utils/AI/InvestigationReport.test.ts +2430 -0
- package/Tests/Utils/APIOutgoingRequestTracer.test.ts +137 -0
- package/Tests/Utils/Rum/SessionReplayHealth.test.ts +884 -0
- package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +40 -0
- package/Tests/Utils/Rum/SessionReplayRecordingEnded.test.ts +619 -0
- package/Tests/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.test.ts +631 -0
- package/Tests/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.test.ts +479 -0
- package/Tests/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.test.ts +507 -0
- package/Tests/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.test.ts +686 -0
- package/Tests/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.test.ts +474 -0
- package/Tests/Utils/SecurityEvent/Connectors/OktaNormalizer.test.ts +736 -0
- package/Tests/Utils/SecurityEvent/Connectors/SplunkNormalizer.test.ts +407 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +129 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +57 -1
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +36 -0
- package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +600 -0
- package/Tests/Utils/Telemetry/NetworkHost.test.ts +48 -0
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +154 -0
- package/Tests/Utils/Traces/CriticalPath.test.ts +25 -0
- package/Types/AI/AIChatTypes.ts +8 -0
- package/Types/AI/InvestigationEvidence.ts +96 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +5 -0
- package/Types/OnCallDutyPolicy/Layer.ts +12 -0
- package/Types/Permission.ts +2 -2
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
- package/Types/Rum/SessionReplay.ts +109 -0
- package/Types/Rum/SessionReplayApi.ts +31 -0
- package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +111 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +87 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +492 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +41 -0
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -1
- package/Types/SecurityEvent/GoogleSecOpsRegion.ts +34 -0
- package/Types/Telemetry/EntityType.ts +14 -0
- package/Types/Telemetry/ExceptionSpanScope.ts +83 -0
- package/Types/Telemetry/LockedFilterDetail.ts +46 -0
- package/Types/Telemetry/ResourceEntityFacet.ts +17 -10
- package/Types/Telemetry/ResourceFacetCatalog.ts +171 -0
- package/UI/Components/Card/Card.tsx +118 -83
- package/UI/Components/Checkbox/Checkbox.tsx +8 -5
- package/UI/Components/CopyTextButton/CopyTextButton.tsx +7 -1
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +4 -1
- package/UI/Components/Detail/Detail.tsx +137 -22
- package/UI/Components/ErrorBoundary.tsx +38 -0
- package/UI/Components/LogsViewer/LogsEntityNames.ts +912 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +156 -77
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +28 -11
- package/UI/Components/LogsViewer/components/FacetSection.tsx +66 -79
- package/UI/Components/LogsViewer/components/FacetValueRow.tsx +17 -2
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +45 -5
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +100 -19
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +156 -39
- package/UI/Components/LogsViewer/components/LogsTable.tsx +30 -8
- package/UI/Components/LogsViewer/types.ts +6 -0
- package/UI/Components/Markdown.tsx/InlineReferences.tsx +628 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +385 -312
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +50 -22
- package/UI/Components/ModelDetail/CardModelDetail.tsx +15 -0
- package/UI/Components/ModelDetail/ModelDetail.tsx +64 -19
- package/UI/Components/ModelList/ModelList.tsx +33 -8
- package/UI/Components/Page/ModelPage.tsx +119 -54
- package/UI/Components/Table/Table.tsx +8 -0
- package/UI/Components/Table/TableRow.tsx +13 -5
- package/UI/Components/TelemetryViewer/FacetVisibility.ts +229 -0
- package/UI/Components/TelemetryViewer/ResourceFacetConfigs.ts +46 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +11 -0
- package/UI/Components/TelemetryViewer/components/FacetSearchInput.tsx +79 -0
- package/UI/Components/TelemetryViewer/components/FacetSectionHeader.tsx +69 -0
- package/UI/Components/TelemetryViewer/components/FacetShowMoreButton.tsx +36 -0
- package/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.tsx +88 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +205 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +496 -0
- package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +30 -10
- package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +203 -10
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSection.tsx +60 -73
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +94 -7
- package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +17 -2
- package/UI/Components/TelemetryViewer/types.ts +19 -0
- package/UI/Components/TelemetryViewer/useFacetSearchExemptions.ts +158 -0
- package/UI/Components/TelemetryViewer/useFacetSectionSearch.ts +102 -0
- package/UI/Utils/Clipboard.ts +68 -2
- package/UI/Utils/Navigation.ts +17 -2
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +620 -0
- package/UI/Utils/Telemetry/UseTelemetryEntityNames.ts +151 -0
- package/Utils/AI/InvestigationReport.ts +1789 -0
- package/Utils/API.ts +90 -1
- package/Utils/Rum/SessionReplayHealth.ts +11 -0
- package/Utils/Rum/SessionReplayRecordingEnded.ts +134 -0
- package/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.ts +427 -0
- package/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.ts +197 -0
- package/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.ts +464 -0
- package/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.ts +567 -0
- package/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.ts +299 -0
- package/Utils/SecurityEvent/Connectors/OktaNormalizer.ts +467 -0
- package/Utils/SecurityEvent/Connectors/SplunkNormalizer.ts +439 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +124 -12
- package/Utils/Telemetry/CrossSignalScope.ts +22 -8
- package/Utils/Telemetry/EntityRelationship.ts +8 -0
- package/Utils/Telemetry/LockedFilterSearch.ts +412 -0
- package/Utils/Telemetry/NetworkHost.ts +43 -0
- package/Utils/Telemetry/OriginAllowList.ts +139 -4
- package/Utils/Traces/CriticalPath.ts +10 -4
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +490 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js.map +1 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js +287 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +2 -2
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +336 -27
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +182 -7
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -1
- package/build/dist/Server/API/SecurityEventConnectionAPI.js +171 -0
- package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -0
- package/build/dist/Server/API/TelemetryAPI.js +248 -170
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +57 -4
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +7 -16
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +8 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +22 -0
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +8 -17
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +4 -14
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventConnectionRunService.js +9 -0
- package/build/dist/Server/Services/SecurityEventConnectionRunService.js.map +1 -0
- package/build/dist/Server/Services/SecurityEventConnectionService.js +356 -0
- package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -0
- package/build/dist/Server/Services/TraceAggregationService.js +51 -25
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +14 -7
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js +468 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js +230 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +32 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +6 -2
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +59 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +5 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js +752 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js +493 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +352 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js +405 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js +466 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js +344 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js +511 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js +406 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js +336 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js +474 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js +417 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js +314 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js +494 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +719 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +404 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +209 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +40 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js +494 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js +379 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +27 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +234 -61
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +537 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +572 -115
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +35 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +52 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +521 -32
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +10 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +8 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js +80 -0
- package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +122 -67
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js +146 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +174 -248
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +492 -0
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js +259 -0
- package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry.js +11 -5
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/InvestigationEvidence.js +2 -0
- package/build/dist/Types/AI/InvestigationEvidence.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +11 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/Permission.js +2 -2
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +9 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +95 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js +18 -0
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +2 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +374 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +35 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js +35 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +14 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ExceptionSpanScope.js +59 -0
- package/build/dist/Types/Telemetry/ExceptionSpanScope.js.map +1 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js +16 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js.map +1 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js +16 -10
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -1
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +119 -0
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -0
- package/build/dist/UI/Components/Card/Card.js +34 -17
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js +6 -4
- package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +63 -13
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +34 -0
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js +535 -0
- package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +117 -57
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +5 -7
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetSection.js +31 -44
- package/build/dist/UI/Components/LogsViewer/components/FacetSection.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +17 -3
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +19 -3
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +64 -18
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +100 -41
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +13 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js +403 -0
- package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +197 -179
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +30 -21
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +12 -0
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js +46 -12
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +26 -7
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelPage.js +62 -34
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/Table/Table.js +3 -1
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +8 -1
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +111 -0
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js +22 -0
- package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js +36 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js +21 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js +14 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js +27 -0
- package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +88 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +228 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +6 -6
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +111 -12
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js +27 -40
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +70 -10
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +17 -3
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/types.js +0 -4
- package/build/dist/UI/Components/TelemetryViewer/types.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js +70 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js +52 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js.map +1 -0
- package/build/dist/UI/Utils/Clipboard.js +59 -2
- package/build/dist/UI/Utils/Clipboard.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +11 -2
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +471 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js +113 -0
- package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js.map +1 -0
- package/build/dist/Utils/AI/InvestigationReport.js +1241 -0
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -0
- package/build/dist/Utils/API.js +25 -0
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayHealth.js +10 -0
- package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js +54 -0
- package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js +311 -0
- package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js +150 -0
- package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js +328 -0
- package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js +405 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js +212 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js +351 -0
- package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js +348 -0
- package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +103 -10
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +16 -5
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +7 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js +277 -0
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -0
- package/build/dist/Utils/Telemetry/NetworkHost.js +39 -0
- package/build/dist/Utils/Telemetry/NetworkHost.js.map +1 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js +105 -4
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
- package/build/dist/Utils/Traces/CriticalPath.js +9 -4
- package/build/dist/Utils/Traces/CriticalPath.js.map +1 -1
- package/package.json +1 -1
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +0 -600
- package/UI/Components/GanttChart/Bar/BarLabel.tsx +0 -17
- package/UI/Components/GanttChart/Bar/Index.tsx +0 -149
- package/UI/Components/GanttChart/ChartContainer.tsx +0 -50
- package/UI/Components/GanttChart/Index.tsx +0 -90
- package/UI/Components/GanttChart/Row/Index.tsx +0 -22
- package/UI/Components/GanttChart/Row/Row.tsx +0 -231
- package/UI/Components/GanttChart/Row/RowLabel.tsx +0 -30
- package/UI/Components/GanttChart/Rows.tsx +0 -59
- package/UI/Components/GanttChart/Timeline/Index.tsx +0 -46
- package/UI/Components/GanttChart/Timeline/TimelineInterval.tsx +0 -33
- package/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.tsx +0 -43
- package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js +0 -8
- package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Bar/Index.js +0 -77
- package/build/dist/UI/Components/GanttChart/Bar/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/ChartContainer.js +0 -33
- package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Index.js +0 -39
- package/build/dist/UI/Components/GanttChart/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/Index.js +0 -7
- package/build/dist/UI/Components/GanttChart/Row/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/Row.js +0 -106
- package/build/dist/UI/Components/GanttChart/Row/Row.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/RowLabel.js +0 -10
- package/build/dist/UI/Components/GanttChart/Row/RowLabel.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Rows.js +0 -19
- package/build/dist/UI/Components/GanttChart/Rows.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/Index.js +0 -16
- package/build/dist/UI/Components/GanttChart/Timeline/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js +0 -13
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js +0 -13
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js.map +0 -1
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { LockedFilterDetail } from "../../Types/Telemetry/LockedFilterDetail";
|
|
2
|
+
import { buildSearchTokenValue } from "../../Types/Telemetry/TelemetrySearchQuery";
|
|
3
|
+
import { escapeWildcards } from "../../Types/BaseDatabase/WildcardPattern";
|
|
4
|
+
import {
|
|
5
|
+
DictionaryFilterOperator,
|
|
6
|
+
detectOperatorFromValue,
|
|
7
|
+
} from "../../UI/Components/Dictionary/DictionaryFilterOperator";
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* Turn a locked filter chip back into the search-bar syntax of the explorer
|
|
11
|
+
* it belongs to, so a reader can copy the filters a resource page pinned and
|
|
12
|
+
* paste them into the main Logs / Traces / Metrics page.
|
|
13
|
+
*
|
|
14
|
+
* The grammar is the shared one in Types/Telemetry/TelemetrySearchQuery; what
|
|
15
|
+
* differs per signal is which top-level columns have a field token at all:
|
|
16
|
+
*
|
|
17
|
+
* logs @<attr>:<v> trace:<id> span:<id> service:<entity id> severity:<level>
|
|
18
|
+
* traces @<attr>:<v> trace:<id> span:<id> service:<entity id>
|
|
19
|
+
* status:<code> kind:<enum> hasexception:<bool> name:<text> statusmessage:<text>
|
|
20
|
+
* metrics @<attr>:<v>
|
|
21
|
+
*
|
|
22
|
+
* `service:` carries the ENTITY ID on logs and traces — both explorers filter
|
|
23
|
+
* the polymorphic `primaryEntityId` column and accept an id verbatim — and is
|
|
24
|
+
* deliberately absent on metrics, whose `service:` token matches Service rows
|
|
25
|
+
* by NAME and would turn an id into an empty result. Values are escaped by
|
|
26
|
+
* the grammar's own {@link buildSearchTokenValue} so a literal `*`, `?`, a
|
|
27
|
+
* quote or a leading operator character means itself.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
export type TelemetrySignal = "logs" | "traces" | "metrics";
|
|
31
|
+
|
|
32
|
+
/** Human name of each explorer, for button labels and tooltips. */
|
|
33
|
+
export const TELEMETRY_EXPLORER_LABELS: Readonly<
|
|
34
|
+
Record<TelemetrySignal, string>
|
|
35
|
+
> = {
|
|
36
|
+
logs: "Logs",
|
|
37
|
+
traces: "Traces",
|
|
38
|
+
metrics: "Metrics",
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const ATTRIBUTE_FACET_PREFIX: string = "attributes.";
|
|
42
|
+
|
|
43
|
+
/*
|
|
44
|
+
* A search token KEY is read up to the first colon, ends at whitespace and
|
|
45
|
+
* cannot be quoted, and a leading `@` / `-` is grammar — so a key carrying
|
|
46
|
+
* any of those cannot ride a token at all.
|
|
47
|
+
*/
|
|
48
|
+
const UNSAFE_KEY_CHARACTERS: RegExp = /[\s":]/;
|
|
49
|
+
|
|
50
|
+
/*
|
|
51
|
+
* Field tokens per signal, keyed by the chip's facetKey. Only columns whose
|
|
52
|
+
* value is accepted verbatim by the target explorer are listed.
|
|
53
|
+
*
|
|
54
|
+
* The traces columns beyond the ids are the ones a stored span query (an
|
|
55
|
+
* incident's or monitor's snapshot) pins, and each takes the chip's raw
|
|
56
|
+
* value as-is: `status:` resolves the numeric status code the chip carries
|
|
57
|
+
* (toSpanStatusCode), `kind:` passes an OTel enum string through
|
|
58
|
+
* (toSpanKind), `hasexception:` reads "true" / "false", and `name:` /
|
|
59
|
+
* `statusmessage:` match a single value as a substring exactly as the stored
|
|
60
|
+
* query does (TEXT_CHIP_FIELDS in TracesViewer) — several values of one
|
|
61
|
+
* column match exactly on both sides too.
|
|
62
|
+
*/
|
|
63
|
+
const FIELD_TOKENS_BY_SIGNAL: Readonly<
|
|
64
|
+
Record<TelemetrySignal, Readonly<Record<string, string>>>
|
|
65
|
+
> = {
|
|
66
|
+
logs: {
|
|
67
|
+
traceId: "trace",
|
|
68
|
+
spanId: "span",
|
|
69
|
+
severityText: "severity",
|
|
70
|
+
primaryEntityId: "service",
|
|
71
|
+
serviceId: "service",
|
|
72
|
+
},
|
|
73
|
+
traces: {
|
|
74
|
+
traceId: "trace",
|
|
75
|
+
spanId: "span",
|
|
76
|
+
primaryEntityId: "service",
|
|
77
|
+
serviceId: "service",
|
|
78
|
+
statusCode: "status",
|
|
79
|
+
kind: "kind",
|
|
80
|
+
hasException: "hasexception",
|
|
81
|
+
name: "name",
|
|
82
|
+
statusMessage: "statusmessage",
|
|
83
|
+
},
|
|
84
|
+
metrics: {},
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
type IsSearchTokenSafeKeyFunction = (key: string) => boolean;
|
|
88
|
+
|
|
89
|
+
/** Whether an attribute key can be the key of an `@key:value` token. */
|
|
90
|
+
export const isSearchTokenSafeKey: IsSearchTokenSafeKeyFunction = (
|
|
91
|
+
key: string,
|
|
92
|
+
): boolean => {
|
|
93
|
+
if (key.length === 0) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (UNSAFE_KEY_CHARACTERS.test(key)) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (key.startsWith("@") || key.startsWith("-")) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return true;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
type BuildSearchTokenForFilterFunction = (
|
|
109
|
+
signal: TelemetrySignal,
|
|
110
|
+
facetKey: string,
|
|
111
|
+
value: string,
|
|
112
|
+
) => string | null;
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The search token that reproduces one chip on the explorer for `signal`, or
|
|
116
|
+
* null when that explorer's grammar has no token for the chip's column (a
|
|
117
|
+
* session id, a metrics service id, an unsafe attribute key, an empty value).
|
|
118
|
+
*/
|
|
119
|
+
export const buildSearchTokenForFilter: BuildSearchTokenForFilterFunction = (
|
|
120
|
+
signal: TelemetrySignal,
|
|
121
|
+
facetKey: string,
|
|
122
|
+
value: string,
|
|
123
|
+
): string | null => {
|
|
124
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (facetKey.startsWith(ATTRIBUTE_FACET_PREFIX)) {
|
|
129
|
+
const attributeKey: string = facetKey.substring(
|
|
130
|
+
ATTRIBUTE_FACET_PREFIX.length,
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
if (!isSearchTokenSafeKey(attributeKey)) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return `@${attributeKey}:${buildSearchTokenValue(value)}`;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const fieldToken: string | undefined =
|
|
141
|
+
FIELD_TOKENS_BY_SIGNAL[signal][facetKey];
|
|
142
|
+
|
|
143
|
+
if (!fieldToken) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return `${fieldToken}:${buildSearchTokenValue(value)}`;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
/*
|
|
151
|
+
* The list grammar splits `(a OR b)` on `,` and on ` OR ` without looking at
|
|
152
|
+
* quotes, so an entry carrying either cannot be spelled inside a list at all.
|
|
153
|
+
*/
|
|
154
|
+
const LIST_UNSAFE_ENTRY: RegExp = /,|\s+OR\s+/i;
|
|
155
|
+
|
|
156
|
+
const QUOTE_REGEX: RegExp = /(")/g;
|
|
157
|
+
const LEADING_OPERATOR_REGEX: RegExp = /^([-~!<>])/;
|
|
158
|
+
const WRAPPED_LIST_REGEX: RegExp = /^(\()(.*)(\))$|^(\[)(.*)(\])$/;
|
|
159
|
+
const WHITESPACE_REGEX: RegExp = /\s/;
|
|
160
|
+
|
|
161
|
+
type RenderGlobFunction = (glob: string) => string;
|
|
162
|
+
|
|
163
|
+
/*
|
|
164
|
+
* A glob rendered as a token value: quotes, a leading operator character and
|
|
165
|
+
* a wrapping bracket pair are escaped exactly as {@link buildSearchTokenValue}
|
|
166
|
+
* escapes them, but `*` and `?` are LEFT ALONE — they are the point of the
|
|
167
|
+
* glob. Quotes protect spaces, not wildcards, so a glob with a space is
|
|
168
|
+
* quoted and still matches as a pattern.
|
|
169
|
+
*/
|
|
170
|
+
const renderGlob: RenderGlobFunction = (glob: string): string => {
|
|
171
|
+
const escaped: string = glob
|
|
172
|
+
.replace(QUOTE_REGEX, "\\$1")
|
|
173
|
+
.replace(LEADING_OPERATOR_REGEX, "\\$1")
|
|
174
|
+
.replace(WRAPPED_LIST_REGEX, "\\$&");
|
|
175
|
+
|
|
176
|
+
return WHITESPACE_REGEX.test(escaped) ? `"${escaped}"` : escaped;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
type RenderListFunction = (
|
|
180
|
+
entries: Array<string>,
|
|
181
|
+
render: (entry: string) => string,
|
|
182
|
+
) => string | null;
|
|
183
|
+
|
|
184
|
+
/*
|
|
185
|
+
* `(a OR b)` — one entry is written bare (the parser reads a one-entry list
|
|
186
|
+
* as plain equality anyway), and an entry the list grammar would split in
|
|
187
|
+
* two makes the whole list unspellable.
|
|
188
|
+
*/
|
|
189
|
+
const renderList: RenderListFunction = (
|
|
190
|
+
entries: Array<string>,
|
|
191
|
+
render: (entry: string) => string,
|
|
192
|
+
): string | null => {
|
|
193
|
+
const meaningful: Array<string> = entries.filter((entry: string): boolean => {
|
|
194
|
+
return entry.length > 0;
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
if (meaningful.length === 0) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if (
|
|
202
|
+
meaningful.some((entry: string): boolean => {
|
|
203
|
+
return LIST_UNSAFE_ENTRY.test(entry);
|
|
204
|
+
})
|
|
205
|
+
) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (meaningful.length === 1) {
|
|
210
|
+
return render(meaningful[0]!);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return `(${meaningful.map(render).join(" OR ")})`;
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
const GLOB_SEPARATOR: string = " OR ";
|
|
217
|
+
|
|
218
|
+
type SplitGlobsFunction = (value: string) => Array<string>;
|
|
219
|
+
|
|
220
|
+
/*
|
|
221
|
+
* The attribute filter form stores several globs joined by " OR " (see
|
|
222
|
+
* DictionaryFilterOperator.joinGlobs); the same split recovers them.
|
|
223
|
+
*/
|
|
224
|
+
const splitGlobs: SplitGlobsFunction = (value: string): Array<string> => {
|
|
225
|
+
return value
|
|
226
|
+
.split(GLOB_SEPARATOR)
|
|
227
|
+
.map((glob: string): string => {
|
|
228
|
+
return glob.trim();
|
|
229
|
+
})
|
|
230
|
+
.filter((glob: string): boolean => {
|
|
231
|
+
return glob.length > 0;
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
type BuildSearchTokenForOperatorValueFunction = (
|
|
236
|
+
attributeKey: string,
|
|
237
|
+
value: unknown,
|
|
238
|
+
) => string | null;
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* The `@key:value` token — negated as `-@key:value` where the grammar puts
|
|
242
|
+
* the negation on the token — that reproduces an attribute filter pinned
|
|
243
|
+
* with an OPERATOR: the shape a log monitor's criteria or an incident's
|
|
244
|
+
* stored query hands the viewer (`Includes`, `Search`, `NotEqual`, ...).
|
|
245
|
+
*
|
|
246
|
+
* Every operator the attribute filter form offers has a spelling in the
|
|
247
|
+
* shared grammar, and the explorer compiles that spelling to the same
|
|
248
|
+
* predicate class the form stored:
|
|
249
|
+
*
|
|
250
|
+
* equals @k:v not equal @k:!v
|
|
251
|
+
* contains @k:~v not contains -@k:~v
|
|
252
|
+
* starts with @k:v* ends with @k:*v
|
|
253
|
+
* matches @k:g not matches -@k:g
|
|
254
|
+
* is any of @k:(a OR b) is none of -@k:(a OR b)
|
|
255
|
+
* > >= < <= @k:>n ... is empty -@k:*
|
|
256
|
+
* is not empty @k:*
|
|
257
|
+
*
|
|
258
|
+
* Literal parts go through the grammar's own escaping, so a literal that
|
|
259
|
+
* starts with `~` or carries a `*` still means itself; a glob keeps its
|
|
260
|
+
* wildcards. Null for a shape the grammar cannot spell: an array of several
|
|
261
|
+
* operators on one key, a list entry the list grammar would split, an unsafe
|
|
262
|
+
* key, an empty value.
|
|
263
|
+
*/
|
|
264
|
+
export const buildSearchTokenForOperatorValue: BuildSearchTokenForOperatorValueFunction =
|
|
265
|
+
(attributeKey: string, value: unknown): string | null => {
|
|
266
|
+
if (!isSearchTokenSafeKey(attributeKey)) {
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (value === undefined || value === null || Array.isArray(value)) {
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const detected: ReturnType<typeof detectOperatorFromValue> =
|
|
275
|
+
detectOperatorFromValue(value);
|
|
276
|
+
const literal: string = detected.rawValue;
|
|
277
|
+
const entries: Array<string> = detected.rawValues || [];
|
|
278
|
+
|
|
279
|
+
const positive: (rendered: string) => string = (
|
|
280
|
+
rendered: string,
|
|
281
|
+
): string => {
|
|
282
|
+
return `@${attributeKey}:${rendered}`;
|
|
283
|
+
};
|
|
284
|
+
const negative: (rendered: string) => string = (
|
|
285
|
+
rendered: string,
|
|
286
|
+
): string => {
|
|
287
|
+
return `-@${attributeKey}:${rendered}`;
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
switch (detected.operator) {
|
|
291
|
+
case DictionaryFilterOperator.EqualTo:
|
|
292
|
+
return literal.length > 0
|
|
293
|
+
? positive(buildSearchTokenValue(literal))
|
|
294
|
+
: null;
|
|
295
|
+
case DictionaryFilterOperator.NotEqual:
|
|
296
|
+
return literal.length > 0
|
|
297
|
+
? positive(`!${buildSearchTokenValue(literal)}`)
|
|
298
|
+
: null;
|
|
299
|
+
case DictionaryFilterOperator.Contains:
|
|
300
|
+
return literal.length > 0
|
|
301
|
+
? positive(`~${buildSearchTokenValue(literal)}`)
|
|
302
|
+
: null;
|
|
303
|
+
case DictionaryFilterOperator.NotContains:
|
|
304
|
+
return literal.length > 0
|
|
305
|
+
? negative(`~${buildSearchTokenValue(literal)}`)
|
|
306
|
+
: null;
|
|
307
|
+
case DictionaryFilterOperator.StartsWith:
|
|
308
|
+
return literal.length > 0
|
|
309
|
+
? positive(renderGlob(`${escapeWildcards(literal)}*`))
|
|
310
|
+
: null;
|
|
311
|
+
case DictionaryFilterOperator.EndsWith:
|
|
312
|
+
return literal.length > 0
|
|
313
|
+
? positive(renderGlob(`*${escapeWildcards(literal)}`))
|
|
314
|
+
: null;
|
|
315
|
+
case DictionaryFilterOperator.Matches: {
|
|
316
|
+
// The form joins several globs with " OR "; split them back apart.
|
|
317
|
+
const rendered: string | null = renderList(
|
|
318
|
+
splitGlobs(literal),
|
|
319
|
+
renderGlob,
|
|
320
|
+
);
|
|
321
|
+
return rendered ? positive(rendered) : null;
|
|
322
|
+
}
|
|
323
|
+
case DictionaryFilterOperator.NotMatches: {
|
|
324
|
+
const rendered: string | null = renderList(
|
|
325
|
+
splitGlobs(literal),
|
|
326
|
+
renderGlob,
|
|
327
|
+
);
|
|
328
|
+
return rendered ? negative(rendered) : null;
|
|
329
|
+
}
|
|
330
|
+
case DictionaryFilterOperator.IsAnyOf: {
|
|
331
|
+
const rendered: string | null = renderList(
|
|
332
|
+
entries,
|
|
333
|
+
buildSearchTokenValue,
|
|
334
|
+
);
|
|
335
|
+
return rendered ? positive(rendered) : null;
|
|
336
|
+
}
|
|
337
|
+
case DictionaryFilterOperator.IsNoneOf: {
|
|
338
|
+
const rendered: string | null = renderList(
|
|
339
|
+
entries,
|
|
340
|
+
buildSearchTokenValue,
|
|
341
|
+
);
|
|
342
|
+
return rendered ? negative(rendered) : null;
|
|
343
|
+
}
|
|
344
|
+
case DictionaryFilterOperator.GreaterThan:
|
|
345
|
+
return literal.length > 0
|
|
346
|
+
? positive(`>${buildSearchTokenValue(literal)}`)
|
|
347
|
+
: null;
|
|
348
|
+
case DictionaryFilterOperator.GreaterThanOrEqual:
|
|
349
|
+
return literal.length > 0
|
|
350
|
+
? positive(`>=${buildSearchTokenValue(literal)}`)
|
|
351
|
+
: null;
|
|
352
|
+
case DictionaryFilterOperator.LessThan:
|
|
353
|
+
return literal.length > 0
|
|
354
|
+
? positive(`<${buildSearchTokenValue(literal)}`)
|
|
355
|
+
: null;
|
|
356
|
+
case DictionaryFilterOperator.LessThanOrEqual:
|
|
357
|
+
return literal.length > 0
|
|
358
|
+
? positive(`<=${buildSearchTokenValue(literal)}`)
|
|
359
|
+
: null;
|
|
360
|
+
case DictionaryFilterOperator.IsEmpty:
|
|
361
|
+
return negative("*");
|
|
362
|
+
case DictionaryFilterOperator.IsNotEmpty:
|
|
363
|
+
return positive("*");
|
|
364
|
+
default:
|
|
365
|
+
return null;
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
/** The subset of a chip this module reads. */
|
|
370
|
+
export interface SearchableLockedFilter {
|
|
371
|
+
facetKey: string;
|
|
372
|
+
value: string;
|
|
373
|
+
lockedDetail?: LockedFilterDetail | undefined;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
type BuildSearchTextForFiltersFunction = (
|
|
377
|
+
signal: TelemetrySignal,
|
|
378
|
+
filters: Array<SearchableLockedFilter>,
|
|
379
|
+
) => string;
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* The search-bar text that reproduces every given locked chip at once —
|
|
383
|
+
* tokens joined by single spaces, duplicates dropped, order kept.
|
|
384
|
+
*
|
|
385
|
+
* A chip that carries a {@link LockedFilterDetail} is trusted on its own
|
|
386
|
+
* `searchToken` (present or deliberately absent — a filter the grammar
|
|
387
|
+
* cannot spell has none, and re-deriving one from the chip's display text
|
|
388
|
+
* would produce a token that filters on the wrong thing). A chip without one
|
|
389
|
+
* falls back to the column rules above.
|
|
390
|
+
*/
|
|
391
|
+
export const buildSearchTextForFilters: BuildSearchTextForFiltersFunction = (
|
|
392
|
+
signal: TelemetrySignal,
|
|
393
|
+
filters: Array<SearchableLockedFilter>,
|
|
394
|
+
): string => {
|
|
395
|
+
const tokens: Array<string> = [];
|
|
396
|
+
const seen: Set<string> = new Set<string>();
|
|
397
|
+
|
|
398
|
+
for (const filter of filters) {
|
|
399
|
+
const token: string | null = filter.lockedDetail
|
|
400
|
+
? filter.lockedDetail.searchToken || null
|
|
401
|
+
: buildSearchTokenForFilter(signal, filter.facetKey, filter.value);
|
|
402
|
+
|
|
403
|
+
if (!token || seen.has(token)) {
|
|
404
|
+
continue;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
seen.add(token);
|
|
408
|
+
tokens.push(token);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
return tokens.join(" ");
|
|
412
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { canonicalizeEntityValue } from "./EntityKey";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Network-host helpers shared by the dependency discovery job and the trace
|
|
5
|
+
* propagation allowlist. Isomorphic and dependency-free on purpose: both
|
|
6
|
+
* callers sit low in the server import graph.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const IPV4_LOOPBACK_REGEX: RegExp = /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Normalize a network address attribute to a bare, lowercase host: no
|
|
13
|
+
* scheme, credentials, path, port, IPv6 brackets or trailing dot. Returns
|
|
14
|
+
* null when nothing host-like is left.
|
|
15
|
+
*/
|
|
16
|
+
export function normalizeHost(value: string | undefined | null): string | null {
|
|
17
|
+
let host: string = canonicalizeEntityValue(value || "");
|
|
18
|
+
if (!host) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
host = host.replace(/^[a-z][a-z0-9+.-]*:\/\//, "");
|
|
22
|
+
host = host.split("/")[0] || "";
|
|
23
|
+
host = host.includes("@") ? host.substring(host.lastIndexOf("@") + 1) : host;
|
|
24
|
+
if (host.startsWith("[")) {
|
|
25
|
+
const closing: number = host.indexOf("]");
|
|
26
|
+
host = closing > 0 ? host.substring(1, closing) : host.substring(1);
|
|
27
|
+
} else if ((host.match(/:/g) || []).length === 1) {
|
|
28
|
+
host = host.split(":")[0] || "";
|
|
29
|
+
}
|
|
30
|
+
host = host.replace(/\.+$/, "");
|
|
31
|
+
return host.length > 0 ? host : null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Loopback targets differ per caller, so they can never be one shared node. */
|
|
35
|
+
export function isLoopbackHost(host: string): boolean {
|
|
36
|
+
return (
|
|
37
|
+
host === "localhost" ||
|
|
38
|
+
host.endsWith(".localhost") ||
|
|
39
|
+
host === "::1" ||
|
|
40
|
+
host === "0.0.0.0" ||
|
|
41
|
+
IPV4_LOOPBACK_REGEX.test(host)
|
|
42
|
+
);
|
|
43
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
|
-
*
|
|
3
|
-
* to decide "is this browser allowed to write into
|
|
2
|
+
* Client-origin allowlist matching and validation, shared by every surface
|
|
3
|
+
* that has to decide "is this browser or installed app allowed to write into
|
|
4
|
+
* this project?".
|
|
4
5
|
*
|
|
5
6
|
* This module is deliberately PURE and isomorphic - no server imports, no
|
|
6
7
|
* Redis, no models - because the same rules have to hold in three places that
|
|
@@ -30,6 +31,8 @@
|
|
|
30
31
|
* origin binding is exactly the credential we are trying to stop
|
|
31
32
|
* shipping.
|
|
32
33
|
*/
|
|
34
|
+
import { SESSION_REPLAY_MAX_MOBILE_APP_IDENTIFIER_LENGTH } from "../../Types/Rum/SessionReplay";
|
|
35
|
+
|
|
33
36
|
/*
|
|
34
37
|
* Hoisted rather than written inline at each call site: none carries the `g`
|
|
35
38
|
* flag, so `.test` is stateless and one compiled instance is safe to share,
|
|
@@ -38,8 +41,84 @@
|
|
|
38
41
|
const WHITESPACE_ANYWHERE: RegExp = /\s/;
|
|
39
42
|
const DIGITS_ONLY: RegExp = /^[0-9]+$/;
|
|
40
43
|
const HOST_LABEL_CHARACTERS: RegExp = /^[a-z0-9-]+$/;
|
|
44
|
+
const MOBILE_APP_IDENTIFIER_LABEL_CHARACTERS: RegExp = /^[a-z0-9_-]+$/;
|
|
41
45
|
|
|
42
46
|
export default class OriginAllowList {
|
|
47
|
+
/*
|
|
48
|
+
* Validate an Android application id / Apple bundle identifier before it
|
|
49
|
+
* is allowed to participate in authorization. The accepted grammar is the
|
|
50
|
+
* safe common shape of the two platforms: reverse-DNS labels made from
|
|
51
|
+
* ASCII letters, digits, hyphens and underscores. Requiring at least two
|
|
52
|
+
* labels prevents short, ambiguous values such as `debug` from becoming a
|
|
53
|
+
* project-wide identity by accident.
|
|
54
|
+
*/
|
|
55
|
+
public static validateMobileAppIdentifier(identifier: string): string | null {
|
|
56
|
+
if (typeof identifier !== "string") {
|
|
57
|
+
return "Mobile app identifier must be text.";
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const trimmed: string = identifier.trim();
|
|
61
|
+
|
|
62
|
+
if (!trimmed) {
|
|
63
|
+
return "Mobile app identifier cannot be empty.";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (trimmed.length > SESSION_REPLAY_MAX_MOBILE_APP_IDENTIFIER_LENGTH) {
|
|
67
|
+
return `Mobile app identifier cannot exceed ${SESSION_REPLAY_MAX_MOBILE_APP_IDENTIFIER_LENGTH} characters.`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (WHITESPACE_ANYWHERE.test(trimmed)) {
|
|
71
|
+
return "Mobile app identifier cannot contain spaces.";
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const labels: Array<string> = trimmed.toLowerCase().split(".");
|
|
75
|
+
|
|
76
|
+
if (labels.length < 2) {
|
|
77
|
+
return "Mobile app identifier must use at least two reverse-DNS labels, for example com.example.app.";
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
for (const label of labels) {
|
|
81
|
+
if (!label) {
|
|
82
|
+
return "Mobile app identifier cannot contain an empty label.";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (!MOBILE_APP_IDENTIFIER_LABEL_CHARACTERS.test(label)) {
|
|
86
|
+
return "Mobile app identifier may contain only letters, digits, hyphens, underscores and dots.";
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (
|
|
90
|
+
label.startsWith("-") ||
|
|
91
|
+
label.endsWith("-") ||
|
|
92
|
+
label.startsWith("_") ||
|
|
93
|
+
label.endsWith("_")
|
|
94
|
+
) {
|
|
95
|
+
return "Each mobile app identifier label must start and end with a letter or digit.";
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/*
|
|
103
|
+
* Canonical identifier used in an app:// authorization origin. Returning
|
|
104
|
+
* an empty string on invalid input keeps the hot ingest path branchless at
|
|
105
|
+
* the call site and mirrors normalizeOrigin's invalid-input contract.
|
|
106
|
+
*/
|
|
107
|
+
public static normalizeMobileAppIdentifier(identifier: string): string {
|
|
108
|
+
if (this.validateMobileAppIdentifier(identifier) !== null) {
|
|
109
|
+
return "";
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return identifier.trim().toLowerCase();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public static getMobileAppOrigin(identifier: string): string | undefined {
|
|
116
|
+
const normalizedIdentifier: string =
|
|
117
|
+
this.normalizeMobileAppIdentifier(identifier);
|
|
118
|
+
|
|
119
|
+
return normalizedIdentifier ? `app://${normalizedIdentifier}` : undefined;
|
|
120
|
+
}
|
|
121
|
+
|
|
43
122
|
/*
|
|
44
123
|
* Canonical form for comparison: trimmed, lowercased, with trailing
|
|
45
124
|
* slashes removed.
|
|
@@ -129,6 +208,18 @@ export default class OriginAllowList {
|
|
|
129
208
|
return true;
|
|
130
209
|
}
|
|
131
210
|
|
|
211
|
+
/*
|
|
212
|
+
* Wildcards exist only for HTTP(S) host names. An app:// identity is an
|
|
213
|
+
* exact installed binary identifier; allowing app://*.example would let
|
|
214
|
+
* any sibling application claim the public ingestion key.
|
|
215
|
+
*/
|
|
216
|
+
if (
|
|
217
|
+
!normalizedAllowed.startsWith("http://*.") &&
|
|
218
|
+
!normalizedAllowed.startsWith("https://*.")
|
|
219
|
+
) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
|
|
132
223
|
const wildcardIndex: number = normalizedAllowed.indexOf("://*.");
|
|
133
224
|
|
|
134
225
|
if (wildcardIndex === -1) {
|
|
@@ -184,6 +275,7 @@ export default class OriginAllowList {
|
|
|
184
275
|
* real; no public-suffix check is
|
|
185
276
|
* attempted because it is wrong more
|
|
186
277
|
* often than right on internal TLDs)
|
|
278
|
+
* app://com.example.checkout exact mobile bundle/package id
|
|
187
279
|
*
|
|
188
280
|
* REJECTED
|
|
189
281
|
* "" / " " empty
|
|
@@ -217,6 +309,8 @@ export default class OriginAllowList {
|
|
|
217
309
|
* https://example..com empty label
|
|
218
310
|
* https://-example.com label starting or ending with "-"
|
|
219
311
|
* https://exa_mple.com character not legal in a hostname
|
|
312
|
+
* app://*.example.com mobile identities never wildcard
|
|
313
|
+
* app://com.example.app:123 mobile identities never carry ports
|
|
220
314
|
*/
|
|
221
315
|
public static validateOriginPattern(pattern: string): string | null {
|
|
222
316
|
if (typeof pattern !== "string") {
|
|
@@ -244,13 +338,54 @@ export default class OriginAllowList {
|
|
|
244
338
|
const schemeSeparatorIndex: number = value.indexOf("://");
|
|
245
339
|
|
|
246
340
|
if (schemeSeparatorIndex === -1) {
|
|
247
|
-
return `"${trimmed}" must start with http:// or
|
|
341
|
+
return `"${trimmed}" must start with http://, https:// or app://.`;
|
|
248
342
|
}
|
|
249
343
|
|
|
250
344
|
const scheme: string = value.substring(0, schemeSeparatorIndex);
|
|
251
345
|
|
|
346
|
+
if (scheme === "app") {
|
|
347
|
+
let identifier: string = value.substring(schemeSeparatorIndex + 3);
|
|
348
|
+
|
|
349
|
+
if (identifier.endsWith("/")) {
|
|
350
|
+
identifier = identifier.substring(0, identifier.length - 1);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
if (identifier.includes("*")) {
|
|
354
|
+
return `"${trimmed}" cannot wildcard a mobile app identifier. List each app:// identifier exactly.`;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (identifier.includes("/")) {
|
|
358
|
+
return `"${trimmed}" must not contain a path. Use only app:// followed by the bundle or package identifier.`;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (identifier.includes("?")) {
|
|
362
|
+
return `"${trimmed}" must not contain a query string.`;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
if (identifier.includes("#")) {
|
|
366
|
+
return `"${trimmed}" must not contain a fragment.`;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
if (identifier.includes("@")) {
|
|
370
|
+
return `"${trimmed}" must not contain a username or password.`;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
if (identifier.includes(":")) {
|
|
374
|
+
return `"${trimmed}" must not contain a port. Mobile app identifiers are exact.`;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
const identifierError: string | null =
|
|
378
|
+
this.validateMobileAppIdentifier(identifier);
|
|
379
|
+
|
|
380
|
+
if (identifierError) {
|
|
381
|
+
return `"${trimmed}" is not a valid mobile app origin. ${identifierError}`;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
return null;
|
|
385
|
+
}
|
|
386
|
+
|
|
252
387
|
if (scheme !== "http" && scheme !== "https") {
|
|
253
|
-
return `"${trimmed}" must use the http:// or
|
|
388
|
+
return `"${trimmed}" must use the http://, https:// or app:// scheme.`;
|
|
254
389
|
}
|
|
255
390
|
|
|
256
391
|
let authority: string = value.substring(schemeSeparatorIndex + 3);
|
|
@@ -288,9 +288,14 @@ export default class CriticalPathUtil {
|
|
|
288
288
|
const selfTimes: Map<string, SpanSelfTime> =
|
|
289
289
|
CriticalPathUtil.computeSelfTimes(spans);
|
|
290
290
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
291
|
+
/*
|
|
292
|
+
* Find total trace duration. Real span timestamps are nanoseconds since the
|
|
293
|
+
* epoch (~1.7e18), far above Number.MAX_SAFE_INTEGER (~9e15), so the bounds
|
|
294
|
+
* must start at +/-Infinity: seeding the start with MAX_SAFE_INTEGER left it
|
|
295
|
+
* there, made the trace look 1.7e18 ns long and every service 0.0%.
|
|
296
|
+
*/
|
|
297
|
+
let traceStart: number = Infinity;
|
|
298
|
+
let traceEnd: number = -Infinity;
|
|
294
299
|
for (const span of spans) {
|
|
295
300
|
if (span.startTimeUnixNano < traceStart) {
|
|
296
301
|
traceStart = span.startTimeUnixNano;
|
|
@@ -299,7 +304,8 @@ export default class CriticalPathUtil {
|
|
|
299
304
|
traceEnd = span.endTimeUnixNano;
|
|
300
305
|
}
|
|
301
306
|
}
|
|
302
|
-
const totalDuration: number =
|
|
307
|
+
const totalDuration: number =
|
|
308
|
+
spans.length > 0 ? Math.max(0, traceEnd - traceStart) : 0;
|
|
303
309
|
|
|
304
310
|
// Aggregate by service
|
|
305
311
|
const serviceMap: Map<
|
|
@@ -126,6 +126,8 @@ import LogDropFilter from "./LogDropFilter";
|
|
|
126
126
|
import DetectionRule from "./DetectionRule";
|
|
127
127
|
import GoogleSecOpsConnection from "./GoogleSecOpsConnection";
|
|
128
128
|
import GoogleSecOpsConnectionRun from "./GoogleSecOpsConnectionRun";
|
|
129
|
+
import SecurityEventConnection from "./SecurityEventConnection";
|
|
130
|
+
import SecurityEventConnectionRun from "./SecurityEventConnectionRun";
|
|
129
131
|
import ThreatIntelFeed from "./ThreatIntelFeed";
|
|
130
132
|
import LogScrubRule from "./LogScrubRule";
|
|
131
133
|
import MetricPipelineRule from "./MetricPipelineRule";
|
|
@@ -479,6 +481,8 @@ const AllModelTypes = [
|
|
|
479
481
|
DetectionRule,
|
|
480
482
|
GoogleSecOpsConnection,
|
|
481
483
|
GoogleSecOpsConnectionRun,
|
|
484
|
+
SecurityEventConnection,
|
|
485
|
+
SecurityEventConnectionRun,
|
|
482
486
|
ThreatIntelFeed,
|
|
483
487
|
LogScrubRule,
|
|
484
488
|
MetricPipelineRule,
|