@oneuptime/common 10.8.1 → 11.0.0

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 (772) hide show
  1. package/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.ts +16 -18
  2. package/Models/AnalyticsModels/AuditLog.ts +3 -1
  3. package/Models/AnalyticsModels/ExceptionInstance.ts +200 -82
  4. package/Models/AnalyticsModels/Index.ts +7 -2
  5. package/Models/AnalyticsModels/Log.ts +197 -81
  6. package/Models/AnalyticsModels/Metric.ts +199 -86
  7. package/Models/AnalyticsModels/MetricBaselineHourly.ts +44 -25
  8. package/Models/AnalyticsModels/MetricItemAggMV1m.ts +23 -20
  9. package/Models/AnalyticsModels/{MetricItemAggMV1mByHost.ts → MetricItemAggMV1mByHostV2.ts} +58 -47
  10. package/Models/AnalyticsModels/MonitorLog.ts +5 -1
  11. package/Models/AnalyticsModels/Profile.ts +206 -85
  12. package/Models/AnalyticsModels/ProfileSample.ts +196 -83
  13. package/Models/AnalyticsModels/Span.ts +218 -85
  14. package/Models/DatabaseModels/CloudResourceInstance.ts +1 -2
  15. package/Models/DatabaseModels/CloudResourceOwnerTeam.ts +1 -2
  16. package/Models/DatabaseModels/CloudResourceOwnerUser.ts +1 -2
  17. package/Models/DatabaseModels/Index.ts +4 -0
  18. package/Models/DatabaseModels/Service.ts +29 -0
  19. package/Models/DatabaseModels/TelemetryEntity.ts +393 -0
  20. package/Models/DatabaseModels/TelemetryEntityRelationship.ts +294 -0
  21. package/Models/DatabaseModels/TelemetryException.ts +13 -12
  22. package/Models/DatabaseModels/TelemetryUsageBilling.ts +5 -5
  23. package/Server/API/AIAgentDataAPI.ts +13 -12
  24. package/Server/API/DashboardAPI.ts +2 -2
  25. package/Server/API/TelemetryAPI.ts +656 -141
  26. package/Server/API/TelemetryExceptionAPI.ts +2 -2
  27. package/Server/Infrastructure/ClickhouseConfig.ts +12 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1780931863719-AddTelemetryResourceMetadataColumns.ts +1 -3
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1780933132562-AddServerlessFunctionTables.ts +6 -2
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1780935387827-AddCloudResourceTables.ts +18 -6
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1781011482945-MigrationName.ts +2317 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1781100000001-RenameTelemetryServiceIdToPrimaryEntityId.ts +48 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1781200000000-AddTelemetryEntityTable.ts +70 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1781200000001-AddTelemetryEntityRelationshipTable.ts +57 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1781250074195-MigrationName.ts +207 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1781300000000-AddTelemetryEntityLabels.ts +24 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1781400000000-AddServiceTelemetrySdkLanguage.ts +25 -0
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  39. package/Server/Infrastructure/Queue.ts +36 -3
  40. package/Server/Middleware/TelemetryIngest.ts +27 -22
  41. package/Server/Services/AlertService.ts +9 -9
  42. package/Server/Services/AnalyticsDatabaseService.ts +204 -35
  43. package/Server/Services/CloudResourceLabelRuleEngineService.ts +4 -1
  44. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +4 -1
  45. package/Server/Services/ExceptionAggregationService.ts +41 -18
  46. package/Server/Services/HostService.ts +2 -1
  47. package/Server/Services/IncidentService.ts +19 -19
  48. package/Server/Services/Index.ts +6 -2
  49. package/Server/Services/LogAggregationService.ts +116 -43
  50. package/Server/Services/MetricAggregationService.ts +29 -14
  51. package/Server/Services/MetricBaselineService.ts +34 -34
  52. package/Server/Services/MetricItemAggMV1mByHostV2Service.ts +30 -0
  53. package/Server/Services/MetricService.ts +119 -31
  54. package/Server/Services/OpenTelemetryIngestService.ts +189 -51
  55. package/Server/Services/ProfileAggregationService.ts +904 -126
  56. package/Server/Services/RumApplicationLabelRuleEngineService.ts +4 -1
  57. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +4 -1
  58. package/Server/Services/ServerlessFunctionInstanceService.ts +4 -2
  59. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +7 -2
  60. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +7 -2
  61. package/Server/Services/ServiceService.ts +6 -0
  62. package/Server/Services/SpanService.ts +274 -14
  63. package/Server/Services/TelemetryEntityRelationshipService.ts +71 -0
  64. package/Server/Services/TelemetryEntityService.ts +246 -0
  65. package/Server/Services/TelemetryExceptionService.ts +27 -23
  66. package/Server/Services/TelemetryUsageBillingService.ts +38 -31
  67. package/Server/Services/TraceAggregationService.ts +875 -43
  68. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +43 -2
  69. package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -2
  70. package/Server/Types/Database/Permissions/BasePermission.ts +37 -1
  71. package/Server/Types/Database/Permissions/OwnedScopePermission.ts +21 -3
  72. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +1 -0
  73. package/Server/Types/Database/QueryHelper.ts +41 -0
  74. package/Server/Utils/Alert/AlertPrivacyFilter.ts +9 -2
  75. package/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.ts +9 -2
  76. package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +95 -0
  77. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +133 -0
  78. package/Server/Utils/Incident/IncidentPrivacyFilter.ts +9 -2
  79. package/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.ts +9 -2
  80. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +1 -1
  81. package/Server/Utils/Monitor/MonitorLogUtil.ts +1 -2
  82. package/Server/Utils/Monitor/MonitorMetricUtil.ts +3 -4
  83. package/Server/Utils/PrivacyFilterUtil.ts +72 -0
  84. package/Server/Utils/Profile/PprofEncoder.ts +135 -11
  85. package/Server/Utils/Telemetry/EntityRegistry.ts +316 -0
  86. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +9 -3
  87. package/Server/Utils/Telemetry/TelemetryEntity.ts +783 -0
  88. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +79 -4
  89. package/Tests/Server/Services/LogAggregationService.test.ts +7 -2
  90. package/Tests/Server/Services/ProfileAggregationService.test.ts +280 -0
  91. package/Tests/Server/Services/ProfileBreakdown.test.ts +161 -0
  92. package/Tests/Server/Services/ProfileFunctionFocus.test.ts +349 -0
  93. package/Tests/Server/Services/TelemetryAttributeService.test.ts +1 -1
  94. package/Tests/Server/Services/TraceAggregationService.test.ts +403 -0
  95. package/Tests/Server/Types/AnalyticsDatabase/ModelPermissionOwnedScope.test.ts +114 -0
  96. package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +189 -0
  97. package/Tests/Server/Types/Database/Permissions/BasePermission.test.ts +118 -0
  98. package/Tests/Server/Types/Database/Permissions/OwnedScopePermission.test.ts +159 -0
  99. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +275 -8
  100. package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +177 -0
  101. package/Tests/Server/Utils/Profile/PprofEncoder.test.ts +276 -0
  102. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +761 -0
  103. package/Tests/Types/Monitor/MonitorStepEntityScope.test.ts +275 -0
  104. package/Tests/Types/Text.test.ts +52 -0
  105. package/Tests/Utils/Telemetry/EntityKey.test.ts +150 -0
  106. package/Tests/Utils/Telemetry/EntityKeySqlParity.test.ts +40 -0
  107. package/Tests/Utils/Telemetry/EntityRelationship.test.ts +150 -0
  108. package/Tests/Utils/UUID.test.ts +47 -0
  109. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +14 -9
  110. package/Types/AnalyticsDatabase/TableColumnType.ts +1 -0
  111. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  112. package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +37 -0
  113. package/Types/Dashboard/DashboardTemplates.ts +4 -5
  114. package/Types/Log/LogQueryParser.ts +2 -2
  115. package/Types/Log/LogQueryToFilter.ts +2 -2
  116. package/Types/Monitor/MonitorStepExceptionMonitor.ts +19 -1
  117. package/Types/Monitor/MonitorStepLogMonitor.ts +20 -1
  118. package/Types/Monitor/MonitorStepMetricMonitor.ts +27 -0
  119. package/Types/Monitor/MonitorStepProfileMonitor.ts +19 -1
  120. package/Types/Monitor/MonitorStepTraceMonitor.ts +18 -1
  121. package/Types/Monitor/MonitorType.ts +8 -1
  122. package/Types/ObjectID.ts +10 -0
  123. package/Types/Permission.ts +4 -2
  124. package/Types/Telemetry/EntityRelationshipType.ts +31 -0
  125. package/Types/Telemetry/EntityType.ts +33 -0
  126. package/Types/Telemetry/TelemetrySavedViewState.ts +2 -0
  127. package/Types/Text.ts +34 -0
  128. package/Types/Trace/TraceAggregationType.ts +1 -0
  129. package/Types/Trace/TraceRecordingRuleDefinition.ts +74 -0
  130. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +14 -14
  131. package/UI/Components/Forms/Fields/FormField.tsx +18 -12
  132. package/UI/Components/Input/Input.tsx +3 -1
  133. package/UI/Components/LogsViewer/LogsViewer.tsx +12 -9
  134. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +10 -9
  135. package/UI/Components/LogsViewer/components/LogSearchBar.tsx +1 -1
  136. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +2 -2
  137. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +4 -4
  138. package/UI/Components/LogsViewer/components/LogsTable.tsx +5 -3
  139. package/UI/Components/Navbar/NavBarMenuModal.tsx +81 -44
  140. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +33 -10
  141. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +18 -3
  142. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +91 -68
  143. package/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.tsx +9 -2
  144. package/UI/Components/TextArea/TextArea.tsx +3 -1
  145. package/UI/Components/Toast/Toast.tsx +4 -2
  146. package/UI/Utils/LogExport.ts +2 -2
  147. package/UI/Utils/TelemetryService.ts +20 -20
  148. package/Utils/Dashboard/Components/DashboardTraceChartComponent.ts +134 -0
  149. package/Utils/Dashboard/Components/Index.ts +7 -0
  150. package/Utils/Telemetry/EntityKey.ts +151 -0
  151. package/Utils/Telemetry/EntityRelationship.ts +113 -0
  152. package/Utils/Traces/CriticalPath.ts +7 -7
  153. package/Utils/UUID.ts +57 -0
  154. package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js +14 -13
  155. package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js.map +1 -1
  156. package/build/dist/Models/AnalyticsModels/AuditLog.js +2 -1
  157. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  158. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +125 -22
  159. package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
  160. package/build/dist/Models/AnalyticsModels/Index.js +7 -2
  161. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  162. package/build/dist/Models/AnalyticsModels/Log.js +123 -22
  163. package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
  164. package/build/dist/Models/AnalyticsModels/Metric.js +125 -27
  165. package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
  166. package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js +38 -21
  167. package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js.map +1 -1
  168. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js +17 -16
  169. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js.map +1 -1
  170. package/build/dist/Models/AnalyticsModels/{MetricItemAggMV1mByHost.js → MetricItemAggMV1mByHostV2.js} +54 -42
  171. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.js.map +1 -0
  172. package/build/dist/Models/AnalyticsModels/MonitorLog.js +4 -1
  173. package/build/dist/Models/AnalyticsModels/MonitorLog.js.map +1 -1
  174. package/build/dist/Models/AnalyticsModels/Profile.js +132 -26
  175. package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
  176. package/build/dist/Models/AnalyticsModels/ProfileSample.js +121 -23
  177. package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
  178. package/build/dist/Models/AnalyticsModels/Span.js +144 -26
  179. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  180. package/build/dist/Models/DatabaseModels/CloudResourceInstance.js.map +1 -1
  181. package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js.map +1 -1
  182. package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js.map +1 -1
  183. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  184. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  185. package/build/dist/Models/DatabaseModels/Service.js +30 -0
  186. package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
  187. package/build/dist/Models/DatabaseModels/TelemetryEntity.js +419 -0
  188. package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +1 -0
  189. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js +317 -0
  190. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +1 -0
  191. package/build/dist/Models/DatabaseModels/TelemetryException.js +12 -12
  192. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  193. package/build/dist/Models/DatabaseModels/TelemetryUsageBilling.js +7 -7
  194. package/build/dist/Models/DatabaseModels/TelemetryUsageBilling.js.map +1 -1
  195. package/build/dist/Server/API/AIAgentDataAPI.js +14 -13
  196. package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
  197. package/build/dist/Server/API/DashboardAPI.js +2 -2
  198. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  199. package/build/dist/Server/API/TelemetryAPI.js +425 -129
  200. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  201. package/build/dist/Server/API/TelemetryExceptionAPI.js +2 -2
  202. package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
  203. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -0
  204. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  205. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780931863719-AddTelemetryResourceMetadataColumns.js.map +1 -1
  206. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780933132562-AddServerlessFunctionTables.js.map +1 -1
  207. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780935387827-AddCloudResourceTables.js.map +1 -1
  208. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781011482945-MigrationName.js +798 -0
  209. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781011482945-MigrationName.js.map +1 -0
  210. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781100000001-RenameTelemetryServiceIdToPrimaryEntityId.js +29 -0
  211. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781100000001-RenameTelemetryServiceIdToPrimaryEntityId.js.map +1 -0
  212. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000000-AddTelemetryEntityTable.js +38 -0
  213. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000000-AddTelemetryEntityTable.js.map +1 -0
  214. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000001-AddTelemetryEntityRelationshipTable.js +33 -0
  215. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000001-AddTelemetryEntityRelationshipTable.js.map +1 -0
  216. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781250074195-MigrationName.js +78 -0
  217. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781250074195-MigrationName.js.map +1 -0
  218. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781300000000-AddTelemetryEntityLabels.js +19 -0
  219. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781300000000-AddTelemetryEntityLabels.js.map +1 -0
  220. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781400000000-AddServiceTelemetrySdkLanguage.js +18 -0
  221. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781400000000-AddServiceTelemetrySdkLanguage.js.map +1 -0
  222. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  223. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  224. package/build/dist/Server/Infrastructure/Queue.js +14 -3
  225. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  226. package/build/dist/Server/Middleware/TelemetryIngest.js +16 -18
  227. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  228. package/build/dist/Server/Services/AlertService.js +9 -9
  229. package/build/dist/Server/Services/AlertService.js.map +1 -1
  230. package/build/dist/Server/Services/AnalyticsDatabaseService.js +115 -40
  231. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  232. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  233. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  234. package/build/dist/Server/Services/ExceptionAggregationService.js +38 -18
  235. package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
  236. package/build/dist/Server/Services/HostService.js +2 -1
  237. package/build/dist/Server/Services/HostService.js.map +1 -1
  238. package/build/dist/Server/Services/IncidentService.js +19 -19
  239. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  240. package/build/dist/Server/Services/Index.js +6 -2
  241. package/build/dist/Server/Services/Index.js.map +1 -1
  242. package/build/dist/Server/Services/LogAggregationService.js +100 -42
  243. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  244. package/build/dist/Server/Services/MetricAggregationService.js +27 -14
  245. package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
  246. package/build/dist/Server/Services/MetricBaselineService.js +28 -28
  247. package/build/dist/Server/Services/MetricBaselineService.js.map +1 -1
  248. package/build/dist/Server/Services/MetricItemAggMV1mByHostV2Service.js +28 -0
  249. package/build/dist/Server/Services/MetricItemAggMV1mByHostV2Service.js.map +1 -0
  250. package/build/dist/Server/Services/MetricService.js +116 -31
  251. package/build/dist/Server/Services/MetricService.js.map +1 -1
  252. package/build/dist/Server/Services/OpenTelemetryIngestService.js +103 -36
  253. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  254. package/build/dist/Server/Services/ProfileAggregationService.js +613 -105
  255. package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
  256. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  257. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  258. package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +4 -2
  259. package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -1
  260. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +2 -1
  261. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  262. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +2 -1
  263. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  264. package/build/dist/Server/Services/ServiceService.js +9 -5
  265. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  266. package/build/dist/Server/Services/SpanService.js +217 -15
  267. package/build/dist/Server/Services/SpanService.js.map +1 -1
  268. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +72 -0
  269. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -0
  270. package/build/dist/Server/Services/TelemetryEntityService.js +201 -0
  271. package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -0
  272. package/build/dist/Server/Services/TelemetryExceptionService.js +18 -18
  273. package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
  274. package/build/dist/Server/Services/TelemetryUsageBillingService.js +27 -21
  275. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  276. package/build/dist/Server/Services/TraceAggregationService.js +568 -43
  277. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  278. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +38 -2
  279. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  280. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +36 -2
  281. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
  282. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +25 -1
  283. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  284. package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js +17 -3
  285. package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js.map +1 -1
  286. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +1 -0
  287. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  288. package/build/dist/Server/Types/Database/QueryHelper.js +31 -0
  289. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  290. package/build/dist/Server/Utils/Alert/AlertPrivacyFilter.js +3 -2
  291. package/build/dist/Server/Utils/Alert/AlertPrivacyFilter.js.map +1 -1
  292. package/build/dist/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.js +3 -2
  293. package/build/dist/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.js.map +1 -1
  294. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
  295. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -0
  296. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +97 -3
  297. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  298. package/build/dist/Server/Utils/Incident/IncidentPrivacyFilter.js +3 -2
  299. package/build/dist/Server/Utils/Incident/IncidentPrivacyFilter.js.map +1 -1
  300. package/build/dist/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.js +3 -2
  301. package/build/dist/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.js.map +1 -1
  302. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +1 -1
  303. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  304. package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js +1 -2
  305. package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js.map +1 -1
  306. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +3 -4
  307. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  308. package/build/dist/Server/Utils/PrivacyFilterUtil.js +47 -0
  309. package/build/dist/Server/Utils/PrivacyFilterUtil.js.map +1 -0
  310. package/build/dist/Server/Utils/Profile/PprofEncoder.js +132 -4
  311. package/build/dist/Server/Utils/Profile/PprofEncoder.js.map +1 -1
  312. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +228 -0
  313. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -0
  314. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +5 -0
  315. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  316. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +569 -0
  317. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -0
  318. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +14 -9
  319. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  320. package/build/dist/Types/AnalyticsDatabase/TableColumnType.js +1 -0
  321. package/build/dist/Types/AnalyticsDatabase/TableColumnType.js.map +1 -1
  322. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  323. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  324. package/build/dist/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.js +2 -0
  325. package/build/dist/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.js.map +1 -0
  326. package/build/dist/Types/Dashboard/DashboardTemplates.js +4 -5
  327. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  328. package/build/dist/Types/Log/LogQueryParser.js +2 -2
  329. package/build/dist/Types/Log/LogQueryParser.js.map +1 -1
  330. package/build/dist/Types/Log/LogQueryToFilter.js +1 -1
  331. package/build/dist/Types/Log/LogQueryToFilter.js.map +1 -1
  332. package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js +9 -1
  333. package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js.map +1 -1
  334. package/build/dist/Types/Monitor/MonitorStepLogMonitor.js +9 -1
  335. package/build/dist/Types/Monitor/MonitorStepLogMonitor.js.map +1 -1
  336. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +13 -0
  337. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
  338. package/build/dist/Types/Monitor/MonitorStepProfileMonitor.js +9 -1
  339. package/build/dist/Types/Monitor/MonitorStepProfileMonitor.js.map +1 -1
  340. package/build/dist/Types/Monitor/MonitorStepTraceMonitor.js +9 -1
  341. package/build/dist/Types/Monitor/MonitorStepTraceMonitor.js.map +1 -1
  342. package/build/dist/Types/Monitor/MonitorType.js +8 -1
  343. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  344. package/build/dist/Types/ObjectID.js +9 -0
  345. package/build/dist/Types/ObjectID.js.map +1 -1
  346. package/build/dist/Types/Permission.js.map +1 -1
  347. package/build/dist/Types/Telemetry/EntityRelationshipType.js +32 -0
  348. package/build/dist/Types/Telemetry/EntityRelationshipType.js.map +1 -0
  349. package/build/dist/Types/Telemetry/EntityType.js +34 -0
  350. package/build/dist/Types/Telemetry/EntityType.js.map +1 -0
  351. package/build/dist/Types/Text.js +32 -1
  352. package/build/dist/Types/Text.js.map +1 -1
  353. package/build/dist/Types/Trace/TraceAggregationType.js +1 -0
  354. package/build/dist/Types/Trace/TraceAggregationType.js.map +1 -1
  355. package/build/dist/Types/Trace/TraceRecordingRuleDefinition.js +50 -1
  356. package/build/dist/Types/Trace/TraceRecordingRuleDefinition.js.map +1 -1
  357. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  358. package/build/dist/UI/Components/Forms/Fields/FormField.js +15 -12
  359. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  360. package/build/dist/UI/Components/Input/Input.js +3 -1
  361. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  362. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +10 -9
  363. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  364. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +8 -8
  365. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  366. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +1 -1
  367. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
  368. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +2 -2
  369. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  370. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +4 -4
  371. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  372. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +3 -3
  373. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
  374. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +43 -30
  375. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  376. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +6 -2
  377. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  378. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -3
  379. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  380. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +18 -10
  381. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  382. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js +4 -2
  383. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js.map +1 -1
  384. package/build/dist/UI/Components/TextArea/TextArea.js +3 -1
  385. package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
  386. package/build/dist/UI/Components/Toast/Toast.js +4 -2
  387. package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
  388. package/build/dist/UI/Utils/LogExport.js +2 -2
  389. package/build/dist/UI/Utils/LogExport.js.map +1 -1
  390. package/build/dist/UI/Utils/TelemetryService.js +16 -16
  391. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  392. package/build/dist/Utils/Dashboard/Components/DashboardTraceChartComponent.js +110 -0
  393. package/build/dist/Utils/Dashboard/Components/DashboardTraceChartComponent.js.map +1 -0
  394. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  395. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  396. package/build/dist/Utils/Telemetry/EntityKey.js +115 -0
  397. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -0
  398. package/build/dist/Utils/Telemetry/EntityRelationship.js +71 -0
  399. package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -0
  400. package/build/dist/Utils/Traces/CriticalPath.js +5 -5
  401. package/build/dist/Utils/Traces/CriticalPath.js.map +1 -1
  402. package/build/dist/Utils/UUID.js +50 -0
  403. package/build/dist/Utils/UUID.js.map +1 -1
  404. package/package.json +2 -1
  405. package/tsconfig.json +10 -1
  406. package/Server/Services/MetricItemAggMV1mByHostService.ts +0 -30
  407. package/Types/Profile/ProfileMetricType.ts +0 -16
  408. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHost.js.map +0 -1
  409. package/build/dist/Server/Services/MetricItemAggMV1mByHostService.js +0 -28
  410. package/build/dist/Server/Services/MetricItemAggMV1mByHostService.js.map +0 -1
  411. package/build/dist/Tests/MockType.js +0 -5
  412. package/build/dist/Tests/MockType.js.map +0 -1
  413. package/build/dist/Tests/Models/AnalyticsModels/Log.test.js +0 -12
  414. package/build/dist/Tests/Models/AnalyticsModels/Log.test.js.map +0 -1
  415. package/build/dist/Tests/Models/File.test.js +0 -10
  416. package/build/dist/Tests/Models/File.test.js.map +0 -1
  417. package/build/dist/Tests/Server/API/BaseAPI.test.js +0 -590
  418. package/build/dist/Tests/Server/API/BaseAPI.test.js.map +0 -1
  419. package/build/dist/Tests/Server/API/Helpers.js +0 -27
  420. package/build/dist/Tests/Server/API/Helpers.js.map +0 -1
  421. package/build/dist/Tests/Server/API/ProbeAPI.test.js +0 -84
  422. package/build/dist/Tests/Server/API/ProbeAPI.test.js.map +0 -1
  423. package/build/dist/Tests/Server/API/ProjectAPI.test.js +0 -170
  424. package/build/dist/Tests/Server/API/ProjectAPI.test.js.map +0 -1
  425. package/build/dist/Tests/Server/API/UserSmsApi.test.js +0 -177
  426. package/build/dist/Tests/Server/API/UserSmsApi.test.js.map +0 -1
  427. package/build/dist/Tests/Server/Middleware/BearerTokenAuthorization.test.js +0 -63
  428. package/build/dist/Tests/Server/Middleware/BearerTokenAuthorization.test.js.map +0 -1
  429. package/build/dist/Tests/Server/Middleware/ClusterKeyAuthorization.test.js +0 -58
  430. package/build/dist/Tests/Server/Middleware/ClusterKeyAuthorization.test.js.map +0 -1
  431. package/build/dist/Tests/Server/Middleware/NotificationMiddleware.test.js +0 -101
  432. package/build/dist/Tests/Server/Middleware/NotificationMiddleware.test.js.map +0 -1
  433. package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js +0 -160
  434. package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js.map +0 -1
  435. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +0 -410
  436. package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +0 -1
  437. package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js +0 -165
  438. package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js.map +0 -1
  439. package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js +0 -193
  440. package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js.map +0 -1
  441. package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js +0 -435
  442. package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js.map +0 -1
  443. package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js +0 -320
  444. package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js.map +0 -1
  445. package/build/dist/Tests/Server/Services/AnalyticsDatabaseService.test.js +0 -266
  446. package/build/dist/Tests/Server/Services/AnalyticsDatabaseService.test.js.map +0 -1
  447. package/build/dist/Tests/Server/Services/BillingService.test.js +0 -910
  448. package/build/dist/Tests/Server/Services/BillingService.test.js.map +0 -1
  449. package/build/dist/Tests/Server/Services/LogAggregationService.test.js +0 -75
  450. package/build/dist/Tests/Server/Services/LogAggregationService.test.js.map +0 -1
  451. package/build/dist/Tests/Server/Services/ProbeService.test.js +0 -127
  452. package/build/dist/Tests/Server/Services/ProbeService.test.js.map +0 -1
  453. package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js +0 -114
  454. package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js.map +0 -1
  455. package/build/dist/Tests/Server/Services/TeamMemberService.test.js +0 -106
  456. package/build/dist/Tests/Server/Services/TeamMemberService.test.js.map +0 -1
  457. package/build/dist/Tests/Server/Services/TelemetryAttributeService.test.js +0 -50
  458. package/build/dist/Tests/Server/Services/TelemetryAttributeService.test.js.map +0 -1
  459. package/build/dist/Tests/Server/TestingUtils/Init.js +0 -4
  460. package/build/dist/Tests/Server/TestingUtils/Init.js.map +0 -1
  461. package/build/dist/Tests/Server/TestingUtils/Postgres/TestDataSourceOptions.js +0 -9
  462. package/build/dist/Tests/Server/TestingUtils/Postgres/TestDataSourceOptions.js.map +0 -1
  463. package/build/dist/Tests/Server/TestingUtils/Redis/TestRedisOptions.js +0 -16
  464. package/build/dist/Tests/Server/TestingUtils/Redis/TestRedisOptions.js.map +0 -1
  465. package/build/dist/Tests/Server/TestingUtils/Services/BillingServiceHelper.js +0 -125
  466. package/build/dist/Tests/Server/TestingUtils/Services/BillingServiceHelper.js.map +0 -1
  467. package/build/dist/Tests/Server/TestingUtils/Services/ProjectServiceHelper.js +0 -39
  468. package/build/dist/Tests/Server/TestingUtils/Services/ProjectServiceHelper.js.map +0 -1
  469. package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceServiceHelper.js +0 -20
  470. package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceServiceHelper.js.map +0 -1
  471. package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceStateServiceHelper.js +0 -31
  472. package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceStateServiceHelper.js.map +0 -1
  473. package/build/dist/Tests/Server/TestingUtils/Services/TeamMemberServiceHelper.js +0 -14
  474. package/build/dist/Tests/Server/TestingUtils/Services/TeamMemberServiceHelper.js.map +0 -1
  475. package/build/dist/Tests/Server/TestingUtils/Services/TeamServiceHelper.js +0 -21
  476. package/build/dist/Tests/Server/TestingUtils/Services/TeamServiceHelper.js.map +0 -1
  477. package/build/dist/Tests/Server/TestingUtils/Services/Types.js +0 -2
  478. package/build/dist/Tests/Server/TestingUtils/Services/Types.js.map +0 -1
  479. package/build/dist/Tests/Server/TestingUtils/Services/UserServiceHelper.js +0 -37
  480. package/build/dist/Tests/Server/TestingUtils/Services/UserServiceHelper.js.map +0 -1
  481. package/build/dist/Tests/Server/TestingUtils/__mocks__/Stripe.mock.js +0 -13
  482. package/build/dist/Tests/Server/TestingUtils/__mocks__/Stripe.mock.js.map +0 -1
  483. package/build/dist/Tests/Server/TestingUtils/__mocks__/TestDatabase.mock.js +0 -22
  484. package/build/dist/Tests/Server/TestingUtils/__mocks__/TestDatabase.mock.js.map +0 -1
  485. package/build/dist/Tests/Server/Types/Domain.test.js +0 -78
  486. package/build/dist/Tests/Server/Types/Domain.test.js.map +0 -1
  487. package/build/dist/Tests/Server/Utils/AnalyticsDatabase/Statement.test.js +0 -94
  488. package/build/dist/Tests/Server/Utils/AnalyticsDatabase/Statement.test.js.map +0 -1
  489. package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js +0 -459
  490. package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js.map +0 -1
  491. package/build/dist/Tests/Server/Utils/Cookie.test.js +0 -83
  492. package/build/dist/Tests/Server/Utils/Cookie.test.js.map +0 -1
  493. package/build/dist/Tests/Server/Utils/CronTab.test.js +0 -29
  494. package/build/dist/Tests/Server/Utils/CronTab.test.js.map +0 -1
  495. package/build/dist/Tests/Server/Utils/JsonToCsv.test.js +0 -114
  496. package/build/dist/Tests/Server/Utils/JsonToCsv.test.js.map +0 -1
  497. package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js +0 -606
  498. package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js.map +0 -1
  499. package/build/dist/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.js +0 -255
  500. package/build/dist/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.js.map +0 -1
  501. package/build/dist/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.js +0 -142
  502. package/build/dist/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.js.map +0 -1
  503. package/build/dist/Tests/Server/Utils/StatusPageResource.test.js +0 -122
  504. package/build/dist/Tests/Server/Utils/StatusPageResource.test.js.map +0 -1
  505. package/build/dist/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.js +0 -0
  506. package/build/dist/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.js.map +0 -1
  507. package/build/dist/Tests/Server/Utils/VM/VMAPI.test.js +0 -205
  508. package/build/dist/Tests/Server/Utils/VM/VMAPI.test.js.map +0 -1
  509. package/build/dist/Tests/Spy.js +0 -4
  510. package/build/dist/Tests/Spy.js.map +0 -1
  511. package/build/dist/Tests/Types/API/ErrorResponse.test.js +0 -13
  512. package/build/dist/Tests/Types/API/ErrorResponse.test.js.map +0 -1
  513. package/build/dist/Tests/Types/API/HTTPErrorResponse.test.js +0 -33
  514. package/build/dist/Tests/Types/API/HTTPErrorResponse.test.js.map +0 -1
  515. package/build/dist/Tests/Types/API/HTTPMethod.test.js +0 -16
  516. package/build/dist/Tests/Types/API/HTTPMethod.test.js.map +0 -1
  517. package/build/dist/Tests/Types/API/Headers.test.js +0 -14
  518. package/build/dist/Tests/Types/API/Headers.test.js.map +0 -1
  519. package/build/dist/Tests/Types/API/Hostname.test.js +0 -22
  520. package/build/dist/Tests/Types/API/Hostname.test.js.map +0 -1
  521. package/build/dist/Tests/Types/API/Protocal.test.js +0 -19
  522. package/build/dist/Tests/Types/API/Protocal.test.js.map +0 -1
  523. package/build/dist/Tests/Types/API/Response.test.js +0 -14
  524. package/build/dist/Tests/Types/API/Response.test.js.map +0 -1
  525. package/build/dist/Tests/Types/API/ResponseType.test.js +0 -13
  526. package/build/dist/Tests/Types/API/ResponseType.test.js.map +0 -1
  527. package/build/dist/Tests/Types/API/Route.test.js +0 -30
  528. package/build/dist/Tests/Types/API/Route.test.js.map +0 -1
  529. package/build/dist/Tests/Types/API/StatusCode.test.js +0 -26
  530. package/build/dist/Tests/Types/API/StatusCode.test.js.map +0 -1
  531. package/build/dist/Tests/Types/API/URL.test.js +0 -33
  532. package/build/dist/Tests/Types/API/URL.test.js.map +0 -1
  533. package/build/dist/Tests/Types/Alerts/AlertEventType.test.js +0 -34
  534. package/build/dist/Tests/Types/Alerts/AlertEventType.test.js.map +0 -1
  535. package/build/dist/Tests/Types/Alerts/AlertType.test.js +0 -19
  536. package/build/dist/Tests/Types/Alerts/AlertType.test.js.map +0 -1
  537. package/build/dist/Tests/Types/AppEnvironment.test.js +0 -13
  538. package/build/dist/Tests/Types/AppEnvironment.test.js.map +0 -1
  539. package/build/dist/Tests/Types/ApplicationLog/ApplicationLogType.test.js +0 -13
  540. package/build/dist/Tests/Types/ApplicationLog/ApplicationLogType.test.js.map +0 -1
  541. package/build/dist/Tests/Types/ArrayUtil.test.js +0 -71
  542. package/build/dist/Tests/Types/ArrayUtil.test.js.map +0 -1
  543. package/build/dist/Tests/Types/Billing/SubscriptionPlan.test.js +0 -181
  544. package/build/dist/Tests/Types/Billing/SubscriptionPlan.test.js.map +0 -1
  545. package/build/dist/Tests/Types/BrandColors.test.js +0 -124
  546. package/build/dist/Tests/Types/BrandColors.test.js.map +0 -1
  547. package/build/dist/Tests/Types/Char.test.js +0 -82
  548. package/build/dist/Tests/Types/Char.test.js.map +0 -1
  549. package/build/dist/Tests/Types/Code/CodeType.test.js +0 -13
  550. package/build/dist/Tests/Types/Code/CodeType.test.js.map +0 -1
  551. package/build/dist/Tests/Types/Color.test.js +0 -44
  552. package/build/dist/Tests/Types/Color.test.js.map +0 -1
  553. package/build/dist/Tests/Types/Company/CompanySize.test.js +0 -20
  554. package/build/dist/Tests/Types/Company/CompanySize.test.js.map +0 -1
  555. package/build/dist/Tests/Types/Company/JobRole.test.js +0 -22
  556. package/build/dist/Tests/Types/Company/JobRole.test.js.map +0 -1
  557. package/build/dist/Tests/Types/Countries.test.js +0 -249
  558. package/build/dist/Tests/Types/Countries.test.js.map +0 -1
  559. package/build/dist/Tests/Types/Database/ColumnLength.test.js +0 -43
  560. package/build/dist/Tests/Types/Database/ColumnLength.test.js.map +0 -1
  561. package/build/dist/Tests/Types/Database/ColumnType.test.js +0 -79
  562. package/build/dist/Tests/Types/Database/ColumnType.test.js.map +0 -1
  563. package/build/dist/Tests/Types/Database/Columns.test.js +0 -20
  564. package/build/dist/Tests/Types/Database/Columns.test.js.map +0 -1
  565. package/build/dist/Tests/Types/Database/CompareBase.test.js +0 -37
  566. package/build/dist/Tests/Types/Database/CompareBase.test.js.map +0 -1
  567. package/build/dist/Tests/Types/Database/Date.test.js +0 -62
  568. package/build/dist/Tests/Types/Database/Date.test.js.map +0 -1
  569. package/build/dist/Tests/Types/Database/EqualTo.test.js +0 -65
  570. package/build/dist/Tests/Types/Database/EqualTo.test.js.map +0 -1
  571. package/build/dist/Tests/Types/Database/EqualToOrNull.test.js +0 -62
  572. package/build/dist/Tests/Types/Database/EqualToOrNull.test.js.map +0 -1
  573. package/build/dist/Tests/Types/Database/InBetween.test.js +0 -72
  574. package/build/dist/Tests/Types/Database/InBetween.test.js.map +0 -1
  575. package/build/dist/Tests/Types/Database/LimitMax.test.js +0 -18
  576. package/build/dist/Tests/Types/Database/LimitMax.test.js.map +0 -1
  577. package/build/dist/Tests/Types/Database/NotEqual.test.js +0 -19
  578. package/build/dist/Tests/Types/Database/NotEqual.test.js.map +0 -1
  579. package/build/dist/Tests/Types/Database/Search.test.js +0 -10
  580. package/build/dist/Tests/Types/Database/Search.test.js.map +0 -1
  581. package/build/dist/Tests/Types/DatabaseType.test.js +0 -7
  582. package/build/dist/Tests/Types/DatabaseType.test.js.map +0 -1
  583. package/build/dist/Tests/Types/Date.test.js +0 -194
  584. package/build/dist/Tests/Types/Date.test.js.map +0 -1
  585. package/build/dist/Tests/Types/Dictionary.test.js +0 -25
  586. package/build/dist/Tests/Types/Dictionary.test.js.map +0 -1
  587. package/build/dist/Tests/Types/Domain.test.js +0 -54
  588. package/build/dist/Tests/Types/Domain.test.js.map +0 -1
  589. package/build/dist/Tests/Types/Email/Email.test.js +0 -51
  590. package/build/dist/Tests/Types/Email/Email.test.js.map +0 -1
  591. package/build/dist/Tests/Types/EmailWithName.test.js +0 -36
  592. package/build/dist/Tests/Types/EmailWithName.test.js.map +0 -1
  593. package/build/dist/Tests/Types/EncryptionAlgorithm.test.js +0 -7
  594. package/build/dist/Tests/Types/EncryptionAlgorithm.test.js.map +0 -1
  595. package/build/dist/Tests/Types/Exception/ApiException.test.js +0 -10
  596. package/build/dist/Tests/Types/Exception/ApiException.test.js.map +0 -1
  597. package/build/dist/Tests/Types/Exception/BadDataException.test.js +0 -12
  598. package/build/dist/Tests/Types/Exception/BadDataException.test.js.map +0 -1
  599. package/build/dist/Tests/Types/Exception/BadOperationException.test.js +0 -10
  600. package/build/dist/Tests/Types/Exception/BadOperationException.test.js.map +0 -1
  601. package/build/dist/Tests/Types/Exception/BadRequestException.test.js +0 -12
  602. package/build/dist/Tests/Types/Exception/BadRequestException.test.js.map +0 -1
  603. package/build/dist/Tests/Types/Exception/DatabaseNotConnectedException.test.js +0 -10
  604. package/build/dist/Tests/Types/Exception/DatabaseNotConnectedException.test.js.map +0 -1
  605. package/build/dist/Tests/Types/Exception/Exception.test.js +0 -15
  606. package/build/dist/Tests/Types/Exception/Exception.test.js.map +0 -1
  607. package/build/dist/Tests/Types/Exception/NotImplementedException.test.js +0 -12
  608. package/build/dist/Tests/Types/Exception/NotImplementedException.test.js.map +0 -1
  609. package/build/dist/Tests/Types/File.test.js +0 -22
  610. package/build/dist/Tests/Types/File.test.js.map +0 -1
  611. package/build/dist/Tests/Types/HashedString.test.js +0 -51
  612. package/build/dist/Tests/Types/HashedString.test.js.map +0 -1
  613. package/build/dist/Tests/Types/Html.test.js +0 -8
  614. package/build/dist/Tests/Types/Html.test.js.map +0 -1
  615. package/build/dist/Tests/Types/IP/IP.test.js +0 -65
  616. package/build/dist/Tests/Types/IP/IP.test.js.map +0 -1
  617. package/build/dist/Tests/Types/IP/IPType.test.js +0 -10
  618. package/build/dist/Tests/Types/IP/IPType.test.js.map +0 -1
  619. package/build/dist/Tests/Types/IP/IPv4.test.js +0 -17
  620. package/build/dist/Tests/Types/IP/IPv4.test.js.map +0 -1
  621. package/build/dist/Tests/Types/IP/IPv6.test.js +0 -17
  622. package/build/dist/Tests/Types/IP/IPv6.test.js.map +0 -1
  623. package/build/dist/Tests/Types/JSON.test.js +0 -37
  624. package/build/dist/Tests/Types/JSON.test.js.map +0 -1
  625. package/build/dist/Tests/Types/JSONFunctions.test.js +0 -38
  626. package/build/dist/Tests/Types/JSONFunctions.test.js.map +0 -1
  627. package/build/dist/Tests/Types/ListData.test.js +0 -34
  628. package/build/dist/Tests/Types/ListData.test.js.map +0 -1
  629. package/build/dist/Tests/Types/Monitor/KubernetesAlertTemplates.test.js +0 -121
  630. package/build/dist/Tests/Types/Monitor/KubernetesAlertTemplates.test.js.map +0 -1
  631. package/build/dist/Tests/Types/Name.test.js +0 -26
  632. package/build/dist/Tests/Types/Name.test.js.map +0 -1
  633. package/build/dist/Tests/Types/ObjectID.test.js +0 -12
  634. package/build/dist/Tests/Types/ObjectID.test.js.map +0 -1
  635. package/build/dist/Tests/Types/OnCallDutyPolicy/LayerUtil.test.js +0 -530
  636. package/build/dist/Tests/Types/OnCallDutyPolicy/LayerUtil.test.js.map +0 -1
  637. package/build/dist/Tests/Types/Permission.test.js +0 -99
  638. package/build/dist/Tests/Types/Permission.test.js.map +0 -1
  639. package/build/dist/Tests/Types/Phone.test.js +0 -37
  640. package/build/dist/Tests/Types/Phone.test.js.map +0 -1
  641. package/build/dist/Tests/Types/Port.test.js +0 -35
  642. package/build/dist/Tests/Types/Port.test.js.map +0 -1
  643. package/build/dist/Tests/Types/PositiveNumber.test.js +0 -101
  644. package/build/dist/Tests/Types/PositiveNumber.test.js.map +0 -1
  645. package/build/dist/Tests/Types/SecuritySeverity.test.js +0 -16
  646. package/build/dist/Tests/Types/SecuritySeverity.test.js.map +0 -1
  647. package/build/dist/Tests/Types/SerializableObject.test.js +0 -37
  648. package/build/dist/Tests/Types/SerializableObject.test.js.map +0 -1
  649. package/build/dist/Tests/Types/Sleep.test.js +0 -14
  650. package/build/dist/Tests/Types/Sleep.test.js.map +0 -1
  651. package/build/dist/Tests/Types/Text.test.js +0 -8
  652. package/build/dist/Tests/Types/Text.test.js.map +0 -1
  653. package/build/dist/Tests/Types/Timezone.test.js +0 -596
  654. package/build/dist/Tests/Types/Timezone.test.js.map +0 -1
  655. package/build/dist/Tests/Types/Typeof.test.js +0 -16
  656. package/build/dist/Tests/Types/Typeof.test.js.map +0 -1
  657. package/build/dist/Tests/Types/UserType.test.js +0 -16
  658. package/build/dist/Tests/Types/UserType.test.js.map +0 -1
  659. package/build/dist/Tests/Types/Version.test.js +0 -35
  660. package/build/dist/Tests/Types/Version.test.js.map +0 -1
  661. package/build/dist/Tests/Types/XML.test.js +0 -35
  662. package/build/dist/Tests/Types/XML.test.js.map +0 -1
  663. package/build/dist/Tests/UI/Components/404.test.js +0 -59
  664. package/build/dist/Tests/UI/Components/404.test.js.map +0 -1
  665. package/build/dist/Tests/UI/Components/Alert.test.js +0 -83
  666. package/build/dist/Tests/UI/Components/Alert.test.js.map +0 -1
  667. package/build/dist/Tests/UI/Components/Badge.test.js +0 -59
  668. package/build/dist/Tests/UI/Components/Badge.test.js.map +0 -1
  669. package/build/dist/Tests/UI/Components/BasicForm.test.js +0 -92
  670. package/build/dist/Tests/UI/Components/BasicForm.test.js.map +0 -1
  671. package/build/dist/Tests/UI/Components/Breadcrumbs.test.js +0 -69
  672. package/build/dist/Tests/UI/Components/Breadcrumbs.test.js.map +0 -1
  673. package/build/dist/Tests/UI/Components/Button.test.js +0 -104
  674. package/build/dist/Tests/UI/Components/Button.test.js.map +0 -1
  675. package/build/dist/Tests/UI/Components/Card.test.js +0 -81
  676. package/build/dist/Tests/UI/Components/Card.test.js.map +0 -1
  677. package/build/dist/Tests/UI/Components/ColorViewer.test.js +0 -42
  678. package/build/dist/Tests/UI/Components/ColorViewer.test.js.map +0 -1
  679. package/build/dist/Tests/UI/Components/ComponentsModal.test.js +0 -233
  680. package/build/dist/Tests/UI/Components/ComponentsModal.test.js.map +0 -1
  681. package/build/dist/Tests/UI/Components/ConfirmModal.test.js +0 -57
  682. package/build/dist/Tests/UI/Components/ConfirmModal.test.js.map +0 -1
  683. package/build/dist/Tests/UI/Components/DictionaryOfStrings.test.js +0 -84
  684. package/build/dist/Tests/UI/Components/DictionaryOfStrings.test.js.map +0 -1
  685. package/build/dist/Tests/UI/Components/Dropdown.test.js +0 -146
  686. package/build/dist/Tests/UI/Components/Dropdown.test.js.map +0 -1
  687. package/build/dist/Tests/UI/Components/DuplicateModel.test.js +0 -229
  688. package/build/dist/Tests/UI/Components/DuplicateModel.test.js.map +0 -1
  689. package/build/dist/Tests/UI/Components/EmptyState/EmptyState.test.js +0 -26
  690. package/build/dist/Tests/UI/Components/EmptyState/EmptyState.test.js.map +0 -1
  691. package/build/dist/Tests/UI/Components/ErrorBoundary.test.js +0 -32
  692. package/build/dist/Tests/UI/Components/ErrorBoundary.test.js.map +0 -1
  693. package/build/dist/Tests/UI/Components/FilePicker.test.js +0 -342
  694. package/build/dist/Tests/UI/Components/FilePicker.test.js.map +0 -1
  695. package/build/dist/Tests/UI/Components/HiddenText.test.js +0 -50
  696. package/build/dist/Tests/UI/Components/HiddenText.test.js.map +0 -1
  697. package/build/dist/Tests/UI/Components/Input.test.js +0 -223
  698. package/build/dist/Tests/UI/Components/Input.test.js.map +0 -1
  699. package/build/dist/Tests/UI/Components/Item.test.js +0 -58
  700. package/build/dist/Tests/UI/Components/Item.test.js.map +0 -1
  701. package/build/dist/Tests/UI/Components/List.test.js +0 -83
  702. package/build/dist/Tests/UI/Components/List.test.js.map +0 -1
  703. package/build/dist/Tests/UI/Components/Loader.test.js +0 -19
  704. package/build/dist/Tests/UI/Components/Loader.test.js.map +0 -1
  705. package/build/dist/Tests/UI/Components/MarkdownEditor.test.js +0 -85
  706. package/build/dist/Tests/UI/Components/MarkdownEditor.test.js.map +0 -1
  707. package/build/dist/Tests/UI/Components/MasterPage.test.js +0 -46
  708. package/build/dist/Tests/UI/Components/MasterPage.test.js.map +0 -1
  709. package/build/dist/Tests/UI/Components/Modal.test.js +0 -127
  710. package/build/dist/Tests/UI/Components/Modal.test.js.map +0 -1
  711. package/build/dist/Tests/UI/Components/NavBar.test.js +0 -52
  712. package/build/dist/Tests/UI/Components/NavBar.test.js.map +0 -1
  713. package/build/dist/Tests/UI/Components/OrderedStatesList.test.js +0 -86
  714. package/build/dist/Tests/UI/Components/OrderedStatesList.test.js.map +0 -1
  715. package/build/dist/Tests/UI/Components/Pagination.test.js +0 -137
  716. package/build/dist/Tests/UI/Components/Pagination.test.js.map +0 -1
  717. package/build/dist/Tests/UI/Components/Pill.test.js +0 -55
  718. package/build/dist/Tests/UI/Components/Pill.test.js.map +0 -1
  719. package/build/dist/Tests/UI/Components/Probe.test.js +0 -52
  720. package/build/dist/Tests/UI/Components/Probe.test.js.map +0 -1
  721. package/build/dist/Tests/UI/Components/ProgressBar.test.js +0 -41
  722. package/build/dist/Tests/UI/Components/ProgressBar.test.js.map +0 -1
  723. package/build/dist/Tests/UI/Components/RadioButtons.test.js +0 -66
  724. package/build/dist/Tests/UI/Components/RadioButtons.test.js.map +0 -1
  725. package/build/dist/Tests/UI/Components/SideMenuItem.test.js +0 -99
  726. package/build/dist/Tests/UI/Components/SideMenuItem.test.js.map +0 -1
  727. package/build/dist/Tests/UI/Components/SideOver.test.js +0 -77
  728. package/build/dist/Tests/UI/Components/SideOver.test.js.map +0 -1
  729. package/build/dist/Tests/UI/Components/Tabs.test.js +0 -56
  730. package/build/dist/Tests/UI/Components/Tabs.test.js.map +0 -1
  731. package/build/dist/Tests/UI/Components/Template/Template.test.js +0 -15
  732. package/build/dist/Tests/UI/Components/Template/Template.test.js.map +0 -1
  733. package/build/dist/Tests/UI/Components/TextArea.test.js +0 -112
  734. package/build/dist/Tests/UI/Components/TextArea.test.js.map +0 -1
  735. package/build/dist/Tests/UI/Components/TimePicker/TimePicker.test.js +0 -352
  736. package/build/dist/Tests/UI/Components/TimePicker/TimePicker.test.js.map +0 -1
  737. package/build/dist/Tests/UI/Components/Toast.test.js +0 -48
  738. package/build/dist/Tests/UI/Components/Toast.test.js.map +0 -1
  739. package/build/dist/Tests/UI/Components/Toggle.test.js +0 -95
  740. package/build/dist/Tests/UI/Components/Toggle.test.js.map +0 -1
  741. package/build/dist/Tests/UI/Components/TopSection.test.js +0 -33
  742. package/build/dist/Tests/UI/Components/TopSection.test.js.map +0 -1
  743. package/build/dist/Tests/UI/Components/XAxis.test.js +0 -21
  744. package/build/dist/Tests/UI/Components/XAxis.test.js.map +0 -1
  745. package/build/dist/Tests/UI/Index.js +0 -2
  746. package/build/dist/Tests/UI/Index.js.map +0 -1
  747. package/build/dist/Tests/UI/Mocks/FileMock.js +0 -3
  748. package/build/dist/Tests/UI/Mocks/FileMock.js.map +0 -1
  749. package/build/dist/Tests/Utils/API.test.js +0 -399
  750. package/build/dist/Tests/Utils/API.test.js.map +0 -1
  751. package/build/dist/Tests/Utils/Analytics.test.js +0 -67
  752. package/build/dist/Tests/Utils/Analytics.test.js.map +0 -1
  753. package/build/dist/Tests/Utils/CronTime.test.js +0 -22
  754. package/build/dist/Tests/Utils/CronTime.test.js.map +0 -1
  755. package/build/dist/Tests/Utils/Faker.test.js +0 -27
  756. package/build/dist/Tests/Utils/Faker.test.js.map +0 -1
  757. package/build/dist/Tests/Utils/MetricUnitUtil.test.js +0 -187
  758. package/build/dist/Tests/Utils/MetricUnitUtil.test.js.map +0 -1
  759. package/build/dist/Tests/Utils/Metrics/MetricFormulaEvaluator.test.js +0 -224
  760. package/build/dist/Tests/Utils/Metrics/MetricFormulaEvaluator.test.js.map +0 -1
  761. package/build/dist/Tests/Utils/Metrics/MetricResultUnitConverter.test.js +0 -180
  762. package/build/dist/Tests/Utils/Metrics/MetricResultUnitConverter.test.js.map +0 -1
  763. package/build/dist/Tests/Utils/RecordingRuleExpression.test.js +0 -142
  764. package/build/dist/Tests/Utils/RecordingRuleExpression.test.js.map +0 -1
  765. package/build/dist/Tests/Utils/Slug.test.js +0 -20
  766. package/build/dist/Tests/Utils/Slug.test.js.map +0 -1
  767. package/build/dist/Tests/Utils/UUID.test.js +0 -48
  768. package/build/dist/Tests/Utils/UUID.test.js.map +0 -1
  769. package/build/dist/Tests/jest.setup.js +0 -30
  770. package/build/dist/Tests/jest.setup.js.map +0 -1
  771. package/build/dist/Types/Profile/ProfileMetricType.js +0 -17
  772. package/build/dist/Types/Profile/ProfileMetricType.js.map +0 -1
