@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.
Files changed (673) hide show
  1. package/Models/DatabaseModels/Index.ts +4 -0
  2. package/Models/DatabaseModels/RumApplication.ts +1 -1
  3. package/Models/DatabaseModels/SecurityEventConnection.ts +457 -0
  4. package/Models/DatabaseModels/SecurityEventConnectionRun.ts +263 -0
  5. package/Models/DatabaseModels/TelemetryIngestionKey.ts +2 -2
  6. package/Server/API/AIInvestigationAPI.ts +484 -24
  7. package/Server/API/GoogleSecOpsConnectionAPI.ts +249 -8
  8. package/Server/API/SecurityEventConnectionAPI.ts +250 -0
  9. package/Server/API/TelemetryAPI.ts +402 -265
  10. package/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.ts +99 -0
  11. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  12. package/Server/Middleware/TelemetryIngest.ts +101 -6
  13. package/Server/Services/ExceptionAggregationService.ts +7 -16
  14. package/Server/Services/GoogleSecOpsConnectionService.ts +15 -0
  15. package/Server/Services/Index.ts +4 -0
  16. package/Server/Services/InventoryItemService.ts +28 -0
  17. package/Server/Services/LogAggregationService.ts +17 -23
  18. package/Server/Services/MetricAggregationService.ts +4 -14
  19. package/Server/Services/SecurityEventConnectionRunService.ts +10 -0
  20. package/Server/Services/SecurityEventConnectionService.ts +538 -0
  21. package/Server/Services/TraceAggregationService.ts +77 -28
  22. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
  23. package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +13 -1
  24. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +15 -1
  25. package/Server/Utils/AI/SRE/InvestigationEvidence.ts +658 -0
  26. package/Server/Utils/AI/SRE/InvestigationReferences.ts +324 -0
  27. package/Server/Utils/AI/Toolbox/Index.ts +38 -0
  28. package/Server/Utils/AI/Toolbox/TimelineTools.ts +9 -2
  29. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +80 -0
  30. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +5 -3
  31. package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.ts +1108 -0
  32. package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.ts +732 -0
  33. package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +495 -0
  34. package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.ts +689 -0
  35. package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.ts +767 -0
  36. package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.ts +571 -0
  37. package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.ts +827 -0
  38. package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.ts +610 -0
  39. package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.ts +549 -0
  40. package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.ts +830 -0
  41. package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.ts +684 -0
  42. package/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.ts +487 -0
  43. package/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.ts +778 -0
  44. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +1002 -0
  45. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +556 -0
  46. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +275 -0
  47. package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +53 -0
  48. package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.ts +709 -0
  49. package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.ts +596 -0
  50. package/Server/Utils/SecurityEvent/Connectors/Types.ts +191 -0
  51. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +353 -65
  52. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +777 -0
  53. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +747 -148
  54. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +48 -2
  55. package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +81 -0
  56. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +741 -40
  57. package/Server/Utils/StartServer.ts +10 -0
  58. package/Server/Utils/Telemetry/EntityRegistry.ts +8 -0
  59. package/Server/Utils/Telemetry/KubernetesResourceAttributes.ts +108 -0
  60. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +174 -93
  61. package/Server/Utils/Telemetry/ResourceFacetPlanner.ts +251 -0
  62. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +248 -413
  63. package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +668 -0
  64. package/Server/Utils/Telemetry/TraceContextPropagation.ts +348 -0
  65. package/Server/Utils/Telemetry.ts +18 -0
  66. package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +413 -0
  67. package/Tests/App/Dashboard/AIRootCauseFeedItem.test.tsx +285 -0
  68. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +242 -0
  69. package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +601 -15
  70. package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +835 -0
  71. package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +41 -0
  72. package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +604 -0
  73. package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +738 -0
  74. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +153 -6
  75. package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +165 -0
  76. package/Tests/App/Dashboard/EpisodeChangeState.test.tsx +1069 -0
  77. package/Tests/App/Dashboard/EpisodeMembersCard.test.tsx +772 -0
  78. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +2354 -0
  79. package/Tests/App/Dashboard/EventOverviewSkeleton.test.tsx +210 -0
  80. package/Tests/App/Dashboard/EventStatBar.test.tsx +392 -0
  81. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +247 -0
  82. package/Tests/App/Dashboard/ExceptionAIAssistance.test.tsx +606 -0
  83. package/Tests/App/Dashboard/ExceptionBreadcrumbTimeline.test.tsx +273 -0
  84. package/Tests/App/Dashboard/ExceptionDetailSideMenu.test.tsx +176 -0
  85. package/Tests/App/Dashboard/ExceptionOverviewCards.test.tsx +366 -0
  86. package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +371 -0
  87. package/Tests/App/Dashboard/ExceptionStackFrameViewer.test.tsx +440 -0
  88. package/Tests/App/Dashboard/ExceptionSummary.test.tsx +381 -0
  89. package/Tests/App/Dashboard/ExceptionTriage.test.tsx +306 -0
  90. package/Tests/App/Dashboard/ExceptionsResourceFacets.test.tsx +604 -0
  91. package/Tests/App/Dashboard/ExceptionsViewerEntityChips.test.tsx +706 -0
  92. package/Tests/App/Dashboard/FeedOrdering.test.ts +32 -0
  93. package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +838 -0
  94. package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +18 -0
  95. package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +297 -20
  96. package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +618 -13
  97. package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +254 -207
  98. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +303 -135
  99. package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +1251 -0
  100. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +303 -0
  101. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +876 -8
  102. package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +35 -0
  103. package/Tests/App/Dashboard/InvestigationReferenceLink.test.tsx +177 -0
  104. package/Tests/App/Dashboard/InvestigationReportView.test.tsx +1295 -0
  105. package/Tests/App/Dashboard/KubernetesImageReferenceView.test.tsx +114 -0
  106. package/Tests/App/Dashboard/KubernetesLogsTabChips.test.tsx +285 -0
  107. package/Tests/App/Dashboard/LogsEntityChipNames.test.tsx +316 -0
  108. package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +361 -0
  109. package/Tests/App/Dashboard/ProfileTableEntityNames.test.tsx +432 -0
  110. package/Tests/App/Dashboard/ProfileViewEntityName.test.tsx +250 -0
  111. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +10 -0
  112. package/Tests/App/Dashboard/ResourceLogsTabsBareLayout.test.tsx +700 -0
  113. package/Tests/App/Dashboard/ResourcePageEntityNameProps.test.tsx +803 -0
  114. package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +11 -1
  115. package/Tests/App/Dashboard/ScheduledMaintenanceChangeState.test.tsx +1026 -0
  116. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +436 -0
  117. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +1195 -0
  118. package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1022 -0
  119. package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +905 -0
  120. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +247 -0
  121. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +375 -274
  122. package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +410 -0
  123. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +774 -0
  124. package/Tests/App/Dashboard/TopErrorsPanelResourceNames.test.tsx +316 -0
  125. package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +30 -0
  126. package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +88 -24
  127. package/Tests/App/Dashboard/TraceExplorer.test.tsx +1590 -0
  128. package/Tests/App/Dashboard/TraceWaterfall.test.tsx +488 -0
  129. package/Tests/App/Dashboard/TracesAnalyticsSeriesLabels.test.tsx +367 -0
  130. package/Tests/App/Dashboard/TracesEntityNames.test.tsx +585 -0
  131. package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +613 -0
  132. package/Tests/App/Dashboard/UseServiceNames.test.tsx +359 -0
  133. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +7 -0
  134. package/Tests/Models/InventoryItemNaming.test.ts +132 -16
  135. package/Tests/Models/SecurityDomainAccessControl.test.ts +61 -17
  136. package/Tests/Server/API/AIInvestigationAPI.test.ts +611 -2
  137. package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +1098 -0
  138. package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +409 -0
  139. package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +856 -0
  140. package/Tests/Server/API/SessionReplayAPI.test.ts +528 -1
  141. package/Tests/Server/API/TelemetryFacetsAPI.test.ts +810 -0
  142. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +240 -0
  143. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +229 -0
  144. package/Tests/Server/Services/InventoryItemDisplayName.test.ts +66 -0
  145. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
  146. package/Tests/Server/Services/SecurityEventConnectionService.test.ts +1233 -0
  147. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +53 -0
  148. package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +218 -0
  149. package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +155 -1
  150. package/Tests/Server/Services/TraceAggregationExceptionScope.test.ts +142 -0
  151. package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +85 -24
  152. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +33 -0
  153. package/Tests/Server/Utils/AI/InvestigationEvidence.test.ts +1395 -0
  154. package/Tests/Server/Utils/AI/InvestigationReferences.test.ts +616 -0
  155. package/Tests/Server/Utils/AI/TimelineTools.test.ts +119 -0
  156. package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +151 -0
  157. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +65 -0
  158. package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorExceptionScope.test.ts +224 -0
  159. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +55 -2
  160. package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.test.ts +1240 -0
  161. package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.test.ts +1853 -0
  162. package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +1129 -0
  163. package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.test.ts +1066 -0
  164. package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.test.ts +1568 -0
  165. package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.test.ts +930 -0
  166. package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.test.ts +1409 -0
  167. package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.test.ts +763 -0
  168. package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.test.ts +1296 -0
  169. package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.test.ts +1102 -0
  170. package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.test.ts +1174 -0
  171. package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.test.ts +1032 -0
  172. package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.test.ts +1558 -0
  173. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +3041 -0
  174. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +1168 -0
  175. package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +906 -0
  176. package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.test.ts +1068 -0
  177. package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.test.ts +1004 -0
  178. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +784 -0
  179. package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +113 -1
  180. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +5 -1
  181. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +93 -13
  182. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +23 -1
  183. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +25 -3
  184. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +22 -8
  185. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +82 -16
  186. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSearchDetections.test.ts +730 -0
  187. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +1577 -0
  188. package/Tests/Server/Utils/SessionReplay/SessionReplayOriginAllowlist.test.ts +41 -0
  189. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1453 -18
  190. package/Tests/Server/Utils/Telemetry/KubernetesResourceAttributes.test.ts +162 -0
  191. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +460 -13
  192. package/Tests/Server/Utils/Telemetry/ResourceFacetPlanner.test.ts +678 -0
  193. package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +348 -2
  194. package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +525 -0
  195. package/Tests/Server/Utils/Telemetry/TraceContextPropagation.test.ts +420 -0
  196. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +73 -0
  197. package/Tests/Types/Rum/SessionReplayTransportContracts.test.ts +95 -0
  198. package/Tests/Types/SecurityEvent/Connectors/ConnectorDiagnostics.test.ts +82 -0
  199. package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +314 -0
  200. package/Tests/Types/Telemetry/ExceptionSpanScope.test.ts +89 -0
  201. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +96 -0
  202. package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +304 -0
  203. package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +357 -0
  204. package/Tests/UI/Components/Card.test.tsx +312 -1
  205. package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +253 -0
  206. package/Tests/UI/Components/CardModelDetailRefresher.test.tsx +342 -0
  207. package/Tests/UI/Components/Checkbox.test.tsx +79 -0
  208. package/Tests/UI/Components/CopyTextButton.test.tsx +142 -0
  209. package/Tests/UI/Components/DetailCompactStyle.test.tsx +621 -0
  210. package/Tests/UI/Components/ErrorBoundary.test.tsx +60 -0
  211. package/Tests/UI/Components/FacetSections.test.tsx +581 -0
  212. package/Tests/UI/Components/FacetSidebarControls.test.tsx +812 -0
  213. package/Tests/UI/Components/FacetVisibility.test.ts +429 -0
  214. package/Tests/UI/Components/LockedFilterActions.test.tsx +396 -0
  215. package/Tests/UI/Components/LockedFilterChip.test.tsx +651 -0
  216. package/Tests/UI/Components/LogsEntityNames.test.ts +1769 -0
  217. package/Tests/UI/Components/LogsEntityNamesComponents.test.tsx +696 -0
  218. package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +600 -0
  219. package/Tests/UI/Components/LogsViewerEntityNames.test.tsx +713 -0
  220. package/Tests/UI/Components/MarkdownInlineReferences.test.tsx +2079 -0
  221. package/Tests/UI/Components/MemberRoleAssignment.test.tsx +446 -0
  222. package/Tests/UI/Components/ModelDetailRefetch.test.tsx +397 -0
  223. package/Tests/UI/Components/ModelListRefetch.test.tsx +233 -0
  224. package/Tests/UI/Components/ModelPageModelChange.test.tsx +409 -0
  225. package/Tests/UI/Components/PaginationIntegration.test.tsx +25 -0
  226. package/Tests/UI/Components/ResourceFacetConfigs.test.ts +172 -0
  227. package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +32 -14
  228. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +44 -1
  229. package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +304 -0
  230. package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +718 -0
  231. package/Tests/UI/Monitor/EvaluationLogList.test.tsx +303 -0
  232. package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +55 -1
  233. package/Tests/UI/Rum/FidelityNotices.test.ts +22 -0
  234. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +120 -136
  235. package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +988 -0
  236. package/Tests/UI/Rum/ReplayCard.test.tsx +32 -0
  237. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +709 -12
  238. package/Tests/UI/Rum/ReplayHeader.test.tsx +50 -1
  239. package/Tests/UI/Rum/ReplayPinControl.test.tsx +67 -10
  240. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +41 -12
  241. package/Tests/UI/Rum/ReplayStage.test.tsx +663 -1
  242. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +173 -0
  243. package/Tests/UI/Rum/ReplayUi.test.tsx +189 -2
  244. package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +91 -0
  245. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +1 -1
  246. package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +585 -0
  247. package/Tests/UI/Rum/SessionReplayTable.test.tsx +844 -51
  248. package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +29 -1
  249. package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +288 -0
  250. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +31 -1
  251. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +6 -0
  252. package/Tests/UI/Utils/Clipboard.test.ts +154 -0
  253. package/Tests/UI/Utils/Navigation.test.ts +24 -0
  254. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +2205 -0
  255. package/Tests/UI/Utils/Telemetry/UseTelemetryEntityNames.test.tsx +844 -0
  256. package/Tests/Utils/AI/InvestigationReport.test.ts +2430 -0
  257. package/Tests/Utils/APIOutgoingRequestTracer.test.ts +137 -0
  258. package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +40 -0
  259. package/Tests/Utils/Rum/SessionReplayRecordingEnded.test.ts +619 -0
  260. package/Tests/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.test.ts +631 -0
  261. package/Tests/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.test.ts +479 -0
  262. package/Tests/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.test.ts +507 -0
  263. package/Tests/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.test.ts +686 -0
  264. package/Tests/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.test.ts +474 -0
  265. package/Tests/Utils/SecurityEvent/Connectors/OktaNormalizer.test.ts +736 -0
  266. package/Tests/Utils/SecurityEvent/Connectors/SplunkNormalizer.test.ts +407 -0
  267. package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +129 -0
  268. package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +57 -1
  269. package/Tests/Utils/Telemetry/EntityRelationship.test.ts +36 -0
  270. package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +600 -0
  271. package/Tests/Utils/Telemetry/NetworkHost.test.ts +48 -0
  272. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +154 -0
  273. package/Tests/Utils/Traces/CriticalPath.test.ts +25 -0
  274. package/Types/AI/AIChatTypes.ts +8 -0
  275. package/Types/AI/InvestigationEvidence.ts +96 -0
  276. package/Types/Monitor/MonitorEvaluationSummary.ts +5 -0
  277. package/Types/Permission.ts +2 -2
  278. package/Types/Rum/SessionReplay.ts +109 -0
  279. package/Types/Rum/SessionReplayApi.ts +31 -0
  280. package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +111 -0
  281. package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +87 -0
  282. package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +492 -0
  283. package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +41 -0
  284. package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -1
  285. package/Types/SecurityEvent/GoogleSecOpsRegion.ts +34 -0
  286. package/Types/Telemetry/EntityType.ts +14 -0
  287. package/Types/Telemetry/ExceptionSpanScope.ts +83 -0
  288. package/Types/Telemetry/LockedFilterDetail.ts +46 -0
  289. package/Types/Telemetry/ResourceEntityFacet.ts +17 -10
  290. package/Types/Telemetry/ResourceFacetCatalog.ts +171 -0
  291. package/UI/Components/Card/Card.tsx +118 -83
  292. package/UI/Components/Checkbox/Checkbox.tsx +8 -5
  293. package/UI/Components/CopyTextButton/CopyTextButton.tsx +7 -1
  294. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +4 -1
  295. package/UI/Components/Detail/Detail.tsx +137 -22
  296. package/UI/Components/ErrorBoundary.tsx +38 -0
  297. package/UI/Components/LogsViewer/LogsEntityNames.ts +912 -0
  298. package/UI/Components/LogsViewer/LogsViewer.tsx +156 -77
  299. package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +28 -11
  300. package/UI/Components/LogsViewer/components/FacetSection.tsx +66 -79
  301. package/UI/Components/LogsViewer/components/FacetValueRow.tsx +17 -2
  302. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +45 -5
  303. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +100 -19
  304. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +156 -39
  305. package/UI/Components/LogsViewer/components/LogsTable.tsx +30 -8
  306. package/UI/Components/LogsViewer/types.ts +6 -0
  307. package/UI/Components/Markdown.tsx/InlineReferences.tsx +628 -0
  308. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +385 -312
  309. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +50 -22
  310. package/UI/Components/ModelDetail/CardModelDetail.tsx +15 -0
  311. package/UI/Components/ModelDetail/ModelDetail.tsx +64 -19
  312. package/UI/Components/ModelList/ModelList.tsx +33 -8
  313. package/UI/Components/Page/ModelPage.tsx +119 -54
  314. package/UI/Components/Table/Table.tsx +8 -0
  315. package/UI/Components/Table/TableRow.tsx +13 -5
  316. package/UI/Components/TelemetryViewer/FacetVisibility.ts +229 -0
  317. package/UI/Components/TelemetryViewer/ResourceFacetConfigs.ts +46 -0
  318. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +11 -0
  319. package/UI/Components/TelemetryViewer/components/FacetSearchInput.tsx +79 -0
  320. package/UI/Components/TelemetryViewer/components/FacetSectionHeader.tsx +69 -0
  321. package/UI/Components/TelemetryViewer/components/FacetShowMoreButton.tsx +36 -0
  322. package/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.tsx +88 -0
  323. package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +205 -0
  324. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +496 -0
  325. package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +30 -10
  326. package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +203 -10
  327. package/UI/Components/TelemetryViewer/components/TelemetryFacetSection.tsx +60 -73
  328. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +94 -7
  329. package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +17 -2
  330. package/UI/Components/TelemetryViewer/types.ts +19 -0
  331. package/UI/Components/TelemetryViewer/useFacetSearchExemptions.ts +158 -0
  332. package/UI/Components/TelemetryViewer/useFacetSectionSearch.ts +102 -0
  333. package/UI/Utils/Clipboard.ts +68 -2
  334. package/UI/Utils/Navigation.ts +17 -2
  335. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +620 -0
  336. package/UI/Utils/Telemetry/UseTelemetryEntityNames.ts +151 -0
  337. package/Utils/AI/InvestigationReport.ts +1789 -0
  338. package/Utils/API.ts +90 -1
  339. package/Utils/Rum/SessionReplayHealth.ts +11 -0
  340. package/Utils/Rum/SessionReplayRecordingEnded.ts +134 -0
  341. package/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.ts +427 -0
  342. package/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.ts +197 -0
  343. package/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.ts +464 -0
  344. package/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.ts +567 -0
  345. package/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.ts +299 -0
  346. package/Utils/SecurityEvent/Connectors/OktaNormalizer.ts +467 -0
  347. package/Utils/SecurityEvent/Connectors/SplunkNormalizer.ts +439 -0
  348. package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +124 -12
  349. package/Utils/Telemetry/CrossSignalScope.ts +22 -8
  350. package/Utils/Telemetry/EntityRelationship.ts +8 -0
  351. package/Utils/Telemetry/LockedFilterSearch.ts +412 -0
  352. package/Utils/Telemetry/NetworkHost.ts +43 -0
  353. package/Utils/Telemetry/OriginAllowList.ts +139 -4
  354. package/Utils/Traces/CriticalPath.ts +10 -4
  355. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  356. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/RumApplication.js +1 -1
  358. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +490 -0
  360. package/build/dist/Models/DatabaseModels/SecurityEventConnection.js.map +1 -0
  361. package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js +287 -0
  362. package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js.map +1 -0
  363. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +2 -2
  364. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
  365. package/build/dist/Server/API/AIInvestigationAPI.js +336 -27
  366. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  367. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +182 -7
  368. package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -1
  369. package/build/dist/Server/API/SecurityEventConnectionAPI.js +171 -0
  370. package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -0
  371. package/build/dist/Server/API/TelemetryAPI.js +248 -170
  372. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  373. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js +40 -0
  374. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js.map +1 -0
  375. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  376. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  377. package/build/dist/Server/Middleware/TelemetryIngest.js +57 -4
  378. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  379. package/build/dist/Server/Services/ExceptionAggregationService.js +7 -16
  380. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  381. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +8 -0
  382. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
  383. package/build/dist/Server/Services/Index.js +4 -0
  384. package/build/dist/Server/Services/Index.js.map +1 -1
  385. package/build/dist/Server/Services/InventoryItemService.js +22 -0
  386. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  387. package/build/dist/Server/Services/LogAggregationService.js +8 -17
  388. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  389. package/build/dist/Server/Services/MetricAggregationService.js +4 -14
  390. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  391. package/build/dist/Server/Services/SecurityEventConnectionRunService.js +9 -0
  392. package/build/dist/Server/Services/SecurityEventConnectionRunService.js.map +1 -0
  393. package/build/dist/Server/Services/SecurityEventConnectionService.js +356 -0
  394. package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -0
  395. package/build/dist/Server/Services/TraceAggregationService.js +51 -25
  396. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  397. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
  398. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  399. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
  400. package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
  401. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +14 -7
  402. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  403. package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js +468 -0
  404. package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js.map +1 -0
  405. package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js +230 -0
  406. package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js.map +1 -0
  407. package/build/dist/Server/Utils/AI/Toolbox/Index.js +32 -0
  408. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  409. package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +6 -2
  410. package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -1
  411. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +59 -0
  412. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  413. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +5 -3
  414. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  415. package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js +752 -0
  416. package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js.map +1 -0
  417. package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js +493 -0
  418. package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js.map +1 -0
  419. package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +352 -0
  420. package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -0
  421. package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js +405 -0
  422. package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js.map +1 -0
  423. package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js +466 -0
  424. package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js.map +1 -0
  425. package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js +344 -0
  426. package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js.map +1 -0
  427. package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js +511 -0
  428. package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js.map +1 -0
  429. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js +406 -0
  430. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js.map +1 -0
  431. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js +336 -0
  432. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js.map +1 -0
  433. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js +474 -0
  434. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js.map +1 -0
  435. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js +417 -0
  436. package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js.map +1 -0
  437. package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js +314 -0
  438. package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js.map +1 -0
  439. package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js +494 -0
  440. package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js.map +1 -0
  441. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +719 -0
  442. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -0
  443. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +404 -0
  444. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -0
  445. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +209 -0
  446. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -0
  447. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +40 -0
  448. package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -0
  449. package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js +494 -0
  450. package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js.map +1 -0
  451. package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js +379 -0
  452. package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js.map +1 -0
  453. package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +27 -0
  454. package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -0
  455. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +234 -61
  456. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
  457. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +537 -0
  458. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +1 -0
  459. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +572 -115
  460. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
  461. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +35 -1
  462. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -1
  463. package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +52 -0
  464. package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js.map +1 -0
  465. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +521 -32
  466. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  467. package/build/dist/Server/Utils/StartServer.js +10 -0
  468. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  469. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +8 -0
  470. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  471. package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js +80 -0
  472. package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js.map +1 -0
  473. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +122 -67
  474. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  475. package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js +146 -0
  476. package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js.map +1 -0
  477. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +174 -248
  478. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  479. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +492 -0
  480. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -0
  481. package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js +259 -0
  482. package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js.map +1 -0
  483. package/build/dist/Server/Utils/Telemetry.js +11 -5
  484. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  485. package/build/dist/Types/AI/InvestigationEvidence.js +2 -0
  486. package/build/dist/Types/AI/InvestigationEvidence.js.map +1 -0
  487. package/build/dist/Types/Permission.js +2 -2
  488. package/build/dist/Types/Permission.js.map +1 -1
  489. package/build/dist/Types/Rum/SessionReplay.js +95 -0
  490. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  491. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  492. package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js +18 -0
  493. package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -0
  494. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +2 -0
  495. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -0
  496. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +374 -0
  497. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -0
  498. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +35 -0
  499. package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -0
  500. package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js +35 -0
  501. package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js.map +1 -0
  502. package/build/dist/Types/Telemetry/EntityType.js +14 -0
  503. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  504. package/build/dist/Types/Telemetry/ExceptionSpanScope.js +59 -0
  505. package/build/dist/Types/Telemetry/ExceptionSpanScope.js.map +1 -0
  506. package/build/dist/Types/Telemetry/LockedFilterDetail.js +16 -0
  507. package/build/dist/Types/Telemetry/LockedFilterDetail.js.map +1 -0
  508. package/build/dist/Types/Telemetry/ResourceEntityFacet.js +16 -10
  509. package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -1
  510. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +119 -0
  511. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -0
  512. package/build/dist/UI/Components/Card/Card.js +34 -17
  513. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  514. package/build/dist/UI/Components/Checkbox/Checkbox.js +6 -4
  515. package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
  516. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
  517. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
  518. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +1 -1
  519. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  520. package/build/dist/UI/Components/Detail/Detail.js +63 -13
  521. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  522. package/build/dist/UI/Components/ErrorBoundary.js +34 -0
  523. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  524. package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js +535 -0
  525. package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js.map +1 -0
  526. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +117 -57
  527. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  528. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +5 -7
  529. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
  530. package/build/dist/UI/Components/LogsViewer/components/FacetSection.js +31 -44
  531. package/build/dist/UI/Components/LogsViewer/components/FacetSection.js.map +1 -1
  532. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +17 -3
  533. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
  534. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +19 -3
  535. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  536. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +64 -18
  537. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  538. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +100 -41
  539. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  540. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +13 -5
  541. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
  542. package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
  543. package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js +403 -0
  544. package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js.map +1 -0
  545. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +197 -179
  546. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  547. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +30 -21
  548. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  549. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +12 -0
  550. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  551. package/build/dist/UI/Components/ModelDetail/ModelDetail.js +46 -12
  552. package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
  553. package/build/dist/UI/Components/ModelList/ModelList.js +26 -7
  554. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  555. package/build/dist/UI/Components/Page/ModelPage.js +62 -34
  556. package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
  557. package/build/dist/UI/Components/Table/Table.js +3 -1
  558. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  559. package/build/dist/UI/Components/Table/TableRow.js +8 -1
  560. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  561. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +111 -0
  562. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -0
  563. package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js +22 -0
  564. package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js.map +1 -0
  565. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
  566. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  567. package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js +36 -0
  568. package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js.map +1 -0
  569. package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js +21 -0
  570. package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js.map +1 -0
  571. package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js +14 -0
  572. package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js.map +1 -0
  573. package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js +27 -0
  574. package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js.map +1 -0
  575. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +88 -0
  576. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +1 -0
  577. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +228 -0
  578. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -0
  579. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +6 -6
  580. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
  581. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +111 -12
  582. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
  583. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js +27 -40
  584. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js.map +1 -1
  585. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +70 -10
  586. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  587. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +17 -3
  588. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
  589. package/build/dist/UI/Components/TelemetryViewer/types.js +0 -4
  590. package/build/dist/UI/Components/TelemetryViewer/types.js.map +1 -1
  591. package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js +70 -0
  592. package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js.map +1 -0
  593. package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js +52 -0
  594. package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js.map +1 -0
  595. package/build/dist/UI/Utils/Clipboard.js +59 -2
  596. package/build/dist/UI/Utils/Clipboard.js.map +1 -1
  597. package/build/dist/UI/Utils/Navigation.js +11 -2
  598. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  599. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +471 -0
  600. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -0
  601. package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js +113 -0
  602. package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js.map +1 -0
  603. package/build/dist/Utils/AI/InvestigationReport.js +1241 -0
  604. package/build/dist/Utils/AI/InvestigationReport.js.map +1 -0
  605. package/build/dist/Utils/API.js +25 -0
  606. package/build/dist/Utils/API.js.map +1 -1
  607. package/build/dist/Utils/Rum/SessionReplayHealth.js +10 -0
  608. package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -1
  609. package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js +54 -0
  610. package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js.map +1 -0
  611. package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js +311 -0
  612. package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js.map +1 -0
  613. package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js +150 -0
  614. package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js.map +1 -0
  615. package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js +328 -0
  616. package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js.map +1 -0
  617. package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js +405 -0
  618. package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js.map +1 -0
  619. package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js +212 -0
  620. package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js.map +1 -0
  621. package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js +351 -0
  622. package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js.map +1 -0
  623. package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js +348 -0
  624. package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js.map +1 -0
  625. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +103 -10
  626. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
  627. package/build/dist/Utils/Telemetry/CrossSignalScope.js +16 -5
  628. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  629. package/build/dist/Utils/Telemetry/EntityRelationship.js +7 -0
  630. package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
  631. package/build/dist/Utils/Telemetry/LockedFilterSearch.js +277 -0
  632. package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -0
  633. package/build/dist/Utils/Telemetry/NetworkHost.js +39 -0
  634. package/build/dist/Utils/Telemetry/NetworkHost.js.map +1 -0
  635. package/build/dist/Utils/Telemetry/OriginAllowList.js +105 -4
  636. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
  637. package/build/dist/Utils/Traces/CriticalPath.js +9 -4
  638. package/build/dist/Utils/Traces/CriticalPath.js.map +1 -1
  639. package/package.json +1 -1
  640. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +0 -600
  641. package/UI/Components/GanttChart/Bar/BarLabel.tsx +0 -17
  642. package/UI/Components/GanttChart/Bar/Index.tsx +0 -149
  643. package/UI/Components/GanttChart/ChartContainer.tsx +0 -50
  644. package/UI/Components/GanttChart/Index.tsx +0 -90
  645. package/UI/Components/GanttChart/Row/Index.tsx +0 -22
  646. package/UI/Components/GanttChart/Row/Row.tsx +0 -231
  647. package/UI/Components/GanttChart/Row/RowLabel.tsx +0 -30
  648. package/UI/Components/GanttChart/Rows.tsx +0 -59
  649. package/UI/Components/GanttChart/Timeline/Index.tsx +0 -46
  650. package/UI/Components/GanttChart/Timeline/TimelineInterval.tsx +0 -33
  651. package/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.tsx +0 -43
  652. package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js +0 -8
  653. package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js.map +0 -1
  654. package/build/dist/UI/Components/GanttChart/Bar/Index.js +0 -77
  655. package/build/dist/UI/Components/GanttChart/Bar/Index.js.map +0 -1
  656. package/build/dist/UI/Components/GanttChart/ChartContainer.js +0 -33
  657. package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +0 -1
  658. package/build/dist/UI/Components/GanttChart/Index.js +0 -39
  659. package/build/dist/UI/Components/GanttChart/Index.js.map +0 -1
  660. package/build/dist/UI/Components/GanttChart/Row/Index.js +0 -7
  661. package/build/dist/UI/Components/GanttChart/Row/Index.js.map +0 -1
  662. package/build/dist/UI/Components/GanttChart/Row/Row.js +0 -106
  663. package/build/dist/UI/Components/GanttChart/Row/Row.js.map +0 -1
  664. package/build/dist/UI/Components/GanttChart/Row/RowLabel.js +0 -10
  665. package/build/dist/UI/Components/GanttChart/Row/RowLabel.js.map +0 -1
  666. package/build/dist/UI/Components/GanttChart/Rows.js +0 -19
  667. package/build/dist/UI/Components/GanttChart/Rows.js.map +0 -1
  668. package/build/dist/UI/Components/GanttChart/Timeline/Index.js +0 -16
  669. package/build/dist/UI/Components/GanttChart/Timeline/Index.js.map +0 -1
  670. package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js +0 -13
  671. package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js.map +0 -1
  672. package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js +0 -13
  673. package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js.map +0 -1
