@oneuptime/common 12.0.15 → 12.0.16

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 (707) hide show
  1. package/Models/AnalyticsModels/Index.ts +10 -0
  2. package/Models/AnalyticsModels/LogCountBaseline.ts +174 -0
  3. package/Models/AnalyticsModels/SecurityEvent.ts +794 -0
  4. package/Models/AnalyticsModels/Span.ts +29 -1
  5. package/Models/AnalyticsModels/SpanCountBaseline.ts +198 -0
  6. package/Models/DatabaseModels/Alert.ts +42 -0
  7. package/Models/DatabaseModels/AlertMeasurement.ts +1114 -0
  8. package/Models/DatabaseModels/AlertMeasurementValue.ts +501 -0
  9. package/Models/DatabaseModels/AlertStateTimeline.ts +10 -2
  10. package/Models/DatabaseModels/BillingPaymentMethod.ts +8 -10
  11. package/Models/DatabaseModels/DetectionRule.ts +487 -0
  12. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +382 -0
  13. package/Models/DatabaseModels/Incident.ts +42 -0
  14. package/Models/DatabaseModels/IncidentMeasurement.ts +1114 -0
  15. package/Models/DatabaseModels/IncidentMeasurementValue.ts +501 -0
  16. package/Models/DatabaseModels/IncidentStateTimeline.ts +10 -2
  17. package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +36 -0
  18. package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +42 -0
  19. package/Models/DatabaseModels/Index.ts +20 -0
  20. package/Models/DatabaseModels/Label.ts +11 -0
  21. package/Models/DatabaseModels/LlmCostBudget.ts +655 -0
  22. package/Models/DatabaseModels/LlmModelPrice.ts +481 -0
  23. package/Models/DatabaseModels/LogSavedView.ts +87 -0
  24. package/Models/DatabaseModels/MarketingConversion.ts +210 -8
  25. package/Models/DatabaseModels/MetricSavedView.ts +59 -0
  26. package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +36 -0
  27. package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +42 -0
  28. package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +36 -0
  29. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +42 -0
  30. package/Models/DatabaseModels/Probe.ts +21 -0
  31. package/Models/DatabaseModels/RunbookLabelRule.ts +36 -0
  32. package/Models/DatabaseModels/RunbookOwnerRule.ts +42 -0
  33. package/Models/DatabaseModels/ScheduledMaintenanceMeasurement.ts +1104 -0
  34. package/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.ts +491 -0
  35. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +10 -2
  36. package/Models/DatabaseModels/StatusPageLabelRule.ts +36 -0
  37. package/Models/DatabaseModels/StatusPageOwnerRule.ts +42 -0
  38. package/Models/DatabaseModels/TableView.ts +15 -0
  39. package/Models/DatabaseModels/Team.ts +13 -0
  40. package/Models/DatabaseModels/TeamMember.ts +8 -0
  41. package/Models/DatabaseModels/TraceSavedView.ts +52 -0
  42. package/Models/DatabaseModels/WorkflowLabelRule.ts +36 -0
  43. package/Models/DatabaseModels/WorkflowOwnerRule.ts +42 -0
  44. package/Server/API/TelemetryAPI.ts +252 -6
  45. package/Server/API/UserAPI.ts +88 -0
  46. package/Server/EnvironmentConfig.ts +36 -1
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.ts +88 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.ts +457 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.ts +97 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.ts +45 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.ts +105 -0
  52. package/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.ts +77 -0
  53. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  54. package/Server/Middleware/IdentityRateLimit.ts +672 -0
  55. package/Server/Services/AccessTokenService.ts +15 -2
  56. package/Server/Services/AlertMeasurementService.ts +302 -0
  57. package/Server/Services/AlertMeasurementValueService.ts +508 -0
  58. package/Server/Services/AlertService.ts +50 -0
  59. package/Server/Services/AlertStateTimelineService.ts +54 -0
  60. package/Server/Services/DetectionRuleService.ts +74 -0
  61. package/Server/Services/GoogleSecOpsConnectionService.ts +89 -0
  62. package/Server/Services/IncidentMeasurementService.ts +304 -0
  63. package/Server/Services/IncidentMeasurementValueService.ts +523 -0
  64. package/Server/Services/IncidentService.ts +51 -0
  65. package/Server/Services/IncidentStateTimelineService.ts +54 -0
  66. package/Server/Services/Index.ts +30 -0
  67. package/Server/Services/LlmCostBudgetService.ts +93 -0
  68. package/Server/Services/LlmModelPriceService.ts +202 -0
  69. package/Server/Services/LogAggregationService.ts +1106 -2
  70. package/Server/Services/LogCountBaselineService.ts +163 -0
  71. package/Server/Services/MutableMetricService.ts +30 -9
  72. package/Server/Services/ScheduledMaintenanceMeasurementService.ts +311 -0
  73. package/Server/Services/ScheduledMaintenanceMeasurementValueService.ts +546 -0
  74. package/Server/Services/ScheduledMaintenanceService.ts +53 -0
  75. package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +188 -1
  76. package/Server/Services/SecurityEventService.ts +104 -0
  77. package/Server/Services/SpanCountBaselineService.ts +173 -0
  78. package/Server/Services/StatusPageService.ts +4 -3
  79. package/Server/Services/TelemetryUsageBillingService.ts +17 -2
  80. package/Server/Services/UserService.ts +284 -51
  81. package/Server/Services/UserTotpAuthService.ts +27 -86
  82. package/Server/Services/UserWebAuthnService.ts +26 -86
  83. package/Server/Types/Billing/MeteredPlan/AllMeteredPlans.ts +14 -0
  84. package/Server/Types/Database/Permissions/TenantPermission.ts +10 -0
  85. package/Server/Types/Database/QueryHelper.ts +1 -1
  86. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  87. package/Server/Utils/AI/Toolbox/Index.ts +6 -0
  88. package/Server/Utils/AI/Toolbox/SecurityEventTools.ts +349 -0
  89. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -4
  90. package/Server/Utils/Attribution.ts +130 -34
  91. package/Server/Utils/Marketing/ConversionUploadProvider.ts +98 -16
  92. package/Server/Utils/Marketing/Providers/GoogleAds.ts +70 -7
  93. package/Server/Utils/Marketing/Providers/LinkedIn.ts +54 -16
  94. package/Server/Utils/Marketing/Providers/Meta.ts +52 -18
  95. package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +37 -10
  96. package/Server/Utils/Marketing/Providers/Reddit.ts +45 -15
  97. package/Server/Utils/Measurement/MeasurementDefinitionValidator.ts +209 -0
  98. package/Server/Utils/Measurement/MeasurementMetricWriter.ts +189 -0
  99. package/Server/Utils/Monitor/Criteria/CountAnomaly.ts +182 -0
  100. package/Server/Utils/Monitor/Criteria/LogMonitorCriteria.ts +132 -0
  101. package/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.ts +35 -0
  102. package/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.ts +132 -0
  103. package/Server/Utils/Monitor/DataToProcess.ts +2 -0
  104. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
  105. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +15 -0
  106. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +20 -0
  107. package/Server/Utils/Monitor/MonitorResource.ts +16 -0
  108. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +1 -0
  109. package/Server/Utils/Monitor/MonitorStepsReferenceExtractor.ts +1 -0
  110. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +548 -0
  111. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +262 -0
  112. package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +212 -0
  113. package/Server/Utils/SecurityEvent/SecurityEventRow.ts +101 -0
  114. package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +635 -0
  115. package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +379 -0
  116. package/Server/Utils/Telemetry/LlmSpan.ts +83 -4
  117. package/Server/Utils/Telemetry/LogErrorPatternSql.ts +136 -0
  118. package/Server/Utils/UserPermission/UserPermission.ts +57 -1
  119. package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +4 -0
  120. package/Tests/App/Dashboard/CreatePageEntryPointPermissions.test.tsx +306 -0
  121. package/Tests/App/Dashboard/DangerZone.test.tsx +11 -0
  122. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +4 -0
  123. package/Tests/App/Dashboard/LogMonitorAttributeOperatorPreview.test.tsx +459 -0
  124. package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +24 -0
  125. package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +6 -0
  126. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +323 -0
  127. package/Tests/Models/DatabaseModels/ProjectSharedResources.test.ts +386 -0
  128. package/Tests/Server/API/LogErrorPatternAPI.test.ts +811 -0
  129. package/Tests/Server/API/UserAuthenticationAPI.test.ts +11 -0
  130. package/Tests/Server/API/UserProjectsAPI.test.ts +11 -2
  131. package/Tests/Server/API/UserTwoFactorAuthAdminAPI.test.ts +918 -0
  132. package/Tests/Server/Infrastructure/LocalCache.test.ts +149 -0
  133. package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +249 -0
  134. package/Tests/Server/Services/AlertMeasurementService.test.ts +665 -0
  135. package/Tests/Server/Services/AlertMeasurementValueService.test.ts +389 -0
  136. package/Tests/Server/Services/DetectionRuleService.test.ts +254 -0
  137. package/Tests/Server/Services/IncidentMeasurementService.test.ts +394 -0
  138. package/Tests/Server/Services/IncidentMeasurementValueService.test.ts +816 -0
  139. package/Tests/Server/Services/LlmCostBudgetService.test.ts +104 -0
  140. package/Tests/Server/Services/LogAggregationAttributeOperators.test.ts +405 -0
  141. package/Tests/Server/Services/LogErrorPatternAggregation.test.ts +804 -0
  142. package/Tests/Server/Services/MutableMetricNameRouting.test.ts +83 -0
  143. package/Tests/Server/Services/ScheduledMaintenanceMeasurementService.test.ts +750 -0
  144. package/Tests/Server/Services/ScheduledMaintenanceMeasurementValueService.test.ts +478 -0
  145. package/Tests/Server/Services/UserAuthenticationService.test.ts +216 -4
  146. package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +1190 -0
  147. package/Tests/Server/Types/Database/Permissions/ScopedRoleSharedResourceAccess.test.ts +466 -0
  148. package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +265 -0
  149. package/Tests/Server/Types/Database/QueryHelperTextAndStructuralOperators.test.ts +206 -0
  150. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +6 -0
  151. package/Tests/Server/Utils/AnalyticsDatabase/FractionalAttributeThreshold.test.ts +224 -0
  152. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +172 -2
  153. package/Tests/Server/Utils/Attribution.test.ts +228 -1
  154. package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +153 -92
  155. package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +123 -6
  156. package/Tests/Server/Utils/Marketing/GoogleAds.test.ts +253 -1
  157. package/Tests/Server/Utils/Marketing/LinkedIn.test.ts +282 -0
  158. package/Tests/Server/Utils/Marketing/Meta.test.ts +304 -0
  159. package/Tests/Server/Utils/Marketing/MicrosoftAds.test.ts +263 -0
  160. package/Tests/Server/Utils/Marketing/Reddit.test.ts +259 -0
  161. package/Tests/Server/Utils/Measurement/MeasurementDefinitionValidator.test.ts +322 -0
  162. package/Tests/Server/Utils/Measurement/MeasurementMetricWriter.test.ts +373 -0
  163. package/Tests/Server/Utils/Monitor/Criteria/CountAnomaly.test.ts +221 -0
  164. package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +236 -0
  165. package/Tests/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.test.ts +147 -0
  166. package/Tests/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.test.ts +274 -0
  167. package/Tests/Server/Utils/Monitor/SecurityEventsMonitorDataExtractor.test.ts +93 -0
  168. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +660 -0
  169. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +308 -0
  170. package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +271 -0
  171. package/Tests/Server/Utils/SecurityEvent/SecurityEventRow.test.ts +272 -0
  172. package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +511 -0
  173. package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +497 -0
  174. package/Tests/Server/Utils/Telemetry/LlmSpan.test.ts +380 -0
  175. package/Tests/Server/Utils/Telemetry/LogErrorPatternSql.test.ts +207 -0
  176. package/Tests/Server/Utils/UserPermission/ProjectUserGrant.test.ts +293 -0
  177. package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +194 -0
  178. package/Tests/Types/Monitor/MonitorStepSecurityEventsMonitor.test.ts +201 -0
  179. package/Tests/Types/SecurityEvent/OcsfEventClass.test.ts +105 -0
  180. package/Tests/Types/SecurityEvent/OcsfSeverity.test.ts +111 -0
  181. package/Tests/Types/Telemetry/LlmCostCatalog.test.ts +516 -0
  182. package/Tests/UI/Components/ActiveFilterChipsOperatorValues.test.tsx +222 -0
  183. package/Tests/UI/Components/BulkActionPermissionGating.test.tsx +296 -0
  184. package/Tests/UI/Components/CardModelDetailPermissionGating.test.tsx +305 -0
  185. package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +23 -0
  186. package/Tests/UI/Components/DictionaryFilterOperatorDisplay.test.ts +239 -0
  187. package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +267 -0
  188. package/Tests/UI/Components/DuplicateModel.test.tsx +37 -0
  189. package/Tests/UI/Components/ModelCardPermissionGating.test.tsx +348 -0
  190. package/Tests/UI/Components/ModelDelete.test.tsx +25 -1
  191. package/Tests/UI/Components/ModelFormCreatePermission.test.tsx +342 -0
  192. package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +680 -0
  193. package/Tests/UI/Components/OrderedStatesListCreateGate.test.tsx +174 -0
  194. package/Tests/UI/Components/SavedViewsDropdownSearch.test.tsx +1127 -0
  195. package/Tests/UI/Components/SavedViewsFacetSection.test.tsx +958 -0
  196. package/Tests/UI/Components/SavedViewsList.test.ts +699 -0
  197. package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +640 -0
  198. package/Tests/UI/Components/SavedViewsSurfaceParity.test.tsx +679 -0
  199. package/Tests/UI/Components/TableViewLoadFailure.test.tsx +248 -0
  200. package/Tests/UI/Types/UseComponentOutsideClick.test.tsx +226 -0
  201. package/Tests/UI/Utils/PermissionGate.test.ts +467 -0
  202. package/Tests/Utils/Measurement/MeasurementEvaluator.test.ts +639 -0
  203. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  204. package/Tests/Utils/Monitor/NetworkDeviceLinkRuleUtil.test.ts +285 -0
  205. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +433 -0
  206. package/Tests/Utils/SecurityEvent/GenericNormalizer.test.ts +204 -0
  207. package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +252 -0
  208. package/Tests/Utils/SecurityEvent/NormalizerHelpers.test.ts +274 -0
  209. package/Tests/Utils/SecurityEvent/OcsfNormalizer.test.ts +208 -0
  210. package/Tests/Utils/SecurityEvent/SecurityEventNormalizer.test.ts +172 -0
  211. package/Tests/Utils/SecurityEvent/SigmaRuleParser.test.ts +471 -0
  212. package/Tests/Utils/SecurityEvent/UdmNormalizer.test.ts +361 -0
  213. package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +82 -0
  214. package/Tests/Utils/Telemetry/LogErrorPattern.test.ts +463 -0
  215. package/Types/AI/AIChatTypes.ts +1 -0
  216. package/Types/Alerts/AlertMeasurementAnchorType.ts +14 -0
  217. package/Types/Alerts/AlertStateRole.ts +11 -0
  218. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +16 -0
  219. package/Types/Dashboard/Chart/ChartType.ts +1 -0
  220. package/Types/Dashboard/DashboardComponentType.ts +2 -0
  221. package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.ts +18 -0
  222. package/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.ts +16 -0
  223. package/Types/Incident/IncidentMeasurementAnchorType.ts +34 -0
  224. package/Types/Incident/IncidentStateRole.ts +14 -0
  225. package/Types/Marketing/Attribution.ts +75 -0
  226. package/Types/Marketing/MarketingConversion.ts +37 -7
  227. package/Types/Measurement/MeasurementAggregationType.ts +43 -0
  228. package/Types/Measurement/MeasurementAnchorKind.ts +23 -0
  229. package/Types/Measurement/MeasurementOccurrence.ts +14 -0
  230. package/Types/Measurement/MeasurementStatus.ts +34 -0
  231. package/Types/MeteredPlan/ProductType.ts +1 -0
  232. package/Types/Monitor/CriteriaFilter.ts +3 -0
  233. package/Types/Monitor/MonitorCriteriaInstance.ts +64 -0
  234. package/Types/Monitor/MonitorStep.ts +28 -0
  235. package/Types/Monitor/MonitorStepSecurityEventsMonitor.ts +100 -0
  236. package/Types/Monitor/MonitorType.ts +20 -0
  237. package/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.ts +17 -0
  238. package/Types/Permission.ts +399 -2
  239. package/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.ts +20 -0
  240. package/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.ts +16 -0
  241. package/Types/SecurityEvent/NormalizedSecurityEvent.ts +92 -0
  242. package/Types/SecurityEvent/OcsfEventClass.ts +205 -0
  243. package/Types/SecurityEvent/OcsfSeverity.ts +88 -0
  244. package/Types/SecurityEvent/SecurityEventFormat.ts +23 -0
  245. package/Types/SecurityEvent/SigmaRule.ts +70 -0
  246. package/Types/Telemetry/LlmConventions.ts +20 -1
  247. package/Types/Telemetry/LlmCostCatalog.ts +557 -0
  248. package/Types/Telemetry/ServiceType.ts +1 -0
  249. package/Types/Telemetry/TelemetryRetentionConfig.ts +5 -1
  250. package/Types/Telemetry/TelemetryType.ts +1 -0
  251. package/Types/TwoFactorAuthStatus.ts +42 -0
  252. package/Types/UserAuthenticationStatus.ts +18 -0
  253. package/UI/Components/ActionButton/ActionButtonSchema.ts +7 -0
  254. package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +35 -2
  255. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +34 -1
  256. package/UI/Components/BulkUpdate/BulkOwnerActions.tsx +45 -1
  257. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +3 -0
  258. package/UI/Components/Button/Button.tsx +37 -2
  259. package/UI/Components/Card/Card.tsx +6 -0
  260. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +24 -1
  261. package/UI/Components/Dictionary/DictionaryFilterOperator.ts +57 -0
  262. package/UI/Components/DuplicateModel/DuplicateModel.tsx +16 -0
  263. package/UI/Components/Forms/ModelForm.tsx +54 -2
  264. package/UI/Components/List/ListRow.tsx +6 -0
  265. package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +34 -7
  266. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +7 -40
  267. package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +155 -3
  268. package/UI/Components/ModelDelete/ModelDelete.tsx +20 -0
  269. package/UI/Components/ModelDetail/CardModelDetail.tsx +36 -23
  270. package/UI/Components/ModelList/ModelList.tsx +21 -2
  271. package/UI/Components/ModelList/StaticModelList.tsx +11 -0
  272. package/UI/Components/ModelTable/BaseModelTable.tsx +168 -62
  273. package/UI/Components/ModelTable/ModelTable.tsx +16 -10
  274. package/UI/Components/ModelTable/TableView.tsx +36 -4
  275. package/UI/Components/MoreMenu/MoreMenuItem.tsx +36 -4
  276. package/UI/Components/OrderedStatesList/Item.tsx +6 -0
  277. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +81 -47
  278. package/UI/Components/ResetObjectID/ResetObjectID.tsx +16 -0
  279. package/UI/Components/SavedViews/SavedViewsFacetSection.tsx +242 -0
  280. package/UI/Components/SavedViews/SavedViewsList.ts +168 -0
  281. package/UI/Components/SavedViews/SavedViewsSearchInput.tsx +46 -0
  282. package/UI/Components/SavedViews/SavedViewsShowMoreButton.tsx +44 -0
  283. package/UI/Components/Table/TableRow.tsx +12 -0
  284. package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +152 -2
  285. package/UI/Types/UseComponentOutsideClick.ts +47 -0
  286. package/UI/Utils/PermissionGate.ts +277 -0
  287. package/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.ts +84 -0
  288. package/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.ts +110 -0
  289. package/Utils/Dashboard/Components/Index.ts +14 -0
  290. package/Utils/Measurement/MeasurementEvaluator.ts +359 -0
  291. package/Utils/Monitor/MonitorSummarySnapshotUtil.ts +1 -0
  292. package/Utils/Monitor/NetworkDeviceLinkRuleUtil.ts +93 -11
  293. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +231 -0
  294. package/Utils/SecurityEvent/GenericNormalizer.ts +208 -0
  295. package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +206 -0
  296. package/Utils/SecurityEvent/NormalizerHelpers.ts +263 -0
  297. package/Utils/SecurityEvent/OcsfNormalizer.ts +194 -0
  298. package/Utils/SecurityEvent/SecurityEventNormalizer.ts +82 -0
  299. package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +579 -0
  300. package/Utils/SecurityEvent/UdmNormalizer.ts +442 -0
  301. package/Utils/Telemetry/CrossSignalScope.ts +46 -9
  302. package/Utils/Telemetry/LogErrorPattern.ts +350 -0
  303. package/build/dist/Models/AnalyticsModels/Index.js +10 -0
  304. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  305. package/build/dist/Models/AnalyticsModels/LogCountBaseline.js +159 -0
  306. package/build/dist/Models/AnalyticsModels/LogCountBaseline.js.map +1 -0
  307. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +596 -0
  308. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -0
  309. package/build/dist/Models/AnalyticsModels/Span.js +24 -1
  310. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  311. package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js +181 -0
  312. package/build/dist/Models/AnalyticsModels/SpanCountBaseline.js.map +1 -0
  313. package/build/dist/Models/DatabaseModels/Alert.js +43 -0
  314. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  315. package/build/dist/Models/DatabaseModels/AlertMeasurement.js +1143 -0
  316. package/build/dist/Models/DatabaseModels/AlertMeasurement.js.map +1 -0
  317. package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js +523 -0
  318. package/build/dist/Models/DatabaseModels/AlertMeasurementValue.js.map +1 -0
  319. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +9 -2
  320. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
  321. package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js +10 -11
  322. package/build/dist/Models/DatabaseModels/BillingPaymentMethod.js.map +1 -1
  323. package/build/dist/Models/DatabaseModels/DetectionRule.js +517 -0
  324. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -0
  325. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +410 -0
  326. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -0
  327. package/build/dist/Models/DatabaseModels/Incident.js +43 -0
  328. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/IncidentMeasurement.js +1143 -0
  330. package/build/dist/Models/DatabaseModels/IncidentMeasurement.js.map +1 -0
  331. package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js +523 -0
  332. package/build/dist/Models/DatabaseModels/IncidentMeasurementValue.js.map +1 -0
  333. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +9 -2
  334. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  335. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +36 -0
  336. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +42 -0
  338. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
  339. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  340. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  341. package/build/dist/Models/DatabaseModels/Label.js +11 -0
  342. package/build/dist/Models/DatabaseModels/Label.js.map +1 -1
  343. package/build/dist/Models/DatabaseModels/LlmCostBudget.js +681 -0
  344. package/build/dist/Models/DatabaseModels/LlmCostBudget.js.map +1 -0
  345. package/build/dist/Models/DatabaseModels/LlmModelPrice.js +503 -0
  346. package/build/dist/Models/DatabaseModels/LlmModelPrice.js.map +1 -0
  347. package/build/dist/Models/DatabaseModels/LogSavedView.js +87 -0
  348. package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
  349. package/build/dist/Models/DatabaseModels/MarketingConversion.js +224 -8
  350. package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -1
  351. package/build/dist/Models/DatabaseModels/MetricSavedView.js +59 -0
  352. package/build/dist/Models/DatabaseModels/MetricSavedView.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +36 -0
  354. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +42 -0
  356. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +36 -0
  358. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +42 -0
  360. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/Probe.js +21 -0
  362. package/build/dist/Models/DatabaseModels/Probe.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +36 -0
  364. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +42 -0
  366. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
  367. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js +1133 -0
  368. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js.map +1 -0
  369. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js +515 -0
  370. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurementValue.js.map +1 -0
  371. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +9 -2
  372. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  373. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +36 -0
  374. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
  375. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +42 -0
  376. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
  377. package/build/dist/Models/DatabaseModels/TableView.js +15 -0
  378. package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
  379. package/build/dist/Models/DatabaseModels/Team.js +13 -0
  380. package/build/dist/Models/DatabaseModels/Team.js.map +1 -1
  381. package/build/dist/Models/DatabaseModels/TeamMember.js +8 -0
  382. package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
  383. package/build/dist/Models/DatabaseModels/TraceSavedView.js +52 -0
  384. package/build/dist/Models/DatabaseModels/TraceSavedView.js.map +1 -1
  385. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +36 -0
  386. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
  387. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +42 -0
  388. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
  389. package/build/dist/Server/API/TelemetryAPI.js +136 -0
  390. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  391. package/build/dist/Server/API/UserAPI.js +75 -2
  392. package/build/dist/Server/API/UserAPI.js.map +1 -1
  393. package/build/dist/Server/EnvironmentConfig.js +29 -1
  394. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  395. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js +36 -0
  396. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788000000000-AddDetectionRuleAndGoogleSecOpsConnection.js.map +1 -0
  397. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js +162 -0
  398. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788100000000-AddMeasurements.js.map +1 -0
  399. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js +40 -0
  400. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788200000000-AddLlmCostBudget.js.map +1 -0
  401. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js +22 -0
  402. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788300000000-AddLlmModelPrice.js.map +1 -0
  403. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js +52 -0
  404. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788400000000-AddMarketingConversionAttribution.js.map +1 -0
  405. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.js +38 -0
  406. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788500000000-RemoveLlmCostBudgetAlertColumns.js.map +1 -0
  407. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  408. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  409. package/build/dist/Server/Middleware/IdentityRateLimit.js +491 -0
  410. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -0
  411. package/build/dist/Server/Services/AccessTokenService.js +13 -2
  412. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  413. package/build/dist/Server/Services/AlertMeasurementService.js +250 -0
  414. package/build/dist/Server/Services/AlertMeasurementService.js.map +1 -0
  415. package/build/dist/Server/Services/AlertMeasurementValueService.js +400 -0
  416. package/build/dist/Server/Services/AlertMeasurementValueService.js.map +1 -0
  417. package/build/dist/Server/Services/AlertService.js +37 -0
  418. package/build/dist/Server/Services/AlertService.js.map +1 -1
  419. package/build/dist/Server/Services/AlertStateTimelineService.js +48 -0
  420. package/build/dist/Server/Services/AlertStateTimelineService.js.map +1 -1
  421. package/build/dist/Server/Services/DetectionRuleService.js +50 -0
  422. package/build/dist/Server/Services/DetectionRuleService.js.map +1 -0
  423. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +55 -0
  424. package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -0
  425. package/build/dist/Server/Services/IncidentMeasurementService.js +252 -0
  426. package/build/dist/Server/Services/IncidentMeasurementService.js.map +1 -0
  427. package/build/dist/Server/Services/IncidentMeasurementValueService.js +413 -0
  428. package/build/dist/Server/Services/IncidentMeasurementValueService.js.map +1 -0
  429. package/build/dist/Server/Services/IncidentService.js +41 -0
  430. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  431. package/build/dist/Server/Services/IncidentStateTimelineService.js +50 -0
  432. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  433. package/build/dist/Server/Services/Index.js +30 -0
  434. package/build/dist/Server/Services/Index.js.map +1 -1
  435. package/build/dist/Server/Services/LlmCostBudgetService.js +89 -0
  436. package/build/dist/Server/Services/LlmCostBudgetService.js.map +1 -0
  437. package/build/dist/Server/Services/LlmModelPriceService.js +163 -0
  438. package/build/dist/Server/Services/LlmModelPriceService.js.map +1 -0
  439. package/build/dist/Server/Services/LogAggregationService.js +709 -0
  440. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  441. package/build/dist/Server/Services/LogCountBaselineService.js +112 -0
  442. package/build/dist/Server/Services/LogCountBaselineService.js.map +1 -0
  443. package/build/dist/Server/Services/MutableMetricService.js +28 -9
  444. package/build/dist/Server/Services/MutableMetricService.js.map +1 -1
  445. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js +254 -0
  446. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js.map +1 -0
  447. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js +434 -0
  448. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementValueService.js.map +1 -0
  449. package/build/dist/Server/Services/ScheduledMaintenanceService.js +37 -0
  450. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  451. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +134 -0
  452. package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
  453. package/build/dist/Server/Services/SecurityEventService.js +64 -0
  454. package/build/dist/Server/Services/SecurityEventService.js.map +1 -0
  455. package/build/dist/Server/Services/SpanCountBaselineService.js +122 -0
  456. package/build/dist/Server/Services/SpanCountBaselineService.js.map +1 -0
  457. package/build/dist/Server/Services/StatusPageService.js +4 -3
  458. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  459. package/build/dist/Server/Services/TelemetryUsageBillingService.js +15 -3
  460. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  461. package/build/dist/Server/Services/UserService.js +262 -42
  462. package/build/dist/Server/Services/UserService.js.map +1 -1
  463. package/build/dist/Server/Services/UserTotpAuthService.js +0 -73
  464. package/build/dist/Server/Services/UserTotpAuthService.js.map +1 -1
  465. package/build/dist/Server/Services/UserWebAuthnService.js +1 -73
  466. package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
  467. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js +13 -0
  468. package/build/dist/Server/Types/Billing/MeteredPlan/AllMeteredPlans.js.map +1 -1
  469. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +10 -0
  470. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
  471. package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
  472. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  473. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  474. package/build/dist/Server/Utils/AI/Toolbox/Index.js +3 -0
  475. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  476. package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js +257 -0
  477. package/build/dist/Server/Utils/AI/Toolbox/SecurityEventTools.js.map +1 -0
  478. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -4
  479. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  480. package/build/dist/Server/Utils/Attribution.js +77 -33
  481. package/build/dist/Server/Utils/Attribution.js.map +1 -1
  482. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +46 -9
  483. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -1
  484. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +52 -8
  485. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -1
  486. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +41 -17
  487. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -1
  488. package/build/dist/Server/Utils/Marketing/Providers/Meta.js +42 -18
  489. package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -1
  490. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +24 -11
  491. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -1
  492. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +34 -15
  493. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -1
  494. package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js +109 -0
  495. package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js.map +1 -0
  496. package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js +131 -0
  497. package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js.map +1 -0
  498. package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js +111 -0
  499. package/build/dist/Server/Utils/Monitor/Criteria/CountAnomaly.js.map +1 -0
  500. package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js +84 -1
  501. package/build/dist/Server/Utils/Monitor/Criteria/LogMonitorCriteria.js.map +1 -1
  502. package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js +35 -0
  503. package/build/dist/Server/Utils/Monitor/Criteria/SecurityEventsMonitorCriteria.js.map +1 -0
  504. package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.js +84 -1
  505. package/build/dist/Server/Utils/Monitor/Criteria/TraceMonitorCriteria.js.map +1 -1
  506. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
  507. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  508. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +12 -0
  509. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  510. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
  511. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  512. package/build/dist/Server/Utils/Monitor/MonitorResource.js +10 -0
  513. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  514. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +6 -5
  515. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  516. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js +1 -0
  517. package/build/dist/Server/Utils/Monitor/MonitorStepsReferenceExtractor.js.map +1 -1
  518. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +404 -0
  519. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -0
  520. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +145 -0
  521. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
  522. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +176 -0
  523. package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -0
  524. package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js +69 -0
  525. package/build/dist/Server/Utils/SecurityEvent/SecurityEventRow.js.map +1 -0
  526. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +493 -0
  527. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -0
  528. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +317 -0
  529. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -0
  530. package/build/dist/Server/Utils/Telemetry/LlmSpan.js +56 -4
  531. package/build/dist/Server/Utils/Telemetry/LlmSpan.js.map +1 -1
  532. package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js +112 -0
  533. package/build/dist/Server/Utils/Telemetry/LogErrorPatternSql.js.map +1 -0
  534. package/build/dist/Server/Utils/UserPermission/UserPermission.js +46 -1
  535. package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
  536. package/build/dist/Types/AI/AIChatTypes.js +1 -0
  537. package/build/dist/Types/AI/AIChatTypes.js.map +1 -1
  538. package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js +15 -0
  539. package/build/dist/Types/Alerts/AlertMeasurementAnchorType.js.map +1 -0
  540. package/build/dist/Types/Alerts/AlertStateRole.js +12 -0
  541. package/build/dist/Types/Alerts/AlertStateRole.js.map +1 -0
  542. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +16 -0
  543. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  544. package/build/dist/Types/Dashboard/Chart/ChartType.js +1 -0
  545. package/build/dist/Types/Dashboard/Chart/ChartType.js.map +1 -1
  546. package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
  547. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  548. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js +2 -0
  549. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsFlowComponent.js.map +1 -0
  550. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js +2 -0
  551. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSecurityEventsListComponent.js.map +1 -0
  552. package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js +29 -0
  553. package/build/dist/Types/Incident/IncidentMeasurementAnchorType.js.map +1 -0
  554. package/build/dist/Types/Incident/IncidentStateRole.js +15 -0
  555. package/build/dist/Types/Incident/IncidentStateRole.js.map +1 -0
  556. package/build/dist/Types/Marketing/Attribution.js +68 -0
  557. package/build/dist/Types/Marketing/Attribution.js.map +1 -0
  558. package/build/dist/Types/Marketing/MarketingConversion.js +36 -7
  559. package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -1
  560. package/build/dist/Types/Measurement/MeasurementAggregationType.js +40 -0
  561. package/build/dist/Types/Measurement/MeasurementAggregationType.js.map +1 -0
  562. package/build/dist/Types/Measurement/MeasurementAnchorKind.js +22 -0
  563. package/build/dist/Types/Measurement/MeasurementAnchorKind.js.map +1 -0
  564. package/build/dist/Types/Measurement/MeasurementOccurrence.js +15 -0
  565. package/build/dist/Types/Measurement/MeasurementOccurrence.js.map +1 -0
  566. package/build/dist/Types/Measurement/MeasurementStatus.js +32 -0
  567. package/build/dist/Types/Measurement/MeasurementStatus.js.map +1 -0
  568. package/build/dist/Types/MeteredPlan/ProductType.js +1 -0
  569. package/build/dist/Types/MeteredPlan/ProductType.js.map +1 -1
  570. package/build/dist/Types/Monitor/CriteriaFilter.js +2 -0
  571. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  572. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +59 -0
  573. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  574. package/build/dist/Types/Monitor/MonitorStep.js +17 -0
  575. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  576. package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js +64 -0
  577. package/build/dist/Types/Monitor/MonitorStepSecurityEventsMonitor.js.map +1 -0
  578. package/build/dist/Types/Monitor/MonitorType.js +19 -0
  579. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  580. package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js +2 -0
  581. package/build/dist/Types/Monitor/SecurityEventsMonitor/SecurityEventsMonitorResponse.js.map +1 -0
  582. package/build/dist/Types/Permission.js +347 -2
  583. package/build/dist/Types/Permission.js.map +1 -1
  584. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js +19 -0
  585. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceMeasurementAnchorType.js.map +1 -0
  586. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js +17 -0
  587. package/build/dist/Types/ScheduledMaintenance/ScheduledMaintenanceStateRole.js.map +1 -0
  588. package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js +2 -0
  589. package/build/dist/Types/SecurityEvent/NormalizedSecurityEvent.js.map +1 -0
  590. package/build/dist/Types/SecurityEvent/OcsfEventClass.js +181 -0
  591. package/build/dist/Types/SecurityEvent/OcsfEventClass.js.map +1 -0
  592. package/build/dist/Types/SecurityEvent/OcsfSeverity.js +81 -0
  593. package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -0
  594. package/build/dist/Types/SecurityEvent/SecurityEventFormat.js +21 -0
  595. package/build/dist/Types/SecurityEvent/SecurityEventFormat.js.map +1 -0
  596. package/build/dist/Types/SecurityEvent/SigmaRule.js +16 -0
  597. package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -0
  598. package/build/dist/Types/Telemetry/LlmConventions.js +19 -1
  599. package/build/dist/Types/Telemetry/LlmConventions.js.map +1 -1
  600. package/build/dist/Types/Telemetry/LlmCostCatalog.js +484 -0
  601. package/build/dist/Types/Telemetry/LlmCostCatalog.js.map +1 -0
  602. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  603. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  604. package/build/dist/Types/Telemetry/TelemetryRetentionConfig.js.map +1 -1
  605. package/build/dist/Types/Telemetry/TelemetryType.js +1 -0
  606. package/build/dist/Types/Telemetry/TelemetryType.js.map +1 -1
  607. package/build/dist/Types/TwoFactorAuthStatus.js +41 -0
  608. package/build/dist/Types/TwoFactorAuthStatus.js.map +1 -0
  609. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +16 -2
  610. package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
  611. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +15 -1
  612. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  613. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js +20 -1
  614. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js.map +1 -1
  615. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +1 -1
  616. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  617. package/build/dist/UI/Components/Button/Button.js +22 -1
  618. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  619. package/build/dist/UI/Components/Card/Card.js +1 -1
  620. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  621. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +14 -1
  622. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  623. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js +47 -0
  624. package/build/dist/UI/Components/Dictionary/DictionaryFilterOperator.js.map +1 -1
  625. package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js +8 -0
  626. package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js.map +1 -1
  627. package/build/dist/UI/Components/Forms/ModelForm.js +40 -1
  628. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  629. package/build/dist/UI/Components/List/ListRow.js +4 -1
  630. package/build/dist/UI/Components/List/ListRow.js.map +1 -1
  631. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +32 -7
  632. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
  633. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +2 -17
  634. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  635. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +93 -4
  636. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
  637. package/build/dist/UI/Components/ModelDelete/ModelDelete.js +13 -0
  638. package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
  639. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +27 -11
  640. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  641. package/build/dist/UI/Components/ModelList/ModelList.js +13 -2
  642. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  643. package/build/dist/UI/Components/ModelList/StaticModelList.js +4 -1
  644. package/build/dist/UI/Components/ModelList/StaticModelList.js.map +1 -1
  645. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +101 -40
  646. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  647. package/build/dist/UI/Components/ModelTable/ModelTable.js +9 -7
  648. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  649. package/build/dist/UI/Components/ModelTable/TableView.js +32 -4
  650. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  651. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +19 -2
  652. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  653. package/build/dist/UI/Components/OrderedStatesList/Item.js +4 -1
  654. package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
  655. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +33 -32
  656. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  657. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +8 -0
  658. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  659. package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js +98 -0
  660. package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js.map +1 -0
  661. package/build/dist/UI/Components/SavedViews/SavedViewsList.js +99 -0
  662. package/build/dist/UI/Components/SavedViews/SavedViewsList.js.map +1 -0
  663. package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js +17 -0
  664. package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js.map +1 -0
  665. package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js +15 -0
  666. package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js.map +1 -0
  667. package/build/dist/UI/Components/Table/TableRow.js +8 -2
  668. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  669. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +93 -4
  670. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
  671. package/build/dist/UI/Types/UseComponentOutsideClick.js +39 -0
  672. package/build/dist/UI/Types/UseComponentOutsideClick.js.map +1 -1
  673. package/build/dist/UI/Utils/PermissionGate.js +164 -0
  674. package/build/dist/UI/Utils/PermissionGate.js.map +1 -0
  675. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js +70 -0
  676. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsFlowComponent.js.map +1 -0
  677. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js +92 -0
  678. package/build/dist/Utils/Dashboard/Components/DashboardSecurityEventsListComponent.js.map +1 -0
  679. package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
  680. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  681. package/build/dist/Utils/Measurement/MeasurementEvaluator.js +210 -0
  682. package/build/dist/Utils/Measurement/MeasurementEvaluator.js.map +1 -0
  683. package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js +1 -0
  684. package/build/dist/Utils/Monitor/MonitorSummarySnapshotUtil.js.map +1 -1
  685. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js +51 -10
  686. package/build/dist/Utils/Monitor/NetworkDeviceLinkRuleUtil.js.map +1 -1
  687. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +108 -0
  688. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -0
  689. package/build/dist/Utils/SecurityEvent/GenericNormalizer.js +176 -0
  690. package/build/dist/Utils/SecurityEvent/GenericNormalizer.js.map +1 -0
  691. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +146 -0
  692. package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -0
  693. package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js +196 -0
  694. package/build/dist/Utils/SecurityEvent/NormalizerHelpers.js.map +1 -0
  695. package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js +136 -0
  696. package/build/dist/Utils/SecurityEvent/OcsfNormalizer.js.map +1 -0
  697. package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js +64 -0
  698. package/build/dist/Utils/SecurityEvent/SecurityEventNormalizer.js.map +1 -0
  699. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +388 -0
  700. package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -0
  701. package/build/dist/Utils/SecurityEvent/UdmNormalizer.js +328 -0
  702. package/build/dist/Utils/SecurityEvent/UdmNormalizer.js.map +1 -0
  703. package/build/dist/Utils/Telemetry/CrossSignalScope.js +29 -7
  704. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  705. package/build/dist/Utils/Telemetry/LogErrorPattern.js +284 -0
  706. package/build/dist/Utils/Telemetry/LogErrorPattern.js.map +1 -0
  707. package/package.json +3 -1