@@ -8,7 +8,9 @@ var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
10
  import { SQL } from "../Utils/AnalyticsDatabase/Statement";
11
+ import { getQuerySettings } from "../Utils/AnalyticsDatabase/QuerySettingsHelper";
11
12
  import ProfileSampleDatabaseService from "./ProfileSampleService";
13
+ import ProfileDatabaseService from "./ProfileService";
12
14
  import TableColumnType from "../../Types/AnalyticsDatabase/TableColumnType";
13
15
  import Includes from "../../Types/BaseDatabase/Includes";
14
16
  import AnalyticsTableName from "../../Types/AnalyticsDatabase/AnalyticsTableName";
@@ -20,17 +22,21 @@ export class ProfileAggregationService {
20
22
  *
21
23
  * Each sample has a `stacktrace` array where each element follows the
22
24
  * format "functionName@fileName:lineNumber". The array is ordered
23
- * bottom-up (index 0 = root, last index = leaf).
25
+ * LEAF-FIRST (index 0 = leaf, last index = root) — the pprof
26
+ * Sample.location_id and OTLP Stack.location_indices conventions both
27
+ * store the innermost frame first, and ingestion preserves wire order.
24
28
  *
25
- * We aggregate samples that share common stack prefixes into a tree of
29
+ * Samples are pre-aggregated in ClickHouse by stack identity, then
30
+ * stacks sharing common prefixes are merged into a tree of
26
31
  * ProfileFlamegraphNode objects.
27
32
  */
28
33
  static async getFlamegraph(request) {
29
- const statement = ProfileAggregationService.buildFlamegraphQuery(request);
34
+ const statement = ProfileAggregationService.buildGroupedStackQuery(request);
30
35
  const dbResult = await ProfileSampleDatabaseService.executeQuery(statement);
31
36
  const response = await dbResult.json();
32
37
  const rows = response.data || [];
33
- // Build the tree from samples
38
+ const truncated = rows.length >= ProfileAggregationService.MAX_STACK_FETCH;
39
+ // Build the tree from the pre-aggregated stacks
34
40
  const root = {
35
41
  functionName: "(root)",
36
42
  fileName: "",
@@ -40,25 +46,37 @@ export class ProfileAggregationService {
40
46
  children: [],
41
47
  frameType: "",
42
48
  };
49
+ /*
50
+ * Per-node child index so frame lookup is O(1) instead of a linear
51
+ * children.find() — wide fan-out (thousands of siblings under root)
52
+ * made the scan quadratic. Kept outside the nodes so the serialized
53
+ * tree shape is unchanged.
54
+ */
55
+ const childIndex = new WeakMap();
43
56
  for (const row of rows) {
44
57
  const stacktrace = row["stacktrace"] || [];
45
58
  const frameTypes = row["frameTypes"] || [];
46
- const value = Number(row["value"] || 0);
59
+ const value = Number(row["totalValue"] || 0);
47
60
  if (stacktrace.length === 0) {
48
61
  continue;
49
62
  }
50
- // Walk down the tree, creating nodes as needed
63
+ /*
64
+ * Walk down the tree, creating nodes as needed. Stored stacks are
65
+ * leaf-first, so iterate from the END of the array (root) toward
66
+ * index 0 (leaf) to build the tree root-to-leaf.
67
+ */
51
68
  let currentNode = root;
52
69
  currentNode.totalValue += value;
53
- for (let i = 0; i < stacktrace.length; i++) {
70
+ for (let i = stacktrace.length - 1; i >= 0; i--) {
54
71
  const frame = ProfileAggregationService.parseFrame(stacktrace[i]);
55
72
  const frameType = frameTypes[i] || "";
56
- // Find or create child
57
- let childNode = currentNode.children.find((child) => {
58
- return (child.functionName === frame.functionName &&
59
- child.fileName === frame.fileName &&
60
- child.lineNumber === frame.lineNumber);
61
- });
73
+ const frameKey = `${frame.functionName}@${frame.fileName}:${frame.lineNumber}`;
74
+ let index = childIndex.get(currentNode);
75
+ if (!index) {
76
+ index = new Map();
77
+ childIndex.set(currentNode, index);
78
+ }
79
+ let childNode = index.get(frameKey);
62
80
  if (!childNode) {
63
81
  childNode = {
64
82
  functionName: frame.functionName,
@@ -70,33 +88,60 @@ export class ProfileAggregationService {
70
88
  frameType: frameType,
71
89
  };
72
90
  currentNode.children.push(childNode);
91
+ index.set(frameKey, childNode);
73
92
  }
74
93
  childNode.totalValue += value;
75
- // If this is the leaf frame, add to selfValue
76
- if (i === stacktrace.length - 1) {
94
+ // Index 0 is the leaf frame in leaf-first storage — it gets selfValue
95
+ if (i === 0) {
77
96
  childNode.selfValue += value;
78
97
  }
79
98
  currentNode = childNode;
80
99
  }
81
100
  }
82
- return root;
101
+ return { flamegraph: root, truncated };
83
102
  }
84
103
  /**
85
104
  * Return the top functions aggregated across samples, sorted by the
86
- * requested metric (selfValue, totalValue, or sampleCount).
105
+ * requested metric (selfValue, totalValue, or sampleCount), along with
106
+ * the pre-limit window total so callers can show "% of total" figures.
87
107
  */
88
108
  static async getFunctionList(request) {
89
- var _a;
90
- const statement = ProfileAggregationService.buildFunctionListQuery(request);
91
- const dbResult = await ProfileSampleDatabaseService.executeQuery(statement);
109
+ var _a, _b;
110
+ const filters = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ projectId: request.projectId }, (request.startTime !== undefined && { startTime: request.startTime })), (request.endTime !== undefined && { endTime: request.endTime })), (request.profileId !== undefined && { profileId: request.profileId })), (request.serviceIds !== undefined && {
111
+ serviceIds: request.serviceIds,
112
+ })), (request.profileType !== undefined && {
113
+ profileType: request.profileType,
114
+ })), (request.profileTypes !== undefined && {
115
+ profileTypes: request.profileTypes,
116
+ }));
117
+ const statement = ProfileAggregationService.buildGroupedStackQuery(filters);
118
+ const windowTotalStatement = ProfileAggregationService.buildWindowTotalQuery(filters);
119
+ /*
120
+ * The window total must be computed over ALL matching rows (pre-limit),
121
+ * so it cannot be derived from the capped grouped result. It is a
122
+ * single cheap aggregate, so run both queries concurrently.
123
+ */
124
+ const [dbResult, windowTotalDbResult] = await Promise.all([
125
+ ProfileSampleDatabaseService.executeQuery(statement),
126
+ ProfileSampleDatabaseService.executeQuery(windowTotalStatement),
127
+ ]);
92
128
  const response = await dbResult.json();