@@ -0,0 +1,827 @@
1
+ import BadDataException from "../../../../../Types/Exception/BadDataException";
2
+ import { JSONObject } from "../../../../../Types/JSON";
3
+ import NormalizedSecurityEvent from "../../../../../Types/SecurityEvent/NormalizedSecurityEvent";
4
+ import {
5
+ SecurityConnectorCheck,
6
+ SecurityConnectorSample,
7
+ } from "../../../../../Types/SecurityEvent/Connectors/ConnectorDiagnostics";
8
+ import SecurityEventConnectorProvider from "../../../../../Types/SecurityEvent/Connectors/SecurityEventConnectorProvider";
9
+ import {
10
+ SecurityEventConnectorDefinition,
11
+ getSecurityEventConnectorDefinition,
12
+ } from "../../../../../Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog";
13
+ import ElasticSecurityNormalizer from "../../../../../Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer";
14
+ import { parseEventTime } from "../../../../../Utils/SecurityEvent/NormalizerHelpers";
15
+ import DataSourceHttpFetch, {
16
+ DataSourceHttpRequest,
17
+ DataSourceHttpResponse,
18
+ } from "../../../DataSource/HttpFetch";
19
+ import { redactLogString } from "../../../LogRedaction";
20
+ import ConnectorErrorMessage from "../../ConnectorErrorMessage";
21
+ import {
22
+ ConnectorFetchOptions,
23
+ ConnectorFetchResult,
24
+ ConnectorFetchWindow,
25
+ ConnectorTestOptions,
26
+ ConnectorTransport,
27
+ SecurityConnectorSettings,
28
+ SecurityEventConnector,
29
+ makeCheck,
30
+ readSettingString,
31
+ } from "../Types";
32
+ import ElasticSecurityClient, {
33
+ ELASTIC_SECURITY_MAX_EXCLUDED_ID_BYTES,
34
+ ELASTIC_SECURITY_MAX_PAGE_SIZE,
35
+ ElasticAlertCount,
36
+ ElasticAlertHit,
37
+ ElasticKibanaStatus,
38
+ ElasticSearchAlertsResult,
39
+ ElasticSecurityHttpError,
40
+ } from "./ElasticSecurityClient";
41
+
42
+ /*
43
+ * Elastic Security (Kibana detection engine) connector.
44
+ *
45
+ * Polls detection alerts by the alert's own @timestamp — the time the
46
+ * rule execution CREATED the alert — never by the matched event's time
47
+ * (kibana.alert.original_time). A rule scheduled hourly writes alerts about
48
+ * events that happened up to an hour earlier, so a cursor on event time
49
+ * would skip every one of them; see Connectors/Types.ts.
50
+ *
51
+ * Paging: the documented signals search body accepts size and sort but
52
+ * neither search_after nor from (see ElasticSecurityClient), so cursor
53
+ * paging is done by advancing the range's lower bound to the last hit's
54
+ * @timestamp. `gte` would re-read alerts sharing that exact timestamp —
55
+ * common, since one rule execution stamps every alert it writes with the
56
+ * same time — so the next request excludes the ids already read at that
57
+ * instant. Each page is then the oldest alerts not yet read: every alert
58
+ * created before the page's last timestamp has been read, a tie group
59
+ * larger than a page is read page by page instead of being cut off at the
60
+ * first one, and nothing is re-read (ids are still remembered, in case a
61
+ * proxy or an older Kibana ignores the exclusion).
62
+ *
63
+ * When a bound stops the fetch, resumeAfter is the @timestamp of the last
64
+ * alert read, so the poller moves its cursor there instead of re-reading
65
+ * the same oldest alerts on every poll (review finding
66
+ * bound-hit-window-never-advances).
67
+ *
68
+ * Settings come from the catalog's keys: config.kibanaUrl, config.space
69
+ * and secrets.apiKey.
70
+ */
71
+
72
+ interface ParsedSettings {
73
+ kibanaUrl: string;
74
+ space: string;
75
+ apiKey: string;
76
+ }
77
+
78
+ // Kibana space ids: lowercase letters, digits, hyphens and underscores.
79
+ const SPACE_ID_REGEX: RegExp = /^[a-z0-9_-]+$/i;
80
+ // A pasted Kibana URL that already carries the /s/<space> prefix or an API path.
81
+ const SPACE_PREFIX_REGEX: RegExp = /\/s\/[^/]+/;
82
+ const API_PATH_REGEX: RegExp = /\/api(\/|$)/;
83
+ // The header scheme pasted along with the key, and anything that is not one base64 token.
84
+ const API_KEY_PREFIX_REGEX: RegExp = /^apikey\s/i;
85
+ const WHITESPACE_REGEX: RegExp = /\s/;
86
+ const DAY_IN_MS: number = 24 * 60 * 60 * 1000;
87
+ // Normalization failures quoted into warnings before the rest are counted only.
88
+ const MAX_NORMALIZATION_WARNINGS: number = 5;
89
+
90
+ type ProviderCheckStep =
91
+ | "authentication"
92
+ | "read-permission"
93
+ | "detections-available";
94
+
95
+ export default class ElasticSecurityConnector
96
+ implements SecurityEventConnector
97
+ {
98
+ public provider: SecurityEventConnectorProvider =
99
+ SecurityEventConnectorProvider.ElasticSecurity;
100
+
101
+ private transport: ConnectorTransport;
102
+
103
+ public constructor(transport?: ConnectorTransport | undefined) {
104
+ this.transport =
105
+ transport ||
106
+ ((request: DataSourceHttpRequest): Promise<DataSourceHttpResponse> => {
107
+ return DataSourceHttpFetch.fetch(request);
108
+ });
109
+ }
110
+
111
+ private static getDefinition(): SecurityEventConnectorDefinition {
112
+ const definition: SecurityEventConnectorDefinition | undefined =
113
+ getSecurityEventConnectorDefinition(
114
+ SecurityEventConnectorProvider.ElasticSecurity,
115
+ );
116
+
117
+ if (!definition) {
118
+ throw new BadDataException(
119
+ "Elastic Security is missing from the connector catalog.",
120
+ );
121
+ }
122
+
123
+ return definition;
124
+ }
125
+
126
+ /*
127
+ * Validation messages name the field by the title the form shows, read
128
+ * from the catalog so a retitled field cannot leave a stale name here.
129
+ */
130
+ private static fieldTitle(key: string): string {
131
+ const definition: SecurityEventConnectorDefinition = this.getDefinition();
132
+ const field: { title: string } | undefined = [
133
+ ...definition.configFields,
134
+ ...definition.secretFields,
135
+ ].find((candidate: { key: string }): boolean => {
136
+ return candidate.key === key;
137
+ });
138
+
139
+ return field?.title || key;
140
+ }
141
+
142
+ private static parseSettings(
143
+ settings: SecurityConnectorSettings,
144
+ ): ParsedSettings {
145
+ const kibanaUrl: string = readSettingString(settings.config, "kibanaUrl");
146
+ const space: string = readSettingString(settings.config, "space");
147
+ const apiKey: string = readSettingString(settings.secrets, "apiKey");
148
+
149
+ if (!kibanaUrl) {
150
+ throw new BadDataException(
151
+ `${this.fieldTitle("kibanaUrl")} is required.`,
152
+ );
153
+ }
154
+
155
+ let parsed: URL;
156
+
157
+ try {
158
+ parsed = new URL(kibanaUrl);
159
+ } catch {
160
+ throw new BadDataException(
161
+ `${this.fieldTitle("kibanaUrl")} must be an absolute URL such as https://kibana.example.com.`,
162
+ );
163
+ }
164
+
165
+ if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
166
+ throw new BadDataException(
167
+ `${this.fieldTitle("kibanaUrl")} must use https (or http).`,
168
+ );
169
+ }
170
+
171
+ if (parsed.search || parsed.hash) {
172
+ throw new BadDataException(
173
+ `${this.fieldTitle("kibanaUrl")} must not contain a query string or fragment.`,
174
+ );
175
+ }
176
+
177
+ if (SPACE_PREFIX_REGEX.test(parsed.pathname)) {
178
+ throw new BadDataException(
179
+ `${this.fieldTitle("kibanaUrl")} must not include the /s/<space> prefix; put the space id in the ${this.fieldTitle("space")} field instead.`,
180
+ );
181
+ }
182
+
183
+ if (API_PATH_REGEX.test(parsed.pathname)) {
184
+ throw new BadDataException(
185
+ `${this.fieldTitle("kibanaUrl")} must be the base URL Kibana is served from, without an /api path.`,
186
+ );
187
+ }
188
+
189
+ if (space && !SPACE_ID_REGEX.test(space)) {
190
+ throw new BadDataException(
191
+ `${this.fieldTitle("space")} must be a space id (letters, numbers, hyphens and underscores), not its display name.`,
192
+ );
193
+ }
194
+
195
+ if (!apiKey) {
196
+ throw new BadDataException(`${this.fieldTitle("apiKey")} is required.`);
197
+ }
198
+
199
+ if (API_KEY_PREFIX_REGEX.test(apiKey)) {
200
+ throw new BadDataException(
201
+ `${this.fieldTitle("apiKey")} must be pasted without the 'ApiKey' prefix.`,
202
+ );
203
+ }
204
+
205
+ /*
206
+ * A raw `id:api_key` pair or a value with whitespace is the most
207
+ * common paste mistake; it would only surface as a 401 later, without
208
+ * saying why. The base64 `encoded` value has neither.
209
+ */
210
+ if (WHITESPACE_REGEX.test(apiKey) || apiKey.includes(":")) {
211
+ throw new BadDataException(
212
+ `${this.fieldTitle("apiKey")} must be the base64 encoded value Kibana shows when the key is created (the 'encoded' field), not the raw id:api_key pair.`,
213
+ );
214
+ }
215
+
216
+ return { kibanaUrl, space, apiKey };
217
+ }
218
+
219
+ public validateSettings(settings: SecurityConnectorSettings): void {
220
+ ElasticSecurityConnector.parseSettings(settings);
221
+ }
222
+
223
+ private buildClient(
224
+ parsed: ParsedSettings,
225
+ requestTimeoutInMs: number,
226
+ ): ElasticSecurityClient {
227
+ return new ElasticSecurityClient({
228
+ kibanaUrl: parsed.kibanaUrl,
229
+ space: parsed.space,
230
+ apiKey: parsed.apiKey,
231
+ transport: this.transport,
232
+ requestTimeoutInMs,
233
+ });
234
+ }
235
+
236
+ /*
237
+ * Three provider checks, in dependency order. Each later check is
238
+ * skipped rather than failed when an earlier one fails, so the report
239
+ * names one root cause instead of three symptoms of it.
240
+ */
241
+ public async testConnection(
242
+ settings: SecurityConnectorSettings,
243
+ options: ConnectorTestOptions,
244
+ ): Promise<Array<SecurityConnectorCheck>> {
245
+ const checks: Array<SecurityConnectorCheck> = [];
246
+ let parsed: ParsedSettings;
247
+ let startedAtMs: number = Date.now();
248
+
249
+ try {
250
+ parsed = ElasticSecurityConnector.parseSettings(settings);
251
+ } catch (error) {
252
+ checks.push(
253
+ makeCheck({
254
+ key: "authentication",
255
+ name: "Authenticate with Kibana",
256
+ status: "fail",
257
+ startedAtMs,
258
+ message: redactLogString(ConnectorErrorMessage.toMessage(error)),
259
+ remediation:
260
+ "Correct the highlighted setting and test again. Nothing was contacted.",
261
+ }),
262
+ );
263
+ checks.push(
264
+ ElasticSecurityConnector.skipped(
265
+ "read-permission",
266
+ "Read detection alerts",
267
+ "Skipped because the configuration is invalid.",
268
+ ),
269
+ );
270
+ checks.push(
271
+ ElasticSecurityConnector.skipped(
272
+ "detections-available",
273
+ "Alerts available to import",
274
+ "Skipped because the configuration is invalid.",
275
+ ),
276
+ );
277
+ return checks;
278
+ }
279
+
280
+ const client: ElasticSecurityClient = this.buildClient(
281
+ parsed,
282
+ options.requestTimeoutInMs,
283
+ );
284
+
285
+ let hostLabel: string = "Kibana";
286
+
287
+ try {
288
+ hostLabel = new URL(client.getBaseUrl()).host;
289
+ } catch {
290
+ hostLabel = "Kibana";
291
+ }
292
+
293
+ // 1. Authentication: GET /api/status must come back unredacted.
294
+ let authenticated: boolean = false;
295
+
296
+ try {
297
+ const status: ElasticKibanaStatus = await client.getStatus();
298
+
299
+ if (!status.authenticated) {
300
+ checks.push(
301
+ makeCheck({
302
+ key: "authentication",
303
+ name: "Authenticate with Kibana",
304
+ status: "fail",
305
+ startedAtMs,
306
+ message: `Kibana at ${hostLabel} answered without authenticating the request: the status document was redacted to the overall level only (${status.level || "unknown"}).`,
307
+ remediation:
308
+ "Kibana ignored the credential, which happens when anonymous access is enabled and the Authorization header was not applied. Confirm the API key was pasted as its base64 encoded value and that no proxy in front of Kibana strips the Authorization header.",
309
+ details: { level: status.level, summary: status.summary },
310
+ }),
311
+ );
312
+ } else {
313
+ authenticated = true;
314
+ checks.push(
315
+ makeCheck({
316
+ key: "authentication",
317
+ name: "Authenticate with Kibana",
318
+ status: "pass",
319
+ startedAtMs,
320
+ message:
321
+ `Kibana ${status.version || ""} at ${hostLabel} accepted the API key. Overall status: ${status.level || "unknown"}.`.replace(
322
+ /\s+/g,
323
+ " ",
324
+ ),
325
+ details: {
326
+ kibanaVersion: status.version,
327
+ level: status.level,
328
+ summary: status.summary,
329
+ },
330
+ }),
331
+ );
332
+ }
333
+ } catch (error) {
334
+ checks.push(
335
+ makeCheck({
336
+ key: "authentication",
337
+ name: "Authenticate with Kibana",
338
+ status: "fail",
339
+ startedAtMs,
340
+ message: ElasticSecurityConnector.errorMessage(error),
341
+ remediation: ElasticSecurityConnector.remediationFor(
342
+ error,
343
+ "authentication",
344
+ ),
345
+ }),
346
+ );
347
+ }
348
+
349
+ if (!authenticated) {
350
+ checks.push(
351
+ ElasticSecurityConnector.skipped(
352
+ "read-permission",
353
+ "Read detection alerts",
354
+ "Skipped because authentication did not succeed.",
355
+ ),
356
+ );
357
+ checks.push(
358
+ ElasticSecurityConnector.skipped(
359
+ "detections-available",
360
+ "Alerts available to import",
361
+ "Skipped because authentication did not succeed.",
362
+ ),
363
+ );
364
+ return checks;
365
+ }
366
+
367
+ const now: Date = new Date();
368
+ const dayAgo: Date = new Date(now.getTime() - DAY_IN_MS);
369
+ const weekAgo: Date = new Date(now.getTime() - 7 * DAY_IN_MS);
370
+
371
+ // 2. Read permission: one alert from the last 24 hours.
372
+ startedAtMs = Date.now();
373
+ let readable: boolean = false;
374
+
375
+ try {
376
+ const page: ElasticSearchAlertsResult = await client.searchAlerts({
377
+ startTime: dayAgo,
378
+ endTime: now,
379
+ size: 1,
380
+ });
381
+ readable = true;
382
+
383
+ const firstHit: ElasticAlertHit | undefined = page.hits[0];
384
+ const ruleName: string = firstHit
385
+ ? ElasticSecurityConnector.describeHit(firstHit)
386
+ : "";
387
+
388
+ checks.push(
389
+ makeCheck({
390
+ key: "read-permission",
391
+ name: "Read detection alerts",
392
+ status: "pass",
393
+ startedAtMs,
394
+ message: firstHit
395
+ ? `The detection alerts index is readable; the one-record probe over the last 24 hours returned an alert from rule "${ruleName}".`
396
+ : "The detection alerts index is readable. No alert was created in the last 24 hours.",
397
+ }),
398
+ );
399
+ } catch (error) {
400
+ checks.push(
401
+ makeCheck({
402
+ key: "read-permission",
403
+ name: "Read detection alerts",
404
+ status: "fail",
405
+ startedAtMs,
406
+ message: ElasticSecurityConnector.errorMessage(error),
407
+ remediation: ElasticSecurityConnector.remediationFor(
408
+ error,
409
+ "read-permission",
410
+ ),
411
+ }),
412
+ );
413
+ }
414
+
415
+ if (!readable) {
416
+ checks.push(
417
+ ElasticSecurityConnector.skipped(
418
+ "detections-available",
419
+ "Alerts available to import",
420
+ "Skipped because detection alerts could not be read.",
421
+ ),
422
+ );
423
+ return checks;
424
+ }
425
+
426
+ // 3. Availability: counts over the last 24 hours and 7 days.
427
+ startedAtMs = Date.now();
428
+
429
+ try {
430
+ const last24h: ElasticAlertCount = await client.countAlerts({
431
+ startTime: dayAgo,
432
+ endTime: now,
433
+ });
434
+ const last7d: ElasticAlertCount = await client.countAlerts({
435
+ startTime: weekAgo,
436
+ endTime: now,
437
+ });
438
+
439
+ const label24h: string = ElasticSecurityConnector.countLabel(last24h);
440
+ const label7d: string = ElasticSecurityConnector.countLabel(last7d);
441
+ const nothing: boolean = last24h.count === 0 && last7d.count === 0;
442
+
443
+ const details: JSONObject = {
444
+ createdLast24h: last24h.count,
445
+ createdLast7d: last7d.count,
446
+ hasMoreLast24h: !last24h.exact,
447
+ hasMoreLast7d: !last7d.exact,
448
+ };
449
+
450
+ checks.push(
451
+ makeCheck({
452
+ key: "detections-available",
453
+ name: "Alerts available to import",
454
+ status: nothing ? "warn" : "pass",
455
+ startedAtMs,
456
+ message: nothing
457
+ ? "No alerts were created in the last 7 days. Polling will import new alerts as Elastic Security creates them."
458
+ : `${label24h} alert${label24h === "1" ? "" : "s"} created in the last 24 hours and ${label7d} in the last 7 days.`,
459
+ ...(nothing
460
+ ? {
461
+ remediation:
462
+ "If you expect alerts, check that detection rules are enabled in this Kibana space and that the space in the connection matches the one the rules run in (alerts are stored per space).",
463
+ }
464
+ : {}),
465
+ details,
466
+ }),
467
+ );
468
+ } catch (error) {
469
+ checks.push(
470
+ makeCheck({
471
+ key: "detections-available",
472
+ name: "Alerts available to import",
473
+ status: "fail",
474
+ startedAtMs,
475
+ message: ElasticSecurityConnector.errorMessage(error),
476
+ remediation: ElasticSecurityConnector.remediationFor(
477
+ error,
478
+ "detections-available",
479
+ ),
480
+ }),
481
+ );
482
+ }
483
+
484
+ return checks;
485
+ }
486
+
487
+ /*
488
+ * Read every alert created in the window, page by page and oldest
489
+ * first, within the request and event budgets. A budget hit returns
490
+ * complete=false with a warning and the resume point; nothing is
491
+ * silently dropped.
492
+ */
493
+ public async fetchEvents(
494
+ settings: SecurityConnectorSettings,
495
+ window: ConnectorFetchWindow,
496
+ options: ConnectorFetchOptions,
497
+ ): Promise<ConnectorFetchResult> {
498
+ const parsed: ParsedSettings =
499
+ ElasticSecurityConnector.parseSettings(settings);
500
+ const client: ElasticSecurityClient = this.buildClient(
501
+ parsed,
502
+ options.requestTimeoutInMs,
503
+ );
504
+
505
+ const result: ConnectorFetchResult = {
506
+ events: [],
507
+ fetchedCount: 0,
508
+ rejectedCount: 0,
509
+ failedCount: 0,
510
+ complete: true,
511
+ requestCount: 0,
512
+ warnings: [],
513
+ samples: [],
514
+ };
515
+
516
+ const pageSize: number = Math.max(
517
+ 1,
518
+ Math.min(ELASTIC_SECURITY_MAX_PAGE_SIZE, Math.trunc(options.maxEvents)),
519
+ );
520
+ const endIso: string = window.endTime.toISOString();
521
+ const seenIds: Set<string> = new Set<string>();
522
+ let lowerBound: string = window.startTime.toISOString();
523
+ /*
524
+ * Ids of the alerts already read whose @timestamp is the lower bound.
525
+ * Every alert read earlier is older than the lower bound (pages are
526
+ * ascending and the bound only moves forward), so these are the only
527
+ * read alerts the next `gte` request could return again.
528
+ */
529
+ let tieIds: Array<string> = [];
530
+ // The newest @timestamp read; pages are ascending, so also the last.
531
+ let lastReadTime: Date | undefined = undefined;
532
+
533
+ for (;;) {
534
+ if (result.requestCount >= options.maxRequests) {
535
+ result.complete = false;
536
+ result.warnings.push(
537
+ `Stopped after ${options.maxRequests} requests with alerts still unread from ${lowerBound}.`,
538
+ );
539
+ break;
540
+ }
541
+
542
+ if (
543
+ Buffer.byteLength(JSON.stringify(tieIds), "utf8") >
544
+ ELASTIC_SECURITY_MAX_EXCLUDED_ID_BYTES
545
+ ) {
546
+ result.complete = false;
547
+ result.warnings.push(
548
+ `${tieIds.length} alerts read so far share the creation time ${lowerBound}, more than one search request can exclude, so the rest of the alerts created at that instant were not read.`,
549
+ );
550
+ break;
551
+ }
552
+
553
+ const page: ElasticSearchAlertsResult = await client.searchAlerts({
554
+ startTime: lowerBound,
555
+ endTime: endIso,
556
+ size: pageSize,
557
+ excludeIds: tieIds,
558
+ });
559
+ result.requestCount += 1;
560
+
561
+ let newInPage: number = 0;
562
+ let reachedEventBound: boolean = false;
563
+
564
+ for (const hit of page.hits) {
565
+ /*
566
+ * A hit without an _id cannot be deduplicated across the overlap
567
+ * re-read; its content stands in for the id so an identical
568
+ * document is still recognized as the same alert.
569
+ */
570
+ const key: string = hit.id || JSON.stringify(hit.source);
571
+
572
+ /*
573
+ * Normally excluded by the query; kept so a Kibana or proxy that
574
+ * drops the exclusion re-reads nothing twice.
575
+ */
576
+ if (seenIds.has(key)) {
577
+ continue;
578
+ }
579
+
580
+ if (result.fetchedCount >= options.maxEvents) {
581
+ reachedEventBound = true;
582
+ break;
583
+ }
584
+
585
+ seenIds.add(key);
586
+ newInPage += 1;
587
+ result.fetchedCount += 1;
588
+
589
+ const hitTime: Date | null = parseEventTime(hit.timestamp);
590
+
591
+ if (
592
+ hitTime &&
593
+ (!lastReadTime || hitTime.getTime() > lastReadTime.getTime())
594
+ ) {
595
+ lastReadTime = hitTime;
596
+ }
597
+
598
+ this.collect(hit, result, options.sampleLimit);
599
+ }
600
+
601
+ if (reachedEventBound) {
602
+ result.complete = false;
603
+ result.warnings.push(
604
+ `Stopped after collecting ${options.maxEvents} alerts; the window holds more.`,
605
+ );
606
+ break;
607
+ }
608
+
609
+ // A short page is the last page.
610
+ if (page.hits.length < pageSize) {
611
+ break;
612
+ }
613
+
614
+ const lastHit: ElasticAlertHit | undefined =
615
+ page.hits[page.hits.length - 1];
616
+ const lastTimestamp: string = lastHit?.timestamp || "";
617
+
618
+ if (!lastTimestamp) {
619
+ result.complete = false;
620
+ result.warnings.push(
621
+ "A full page of alerts ended with a document that has no @timestamp, so the window cannot be paged further.",
622
+ );
623
+ break;
624
+ }
625
+
626
+ /*
627
+ * A full page with nothing new means the source ignored the
628
+ * exclusion and the lower bound is not moving the result set;
629
+ * another request would return the same page. Report it rather
630
+ * than loop.
631
+ */
632
+ if (newInPage === 0) {
633
+ result.complete = false;
634
+ result.warnings.push(
635
+ `A full page of alerts from ${lowerBound} contained only alerts already read, so the window cannot be paged further.`,
636
+ );
637
+ break;
638
+ }
639
+
640
+ const idsAtLastTimestamp: Array<string> = page.hits
641
+ .filter((hit: ElasticAlertHit): boolean => {
642
+ return (
643
+ Boolean(hit.id) &&
644
+ ElasticSecurityConnector.sameInstant(hit.timestamp, lastTimestamp)
645
+ );
646
+ })
647
+ .map((hit: ElasticAlertHit): string => {
648
+ return hit.id;
649
+ });
650
+
651
+ /*
652
+ * A page that did not get past the lower bound (all of it shares
653
+ * that instant) adds to the ids already excluded there; a page that
654
+ * moved the bound starts a new list, because nothing read before it
655
+ * carries the new timestamp.
656
+ */
657
+ tieIds = ElasticSecurityConnector.sameInstant(lastTimestamp, lowerBound)
658
+ ? Array.from(new Set<string>([...tieIds, ...idsAtLastTimestamp]))
659
+ : Array.from(new Set<string>(idsAtLastTimestamp));
660
+ lowerBound = lastTimestamp;
661
+ }
662
+
663
+ /*
664
+ * Every alert created strictly before lastReadTime inside the window
665
+ * has been read, which is exactly what the poller needs to move on.
666
+ */
667
+ if (!result.complete && lastReadTime) {
668
+ result.resumeAfter = lastReadTime;
669
+ }
670
+
671
+ return result;
672
+ }
673
+
674
+ /*
675
+ * Two @timestamp values name the same instant. Compared as times so
676
+ * "…412Z" and "…412+00:00" group together; the raw strings are compared
677
+ * only when one does not parse.
678
+ */
679
+ private static sameInstant(left: string, right: string): boolean {
680
+ const leftTime: Date | null = parseEventTime(left);
681
+ const rightTime: Date | null = parseEventTime(right);
682
+
683
+ if (leftTime && rightTime) {
684
+ return leftTime.getTime() === rightTime.getTime();
685
+ }
686
+
687
+ return left === right;
688
+ }
689
+
690
+ private collect(
691
+ hit: ElasticAlertHit,
692
+ result: ConnectorFetchResult,
693
+ sampleLimit: number,
694
+ ): void {
695
+ const raw: JSONObject = ElasticSecurityConnector.toRaw(hit);
696
+
697
+ if (!ElasticSecurityNormalizer.isRecognized(raw)) {
698
+ result.rejectedCount += 1;
699
+ return;
700
+ }
701
+
702
+ let normalized: NormalizedSecurityEvent;
703
+
704
+ try {
705
+ normalized = ElasticSecurityNormalizer.normalize(raw);
706
+ } catch (error) {
707
+ result.failedCount += 1;
708
+
709
+ if (result.warnings.length < MAX_NORMALIZATION_WARNINGS) {
710
+ result.warnings.push(
711
+ `Alert ${hit.id || "(no id)"} could not be normalized: ${redactLogString(ConnectorErrorMessage.toMessage(error))}`,
712
+ );
713
+ }
714
+
715
+ return;
716
+ }
717
+
718
+ result.events.push(normalized);
719
+
720
+ if (result.samples.length < sampleLimit) {
721
+ const sample: SecurityConnectorSample = {
722
+ id: normalized.eventUid,
723
+ title: normalized.ruleName || normalized.message,
724
+ severity: normalized.severityName,
725
+ ...(hit.timestamp ? { createdTime: hit.timestamp } : {}),
726
+ eventTime: normalized.time.toISOString(),
727
+ };
728
+ result.samples.push(sample);
729
+ }
730
+ }
731
+
732
+ private static toRaw(hit: ElasticAlertHit): JSONObject {
733
+ return {
734
+ _id: hit.id,
735
+ _index: hit.index,
736
+ _source: hit.source,
737
+ };
738
+ }
739
+
740
+ /*
741
+ * The rule name for the read-permission message. A document the
742
+ * normalizer cannot read must not turn a successful read into a failed
743
+ * check, so this never throws.
744
+ */
745
+ private static describeHit(hit: ElasticAlertHit): string {
746
+ try {
747
+ const raw: JSONObject = this.toRaw(hit);
748
+
749
+ if (!ElasticSecurityNormalizer.isRecognized(raw)) {
750
+ return "unrecognized document";
751
+ }
752
+
753
+ return redactLogString(
754
+ ElasticSecurityNormalizer.normalize(raw).ruleName || "unnamed",
755
+ );
756
+ } catch {
757
+ return "unreadable document";
758
+ }
759
+ }
760
+
761
+ private static skipped(
762
+ key: string,
763
+ name: string,
764
+ message: string,
765
+ ): SecurityConnectorCheck {
766
+ return makeCheck({
767
+ key,
768
+ name,
769
+ status: "skip",
770
+ startedAtMs: Date.now(),
771
+ message,
772
+ });
773
+ }
774
+
775
+ private static countLabel(count: ElasticAlertCount): string {
776
+ return count.exact ? String(count.count) : `${count.count}+`;
777
+ }
778
+
779
+ private static errorMessage(error: unknown): string {
780
+ return redactLogString(
781
+ ConnectorErrorMessage.toMessage(error, { truncate: false }),
782
+ );
783
+ }
784
+
785
+ /*
786
+ * Remediation is chosen by HTTP status when the failure carried one,
787
+ * and by the step otherwise (a timeout or a non-JSON body means the URL
788
+ * is not reaching Kibana at all).
789
+ */
790
+ private static remediationFor(
791
+ error: unknown,
792
+ step: ProviderCheckStep,
793
+ ): string {
794
+ const status: number | null =
795
+ error instanceof ElasticSecurityHttpError ? error.statusCode : null;
796
+
797
+ if (status === 401) {
798
+ return "Create a new API key in Kibana (Stack Management > API keys) and paste its base64 encoded value with Update credentials. Keys can be given an expiry; an expired or invalidated key answers 401.";
799
+ }
800
+
801
+ if (status === 403) {
802
+ return "Grant the API key's user (or its role descriptors) read and view_index_metadata on the .alerts-security.alerts-<space-id> index and the Kibana Security feature privilege that allows viewing alerts in this space, then test again.";
803
+ }
804
+
805
+ if (status === 404) {
806
+ return "Check the Kibana URL and Kibana space. The URL must be the origin Kibana is served from (for example https://kibana.example.com or https://<deployment>.kb.<region>.cloud.es.io), and the space must be the space id, not its display name.";
807
+ }
808
+
809
+ if (status === 429) {
810
+ return "Kibana or Elasticsearch is rate limiting. Wait and test again; consider a longer poll interval.";
811
+ }
812
+
813
+ if (status !== null && status >= 500) {
814
+ return "Kibana or Elasticsearch failed internally. Check the Kibana server logs and Elasticsearch cluster health, then test again.";
815
+ }
816
+
817
+ if (step === "authentication") {
818
+ return "OneUptime could not get a readable status document from Kibana. Check that the Kibana URL is reachable from the OneUptime API and worker processes (a private network needs a self-hosted OneUptime or a network path), uses the right scheme and port, and is not behind a login page or proxy that rewrites responses.";
819
+ }
820
+
821
+ if (step === "read-permission") {
822
+ return "Kibana answered the status request but not the detection engine search. Confirm Elastic Security is enabled in this space and that the API key can read detection alerts.";
823
+ }
824
+
825
+ return "The alert count request failed after a successful read. Test again; if it persists, check the Kibana server logs for the signals search endpoint.";
826
+ }
827
+ }