@@ -11,12 +11,29 @@ import { SQL, Statement } from "../Utils/AnalyticsDatabase/Statement";
11
11
  import { getQuerySettings } from "../Utils/AnalyticsDatabase/QuerySettingsHelper";
12
12
  import LogDatabaseService from "./LogService";
13
13
  import TableColumnType from "../../Types/AnalyticsDatabase/TableColumnType";
14
+ import { ObjectType } from "../../Types/JSON";
14
15
  import BadDataException from "../../Types/Exception/BadDataException";
15
16
  import Includes from "../../Types/BaseDatabase/Includes";
16
17
  import AnalyticsTableName from "../../Types/AnalyticsDatabase/AnalyticsTableName";
17
18
  import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
18
19
  import ServiceType from "../../Types/Telemetry/ServiceType";
19
20
  import { appendResourceScopeFilters, } from "../Utils/Telemetry/ResourceEntityFilter";
21
+ import { buildLogErrorPatternExpression, clampLogErrorPattern, } from "../Utils/Telemetry/LogErrorPatternSql";
22
+ /*
23
+ * ---------------------------------------------------------------------
24
+ * Error-pattern insights
25
+ * ---------------------------------------------------------------------
26
+ *
27
+ * The Logs Insights page answers "what is actually going wrong, and where"
28
+ * by clustering error bodies into patterns (see
29
+ * Common/Utils/Telemetry/LogErrorPattern) and counting the clusters in the
30
+ * database. Everything below shares one filter shape so the top-list and
31
+ * every drill-down run against exactly the same slice of logs — a
32
+ * correlation panel that silently widened its own scope would be worse
33
+ * than no panel at all.
34
+ */
35
+ /** Severities treated as "an error" when the caller does not say. */
36
+ export const DEFAULT_ERROR_LOG_SEVERITIES = ["Error", "Fatal"];
20
37
  export class LogAggregationService {
21
38
  static async getHistogram(request) {
22
39
  const statement = LogAggregationService.buildHistogramStatement(request);
@@ -518,6 +535,20 @@ export class LogAggregationService {
518
535
  value: new Includes(attrValue),
519
536
  }}), mapKeys(attributes), mapValues(attributes))`);
520
537
  }
538
+ else if (typeof attrValue === "object" && attrValue !== null) {
539
+ LogAggregationService.appendAttributeOperatorFilter(statement, attrKey, attrValue);
540
+ }
541
+ else if (attrValue === "") {
542
+ /*
543
+ * A blank equality value is "missing or empty", not "present and
544
+ * empty": the list query compares `attributes['k'] = ''`, and a Map
545
+ * subscript returns the type default for a key the row does not
546
+ * carry, so rows without the attribute match too. Routed through the
547
+ * operator builder so a bare "" and an explicit EqualTo("") — the
548
+ * same filter written two ways — cannot disagree.
549
+ */
550
+ LogAggregationService.appendAttributeOperatorFilter(statement, attrKey, { _type: ObjectType.IsNull });
551
+ }
521
552
  else {
522
553
  statement.append(SQL ` AND arrayExists((k, v) -> lowerUTF8(k) = lowerUTF8(${{
523
554
  type: TableColumnType.Text,
@@ -530,6 +561,210 @@ export class LogAggregationService {
530
561
  }
531
562
  }
532
563
  }
564
+ /*
565
+ * Attribute filter rows carry an operator (`contains`, `is any of`,
566
+ * `is empty`, ...) as well as a value, and the operator travels over the
567
+ * wire as the serialized `{_type, value}` shape every QueryOperator's
568
+ * toJSON() produces. The list query compiles those through
569
+ * StatementGenerator; these aggregation endpoints (histogram, facets,
570
+ * export) used to treat anything non-array as a plain string, so an
571
+ * operator object bound as "[object Object]", matched nothing, and left the
572
+ * log monitor preview showing an empty chart beside a populated list.
573
+ *
574
+ * Predicates mirror StatementGenerator's map-attribute branches, in the
575
+ * case-insensitive arrayExists form the rest of this builder uses — these
576
+ * keys are typed by a user, not canonical column names.
577
+ */
578
+ static appendAttributeOperatorFilter(statement, attrKey, attrValue) {
579
+ const operatorType = attrValue["_type"];
580
+ const rawValue = attrValue["value"];
581
+ // `<key> matches case-insensitively AND <predicate>` over the map pairs.
582
+ const matches = (predicate) => {
583
+ return SQL `arrayExists((k, v) -> lowerUTF8(k) = lowerUTF8(${{
584
+ type: TableColumnType.Text,
585
+ value: attrKey,
586
+ }}) AND `
587
+ .append(predicate)
588
+ .append(SQL `, mapKeys(attributes), mapValues(attributes))`);
589
+ };
590
+ /*
591
+ * `value` is unvalidated JSON off the wire. `String()` and `Number()` do
592
+ * not merely produce a bad result on an object — ToPrimitive THROWS a
593
+ * TypeError when the object shadows toString/valueOf with non-callables
594
+ * (`{"toString": 1}`), and that escapes the BadDataException the default
595
+ * branch raises, answering with a 500 instead of a 400. Narrow to
596
+ * primitives first so every rejection goes out the same door.
597
+ */
598
+ const requirePrimitive = (value) => {
599
+ if (value === undefined || value === null) {
600
+ return null;
601
+ }
602
+ if (typeof value === "string" ||
603
+ typeof value === "number" ||
604
+ typeof value === "boolean") {
605
+ return value;
606
+ }
607
+ throw new BadDataException(`Invalid value in the attribute filter for "${attrKey}"`);
608
+ };
609
+ const textValue = () => {
610
+ const primitive = requirePrimitive(rawValue);
611
+ return primitive === null ? "" : String(primitive);
612
+ };
613
+ const like = (pattern) => {
614
+ return SQL `v ILIKE ${{
615
+ type: TableColumnType.Text,
616
+ value: pattern,
617
+ }}`;
618
+ };
619
+ /*
620
+ * Map values are stored as text; toFloat64OrNull yields NULL for
621
+ * non-numeric values (including the empty default for a missing key),
622
+ * which compares false against any threshold and drops those rows.
623
+ */
624
+ const numeric = (comparison) => {
625
+ const primitive = requirePrimitive(rawValue);
626
+ const threshold = Number(primitive);
627
+ /*
628
+ * Reject rather than bind. `Number(null)` is 0, so a filter with no
629
+ * value would silently become "> 0", and a non-numeric one binds as the
630
+ * literal `nan`, which ClickHouse cannot parse — a 500 where the user
631
+ * should get a 400 naming the filter.
632
+ */
633
+ if (primitive === null ||
634
+ primitive === "" ||
635
+ !Number.isFinite(threshold)) {
636
+ throw new BadDataException(`The attribute filter for "${attrKey}" needs a numeric value`);
637
+ }
638
+ /*
639
+ * Decimal (ClickHouse Double), not Number (Int32): the left-hand side is
640
+ * a Float64 and thresholds are free text, so `> 1.5` bound as Int32 is a
641
+ * parse error at the database rather than a comparison.
642
+ *
643
+ * The comparison itself is appended as raw SQL — an interpolation in the
644
+ * SQL tag becomes a bound Identifier, which is not what `>` is. Every
645
+ * caller passes a literal from the switch below, never user input.
646
+ */
647
+ return SQL `toFloat64OrNull(v) `.append(comparison).append(SQL ` ${{
648
+ type: TableColumnType.Decimal,
649
+ value: threshold,
650
+ }}`);
651
+ };
652
+ const membershipValues = () => {
653
+ return Array.isArray(rawValue)
654
+ ? rawValue.map((entry) => {
655
+ const primitive = requirePrimitive(entry);
656
+ return primitive === null ? "" : String(primitive);
657
+ })
658
+ : [];
659
+ };
660
+ /*
661
+ * "the key is present with a non-empty value".
662
+ *
663
+ * A ClickHouse Map subscript returns the value type's default for a
664
+ * missing key, so the list query's `attributes['k']` reads as '' for a row
665
+ * that has no such attribute at all. That makes an EMPTY comparison value
666
+ * mean something different from every other value, in both directions:
667
+ * `attributes['k'] = ''` matches rows that lack the key, and
668
+ * `attributes['k'] != ''` drops them. Naively negating the existence test
669
+ * gets both backwards — an "is not equal to <blank>" filter counted every
670
+ * row in the project while the list beside it counted only the handful
671
+ * that carried the attribute.
672
+ */
673
+ const hasNonEmptyValue = () => {
674
+ return matches(SQL `v != ''`);
675
+ };
676
+ switch (operatorType) {
677
+ case ObjectType.EqualTo:
678
+ if (textValue() === "") {
679
+ // `attributes['k'] = ''` — missing or empty. Same set as "is empty".
680
+ statement.append(SQL ` AND NOT `.append(hasNonEmptyValue()));
681
+ return;
682
+ }
683
+ statement.append(SQL ` AND `.append(matches(SQL `v = ${{
684
+ type: TableColumnType.Text,
685
+ value: textValue(),
686
+ }}`)));
687
+ return;
688
+ case ObjectType.NotEqual:
689
+ if (textValue() === "") {
690
+ /*
691
+ * `attributes['k'] != ''` — present AND non-empty. Same set as
692
+ * "is not empty"; see hasNonEmptyValue above for why blank is
693
+ * special.
694
+ */
695
+ statement.append(SQL ` AND `.append(hasNonEmptyValue()));
696
+ return;
697
+ }
698
+ /*
699
+ * Negating the whole existence test is what makes rows that lack the
700
+ * attribute pass, matching the map-subscript form's semantics (a
701
+ * missing key reads as '' and so is != a non-empty value).
702
+ */
703
+ statement.append(SQL ` AND NOT `.append(matches(SQL `v = ${{
704
+ type: TableColumnType.Text,
705
+ value: textValue(),
706
+ }}`)));
707
+ return;
708
+ case ObjectType.Search:
709
+ statement.append(SQL ` AND `.append(matches(like(`%${textValue()}%`))));
710
+ return;
711
+ case ObjectType.NotContains:
712
+ statement.append(SQL ` AND NOT `.append(matches(like(`%${textValue()}%`))));
713
+ return;
714
+ case ObjectType.StartsWith:
715
+ statement.append(SQL ` AND `.append(matches(like(`${textValue()}%`))));
716
+ return;
717
+ case ObjectType.EndsWith:
718
+ statement.append(SQL ` AND `.append(matches(like(`%${textValue()}`))));
719
+ return;
720
+ case ObjectType.GreaterThan:
721
+ statement.append(SQL ` AND `.append(matches(numeric(">"))));
722
+ return;
723
+ case ObjectType.GreaterThanOrEqual:
724
+ statement.append(SQL ` AND `.append(matches(numeric(">="))));
725
+ return;
726
+ case ObjectType.LessThan:
727
+ statement.append(SQL ` AND `.append(matches(numeric("<"))));
728
+ return;
729
+ case ObjectType.LessThanOrEqual:
730
+ statement.append(SQL ` AND `.append(matches(numeric("<="))));
731
+ return;
732
+ case ObjectType.IsNull:
733
+ // "is empty" — no non-empty value stored under that key.
734
+ statement.append(SQL ` AND NOT `.append(hasNonEmptyValue()));
735
+ return;
736
+ case ObjectType.NotNull:
737
+ statement.append(SQL ` AND `.append(hasNonEmptyValue()));
738
+ return;
739
+ case ObjectType.Includes:
740
+ case ObjectType.IncludesNone: {
741
+ const values = membershipValues();
742
+ /*
743
+ * An empty membership list means "All", not "nothing" — skipping the
744
+ * predicate matches how StatementGenerator and the form treat it, and
745
+ * avoids emitting `IN ()`.
746
+ */
747
+ if (values.length === 0) {
748
+ return;
749
+ }
750
+ const membership = matches(SQL `v IN (${{
751
+ type: TableColumnType.Text,
752
+ value: new Includes(values),
753
+ }})`);
754
+ statement.append((operatorType === ObjectType.Includes
755
+ ? SQL ` AND `
756
+ : SQL ` AND NOT `).append(membership));
757
+ return;
758
+ }
759
+ default:
760
+ /*
761
+ * An unrecognized shape is a filter this builder cannot honour.
762
+ * Refuse it rather than binding an object as text and quietly
763
+ * returning counts that disagree with the logs list.
764
+ */
765
+ throw new BadDataException(`Unsupported attribute filter for "${attrKey}"`);
766
+ }
767
+ }
533
768
  static async getExportLogs(request) {
534
769
  const maxLimit = Math.min(request.limit || 10000, 10000);
535
770
  const statement = SQL `
@@ -740,6 +975,414 @@ export class LogAggregationService {
740
975
  const estimatedReductionPercent = totalLogs > 0 ? Math.round((matchingLogs / totalLogs) * 100) : 0;
741
976
  return { totalLogs, matchingLogs, estimatedReductionPercent };
742
977
  }
978
+ /**
979
+ * The distinct error messages in the window, most frequent first.
980
+ *
981
+ * This is the "Top Errors" list: one row per pattern with its occurrence
982
+ * count, when it started and last happened, how many resources it spans,
983
+ * and enough sample material (a real body, some trace ids) for the UI to
984
+ * render the row without a second round trip.
985
+ */
986
+ static async getTopErrorPatterns(request) {
987
+ const statement = LogAggregationService.buildTopErrorPatternsStatement(request);
988
+ const rows = await LogAggregationService.runQuery(statement);
989
+ return rows
990
+ .map((row) => {
991
+ return {
992
+ pattern: String(row["pattern"] || ""),
993
+ sampleBody: String(row["sampleBody"] || ""),
994
+ count: Number(row["cnt"] || 0),
995
+ firstSeenAt: String(row["firstSeen"] || ""),
996
+ lastSeenAt: String(row["lastSeen"] || ""),
997
+ resourceCount: Number(row["resourceCount"] || 0),
998
+ resourceIds: LogAggregationService.toStringArray(row["resourceIds"]),
999
+ severities: LogAggregationService.toStringArray(row["severities"]),
1000
+ traceCount: Number(row["traceCount"] || 0),
1001
+ sampleTraceIds: LogAggregationService.toStringArray(row["sampleTraceIds"]),
1002
+ };
1003
+ })
1004
+ .filter((item) => {
1005
+ return item.pattern.length > 0;
1006
+ });
1007
+ }
1008
+ /**
1009
+ * When one pattern happened, bucketed over the window — the "is this a
1010
+ * steady drip or a spike at 14:05" question.
1011
+ */
1012
+ static async getErrorPatternTimeline(request) {
1013
+ const statement = LogAggregationService.buildErrorPatternTimelineStatement(request);
1014
+ const rows = await LogAggregationService.runQuery(statement);
1015
+ return rows.map((row) => {
1016
+ return {
1017
+ time: String(row["bucket"] || ""),
1018
+ count: Number(row["cnt"] || 0),
1019
+ };
1020
+ });
1021
+ }
1022
+ /**
1023
+ * Other error patterns that fired in the same time buckets as this one.
1024
+ *
1025
+ * This is the correlation the Insights page exists for: rather than
1026
+ * eyeballing two log lists side by side, the panel names the errors that
1027
+ * keep company with the one under investigation. "Same bucket" is a
1028
+ * deliberately coarse notion of simultaneity — it inherits whatever
1029
+ * bucket size the timeline is drawn at, so a wide window correlates
1030
+ * loosely and a narrow one tightly.
1031
+ */
1032
+ static async getErrorPatternCoOccurrences(request) {
1033
+ const statement = LogAggregationService.buildErrorPatternCoOccurrenceStatement(request);
1034
+ const rows = await LogAggregationService.runQuery(statement);
1035
+ return rows
1036
+ .map((row) => {
1037
+ return {
1038
+ pattern: String(row["pattern"] || ""),
1039
+ sampleBody: String(row["sampleBody"] || ""),
1040
+ count: Number(row["cnt"] || 0),
1041
+ };
1042
+ })
1043
+ .filter((item) => {
1044
+ return item.pattern.length > 0;
1045
+ });
1046
+ }
1047
+ /**
1048
+ * The attribute key/value pairs carried by this pattern's occurrences,
1049
+ * most common first — how the page answers "which host is this?" without
1050
+ * the user having to open a log line and read its attributes.
1051
+ */
1052
+ static async getErrorPatternAttributes(request) {
1053
+ const statement = LogAggregationService.buildErrorPatternAttributesStatement(request);
1054
+ const rows = await LogAggregationService.runQuery(statement);
1055
+ return rows
1056
+ .map((row) => {
1057
+ return {
1058
+ key: String(row["attrKey"] || ""),
1059
+ value: String(row["attrValue"] || ""),
1060
+ count: Number(row["cnt"] || 0),
1061
+ };
1062
+ })
1063
+ .filter((item) => {
1064
+ return item.key.length > 0;
1065
+ });
1066
+ }
1067
+ /** Which services / hosts / clusters this pattern is happening on. */
1068
+ static async getErrorPatternResources(request) {
1069
+ const statement = LogAggregationService.buildErrorPatternResourcesStatement(request);
1070
+ const rows = await LogAggregationService.runQuery(statement);
1071
+ return rows
1072
+ .map((row) => {
1073
+ return {
1074
+ resourceId: String(row["resourceId"] || ""),
1075
+ resourceType: String(row["resourceType"] || ""),
1076
+ count: Number(row["cnt"] || 0),
1077
+ lastSeenAt: String(row["lastSeen"] || ""),
1078
+ };
1079
+ })
1080
+ .filter((item) => {
1081
+ return item.resourceId.length > 0;
1082
+ });
1083
+ }
1084
+ /**
1085
+ * Traces that carry at least one occurrence — the jump from "this error
1086
+ * happened" to the request it happened inside.
1087
+ */
1088
+ static async getErrorPatternTraces(request) {
1089
+ const statement = LogAggregationService.buildErrorPatternTracesStatement(request);
1090
+ const rows = await LogAggregationService.runQuery(statement);
1091
+ return rows
1092
+ .map((row) => {
1093
+ return {
1094
+ traceId: String(row["traceId"] || ""),
1095
+ count: Number(row["cnt"] || 0),
1096
+ lastSeenAt: String(row["lastSeen"] || ""),
1097
+ resourceId: String(row["resourceId"] || ""),
1098
+ };
1099
+ })
1100
+ .filter((item) => {
1101
+ return item.traceId.length > 0;
1102
+ });
1103
+ }
1104
+ /** The most recent raw log lines behind the pattern. */
1105
+ static async getErrorPatternSamples(request) {
1106
+ const statement = LogAggregationService.buildErrorPatternSamplesStatement(request);
1107
+ const rows = await LogAggregationService.runQuery(statement);
1108
+ return rows.map((row) => {
1109
+ return {
1110
+ logId: String(row["_id"] || ""),
1111
+ time: String(row["time"] || ""),
1112
+ body: String(row["body"] || ""),
1113
+ severityText: String(row["severityText"] || ""),
1114
+ resourceId: String(row["resourceId"] || ""),
1115
+ traceId: String(row["traceId"] || ""),
1116
+ spanId: String(row["spanId"] || ""),
1117
+ };
1118
+ });
1119
+ }
1120
+ static async runQuery(statement) {
1121
+ const dbResult = await LogDatabaseService.executeQuery(statement);
1122
+ const response = await dbResult.json();
1123
+ return response.data || [];
1124
+ }
1125
+ /*
1126
+ * ClickHouse returns array-valued aggregates (groupUniqArray) as JSON
1127
+ * arrays, but a row that reached us through a different serializer could
1128
+ * carry anything — coerce defensively rather than trusting the shape.
1129
+ */
1130
+ static toStringArray(value) {
1131
+ if (!Array.isArray(value)) {
1132
+ return [];
1133
+ }
1134
+ return value
1135
+ .map((item) => {
1136
+ return String(item !== null && item !== void 0 ? item : "");
1137
+ })
1138
+ .filter((item) => {
1139
+ return item.length > 0;
1140
+ });
1141
+ }
1142
+ static clampErrorPatternLimit(limit) {
1143
+ if (typeof limit !== "number" || !Number.isFinite(limit)) {
1144
+ return LogAggregationService.DEFAULT_ERROR_PATTERN_LIMIT;
1145
+ }
1146
+ return Math.min(Math.max(1, Math.floor(limit)), LogAggregationService.MAX_ERROR_PATTERN_LIMIT);
1147
+ }
1148
+ /*
1149
+ * Error-pattern reads share one WHERE clause so a drill-down can never
1150
+ * see rows the top-list did not. The only thing this adds over
1151
+ * appendCommonFilters is the severity default: a request that names no
1152
+ * severities means "errors", not "every log in the project".
1153
+ */
1154
+ static appendErrorPatternScope(statement, request) {
1155
+ statement.append(SQL ` WHERE projectId = ${{
1156
+ type: TableColumnType.ObjectID,
1157
+ value: request.projectId,
1158
+ }} AND time >= ${{
1159
+ type: TableColumnType.Date,
1160
+ value: request.startTime,
1161
+ }} AND time <= ${{
1162
+ type: TableColumnType.Date,
1163
+ value: request.endTime,
1164
+ }}`);
1165
+ statement.append(LogAggregationService.RETENTION_FILTER);
1166
+ statement.append(LogAggregationService.NON_EMPTY_BODY_FILTER);
1167
+ LogAggregationService.appendCommonFilters(statement, Object.assign(Object.assign({}, request), { severityTexts: request.severityTexts && request.severityTexts.length > 0
1168
+ ? request.severityTexts
1169
+ : DEFAULT_ERROR_LOG_SEVERITIES }));
1170
+ }
1171
+ /*
1172
+ * ` AND <pattern expression> = '<the pattern>'` — the predicate every
1173
+ * drill-down uses to reduce the window to one cluster. The pattern value
1174
+ * is clamped to the same maximum length the expression truncates to, so
1175
+ * an oversized parameter cannot be used to push a huge constant into the
1176
+ * query (it could only ever match nothing anyway).
1177
+ */
1178
+ static appendErrorPatternEquality(statement, pattern) {
1179
+ statement.append(" AND ");
1180
+ statement.append(buildLogErrorPatternExpression());
1181
+ statement.append(SQL ` = ${{
1182
+ type: TableColumnType.Text,
1183
+ value: clampLogErrorPattern(pattern),
1184
+ }}`);
1185
+ }
1186
+ static errorPatternQuerySettings() {
1187
+ /*
1188
+ * Same ceiling as every other aggregation here: below the client's 58s
1189
+ * request timeout, 'break' so a wide window degrades to partial counts
1190
+ * instead of an error page, and the scan-memory bound because these
1191
+ * queries read the fat `attributes` map alongside `body`.
1192
+ */
1193
+ return getQuerySettings({
1194
+ maxExecutionTimeInSeconds: 45,
1195
+ timeoutOverflowMode: "break",
1196
+ boundScanMemory: true,
1197
+ });
1198
+ }
1199
+ static buildTopErrorPatternsStatement(request) {
1200
+ const limit = LogAggregationService.clampErrorPatternLimit(request.limit);
1201
+ /*
1202
+ * Inlined rather than bound as a parameter: these are the parameters of
1203
+ * a PARAMETRIC aggregate function, which ClickHouse requires to be
1204
+ * constants, and they are trusted class constants rather than anything
1205
+ * a caller supplies.
1206
+ */
1207
+ const sampleLimit = LogAggregationService.ERROR_PATTERN_SAMPLE_ARRAY_LIMIT;
1208
+ const severityLimit = LogAggregationService.ERROR_PATTERN_SEVERITY_ARRAY_LIMIT;
1209
+ const statement = new Statement();
1210
+ statement.append("SELECT ");
1211
+ statement.append(buildLogErrorPatternExpression());
1212
+ statement.append(" AS pattern");
1213
+ statement.append(", count() AS cnt");
1214
+ /*
1215
+ * The newest real body in the group. Showing a raw example alongside
1216
+ * the normalized pattern is what makes a row readable — `<num>` reads
1217
+ * very differently next to the line it came from.
1218
+ */
1219
+ statement.append(", argMax(ifNull(body, ''), time) AS sampleBody");
1220
+ statement.append(", min(time) AS firstSeen");
1221
+ statement.append(", max(time) AS lastSeen");
1222
+ statement.append(", uniqExact(primaryEntityId) AS resourceCount");
1223
+ statement.append(`, groupUniqArray(${sampleLimit})(toString(primaryEntityId)) AS resourceIds`);
1224
+ statement.append(`, groupUniqArray(${severityLimit})(toString(severityText)) AS severities`);
1225
+ statement.append(", uniqExactIf(traceId, ifNull(traceId, '') != '') AS traceCount");
1226
+ statement.append(`, groupUniqArrayIf(${sampleLimit})(ifNull(traceId, ''), ifNull(traceId, '') != '') AS sampleTraceIds`);
1227
+ statement.append(` FROM ${LogAggregationService.TABLE_NAME}`);
1228
+ LogAggregationService.appendErrorPatternScope(statement, request);
1229
+ statement.append(" GROUP BY pattern");
1230
+ statement.append(LogAggregationService.NON_EMPTY_PATTERN_HAVING);
1231
+ statement.append(SQL ` ORDER BY cnt DESC LIMIT ${{
1232
+ type: TableColumnType.Number,
1233
+ value: limit,
1234
+ }}`);
1235
+ statement.append(LogAggregationService.errorPatternQuerySettings());
1236
+ return statement;
1237
+ }
1238
+ static buildErrorPatternTimelineStatement(request) {
1239
+ const intervalSeconds = LogAggregationService.resolveBucketSeconds(request);
1240
+ const statement = SQL `SELECT toStartOfInterval(time, INTERVAL ${{
1241
+ type: TableColumnType.Number,
1242
+ value: intervalSeconds,
1243
+ }} SECOND) AS bucket, count() AS cnt`;
1244
+ statement.append(` FROM ${LogAggregationService.TABLE_NAME}`);
1245
+ LogAggregationService.appendErrorPatternScope(statement, request);
1246
+ LogAggregationService.appendErrorPatternEquality(statement, request.pattern);
1247
+ statement.append(" GROUP BY bucket ORDER BY bucket ASC");
1248
+ statement.append(LogAggregationService.errorPatternQuerySettings());
1249
+ return statement;
1250
+ }
1251
+ static buildErrorPatternCoOccurrenceStatement(request) {
1252
+ const intervalSeconds = LogAggregationService.resolveBucketSeconds(request);
1253
+ const limit = LogAggregationService.clampErrorPatternLimit(request.limit);
1254
+ const statement = new Statement();
1255
+ statement.append("SELECT ");
1256
+ statement.append(buildLogErrorPatternExpression());
1257
+ statement.append(" AS pattern");
1258
+ statement.append(", count() AS cnt");
1259
+ statement.append(", argMax(ifNull(body, ''), time) AS sampleBody");
1260
+ statement.append(` FROM ${LogAggregationService.TABLE_NAME}`);
1261
+ LogAggregationService.appendErrorPatternScope(statement, request);
1262
+ /*
1263
+ * Everything EXCEPT the pattern under investigation. Written as the
1264
+ * full expression rather than the `pattern` alias: ClickHouse
1265
+ * substitutes same-level SELECT aliases into WHERE, and an alias that
1266
+ * shadows nothing today can start shadowing a real column tomorrow.
1267
+ */
1268
+ statement.append(" AND ");
1269
+ statement.append(buildLogErrorPatternExpression());
1270
+ statement.append(SQL ` != ${{
1271
+ type: TableColumnType.Text,
1272
+ value: clampLogErrorPattern(request.pattern),
1273
+ }}`);
1274
+ /*
1275
+ * ...restricted to the buckets the investigated pattern itself landed
1276
+ * in.
1277
+ *
1278
+ * GLOBAL IN, not plain IN, and it is load-bearing. This predicate sits
1279
+ * in a query on the Distributed LogItemV3 table whose subquery reads
1280
+ * that SAME Distributed table, which multi-shard ClickHouse rejects
1281
+ * outright as a double-distributed subquery (Code 288,
1282
+ * distributed_product_mode = 'deny' by default) — the panel would throw
1283
+ * on any 2+-shard cluster, and because the endpoint wraps each
1284
+ * correlation read in a degrade-to-empty catch it would fail SILENTLY,
1285
+ * rendering "nothing else was failing" forever.
1286
+ *
1287
+ * A shard-local evaluation would be wrong even where it is allowed: the
1288
+ * sharding key is cityHash64(projectId, primaryEntityId, time), so one
1289
+ * project's rows span every shard and the bucket set has to be computed
1290
+ * once globally. On a single shard GLOBAL is a semantic no-op. Same
1291
+ * reasoning, same shape as MetricService's Top-K group restriction.
1292
+ */
1293
+ statement.append(SQL ` AND toStartOfInterval(time, INTERVAL ${{
1294
+ type: TableColumnType.Number,
1295
+ value: intervalSeconds,
1296
+ }} SECOND) GLOBAL IN (SELECT DISTINCT toStartOfInterval(time, INTERVAL ${{
1297
+ type: TableColumnType.Number,
1298
+ value: intervalSeconds,
1299
+ }} SECOND)`);
1300
+ statement.append(` FROM ${LogAggregationService.TABLE_NAME}`);
1301
+ LogAggregationService.appendErrorPatternScope(statement, request);
1302
+ LogAggregationService.appendErrorPatternEquality(statement, request.pattern);
1303
+ statement.append(")");
1304
+ statement.append(" GROUP BY pattern");
1305
+ statement.append(LogAggregationService.NON_EMPTY_PATTERN_HAVING);
1306
+ statement.append(SQL ` ORDER BY cnt DESC LIMIT ${{
1307
+ type: TableColumnType.Number,
1308
+ value: limit,
1309
+ }}`);
1310
+ statement.append(LogAggregationService.errorPatternQuerySettings());
1311
+ return statement;
1312
+ }
1313
+ static buildErrorPatternAttributesStatement(request) {
1314
+ const limit = LogAggregationService.clampErrorPatternLimit(request.limit);
1315
+ /*
1316
+ * The ARRAY JOIN runs over a pre-filtered subquery on purpose. Written
1317
+ * flat, the join explodes every row in the window into one row per
1318
+ * attribute BEFORE the WHERE narrows to a single pattern — on a service
1319
+ * carrying twenty resource attributes that is a twentyfold scan for a
1320
+ * result the size of a tooltip.
1321
+ */
1322
+ const statement = new Statement();
1323
+ statement.append(`SELECT attrKey, attrValue, count() AS cnt FROM (SELECT attributes FROM ${LogAggregationService.TABLE_NAME}`);
1324
+ LogAggregationService.appendErrorPatternScope(statement, request);
1325
+ LogAggregationService.appendErrorPatternEquality(statement, request.pattern);
1326
+ statement.append(") ARRAY JOIN mapKeys(attributes) AS attrKey, mapValues(attributes) AS attrValue");
1327
+ statement.append(SQL ` GROUP BY attrKey, attrValue ORDER BY cnt DESC LIMIT ${{
1328
+ type: TableColumnType.Number,
1329
+ value: limit,
1330
+ }}`);
1331
+ statement.append(LogAggregationService.errorPatternQuerySettings());
1332
+ return statement;
1333
+ }
1334
+ static buildErrorPatternResourcesStatement(request) {
1335
+ const limit = LogAggregationService.clampErrorPatternLimit(request.limit);
1336
+ const statement = new Statement();
1337
+ statement.append(`SELECT toString(primaryEntityId) AS resourceId, any(ifNull(primaryEntityType, '')) AS resourceType, count() AS cnt, max(time) AS lastSeen FROM ${LogAggregationService.TABLE_NAME}`);
1338
+ LogAggregationService.appendErrorPatternScope(statement, request);
1339
+ LogAggregationService.appendErrorPatternEquality(statement, request.pattern);
1340
+ statement.append(SQL ` GROUP BY resourceId ORDER BY cnt DESC LIMIT ${{
1341
+ type: TableColumnType.Number,
1342
+ value: limit,
1343
+ }}`);
1344
+ statement.append(LogAggregationService.errorPatternQuerySettings());
1345
+ return statement;
1346
+ }
1347
+ static buildErrorPatternTracesStatement(request) {
1348
+ const limit = LogAggregationService.clampErrorPatternLimit(request.limit);
1349
+ const statement = new Statement();
1350
+ statement.append(`SELECT ifNull(traceId, '') AS traceId, count() AS cnt, max(time) AS lastSeen, any(toString(primaryEntityId)) AS resourceId FROM ${LogAggregationService.TABLE_NAME}`);
1351
+ LogAggregationService.appendErrorPatternScope(statement, request);
1352
+ LogAggregationService.appendErrorPatternEquality(statement, request.pattern);
1353
+ statement.append(" AND ifNull(traceId, '') != ''");
1354
+ statement.append(SQL ` GROUP BY traceId ORDER BY cnt DESC LIMIT ${{
1355
+ type: TableColumnType.Number,
1356
+ value: limit,
1357
+ }}`);
1358
+ statement.append(LogAggregationService.errorPatternQuerySettings());
1359
+ return statement;
1360
+ }
1361
+ static buildErrorPatternSamplesStatement(request) {
1362
+ const limit = LogAggregationService.clampErrorPatternLimit(request.limit);
1363
+ const statement = new Statement();
1364
+ statement.append(`SELECT _id, time, ifNull(body, '') AS body, toString(severityText) AS severityText, toString(primaryEntityId) AS resourceId, ifNull(traceId, '') AS traceId, ifNull(spanId, '') AS spanId FROM ${LogAggregationService.TABLE_NAME}`);
1365
+ LogAggregationService.appendErrorPatternScope(statement, request);
1366
+ LogAggregationService.appendErrorPatternEquality(statement, request.pattern);
1367
+ statement.append(SQL ` ORDER BY time DESC LIMIT ${{
1368
+ type: TableColumnType.Number,
1369
+ value: limit,
1370
+ }}`);
1371
+ statement.append(LogAggregationService.errorPatternQuerySettings());
1372
+ return statement;
1373
+ }
1374
+ /*
1375
+ * Bucket size in seconds, clamped to a minute floor. A zero or negative
1376
+ * bucket would compile to `INTERVAL 0 SECOND`, which ClickHouse rejects —
1377
+ * and the correlation query's "same bucket" join would lose all meaning.
1378
+ */
1379
+ static resolveBucketSeconds(request) {
1380
+ const minutes = request.bucketSizeInMinutes;
1381
+ if (typeof minutes !== "number" || !Number.isFinite(minutes)) {
1382
+ return 60;
1383
+ }
1384
+ return Math.max(1, Math.floor(minutes)) * 60;
1385
+ }
743
1386
  static isTopLevelColumn(key) {
744
1387
  return LogAggregationService.TOP_LEVEL_COLUMNS.has(key);
745
1388
  }
@@ -802,6 +1445,30 @@ LogAggregationService.MAX_FACET_KEY_LENGTH = 256;
802
1445
  LogAggregationService.RETENTION_FILTER = " AND retentionDate >= now()";
803
1446
  LogAggregationService.DEFAULT_ANALYTICS_LIMIT = 10;
804
1447
  LogAggregationService.MAX_GROUP_BY_DIMENSIONS = 2;
1448
+ // --- Error pattern insights ---
1449
+ LogAggregationService.DEFAULT_ERROR_PATTERN_LIMIT = 10;
1450
+ LogAggregationService.MAX_ERROR_PATTERN_LIMIT = 50;
1451
+ LogAggregationService.ERROR_PATTERN_SAMPLE_ARRAY_LIMIT = 5;
1452
+ /* Every severity a pattern can carry fits comfortably in eight slots. */
1453
+ LogAggregationService.ERROR_PATTERN_SEVERITY_ARRAY_LIMIT = 8;
1454
+ /*
1455
+ * Cheap pre-filter for bodies that carry no message: they normalize to the
1456
+ * empty pattern, which would otherwise become a meaningless "" group.
1457
+ *
1458
+ * Deliberately only a pre-filter, not the guarantee. ClickHouse's trimBoth
1459
+ * strips SPACES only, so a body of tabs or newlines survives this predicate
1460
+ * and still normalizes to "" once the whitespace rule collapses it. The
1461
+ * grouped reads therefore also carry `HAVING pattern != ''`; this stays
1462
+ * because skipping those rows before aggregation is strictly cheaper than
1463
+ * grouping them and throwing the group away.
1464
+ */
1465
+ LogAggregationService.NON_EMPTY_BODY_FILTER = " AND notEmpty(trimBoth(ifNull(body, '')))";
1466
+ /*
1467
+ * The actual guarantee that no empty-pattern group is returned. Applied to
1468
+ * every read that GROUPs BY the pattern; the row-returning reads instead
1469
+ * scope to one caller-supplied pattern, which is never "".
1470
+ */
1471
+ LogAggregationService.NON_EMPTY_PATTERN_HAVING = " HAVING pattern != ''";
805
1472
  __decorate([
806
1473
  CaptureSpan(),
807
1474
  __metadata("design:type", Function),
@@ -850,5 +1517,47 @@ __decorate([
850
1517
  __metadata("design:paramtypes", [Object]),
851
1518
  __metadata("design:returntype", Promise)
852
1519
  ], LogAggregationService, "getDropFilterEstimate", null);
1520
+ __decorate([
1521
+ CaptureSpan(),
1522
+ __metadata("design:type", Function),
1523
+ __metadata("design:paramtypes", [Object]),
1524
+ __metadata("design:returntype", Promise)
1525
+ ], LogAggregationService, "getTopErrorPatterns", null);
1526
+ __decorate([
1527
+ CaptureSpan(),
1528
+ __metadata("design:type", Function),
1529
+ __metadata("design:paramtypes", [Object]),
1530
+ __metadata("design:returntype", Promise)
1531
+ ], LogAggregationService, "getErrorPatternTimeline", null);
1532
+ __decorate([
1533
+ CaptureSpan(),
1534
+ __metadata("design:type", Function),
1535
+ __metadata("design:paramtypes", [Object]),
1536
+ __metadata("design:returntype", Promise)
1537
+ ], LogAggregationService, "getErrorPatternCoOccurrences", null);
1538
+ __decorate([
1539
+ CaptureSpan(),
1540
+ __metadata("design:type", Function),
1541
+ __metadata("design:paramtypes", [Object]),
1542
+ __metadata("design:returntype", Promise)
1543
+ ], LogAggregationService, "getErrorPatternAttributes", null);
1544
+ __decorate([
1545
+ CaptureSpan(),
1546
+ __metadata("design:type", Function),
1547
+ __metadata("design:paramtypes", [Object]),
1548
+ __metadata("design:returntype", Promise)
1549
+ ], LogAggregationService, "getErrorPatternResources", null);
1550
+ __decorate([
1551
+ CaptureSpan(),
1552
+ __metadata("design:type", Function),
1553
+ __metadata("design:paramtypes", [Object]),
1554
+ __metadata("design:returntype", Promise)
1555
+ ], LogAggregationService, "getErrorPatternTraces", null);
1556
+ __decorate([
1557
+ CaptureSpan(),
1558
+ __metadata("design:type", Function),
1559
+ __metadata("design:paramtypes", [Object]),
1560
+ __metadata("design:returntype", Promise)
1561
+ ], LogAggregationService, "getErrorPatternSamples", null);
853
1562
  export default LogAggregationService;
854
1563
  //# sourceMappingURL=LogAggregationService.js.map