129
+ const windowTotalResponse = await windowTotalDbResult.json();
93
130
  const rows = response.data || [];
94
- // Aggregate per-function stats in-memory from the raw samples
131
+ const truncated = rows.length >= ProfileAggregationService.MAX_STACK_FETCH;
132
+ const windowTotalRows = windowTotalResponse.data || [];
133
+ const windowTotal = Number(((_a = windowTotalRows[0]) === null || _a === void 0 ? void 0 : _a["windowTotal"]) || 0);
134
+ // Aggregate per-function stats from the pre-aggregated stacks
95
135
  const functionMap = new Map();
96
136
  for (const row of rows) {
97
137
  const stacktrace = row["stacktrace"] || [];
98
138
  const frameTypes = row["frameTypes"] || [];
99
- const value = Number(row["value"] || 0);
139
+ const value = Number(row["totalValue"] || 0);
140
+ /*
141
+ * Each grouped row stands in for `sampleCount` raw samples sharing
142
+ * one stack, so per-function sample counts add the group size, not 1.
143
+ */
144
+ const groupSampleCount = Number(row["sampleCount"] || 0);
100
145
  if (stacktrace.length === 0) {
101
146
  continue;
102
147
  }
@@ -105,7 +150,8 @@ export class ProfileAggregationService {
105
150
  const frame = ProfileAggregationService.parseFrame(stacktrace[i]);
106
151
  const frameType = frameTypes[i] || "";
107
152
  const key = `${frame.functionName}@${frame.fileName}:${frame.lineNumber}`;
108
- const isLeaf = i === stacktrace.length - 1;
153
+ // Stacks are stored leaf-first, so index 0 is the leaf frame.
154
+ const isLeaf = i === 0;
109
155
  let entry = functionMap.get(key);
110
156
  if (!entry) {
111
157
  entry = {
@@ -118,10 +164,10 @@ export class ProfileAggregationService {
118
164
  };
119
165
  functionMap.set(key, entry);
120
166
  }
121
- // totalValue: count the value once per unique function per sample
167
+ // totalValue: count the value once per unique function per stack
122
168
  if (!seenInThisSample.has(key)) {
123
169
  entry.totalValue += value;
124
- entry.sampleCount += 1;
170
+ entry.sampleCount += groupSampleCount;
125
171
  seenInThisSample.add(key);
126
172
  }
127
173
  // selfValue: only the leaf frame
@@ -142,29 +188,250 @@ export class ProfileAggregationService {
142
188
  }
143
189
  return b.selfValue - a.selfValue;
144
190
  });
145
- const limit = (_a = request.limit) !== null && _a !== void 0 ? _a : ProfileAggregationService.DEFAULT_FUNCTION_LIST_LIMIT;
146
- return items.slice(0, limit);
191
+ const limit = (_b = request.limit) !== null && _b !== void 0 ? _b : ProfileAggregationService.DEFAULT_FUNCTION_LIST_LIMIT;
192
+ return {
193
+ functions: items.slice(0, limit),
194
+ windowTotal,
195
+ truncated,
196
+ };
147
197
  }
148
198
  /**
149
- * Build a diff flamegraph comparing two time ranges.
150
- * Returns a tree where each node has baseline/comparison values and deltas.
199
+ * "Sandwich" aggregation for one function: every matching stack is
200
+ * split at the focused function, the frames toward the root become the
201
+ * callers tree and the frames toward the leaf become the callees tree.
202
+ * Both trees are rooted at the focused function itself so the UI can
203
+ * render them stacked around a single center row.
204
+ *
205
+ * Frames match on functionName + fileName only — line numbers shift on
206
+ * every deploy (and with inlining), so including them would split one
207
+ * logical function into many.
151
208
  */
152
- static async getDiffFlamegraph(request) {
153
- const baselineTree = await ProfileAggregationService.getFlamegraph(Object.assign(Object.assign(Object.assign({ projectId: request.projectId, startTime: request.baselineStartTime, endTime: request.baselineEndTime }, (request.serviceIds !== undefined && {
154
- serviceIds: request.serviceIds,
155
- })), (request.profileType !== undefined && {
156
- profileType: request.profileType,
157
- })), (request.profileTypes !== undefined && {
158
- profileTypes: request.profileTypes,
159
- })));
160
- const comparisonTree = await ProfileAggregationService.getFlamegraph(Object.assign(Object.assign(Object.assign({ projectId: request.projectId, startTime: request.comparisonStartTime, endTime: request.comparisonEndTime }, (request.serviceIds !== undefined && {
209
+ static async getFunctionFocus(request) {
210
+ var _a;
211
+ const filters = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ projectId: request.projectId }, (request.profileId !== undefined && { profileId: request.profileId })), (request.startTime !== undefined && { startTime: request.startTime })), (request.endTime !== undefined && { endTime: request.endTime })), (request.serviceIds !== undefined && {
161
212
  serviceIds: request.serviceIds,
162
213
  })), (request.profileType !== undefined && {
163
214
  profileType: request.profileType,
164
215
  })), (request.profileTypes !== undefined && {
165
216
  profileTypes: request.profileTypes,
166
- })));
167
- return ProfileAggregationService.mergeDiffTrees(baselineTree, comparisonTree);
217
+ }));
218
+ const statement = ProfileAggregationService.buildFunctionStackQuery(filters, request.functionName, request.fileName);
219
+ const windowTotalStatement = ProfileAggregationService.buildWindowTotalQuery(filters);
220
+ /*
221
+ * windowTotal deliberately ignores the function prefilter — it is the
222
+ * denominator for "% of window" figures, so it must cover every row
223
+ * matching the non-function filters. Both reads are independent, so
224
+ * run them concurrently.
225
+ */
226
+ const [dbResult, windowTotalDbResult] = await Promise.all([
227
+ ProfileSampleDatabaseService.executeQuery(statement),
228
+ ProfileSampleDatabaseService.executeQuery(windowTotalStatement),
229
+ ]);
230
+ const response = await dbResult.json();
231
+ const windowTotalResponse = await windowTotalDbResult.json();
232
+ const rows = response.data || [];
233
+ const truncated = rows.length >= ProfileAggregationService.MAX_STACK_FETCH;
234
+ const windowTotalRows = windowTotalResponse.data || [];
235
+ const windowTotal = Number(((_a = windowTotalRows[0]) === null || _a === void 0 ? void 0 : _a["windowTotal"]) || 0);
236
+ /*
237
+ * Both trees are rooted at the focused function. lineNumber is 0
238
+ * because the view aggregates across line numbers by design.
239
+ */
240
+ const callers = {
241
+ functionName: request.functionName,
242
+ fileName: request.fileName,
243
+ lineNumber: 0,
244
+ selfValue: 0,
245
+ totalValue: 0,
246
+ children: [],
247
+ frameType: "",
248
+ };
249
+ const callees = {
250
+ functionName: request.functionName,
251
+ fileName: request.fileName,
252
+ lineNumber: 0,
253
+ selfValue: 0,
254
+ totalValue: 0,
255
+ children: [],
256
+ frameType: "",
257
+ };
258
+ /*
259
+ * Per-node child index for O(1) frame lookup, mirroring getFlamegraph.
260
+ * One map serves both trees since it is keyed by parent node identity.
261
+ */
262
+ const childIndex = new WeakMap();
263
+ let totalValue = 0;
264
+ let selfValue = 0;
265
+ let sampleCount = 0;
266
+ for (const row of rows) {
267
+ const stacktrace = row["stacktrace"] || [];
268
+ const frameTypes = row["frameTypes"] || [];
269
+ const value = Number(row["totalValue"] || 0);
270
+ const groupSampleCount = Number(row["sampleCount"] || 0);
271
+ if (stacktrace.length === 0) {
272
+ continue;
273
+ }
274
+ /*
275
+ * Stacks are leaf-first, so scanning from the END finds the
276
+ * occurrence CLOSEST TO THE ROOT first. For recursive functions
277
+ * this attributes the whole recursive subtree (including nested
278
+ * occurrences) to one split point, so each stack's value is
279
+ * counted exactly once.
280
+ */
281
+ let occurrenceIndex = -1;
282
+ for (let i = stacktrace.length - 1; i >= 0; i--) {
283
+ const frame = ProfileAggregationService.parseFrame(stacktrace[i]);
284
+ if (frame.functionName === request.functionName &&
285
+ frame.fileName === request.fileName) {
286
+ occurrenceIndex = i;
287
+ break;
288
+ }
289
+ }
290
+ /*
291
+ * The ClickHouse prefilter is a prefix match and can overmatch
292
+ * when a fileName containing colons shares a prefix with another
293
+ * (parseFrame splits on the LAST colon) — drop those rows here.
294
+ */
295
+ if (occurrenceIndex === -1) {
296
+ continue;
297
+ }
298
+ totalValue += value;
299
+ sampleCount += groupSampleCount;
300
+ /*
301
+ * Self time counts whenever the function is the EXECUTING (leaf)
302
+ * frame — checked against index 0 directly rather than the split
303
+ * point, because a recursive stack splits at the root-most
304
+ * occurrence while the leaf may still be the same function
305
+ * (standard sandwich-view semantics: self = "was on CPU").
306
+ */
307
+ const leafFrame = ProfileAggregationService.parseFrame(stacktrace[0]);
308
+ if (leafFrame.functionName === request.functionName &&
309
+ leafFrame.fileName === request.fileName) {
310
+ selfValue += value;
311
+ }
312
+ const occurrenceFrameType = frameTypes[occurrenceIndex] || "";
313
+ if (!callers.frameType) {
314
+ callers.frameType = occurrenceFrameType;
315
+ }
316
+ if (!callees.frameType) {
317
+ callees.frameType = occurrenceFrameType;
318
+ }
319
+ callers.totalValue += value;
320
+ callees.totalValue += value;
321
+ /*
322
+ * Caller chain: frames ABOVE the occurrence (toward the root),
323
+ * direct caller first so depth in the tree equals caller distance.
324
+ */
325
+ const callerIndices = [];
326
+ for (let i = occurrenceIndex + 1; i < stacktrace.length; i++) {
327
+ callerIndices.push(i);
328
+ }
329
+ /*
330
+ * Callee chain: frames BELOW the occurrence (toward the leaf),
331
+ * direct callee first.
332
+ */
333
+ const calleeIndices = [];
334
+ for (let i = occurrenceIndex - 1; i >= 0; i--) {
335
+ calleeIndices.push(i);
336
+ }
337
+ ProfileAggregationService.appendFocusChain({
338
+ root: callers,
339
+ stacktrace,
340
+ frameTypes,
341
+ frameIndices: callerIndices,
342
+ value,
343
+ childIndex,
344
+ });
345
+ ProfileAggregationService.appendFocusChain({
346
+ root: callees,
347
+ stacktrace,
348
+ frameTypes,
349
+ frameIndices: calleeIndices,
350
+ value,
351
+ childIndex,
352
+ });
353
+ }
354
+ return {
355
+ functionName: request.functionName,
356
+ fileName: request.fileName,
357
+ totalValue,
358
+ selfValue,
359
+ sampleCount,
360
+ windowTotal,
361
+ callers,
362
+ callees,
363
+ truncated,
364
+ };
365
+ }
366
+ /**
367
+ * Walk one split half of a stack into a focus tree, merging frames on
368
+ * functionName + fileName (line numbers aggregated away — same
369
+ * deploy-stability rationale as the focused-function match itself).
370
+ * The terminal node of the chain absorbs selfValue: in the callers
371
+ * tree that is the stack root ("the chain starts here"), in the
372
+ * callees tree the leaf ("the time bottoms out here"). An empty chain
373
+ * terminates at the focused root itself.
374
+ */
375
+ static appendFocusChain(data) {
376
+ let currentNode = data.root;
377
+ for (const frameIndex of data.frameIndices) {
378
+ const frame = ProfileAggregationService.parseFrame(data.stacktrace[frameIndex]);
379
+ const frameType = data.frameTypes[frameIndex] || "";
380
+ const frameKey = `${frame.functionName}@${frame.fileName}`;
381
+ let index = data.childIndex.get(currentNode);
382
+ if (!index) {
383
+ index = new Map();
384
+ data.childIndex.set(currentNode, index);
385
+ }
386
+ let childNode = index.get(frameKey);
387
+ if (!childNode) {
388
+ childNode = {
389
+ functionName: frame.functionName,
390
+ fileName: frame.fileName,
391
+ lineNumber: 0,
392
+ selfValue: 0,
393
+ totalValue: 0,
394
+ children: [],
395
+ frameType: frameType,
396
+ };
397
+ currentNode.children.push(childNode);
398
+ index.set(frameKey, childNode);
399
+ }
400
+ childNode.totalValue += data.value;
401
+ currentNode = childNode;
402
+ }
403
+ currentNode.selfValue += data.value;
404
+ }
405
+ /**
406
+ * Build a diff flamegraph comparing two time ranges.
407
+ * Returns a tree where each node has baseline/comparison values and
408
+ * deltas, plus a truncation flag covering both source windows.
409
+ */
410
+ static async getDiffFlamegraph(request) {
411
+ /*
412
+ * The two windows are independent reads, so fetch them concurrently —
413
+ * sequential awaits doubled the latency of every diff request.
414
+ */
415
+ const [baselineResult, comparisonResult] = await Promise.all([
416
+ ProfileAggregationService.getFlamegraph(Object.assign(Object.assign(Object.assign({ projectId: request.projectId, startTime: request.baselineStartTime, endTime: request.baselineEndTime }, (request.serviceIds !== undefined && {
417
+ serviceIds: request.serviceIds,
418
+ })), (request.profileType !== undefined && {
419
+ profileType: request.profileType,
420
+ })), (request.profileTypes !== undefined && {
421
+ profileTypes: request.profileTypes,
422
+ }))),
423
+ ProfileAggregationService.getFlamegraph(Object.assign(Object.assign(Object.assign({ projectId: request.projectId, startTime: request.comparisonStartTime, endTime: request.comparisonEndTime }, (request.serviceIds !== undefined && {
424
+ serviceIds: request.serviceIds,
425
+ })), (request.profileType !== undefined && {
426
+ profileType: request.profileType,
427
+ })), (request.profileTypes !== undefined && {
428
+ profileTypes: request.profileTypes,
429
+ }))),
430
+ ]);
431
+ return {
432
+ diffFlamegraph: ProfileAggregationService.mergeDiffTrees(baselineResult.flamegraph, comparisonResult.flamegraph),
433
+ truncated: baselineResult.truncated || comparisonResult.truncated,
434
+ };
168
435
  }
169
436
  static mergeDiffTrees(baseline, comparison) {
170
437
  const baselineValue = (baseline === null || baseline === void 0 ? void 0 : baseline.totalValue) || 0;
@@ -221,134 +488,239 @@ export class ProfileAggregationService {
221
488
  return node;
222
489
  }
223
490
  /**
224
- * Aggregate sample / profile counts per serviceId for a time window.
491
+ * Aggregate sample / profile counts per primaryEntityId for a time window.
225
492
  * Drives the "loudest services first" sort on the Profiles dashboard
226
493
  * so a developer opening the page lands on the workloads that are
227
494
  * actually doing work rather than scrolling past kernel-thread noise.
495
+ *
496
+ * Reads the small Profile table (one row per ingested profile, with a
497
+ * denormalized sampleCount) instead of scanning every row of the huge
498
+ * ProfileSample table for what is just a per-service ranking.
228
499
  */
229
500
  static async getServiceActivity(request) {
230
501
  const statement = ProfileAggregationService.buildServiceActivityQuery(request);
231
- const dbResult = await ProfileSampleDatabaseService.executeQuery(statement);
502
+ const dbResult = await ProfileDatabaseService.executeQuery(statement);
232
503
  const response = await dbResult.json();
233
504
  const rows = response.data || [];
234
505
  const out = [];
235
506
  for (const row of rows) {
236
- const serviceId = String(row["serviceId"] || "");
237
- if (!serviceId) {
507
+ const primaryEntityId = String(row["primaryEntityId"] || "");
508
+ if (!primaryEntityId) {
238
509
  continue;
239
510
  }
240
511
  out.push({
241
- serviceId,
242
- sampleCount: Number(row["sampleCount"] || 0),
512
+ primaryEntityId,
513
+ sampleCount: Number(row["totalSampleCount"] || 0),
243
514
  profileCount: Number(row["profileCount"] || 0),
244
- totalValue: Number(row["totalValue"] || 0),
515
+ /*
516
+ * Profile rows do not carry a summed sample value, and no client
517
+ * reads this field — it is kept at 0 purely so the response shape
518
+ * stays stable for existing consumers.
519
+ */
520
+ totalValue: 0,
245
521
  });
246
522
  }
247
523
  return out;
248
524
  }
525
+ /**
526
+ * Group profiling volume by a dimension ("service" = primaryEntityId,
527
+ * anything else = a Profile attribute key) over a time window.
528
+ *
529
+ * Reads the small Profile table (one row per ingested profile with a
530
+ * denormalized sampleCount) — same reasoning as getServiceActivity: a
531
+ * share-of-volume ranking never needs the huge ProfileSample table.
532
+ *
533
+ * totalSampleCount sums over ALL fetched groups before the limit is
534
+ * applied, so item shares stay percentages of the real total rather
535
+ * than of the visible top-N.
536
+ */
537
+ static async getBreakdown(request) {
538
+ var _a;
539
+ const statement = ProfileAggregationService.buildBreakdownQuery(request);
540
+ const dbResult = await ProfileDatabaseService.executeQuery(statement);
541
+ const response = await dbResult.json();
542
+ const rows = response.data || [];
543
+ // Rows arrive sorted by summed sampleCount descending (query ORDER BY).
544
+ const allItems = [];
545
+ let totalSampleCount = 0;
546
+ for (const row of rows) {
547
+ const value = String(row["breakdownValue"] || "");
548
+ if (!value) {
549
+ continue;
550
+ }
551
+ const groupSampleCount = Number(row["totalSampleCount"] || 0);
552
+ totalSampleCount += groupSampleCount;
553
+ allItems.push({
554
+ value,
555
+ sampleCount: groupSampleCount,
556
+ profileCount: Number(row["profileCount"] || 0),
557
+ share: 0,
558
+ });
559
+ }
560
+ const limit = (_a = request.limit) !== null && _a !== void 0 ? _a : ProfileAggregationService.DEFAULT_BREAKDOWN_LIMIT;
561
+ const items = allItems.slice(0, limit);
562
+ for (const item of items) {
563
+ item.share =
564
+ totalSampleCount > 0 ? (item.sampleCount / totalSampleCount) * 100 : 0;
565
+ }
566
+ return { items, totalSampleCount };
567
+ }
249
568
  // --- Query builders ---
250
- static buildFlamegraphQuery(request) {
569
+ /**
570
+ * Fetch samples pre-aggregated by stack identity. Collapsing identical
571
+ * (stacktrace, frameTypes) pairs in ClickHouse shrinks tens of thousands
572
+ * of raw sample rows to a few hundred unique stacks before they cross
573
+ * the wire, and the ORDER BY makes the LIMIT drop the smallest stacks
574
+ * first instead of an arbitrary subset.
575
+ *
576
+ * `value` is stored as Int128 in ClickHouse, so the sum is wrapped in
577
+ * toFloat64 to keep the JSON output numeric (toFloat64OrZero would fail
578
+ * with "Illegal type Int128").
579
+ */
580
+ static buildGroupedStackQuery(request) {
251
581
  const statement = SQL `
252
582
  SELECT
253
583
  stacktrace,
254
584
  frameTypes,
255
- value
585
+ toFloat64(sum(value)) AS totalValue,
586
+ count() AS sampleCount
256
587
  FROM ${ProfileAggregationService.TABLE_NAME}
257
588
  WHERE projectId = ${{
258
589
  type: TableColumnType.ObjectID,
259
590
  value: request.projectId,
260
591
  }}
261
592
  `;
262
- if (request.profileId) {
263
- statement.append(SQL ` AND profileId = ${{
264
- type: TableColumnType.Text,
265
- value: request.profileId,
266
- }}`);
267
- }
268
- if (request.startTime) {
269
- statement.append(SQL ` AND time >= ${{
270
- type: TableColumnType.Date,
271
- value: request.startTime,
272
- }}`);
273
- }
274
- if (request.endTime) {
275
- statement.append(SQL ` AND time <= ${{
276
- type: TableColumnType.Date,
277
- value: request.endTime,
278
- }}`);
279
- }
280
- ProfileAggregationService.appendCommonFilters(statement, request);
281
- statement.append(SQL ` LIMIT ${{
593
+ ProfileAggregationService.appendSampleFilters(statement, request);
594
+ statement.append(SQL ` GROUP BY stacktrace, frameTypes
595
+ ORDER BY totalValue DESC
596
+ LIMIT ${{
282
597
  type: TableColumnType.Number,
283
- value: ProfileAggregationService.MAX_SAMPLE_FETCH,
598
+ value: ProfileAggregationService.MAX_STACK_FETCH,
284
599
  }}`);
285
600
  /*
286
- * Cap runtime below the client's 58s request_timeout; a flamegraph
287
- * over a busy project can pull MAX_SAMPLE_FETCH raw samples. 'break'
288
- * yields a partial flamegraph rather than holding a pool connection.
601
+ * Cap runtime below the client's 58s request_timeout; 'break' yields
602
+ * a partial (top stacks) result rather than holding a pool connection.
289
603
  */
290
- statement.append(" SETTINGS max_execution_time = 45, timeout_overflow_mode = 'break'");
604
+ statement.append(getQuerySettings({
605
+ maxExecutionTimeInSeconds: 45,
606
+ timeoutOverflowMode: "break",
607
+ }));
291
608
  return statement;
292
609
  }
293
- static buildFunctionListQuery(request) {
610
+ /**
611
+ * Grouped-stack query restricted to stacks containing one function, so
612
+ * a sandwich aggregation never pulls the full window's stacks over the
613
+ * wire just to discard most of them.
614
+ *
615
+ * Stored frame strings are "functionName" + ("@fileName" when fileName
616
+ * is non-empty) + (":lineNumber" when lineNumber > 0) — see
617
+ * OtelProfilesIngestService.resolveStackFrames. Line numbers shift
618
+ * across deploys, so the predicate matches the functionName+fileName
619
+ * identity only:
620
+ * - non-empty fileName: exact "fn@file" (no line recorded) OR prefix
621
+ * "fn@file:" (line recorded);
622
+ * - empty fileName: the exact bare frame (folded uploads and
623
+ * address-only frames store just the name — parseFrame treats any
624
+ * '@'-less frame as all functionName, so equality is the full
625
+ * match).
626
+ * The prefix form can overmatch when one colon-bearing fileName is a
627
+ * prefix of another (parseFrame splits on the LAST colon), so callers
628
+ * must re-check each frame in memory via parseFrame.
629
+ */
630
+ static buildFunctionStackQuery(request, functionName, fileName) {
294
631
  const statement = SQL `
295
632
  SELECT
296
633
  stacktrace,
297
634
  frameTypes,
298
- value
635
+ toFloat64(sum(value)) AS totalValue,
636
+ count() AS sampleCount
299
637
  FROM ${ProfileAggregationService.TABLE_NAME}
300
638
  WHERE projectId = ${{
301
639
  type: TableColumnType.ObjectID,
302
640
  value: request.projectId,
303
641
  }}
304
- AND time >= ${{
305
- type: TableColumnType.Date,
306
- value: request.startTime,
307
- }}
308
- AND time <= ${{
309
- type: TableColumnType.Date,
310
- value: request.endTime,
311
- }}
312
642
  `;
313
- ProfileAggregationService.appendCommonFilters(statement, request);
314
- statement.append(SQL ` LIMIT ${{
643
+ ProfileAggregationService.appendSampleFilters(statement, request);
644
+ if (fileName) {
645
+ statement.append(SQL ` AND arrayExists(x -> (x = ${{
646
+ type: TableColumnType.Text,
647
+ value: `${functionName}@${fileName}`,
648
+ }} OR startsWith(x, ${{
649
+ type: TableColumnType.Text,
650
+ value: `${functionName}@${fileName}:`,
651
+ }})), stacktrace)`);
652
+ }
653
+ else {
654
+ statement.append(SQL ` AND has(stacktrace, ${{
655
+ type: TableColumnType.Text,
656
+ value: functionName,
657
+ }})`);
658
+ }
659
+ statement.append(SQL ` GROUP BY stacktrace, frameTypes
660
+ ORDER BY totalValue DESC
661
+ LIMIT ${{
315
662
  type: TableColumnType.Number,
316
- value: ProfileAggregationService.MAX_SAMPLE_FETCH,
663
+ value: ProfileAggregationService.MAX_STACK_FETCH,
317
664
  }}`);
318
665
  /*
319
666
  * Cap runtime below the client's 58s request_timeout; 'break' yields
320
- * a partial function list rather than holding a pool connection.
667
+ * a partial (top stacks) result rather than holding a pool connection.
321
668
  */
322
- statement.append(" SETTINGS max_execution_time = 45, timeout_overflow_mode = 'break'");
669
+ statement.append(getQuerySettings({
670
+ maxExecutionTimeInSeconds: 45,
671
+ timeoutOverflowMode: "break",
672
+ }));
673
+ return statement;
674
+ }
675
+ /**
676
+ * Total of `value` across every sample row matching the filters — no
677
+ * GROUP BY and no LIMIT, so it stays correct even when the grouped
678
+ * stack query truncates.
679
+ */
680
+ static buildWindowTotalQuery(request) {
681
+ const statement = SQL `
682
+ SELECT
683
+ toFloat64(sum(value)) AS windowTotal
684
+ FROM ${ProfileAggregationService.TABLE_NAME}
685
+ WHERE projectId = ${{
686
+ type: TableColumnType.ObjectID,
687
+ value: request.projectId,
688
+ }}
689
+ `;
690
+ ProfileAggregationService.appendSampleFilters(statement, request);
691
+ statement.append(getQuerySettings({
692
+ maxExecutionTimeInSeconds: 45,
693
+ timeoutOverflowMode: "break",
694
+ }));
323
695
  return statement;
324
696
  }
325
697
  static buildServiceActivityQuery(request) {
326
698
  /*
327
- * sum(value) directly value is stored as Int128 in ClickHouse, so
328
- * toFloat64OrZero would fail ("Illegal type Int128"); a plain sum is
329
- * the right idiom here, and we coerce to Number when serialising in
330
- * getServiceActivity.
699
+ * One Profile row per ingested profile with a denormalized sampleCount,
700
+ * so the per-service ranking never has to touch the (orders of
701
+ * magnitude larger) ProfileSample table. uniqExact tolerates duplicate
702
+ * rows for the same profileId from re-ingestion.
331
703
  */
332
704
  const statement = SQL `
333
705
  SELECT
334
- toString(serviceId) AS serviceId,
335
- count() AS sampleCount,
336
- uniqExact(profileId) AS profileCount,
337
- toFloat64(sum(value)) AS totalValue
338
- FROM ${ProfileAggregationService.TABLE_NAME}
706
+ toString(primaryEntityId) AS primaryEntityId,
707
+ toFloat64(sum(sampleCount)) AS totalSampleCount,
708
+ uniqExact(profileId) AS profileCount
709
+ FROM ${ProfileAggregationService.PROFILE_TABLE_NAME}
339
710
  WHERE projectId = ${{
340
711
  type: TableColumnType.ObjectID,
341
712
  value: request.projectId,
342
713
  }}
343
- AND time >= ${{
714
+ AND startTime >= ${{
344
715
  type: TableColumnType.Date,
345
716
  value: request.startTime,
346
717
  }}
347
- AND time <= ${{
718
+ AND startTime <= ${{
348
719
  type: TableColumnType.Date,
349
720
  value: request.endTime,
350
721
  }}
351
722
  `;
723
+ statement.append(" AND retentionDate >= now()");
352
724
  /*
353
725
  * profileTypes (array) wins over profileType (single) so the UI
354
726
  * can OR together every raw type string in a category.
@@ -365,19 +737,127 @@ export class ProfileAggregationService {
365
737
  value: request.profileType,
366
738
  }}`);
367
739
  }
368
- statement.append(SQL ` GROUP BY serviceId
369
- ORDER BY sampleCount DESC
740
+ statement.append(SQL ` GROUP BY primaryEntityId
741
+ ORDER BY totalSampleCount DESC
370
742
  LIMIT 10000`);
371
743
  /*
372
744
  * Cap runtime below the client's 58s request_timeout; 'break' yields
373
745
  * partial service activity rather than holding a pool connection.
374
746
  */
375
- statement.append(" SETTINGS max_execution_time = 45, timeout_overflow_mode = 'break'");
747
+ statement.append(getQuerySettings({
748
+ maxExecutionTimeInSeconds: 45,
749
+ timeoutOverflowMode: "break",
750
+ }));
376
751
  return statement;
377
752
  }
753
+ /**
754
+ * Per-group volume aggregate over the Profile table for getBreakdown.
755
+ *
756
+ * The "service" dimension groups by primaryEntityId (mirroring
757
+ * buildServiceActivityQuery); any other dimension is a Profile
758
+ * attribute key, read via the parameter-bound Map subscript
759
+ * `attributes[key]` — the same O(1) fast path the analytics query
760
+ * generator uses for map equality. The subscript yields '' for missing
761
+ * keys, so the != '' guard drops profiles without the attribute.
762
+ */
763
+ static buildBreakdownQuery(request) {
764
+ let statement;
765
+ if (request.breakdownBy === "service") {
766
+ statement = SQL `
767
+ SELECT
768
+ toString(primaryEntityId) AS breakdownValue,
769
+ toFloat64(sum(sampleCount)) AS totalSampleCount,
770
+ uniqExact(profileId) AS profileCount
771
+ FROM ${ProfileAggregationService.PROFILE_TABLE_NAME}
772
+ WHERE projectId = ${{
773
+ type: TableColumnType.ObjectID,
774
+ value: request.projectId,
775
+ }}
776
+ `;
777
+ }
778
+ else {
779
+ statement = SQL `
780
+ SELECT
781
+ attributes[${{
782
+ type: TableColumnType.Text,
783
+ value: request.breakdownBy,
784
+ }}] AS breakdownValue,
785
+ toFloat64(sum(sampleCount)) AS totalSampleCount,
786
+ uniqExact(profileId) AS profileCount
787
+ FROM ${ProfileAggregationService.PROFILE_TABLE_NAME}
788
+ WHERE projectId = ${{
789
+ type: TableColumnType.ObjectID,
790
+ value: request.projectId,
791
+ }}
792
+ AND attributes[${{
793
+ type: TableColumnType.Text,
794
+ value: request.breakdownBy,
795
+ }}] != ''
796
+ `;
797
+ }
798
+ statement.append(SQL ` AND startTime >= ${{
799
+ type: TableColumnType.Date,
800
+ value: request.startTime,
801
+ }} AND startTime <= ${{
802
+ type: TableColumnType.Date,
803
+ value: request.endTime,
804
+ }}`);
805
+ /*
806
+ * Read-side retention filter: rows past their per-service retention
807
+ * stay in their part until the whole part drops (ttl_only_drop_parts).
808
+ */
809
+ statement.append(" AND retentionDate >= now()");
810
+ ProfileAggregationService.appendCommonFilters(statement, request);
811
+ statement.append(SQL ` GROUP BY breakdownValue
812
+ ORDER BY totalSampleCount DESC
813
+ LIMIT ${{
814
+ type: TableColumnType.Number,
815
+ value: ProfileAggregationService.MAX_BREAKDOWN_GROUP_FETCH,
816
+ }}`);
817
+ /*
818
+ * Cap runtime below the client's 58s request_timeout; 'break' yields
819
+ * a partial (top groups) result rather than holding a pool connection.
820
+ */
821
+ statement.append(getQuerySettings({
822
+ maxExecutionTimeInSeconds: 45,
823
+ timeoutOverflowMode: "break",
824
+ }));
825
+ return statement;
826
+ }
827
+ /**
828
+ * Shared WHERE-clause tail for ProfileSample reads: optional profileId /
829
+ * time-window filters, the read-side retention filter, and the common
830
+ * service / profile-type filters.
831
+ */
832
+ static appendSampleFilters(statement, request) {
833
+ if (request.profileId) {
834
+ statement.append(SQL ` AND profileId = ${{
835
+ type: TableColumnType.Text,
836
+ value: request.profileId,
837
+ }}`);
838
+ }
839
+ if (request.startTime) {
840
+ statement.append(SQL ` AND time >= ${{
841
+ type: TableColumnType.Date,
842
+ value: request.startTime,
843
+ }}`);
844
+ }
845
+ if (request.endTime) {
846
+ statement.append(SQL ` AND time <= ${{
847
+ type: TableColumnType.Date,
848
+ value: request.endTime,
849
+ }}`);
850
+ }
851
+ /*
852
+ * Read-side retention filter: rows past their per-service retention
853
+ * stay in their part until the whole part drops (ttl_only_drop_parts).
854
+ */
855
+ statement.append(" AND retentionDate >= now()");
856
+ ProfileAggregationService.appendCommonFilters(statement, request);
857
+ }
378
858
  static appendCommonFilters(statement, request) {
379
859
  if (request.serviceIds && request.serviceIds.length > 0) {
380
- statement.append(SQL ` AND serviceId IN (${{
860
+ statement.append(SQL ` AND primaryEntityId IN (${{
381
861
  type: TableColumnType.ObjectID,
382
862
  value: new Includes(request.serviceIds.map((id) => {
383
863
  return id.toString();
@@ -436,8 +916,24 @@ export class ProfileAggregationService {
436
916
  }
437
917
  }
438
918
  ProfileAggregationService.TABLE_NAME = AnalyticsTableName.ProfileSample;
919
+ ProfileAggregationService.PROFILE_TABLE_NAME = AnalyticsTableName.Profile;
439
920
  ProfileAggregationService.DEFAULT_FUNCTION_LIST_LIMIT = 50;
440
- ProfileAggregationService.MAX_SAMPLE_FETCH = 50000;
921
+ ProfileAggregationService.DEFAULT_BREAKDOWN_LIMIT = 10;
922
+ /**
923
+ * Cap on unique groups fetched by a breakdown query. Groups are ordered
924
+ * by summed sampleCount, so hitting the cap drops the quietest groups
925
+ * first — totals over the fetched groups stay representative even for
926
+ * pathological high-cardinality attribute keys.
927
+ */
928
+ ProfileAggregationService.MAX_BREAKDOWN_GROUP_FETCH = 10000;
929
+ /**
930
+ * Cap on unique (stacktrace, frameTypes) groups fetched per query.
931
+ * Sample reads GROUP BY stack identity and ORDER BY summed value, so
932
+ * hitting this cap drops the *smallest* stacks first — truncation is
933
+ * deterministic and barely visible in a flamegraph, unlike a LIMIT over
934
+ * raw unordered sample rows.
935
+ */
936
+ ProfileAggregationService.MAX_STACK_FETCH = 10000;
441
937
  __decorate([
442
938
  CaptureSpan(),
443
939
  __metadata("design:type", Function),
@@ -450,6 +946,12 @@ __decorate([
450
946
  __metadata("design:paramtypes", [Object]),
451
947
  __metadata("design:returntype", Promise)
452
948
  ], ProfileAggregationService, "getFunctionList", null);
949
+ __decorate([
950
+ CaptureSpan(),
951
+ __metadata("design:type", Function),
952
+ __metadata("design:paramtypes", [Object]),
953
+ __metadata("design:returntype", Promise)
954
+ ], ProfileAggregationService, "getFunctionFocus", null);
453
955
  __decorate([
454
956
  CaptureSpan(),
455
957
  __metadata("design:type", Function),
@@ -462,5 +964,11 @@ __decorate([
462
964
  __metadata("design:paramtypes", [Object]),
463
965
  __metadata("design:returntype", Promise)
464
966
  ], ProfileAggregationService, "getServiceActivity", null);
967
+ __decorate([
968
+ CaptureSpan(),
969
+ __metadata("design:type", Function),
970
+ __metadata("design:paramtypes", [Object]),
971
+ __metadata("design:returntype", Promise)
972
+ ], ProfileAggregationService, "getBreakdown", null);
465
973
  export default ProfileAggregationService;
466
974
  //# sourceMappingURL=ProfileAggregationService.js.map