@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
@@ -4,6 +4,7 @@ import Express, {
4
4
  ExpressResponse,
5
5
  ExpressRouter,
6
6
  NextFunction,
7
+ RequestHandler,
7
8
  } from "../Utils/Express";
8
9
  import Response from "../Utils/Response";
9
10
  import BadDataException from "../../Types/Exception/BadDataException";
@@ -28,6 +29,12 @@ import TraceAggregationService, {
28
29
  HistogramRequest as TraceHistogramRequest,
29
30
  FacetValue as TraceFacetValue,
30
31
  MultiFacetRequest as TraceMultiFacetRequest,
32
+ TraceFilters,
33
+ TraceAnalyticsChartType,
34
+ TraceAnalyticsRequest,
35
+ TraceAnalyticsTimeseriesRow,
36
+ TraceAnalyticsTopItem,
37
+ TraceAnalyticsTableRow,
31
38
  } from "../Services/TraceAggregationService";
32
39
  import ExceptionAggregationService, {
33
40
  HistogramBucket as ExceptionHistogramBucket,
@@ -41,9 +48,13 @@ import MetricAggregationService, {
41
48
  } from "../Services/MetricAggregationService";
42
49
  import ProfileAggregationService, {
43
50
  FlamegraphRequest,
51
+ FlamegraphResult,
44
52
  FunctionListRequest,
45
- FunctionListItem,
46
- ProfileFlamegraphNode,
53
+ FunctionListResult,
54
+ FunctionFocusRequest,
55
+ FunctionFocusResult,
56
+ BreakdownRequest,
57
+ BreakdownResult,
47
58
  DiffFlamegraphRequest,
48
59
  DiffFlamegraphNode,
49
60
  ServiceActivityRequest,
@@ -58,6 +69,7 @@ import ProfileSample from "../../Models/AnalyticsModels/ProfileSample";
58
69
  import ProfileService from "../Services/ProfileService";
59
70
  import ProfileSampleService from "../Services/ProfileSampleService";
60
71
  import SortOrder from "../../Types/BaseDatabase/SortOrder";
72
+ import Permission from "../../Types/Permission";
61
73
  import ObjectID from "../../Types/ObjectID";
62
74
  import OneUptimeDate from "../../Types/Date";
63
75
  import { JSONObject } from "../../Types/JSON";
@@ -68,9 +80,81 @@ import ResourceFacetResolver, {
68
80
 
69
81
  const router: ExpressRouter = Express.getRouter();
70
82
 
83
+ /*
84
+ * Shared guards for every bespoke telemetry route in this file. These routes
85
+ * don't go through BaseAnalyticsAPI, so nothing downstream re-checks
86
+ * authorization: the tenantId comes straight from a caller-controlled header
87
+ * and UserMiddleware lets tokenless requests through as Public. Every route
88
+ * must therefore demand an authenticated principal that holds a
89
+ * telemetry-read permission on that tenant before any data is queried.
90
+ * Each guard's permission list mirrors the table-level read access control
91
+ * declared on the corresponding analytics model, keeping these routes
92
+ * exactly as permissive as the model-backed CRUD APIs for the same signal.
93
+ *
94
+ * Guards are declared before any route registration: route registration
95
+ * executes at module load, and spreading a const declared further down the
96
+ * file would throw at startup (temporal dead zone).
97
+ */
98
+ type TelemetryReadAccessGuardFactory = (
99
+ signalReadPermission: Permission,
100
+ ) => Array<RequestHandler>;
101
+
102
+ const createTelemetryReadAccessGuard: TelemetryReadAccessGuardFactory = (
103
+ signalReadPermission: Permission,
104
+ ): Array<RequestHandler> => {
105
+ return [
106
+ UserMiddleware.getUserMiddleware,
107
+ UserMiddleware.requireUserAuthentication,
108
+ UserMiddleware.requirePermission({
109
+ permissions: [
110
+ Permission.ProjectOwner,
111
+ Permission.ProjectAdmin,
112
+ Permission.ProjectMember,
113
+ Permission.Viewer,
114
+ Permission.TelemetryAdmin,
115
+ Permission.TelemetryMember,
116
+ Permission.TelemetryViewer,
117
+ signalReadPermission,
118
+ ],
119
+ }),
120
+ ];
121
+ };
122
+
123
+ // Mirrors the read access control declared on the Log analytics model.
124
+ const requireLogReadAccess: Array<RequestHandler> =
125
+ createTelemetryReadAccessGuard(Permission.ReadTelemetryServiceLog);
126
+
127
+ // Mirrors the read access control declared on the Span analytics model.
128
+ const requireTraceReadAccess: Array<RequestHandler> =
129
+ createTelemetryReadAccessGuard(Permission.ReadTelemetryServiceTraces);
130
+
131
+ /*
132
+ * Mirrors the read access control declared on the Metric analytics model,
133
+ * whose table-level read list grants ReadTelemetryServiceTraces rather than
134
+ * ReadTelemetryServiceMetrics. The guard follows the model declaration so
135
+ * these routes stay in lockstep with the model-backed CRUD API; if the model
136
+ * ever switches to ReadTelemetryServiceMetrics this must change with it.
137
+ */
138
+ const requireMetricReadAccess: Array<RequestHandler> =
139
+ createTelemetryReadAccessGuard(Permission.ReadTelemetryServiceTraces);
140
+
141
+ /*
142
+ * Mirrors the read access control declared on the ExceptionInstance
143
+ * analytics model.
144
+ */
145
+ const requireExceptionReadAccess: Array<RequestHandler> =
146
+ createTelemetryReadAccessGuard(Permission.ReadTelemetryException);
147
+
148
+ /*
149
+ * Mirrors the read access control declared on the Profile / ProfileSample
150
+ * analytics models.
151
+ */
152
+ const requireProfileReadAccess: Array<RequestHandler> =
153
+ createTelemetryReadAccessGuard(Permission.ReadTelemetryServiceProfiles);
154
+
71
155
  router.post(
72
156
  "/telemetry/metrics/get-attributes",
73
- UserMiddleware.getUserMiddleware,
157
+ ...requireMetricReadAccess,
74
158
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
75
159
  return getAttributes(req, res, next, TelemetryType.Metric);
76
160
  },
@@ -78,7 +162,7 @@ router.post(
78
162
 
79
163
  router.post(
80
164
  "/telemetry/metrics/get-attribute-values",
81
- UserMiddleware.getUserMiddleware,
165
+ ...requireMetricReadAccess,
82
166
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
83
167
  return getAttributeValues(req, res, next, TelemetryType.Metric);
84
168
  },
@@ -86,7 +170,7 @@ router.post(
86
170
 
87
171
  router.post(
88
172
  "/telemetry/logs/get-attributes",
89
- UserMiddleware.getUserMiddleware,
173
+ ...requireLogReadAccess,
90
174
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
91
175
  return getAttributes(req, res, next, TelemetryType.Log);
92
176
  },
@@ -94,7 +178,7 @@ router.post(
94
178
 
95
179
  router.post(
96
180
  "/telemetry/logs/get-attribute-values",
97
- UserMiddleware.getUserMiddleware,
181
+ ...requireLogReadAccess,
98
182
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
99
183
  return getAttributeValues(req, res, next, TelemetryType.Log);
100
184
  },
@@ -102,7 +186,7 @@ router.post(
102
186
 
103
187
  router.post(
104
188
  "/telemetry/traces/get-attributes",
105
- UserMiddleware.getUserMiddleware,
189
+ ...requireTraceReadAccess,
106
190
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
107
191
  return getAttributes(req, res, next, TelemetryType.Trace);
108
192
  },
@@ -110,7 +194,7 @@ router.post(
110
194
 
111
195
  router.post(
112
196
  "/telemetry/traces/get-attribute-values",
113
- UserMiddleware.getUserMiddleware,
197
+ ...requireTraceReadAccess,
114
198
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
115
199
  return getAttributeValues(req, res, next, TelemetryType.Trace);
116
200
  },
@@ -118,7 +202,7 @@ router.post(
118
202
 
119
203
  router.post(
120
204
  "/telemetry/exceptions/get-attributes",
121
- UserMiddleware.getUserMiddleware,
205
+ ...requireExceptionReadAccess,
122
206
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
123
207
  return getAttributes(req, res, next, TelemetryType.Exception);
124
208
  },
@@ -126,7 +210,7 @@ router.post(
126
210
 
127
211
  router.post(
128
212
  "/telemetry/exceptions/get-attribute-values",
129
- UserMiddleware.getUserMiddleware,
213
+ ...requireExceptionReadAccess,
130
214
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
131
215
  return getAttributeValues(req, res, next, TelemetryType.Exception);
132
216
  },
@@ -262,7 +346,7 @@ const getAttributeValues: GetAttributeValuesFunction = async (
262
346
 
263
347
  router.post(
264
348
  "/telemetry/logs/histogram",
265
- UserMiddleware.getUserMiddleware,
349
+ ...requireLogReadAccess,
266
350
  async (
267
351
  req: ExpressRequest,
268
352
  res: ExpressResponse,
@@ -300,6 +384,10 @@ router.post(
300
384
  })
301
385
  : undefined;
302
386
 
387
+ const entityKeys: Array<string> | undefined = body["entityKeys"]
388
+ ? (body["entityKeys"] as Array<string>)
389
+ : undefined;
390
+
303
391
  const severityTexts: Array<string> | undefined = body["severityTexts"]
304
392
  ? (body["severityTexts"] as Array<string>)
305
393
  : undefined;
@@ -326,6 +414,7 @@ router.post(
326
414
  endTime,
327
415
  bucketSizeInMinutes,
328
416
  serviceIds,
417
+ entityKeys,
329
418
  severityTexts,
330
419
  bodySearchText,
331
420
  traceIds,
@@ -349,7 +438,7 @@ router.post(
349
438
 
350
439
  router.post(
351
440
  "/telemetry/logs/facets",
352
- UserMiddleware.getUserMiddleware,
441
+ ...requireLogReadAccess,
353
442
  async (
354
443
  req: ExpressRequest,
355
444
  res: ExpressResponse,
@@ -371,7 +460,7 @@ router.post(
371
460
 
372
461
  const facetKeys: Array<string> = body["facetKeys"]
373
462
  ? (body["facetKeys"] as Array<string>)
374
- : ["severityText", "serviceId"];
463
+ : ["severityText", "primaryEntityId"];
375
464
 
376
465
  const startTime: Date = body["startTime"]
377
466
  ? OneUptimeDate.fromString(body["startTime"] as string)
@@ -389,6 +478,10 @@ router.post(
389
478
  })
390
479
  : undefined;
391
480
 
481
+ const entityKeys: Array<string> | undefined = body["entityKeys"]
482
+ ? (body["entityKeys"] as Array<string>)
483
+ : undefined;
484
+
392
485
  const severityTexts: Array<string> | undefined = body["severityTexts"]
393
486
  ? (body["severityTexts"] as Array<string>)
394
487
  : undefined;
@@ -411,9 +504,9 @@ router.post(
411
504
 
412
505
  /*
413
506
  * Per-facet partial-match filter applied at the Postgres source-of-truth
414
- * lookup stage. Only consulted for resource facets (serviceId / hostId /
415
- * dockerHostId / kubernetesClusterId) — other facets continue to filter
416
- * client-side over the loaded value list.
507
+ * lookup stage. Only consulted for resource facets (primaryEntityId /
508
+ * hostId / dockerHostId / kubernetesClusterId) — other facets continue
509
+ * to filter client-side over the loaded value list.
417
510
  */
418
511
  const facetSearchText: Record<string, string> | undefined = body[
419
512
  "facetSearchText"
@@ -445,6 +538,7 @@ router.post(
445
538
  facetKey,
446
539
  limit,
447
540
  serviceIds,
541
+ entityKeys,
448
542
  severityTexts,
449
543
  bodySearchText,
450
544
  traceIds,
@@ -508,11 +602,127 @@ router.post(
508
602
  },
509
603
  );
510
604
 
605
+ /*
606
+ * Shared body parsing for every trace aggregation endpoint (histogram,
607
+ * facets, analytics). Defensive about shapes: arrays are validated and
608
+ * filtered to strings, booleans/numbers use strict typeof checks (JSON null
609
+ * or a stringly-typed value must mean "no filter", never an active
610
+ * predicate).
611
+ */
612
+ function parseTraceFilterBody(body: JSONObject): TraceFilters {
613
+ const serviceIds: Array<ObjectID> | undefined = Array.isArray(
614
+ body["serviceIds"],
615
+ )
616
+ ? (body["serviceIds"] as Array<unknown>)
617
+ .filter((v: unknown): v is string => {
618
+ return typeof v === "string";
619
+ })
620
+ .map((id: string) => {
621
+ return new ObjectID(id);
622
+ })
623
+ : undefined;
624
+
625
+ const stringArray: (key: string) => Array<string> | undefined = (
626
+ key: string,
627
+ ): Array<string> | undefined => {
628
+ return Array.isArray(body[key])
629
+ ? (body[key] as Array<unknown>).filter((v: unknown): v is string => {
630
+ return typeof v === "string";
631
+ })
632
+ : undefined;
633
+ };
634
+
635
+ /*
636
+ * Numeric strings are coerced (stringly-typed clients worked before the
637
+ * parsing was centralized) — dropping them would silently widen the
638
+ * filter to all statuses.
639
+ */
640
+ const statusCodes: Array<number> | undefined = Array.isArray(
641
+ body["statusCodes"],
642
+ )
643
+ ? (body["statusCodes"] as Array<unknown>)
644
+ .map((v: unknown): number => {
645
+ return typeof v === "number" ? v : Number(v);
646
+ })
647
+ .filter((v: number): boolean => {
648
+ return Number.isFinite(v);
649
+ })
650
+ : undefined;
651
+
652
+ const stringRecord: (key: string) => Record<string, string> | undefined = (
653
+ key: string,
654
+ ): Record<string, string> | undefined => {
655
+ const raw: unknown = body[key];
656
+ if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
657
+ return undefined;
658
+ }
659
+ const entries: Array<[string, string]> = Object.entries(
660
+ raw as Record<string, unknown>,
661
+ ).filter((entry: [string, unknown]): entry is [string, string] => {
662
+ return typeof entry[1] === "string";
663
+ });
664
+ if (entries.length === 0) {
665
+ return undefined;
666
+ }
667
+ return Object.fromEntries(entries);
668
+ };
669
+
670
+ return {
671
+ serviceIds,
672
+ entityKeys: stringArray("entityKeys"),
673
+ statusCodes,
674
+ spanKinds: stringArray("spanKinds"),
675
+ spanNames: stringArray("spanNames"),
676
+ /*
677
+ * spanNameSearches is the only multiplicative filter (one ILIKE
678
+ * predicate per entry) — cap it. The dashboard sends at most one.
679
+ */
680
+ spanNameSearches: stringArray("spanNameSearches")?.slice(0, 10),
681
+ spanIds: stringArray("spanIds"),
682
+ traceIds: stringArray("traceIds"),
683
+ nameSearchText:
684
+ typeof body["nameSearchText"] === "string" && body["nameSearchText"]
685
+ ? (body["nameSearchText"] as string)
686
+ : undefined,
687
+ statusMessageSearchText:
688
+ typeof body["statusMessageSearchText"] === "string" &&
689
+ body["statusMessageSearchText"]
690
+ ? (body["statusMessageSearchText"] as string)
691
+ : undefined,
692
+ statusMessages: stringArray("statusMessages"),
693
+ /*
694
+ * Strict boolean check — unlike rootOnly, a coerced `false` is a
695
+ * meaningful predicate here (JSON null must mean "no filter", not
696
+ * "exclude exception spans").
697
+ */
698
+ hasException:
699
+ typeof body["hasException"] === "boolean"
700
+ ? (body["hasException"] as boolean)
701
+ : undefined,
702
+ minDurationNano:
703
+ typeof body["minDurationNano"] === "number"
704
+ ? (body["minDurationNano"] as number)
705
+ : undefined,
706
+ maxDurationNano:
707
+ typeof body["maxDurationNano"] === "number"
708
+ ? (body["maxDurationNano"] as number)
709
+ : undefined,
710
+ exactDurationNano:
711
+ typeof body["exactDurationNano"] === "number"
712
+ ? (body["exactDurationNano"] as number)
713
+ : undefined,
714
+ rootOnly:
715
+ body["rootOnly"] === undefined ? undefined : Boolean(body["rootOnly"]),
716
+ attributes: stringRecord("attributes"),
717
+ attributeSearches: stringRecord("attributeSearches"),
718
+ };
719
+ }
720
+
511
721
  // --- Trace Histogram Endpoint ---
512
722
 
513
723
  router.post(
514
724
  "/telemetry/traces/histogram",
515
- UserMiddleware.getUserMiddleware,
725
+ ...requireTraceReadAccess,
516
726
  async (
517
727
  req: ExpressRequest,
518
728
  res: ExpressResponse,
@@ -544,52 +754,14 @@ router.post(
544
754
  (body["bucketSizeInMinutes"] as number) ||
545
755
  computeDefaultBucketSize(startTime, endTime);
546
756
 
547
- const serviceIds: Array<ObjectID> | undefined = body["serviceIds"]
548
- ? (body["serviceIds"] as Array<string>).map((id: string) => {
549
- return new ObjectID(id);
550
- })
551
- : undefined;
552
-
553
- const statusCodes: Array<number> | undefined = body["statusCodes"]
554
- ? (body["statusCodes"] as Array<number>)
555
- : undefined;
556
-
557
- const spanKinds: Array<string> | undefined = body["spanKinds"]
558
- ? (body["spanKinds"] as Array<string>)
559
- : undefined;
560
-
561
- const spanNames: Array<string> | undefined = body["spanNames"]
562
- ? (body["spanNames"] as Array<string>)
563
- : undefined;
564
-
565
- const traceIds: Array<string> | undefined = body["traceIds"]
566
- ? (body["traceIds"] as Array<string>)
567
- : undefined;
568
-
569
- const nameSearchText: string | undefined = body["nameSearchText"]
570
- ? (body["nameSearchText"] as string)
571
- : undefined;
572
-
573
- const rootOnly: boolean | undefined =
574
- body["rootOnly"] === undefined ? undefined : Boolean(body["rootOnly"]);
575
-
576
- const attributes: Record<string, string> | undefined = body["attributes"]
577
- ? (body["attributes"] as Record<string, string>)
578
- : undefined;
757
+ const traceFilters: TraceFilters = parseTraceFilterBody(body);
579
758
 
580
759
  const request: TraceHistogramRequest = {
581
760
  projectId: databaseProps.tenantId,
582
761
  startTime,
583
762
  endTime,
584
763
  bucketSizeInMinutes,
585
- serviceIds,
586
- statusCodes,
587
- spanKinds,
588
- spanNames,
589
- traceIds,
590
- nameSearchText,
591
- rootOnly,
592
- attributes,
764
+ ...traceFilters,
593
765
  };
594
766
 
595
767
  const buckets: Array<TraceHistogramBucket> =
@@ -608,7 +780,7 @@ router.post(
608
780
 
609
781
  router.post(
610
782
  "/telemetry/traces/facets",
611
- UserMiddleware.getUserMiddleware,
783
+ ...requireTraceReadAccess,
612
784
  async (
613
785
  req: ExpressRequest,
614
786
  res: ExpressResponse,
@@ -630,7 +802,7 @@ router.post(
630
802
 
631
803
  const facetKeys: Array<string> = body["facetKeys"]
632
804
  ? (body["facetKeys"] as Array<string>)
633
- : ["serviceId", "statusCode", "kind", "name"];
805
+ : ["primaryEntityId", "statusCode", "kind", "name"];
634
806
 
635
807
  const startTime: Date = body["startTime"]
636
808
  ? OneUptimeDate.fromString(body["startTime"] as string)
@@ -642,44 +814,13 @@ router.post(
642
814
 
643
815
  const limit: number = (body["limit"] as number) || 500;
644
816
 
645
- const serviceIds: Array<ObjectID> | undefined = body["serviceIds"]
646
- ? (body["serviceIds"] as Array<string>).map((id: string) => {
647
- return new ObjectID(id);
648
- })
649
- : undefined;
650
-
651
- const statusCodes: Array<number> | undefined = body["statusCodes"]
652
- ? (body["statusCodes"] as Array<number>)
653
- : undefined;
654
-
655
- const spanKinds: Array<string> | undefined = body["spanKinds"]
656
- ? (body["spanKinds"] as Array<string>)
657
- : undefined;
658
-
659
- const spanNames: Array<string> | undefined = body["spanNames"]
660
- ? (body["spanNames"] as Array<string>)
661
- : undefined;
662
-
663
- const traceIds: Array<string> | undefined = body["traceIds"]
664
- ? (body["traceIds"] as Array<string>)
665
- : undefined;
666
-
667
- const nameSearchText: string | undefined = body["nameSearchText"]
668
- ? (body["nameSearchText"] as string)
669
- : undefined;
670
-
671
- const rootOnly: boolean | undefined =
672
- body["rootOnly"] === undefined ? undefined : Boolean(body["rootOnly"]);
673
-
674
- const attributes: Record<string, string> | undefined = body["attributes"]
675
- ? (body["attributes"] as Record<string, string>)
676
- : undefined;
817
+ const traceFilters: TraceFilters = parseTraceFilterBody(body);
677
818
 
678
819
  /*
679
820
  * Per-facet partial-match filter applied at the Postgres source-of-truth
680
- * lookup stage. Only consulted for resource facets (serviceId / hostId /
681
- * dockerHostId / kubernetesClusterId) — other facets continue to filter
682
- * client-side over the loaded value list.
821
+ * lookup stage. Only consulted for resource facets (primaryEntityId /
822
+ * hostId / dockerHostId / kubernetesClusterId) — other facets continue
823
+ * to filter client-side over the loaded value list.
683
824
  */
684
825
  const facetSearchText: Record<string, string> | undefined = body[
685
826
  "facetSearchText"
@@ -699,19 +840,13 @@ router.post(
699
840
  endTime,
700
841
  facetKeys,
701
842
  limit,
702
- serviceIds,
703
- statusCodes,
704
- spanKinds,
705
- spanNames,
706
- traceIds,
707
- nameSearchText,
708
- rootOnly,
709
- attributes,
843
+ ...traceFilters,
710
844
  };
711
845
 
712
846
  /*
713
- * Resource facets (serviceId / hostId / dockerHostId / k8s cluster ...)
714
- * and statusCode are counted with an exact, projection-backed GROUP BY
847
+ * Resource facets (primaryEntityId / hostId / dockerHostId / k8s
848
+ * cluster ...) and statusCode are counted with an exact,
849
+ * projection-backed GROUP BY
715
850
  * in getResourceFacetCounts(). The recent-N sample below saturates with
716
851
  * whichever service is chattiest right now and reports 0 for every other
717
852
  * service regardless of its true volume over the window — the "top 1000"
@@ -781,8 +916,8 @@ router.post(
781
916
  /*
782
917
  * Replace resource-facet results with the Postgres source-of-truth list
783
918
  * (filtered by facetSearchText and enriched with displayName). Every
784
- * resource facet shares the same exact serviceId -> count map; resource
785
- * ids are globally unique, so each facet only ever resolves its own
919
+ * resource facet shares the same exact primaryEntityId -> count map;
920
+ * resource ids are globally unique, so each facet only ever resolves its own
786
921
  * entities. Entities with no telemetry in the window surface with count
787
922
  * 0 instead of being hidden, and the search box can find resources
788
923
  * beyond the loaded subset.
@@ -822,11 +957,134 @@ router.post(
822
957
  },
823
958
  );
824
959
 
960
+ // --- Trace Analytics Endpoint ---
961
+
962
+ router.post(
963
+ "/telemetry/traces/analytics",
964
+ ...requireTraceReadAccess,
965
+ async (
966
+ req: ExpressRequest,
967
+ res: ExpressResponse,
968
+ next: NextFunction,
969
+ ): Promise<void> => {
970
+ try {
971
+ const databaseProps: DatabaseCommonInteractionProps =
972
+ await CommonAPI.getDatabaseCommonInteractionProps(req);
973
+
974
+ if (!databaseProps?.tenantId) {
975
+ return Response.sendErrorResponse(
976
+ req,
977
+ res,
978
+ new BadDataException("Invalid Project ID"),
979
+ );
980
+ }
981
+
982
+ const body: JSONObject = req.body as JSONObject;
983
+
984
+ const chartType: TraceAnalyticsChartType =
985
+ (body["chartType"] as TraceAnalyticsChartType) || "timeseries";
986
+
987
+ if (!["timeseries", "toplist", "table"].includes(chartType)) {
988
+ return Response.sendErrorResponse(
989
+ req,
990
+ res,
991
+ new BadDataException("Invalid chartType"),
992
+ );
993
+ }
994
+
995
+ const metric: string = (body["metric"] as string) || "count";
996
+
997
+ if (!TraceAggregationService.isValidAnalyticsMetric(metric)) {
998
+ return Response.sendErrorResponse(
999
+ req,
1000
+ res,
1001
+ new BadDataException("Invalid metric"),
1002
+ );
1003
+ }
1004
+
1005
+ const startTime: Date = body["startTime"]
1006
+ ? OneUptimeDate.fromString(body["startTime"] as string)
1007
+ : OneUptimeDate.addRemoveHours(OneUptimeDate.getCurrentDate(), -1);
1008
+
1009
+ const endTime: Date = body["endTime"]
1010
+ ? OneUptimeDate.fromString(body["endTime"] as string)
1011
+ : OneUptimeDate.getCurrentDate();
1012
+
1013
+ const rawBucketSize: number = Number(body["bucketSizeInMinutes"]);
1014
+ const bucketSizeInMinutes: number =
1015
+ Number.isFinite(rawBucketSize) && rawBucketSize >= 1
1016
+ ? Math.trunc(rawBucketSize)
1017
+ : computeDefaultBucketSize(startTime, endTime);
1018
+
1019
+ const groupBy: Array<string> | undefined = Array.isArray(body["groupBy"])
1020
+ ? (body["groupBy"] as Array<unknown>).filter(
1021
+ (v: unknown): v is string => {
1022
+ return typeof v === "string" && v.length > 0;
1023
+ },
1024
+ )
1025
+ : undefined;
1026
+
1027
+ /*
1028
+ * Clamp to a sane integer range — `limit` flows into LIMIT and the
1029
+ * timeseries series cap, so negative/fractional values would 500 in
1030
+ * ClickHouse and huge values would explode the result set. Numeric
1031
+ * strings are accepted (dashboard widget arguments are stored as
1032
+ * strings).
1033
+ */
1034
+ const rawLimit: number = Number(body["limit"]);
1035
+ const limit: number | undefined = Number.isFinite(rawLimit)
1036
+ ? Math.min(Math.max(Math.trunc(rawLimit), 1), 1000)
1037
+ : undefined;
1038
+
1039
+ const traceFilters: TraceFilters = parseTraceFilterBody(body);
1040
+
1041
+ const request: TraceAnalyticsRequest = {
1042
+ projectId: databaseProps.tenantId,
1043
+ startTime,
1044
+ endTime,
1045
+ bucketSizeInMinutes,
1046
+ chartType,
1047
+ metric,
1048
+ groupBy,
1049
+ limit,
1050
+ ...traceFilters,
1051
+ };
1052
+
1053
+ if (chartType === "timeseries") {
1054
+ const data: Array<TraceAnalyticsTimeseriesRow> =
1055
+ await TraceAggregationService.getAnalyticsTimeseries(request);
1056
+
1057
+ return Response.sendJsonObjectResponse(req, res, {
1058
+ data: data as unknown as JSONObject,
1059
+ });
1060
+ }
1061
+
1062
+ if (chartType === "toplist") {
1063
+ const data: Array<TraceAnalyticsTopItem> =
1064
+ await TraceAggregationService.getAnalyticsTopList(request);
1065
+
1066
+ return Response.sendJsonObjectResponse(req, res, {
1067
+ data: data as unknown as JSONObject,
1068
+ });
1069
+ }
1070
+
1071
+ const data: Array<TraceAnalyticsTableRow> =
1072
+ await TraceAggregationService.getAnalyticsTable(request);
1073
+
1074
+ return Response.sendJsonObjectResponse(req, res, {
1075
+ data: data as unknown as JSONObject,
1076
+ });
1077
+ } catch (err: unknown) {
1078
+ next(err);
1079
+ }
1080
+ },
1081
+ );
1082
+
825
1083
  // --- Exception Histogram Endpoint ---
826
1084
 
827
1085
  router.post(
828
1086
  "/telemetry/exceptions/histogram",
829
- UserMiddleware.getUserMiddleware,
1087
+ ...requireExceptionReadAccess,
830
1088
  async (
831
1089
  req: ExpressRequest,
832
1090
  res: ExpressResponse,
@@ -917,7 +1175,7 @@ router.post(
917
1175
 
918
1176
  router.post(
919
1177
  "/telemetry/exceptions/facets",
920
- UserMiddleware.getUserMiddleware,
1178
+ ...requireExceptionReadAccess,
921
1179
  async (
922
1180
  req: ExpressRequest,
923
1181
  res: ExpressResponse,
@@ -940,7 +1198,7 @@ router.post(
940
1198
  const facetKeys: Array<string> = body["facetKeys"]
941
1199
  ? (body["facetKeys"] as Array<string>)
942
1200
  : [
943
- "serviceId",
1201
+ "primaryEntityId",
944
1202
  "hostId",
945
1203
  "dockerHostId",
946
1204
  "kubernetesClusterId",
@@ -1085,7 +1343,7 @@ router.post(
1085
1343
 
1086
1344
  router.post(
1087
1345
  "/telemetry/metrics/facets",
1088
- UserMiddleware.getUserMiddleware,
1346
+ ...requireMetricReadAccess,
1089
1347
  async (
1090
1348
  req: ExpressRequest,
1091
1349
  res: ExpressResponse,
@@ -1107,7 +1365,7 @@ router.post(
1107
1365
 
1108
1366
  const facetKeys: Array<string> = body["facetKeys"]
1109
1367
  ? (body["facetKeys"] as Array<string>)
1110
- : ["serviceId", "hostId", "dockerHostId", "kubernetesClusterId"];
1368
+ : ["primaryEntityId", "hostId", "dockerHostId", "kubernetesClusterId"];
1111
1369
 
1112
1370
  const startTime: Date = body["startTime"]
1113
1371
  ? OneUptimeDate.fromString(body["startTime"] as string)
@@ -1217,7 +1475,7 @@ router.post(
1217
1475
 
1218
1476
  router.post(
1219
1477
  "/telemetry/logs/analytics",
1220
- UserMiddleware.getUserMiddleware,
1478
+ ...requireLogReadAccess,
1221
1479
  async (
1222
1480
  req: ExpressRequest,
1223
1481
  res: ExpressResponse,
@@ -1357,7 +1615,7 @@ router.post(
1357
1615
 
1358
1616
  router.post(
1359
1617
  "/telemetry/logs/export",
1360
- UserMiddleware.getUserMiddleware,
1618
+ ...requireLogReadAccess,
1361
1619
  async (
1362
1620
  req: ExpressRequest,
1363
1621
  res: ExpressResponse,
@@ -1427,7 +1685,7 @@ router.post(
1427
1685
 
1428
1686
  if (format === "csv") {
1429
1687
  const header: string =
1430
- "time,serviceId,severityText,severityNumber,body,traceId,spanId,attributes";
1688
+ "time,primaryEntityId,severityText,severityNumber,body,traceId,spanId,attributes";
1431
1689
  const csvRows: Array<string> = rows.map((row: JSONObject) => {
1432
1690
  const escapeCsv: (val: unknown) => string = (
1433
1691
  val: unknown,
@@ -1442,7 +1700,7 @@ router.post(
1442
1700
 
1443
1701
  return [
1444
1702
  escapeCsv(row["time"]),
1445
- escapeCsv(row["serviceId"]),
1703
+ escapeCsv(row["primaryEntityId"]),
1446
1704
  escapeCsv(row["severityText"]),
1447
1705
  escapeCsv(row["severityNumber"]),
1448
1706
  escapeCsv(row["body"]),
@@ -1479,7 +1737,7 @@ router.post(
1479
1737
 
1480
1738
  router.post(
1481
1739
  "/telemetry/logs/context",
1482
- UserMiddleware.getUserMiddleware,
1740
+ ...requireLogReadAccess,
1483
1741
  async (
1484
1742
  req: ExpressRequest,
1485
1743
  res: ExpressResponse,
@@ -1500,16 +1758,16 @@ router.post(
1500
1758
  const body: JSONObject = req.body as JSONObject;
1501
1759
 
1502
1760
  const logId: string | undefined = body["logId"] as string | undefined;
1503
- const serviceId: string | undefined = body["serviceId"] as
1504
- | string
1505
- | undefined;
1761
+ // `serviceId` is the pre-rename alias kept for stale clients.
1762
+ const primaryEntityId: string | undefined = (body["primaryEntityId"] ||
1763
+ body["serviceId"]) as string | undefined;
1506
1764
  const time: string | undefined = body["time"] as string | undefined;
1507
1765
 
1508
- if (!logId || !serviceId || !time) {
1766
+ if (!logId || !primaryEntityId || !time) {
1509
1767
  return Response.sendErrorResponse(
1510
1768
  req,
1511
1769
  res,
1512
- new BadDataException("logId, serviceId, and time are required"),
1770
+ new BadDataException("logId, primaryEntityId, and time are required"),
1513
1771
  );
1514
1772
  }
1515
1773
 
@@ -1520,7 +1778,7 @@ router.post(
1520
1778
  after: Array<JSONObject>;
1521
1779
  } = await LogAggregationService.getLogContext({
1522
1780
  projectId: databaseProps.tenantId,
1523
- serviceId: new ObjectID(serviceId),
1781
+ primaryEntityId: new ObjectID(primaryEntityId),
1524
1782
  time: OneUptimeDate.fromString(time),
1525
1783
  logId,
1526
1784
  count,
@@ -1540,7 +1798,7 @@ router.post(
1540
1798
 
1541
1799
  router.post(
1542
1800
  "/telemetry/logs/drop-filter-estimate",
1543
- UserMiddleware.getUserMiddleware,
1801
+ ...requireLogReadAccess,
1544
1802
  async (
1545
1803
  req: ExpressRequest,
1546
1804
  res: ExpressResponse,
@@ -1647,7 +1905,7 @@ function computeDefaultBucketSize(startTime: Date, endTime: Date): number {
1647
1905
 
1648
1906
  router.post(
1649
1907
  "/telemetry/profiles/get-attributes",
1650
- UserMiddleware.getUserMiddleware,
1908
+ ...requireProfileReadAccess,
1651
1909
  async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
1652
1910
  return getAttributes(req, res, next, TelemetryType.Profile);
1653
1911
  },
@@ -1657,7 +1915,7 @@ router.post(
1657
1915
 
1658
1916
  router.post(
1659
1917
  "/telemetry/profiles/flamegraph",
1660
- UserMiddleware.getUserMiddleware,
1918
+ ...requireProfileReadAccess,
1661
1919
  async (
1662
1920
  req: ExpressRequest,
1663
1921
  res: ExpressResponse,
@@ -1730,11 +1988,12 @@ router.post(
1730
1988
  profileTypes.length > 0 && { profileTypes }),
1731
1989
  };
1732
1990
 
1733
- const flamegraph: ProfileFlamegraphNode =
1991
+ const result: FlamegraphResult =
1734
1992
  await ProfileAggregationService.getFlamegraph(request);
1735
1993
 
1736
1994
  return Response.sendJsonObjectResponse(req, res, {
1737
- flamegraph: flamegraph as unknown as JSONObject,
1995
+ flamegraph: result.flamegraph as unknown as JSONObject,
1996
+ truncated: result.truncated,
1738
1997
  });
1739
1998
  } catch (err: unknown) {
1740
1999
  next(err);
@@ -1746,7 +2005,7 @@ router.post(
1746
2005
 
1747
2006
  router.post(
1748
2007
  "/telemetry/profiles/function-list",
1749
- UserMiddleware.getUserMiddleware,
2008
+ ...requireProfileReadAccess,
1750
2009
  async (
1751
2010
  req: ExpressRequest,
1752
2011
  res: ExpressResponse,
@@ -1766,13 +2025,37 @@ router.post(
1766
2025
 
1767
2026
  const body: JSONObject = req.body as JSONObject;
1768
2027
 
1769
- const startTime: Date = body["startTime"]
2028
+ const profileId: string | undefined = body["profileId"]
2029
+ ? (body["profileId"] as string)
2030
+ : undefined;
2031
+
2032
+ /*
2033
+ * Only default the window when no profileId is given: a profile's
2034
+ * samples are bounded by the profile itself, and a defaulted
2035
+ * last-hour window would silently exclude any profile captured
2036
+ * before the window started.
2037
+ */
2038
+ const startTime: Date | undefined = body["startTime"]
1770
2039
  ? OneUptimeDate.fromString(body["startTime"] as string)
1771
- : OneUptimeDate.addRemoveHours(OneUptimeDate.getCurrentDate(), -1);
2040
+ : profileId
2041
+ ? undefined
2042
+ : OneUptimeDate.addRemoveHours(OneUptimeDate.getCurrentDate(), -1);
1772
2043
 
1773
- const endTime: Date = body["endTime"]
2044
+ const endTime: Date | undefined = body["endTime"]
1774
2045
  ? OneUptimeDate.fromString(body["endTime"] as string)
1775
- : OneUptimeDate.getCurrentDate();
2046
+ : profileId
2047
+ ? undefined
2048
+ : OneUptimeDate.getCurrentDate();
2049
+
2050
+ if (!profileId && !startTime) {
2051
+ return Response.sendErrorResponse(
2052
+ req,
2053
+ res,
2054
+ new BadDataException(
2055
+ "Either profileId or startTime must be provided",
2056
+ ),
2057
+ );
2058
+ }
1776
2059
 
1777
2060
  const serviceIds: Array<ObjectID> | undefined = body["serviceIds"]
1778
2061
  ? (body["serviceIds"] as Array<string>).map((id: string) => {
@@ -1805,8 +2088,9 @@ router.post(
1805
2088
 
1806
2089
  const request: FunctionListRequest = {
1807
2090
  projectId: databaseProps.tenantId,
1808
- startTime,
1809
- endTime,
2091
+ ...(startTime !== undefined && { startTime }),
2092
+ ...(endTime !== undefined && { endTime }),
2093
+ ...(profileId !== undefined && { profileId }),
1810
2094
  ...(serviceIds !== undefined && { serviceIds }),
1811
2095
  ...(profileType !== undefined && { profileType }),
1812
2096
  ...(profileTypes !== undefined &&
@@ -1815,11 +2099,13 @@ router.post(
1815
2099
  ...(sortBy !== undefined && { sortBy }),
1816
2100
  };
1817
2101
 
1818
- const functions: Array<FunctionListItem> =
2102
+ const result: FunctionListResult =
1819
2103
  await ProfileAggregationService.getFunctionList(request);
1820
2104
 
1821
2105
  return Response.sendJsonObjectResponse(req, res, {
1822
- functions: functions as unknown as JSONObject,
2106
+ functions: result.functions as unknown as JSONObject,
2107
+ windowTotal: result.windowTotal,
2108
+ truncated: result.truncated,
1823
2109
  });
1824
2110
  } catch (err: unknown) {
1825
2111
  next(err);
@@ -1831,7 +2117,7 @@ router.post(
1831
2117
 
1832
2118
  router.post(
1833
2119
  "/telemetry/profiles/service-activity",
1834
- UserMiddleware.getUserMiddleware,
2120
+ ...requireProfileReadAccess,
1835
2121
  async (
1836
2122
  req: ExpressRequest,
1837
2123
  res: ExpressResponse,
@@ -1898,7 +2184,7 @@ router.post(
1898
2184
 
1899
2185
  router.get(
1900
2186
  "/telemetry/profiles/:profileId/pprof",
1901
- UserMiddleware.getUserMiddleware,
2187
+ ...requireProfileReadAccess,
1902
2188
  async (
1903
2189
  req: ExpressRequest,
1904
2190
  res: ExpressResponse,
@@ -2027,7 +2313,7 @@ router.get(
2027
2313
 
2028
2314
  router.post(
2029
2315
  "/telemetry/profiles/diff-flamegraph",
2030
- UserMiddleware.getUserMiddleware,
2316
+ ...requireProfileReadAccess,
2031
2317
  async (
2032
2318
  req: ExpressRequest,
2033
2319
  res: ExpressResponse,
@@ -2110,11 +2396,240 @@ router.post(
2110
2396
  profileTypes.length > 0 && { profileTypes }),
2111
2397
  };
2112
2398
 
2113
- const diffFlamegraph: DiffFlamegraphNode =
2399
+ const result: { diffFlamegraph: DiffFlamegraphNode; truncated: boolean } =
2114
2400
  await ProfileAggregationService.getDiffFlamegraph(request);
2115
2401
 
2402
+ /*
2403
+ * `truncated` is surfaced so the UI can warn that the diff was built
2404
+ * from a capped sample set rather than the full window.
2405
+ */
2406
+ return Response.sendJsonObjectResponse(req, res, {
2407
+ diffFlamegraph: result.diffFlamegraph as unknown as JSONObject,
2408
+ truncated: result.truncated,
2409
+ });
2410
+ } catch (err: unknown) {
2411
+ next(err);
2412
+ }
2413
+ },
2414
+ );
2415
+
2416
+ // --- Profile Function Focus Endpoint ---
2417
+
2418
+ router.post(
2419
+ "/telemetry/profiles/function-focus",
2420
+ ...requireProfileReadAccess,
2421
+ async (
2422
+ req: ExpressRequest,
2423
+ res: ExpressResponse,
2424
+ next: NextFunction,
2425
+ ): Promise<void> => {
2426
+ try {
2427
+ const databaseProps: DatabaseCommonInteractionProps =
2428
+ await CommonAPI.getDatabaseCommonInteractionProps(req);
2429
+
2430
+ if (!databaseProps?.tenantId) {
2431
+ return Response.sendErrorResponse(
2432
+ req,
2433
+ res,
2434
+ new BadDataException("Invalid Project ID"),
2435
+ );
2436
+ }
2437
+
2438
+ const body: JSONObject = req.body as JSONObject;
2439
+
2440
+ const functionName: string | undefined =
2441
+ body["functionName"] && typeof body["functionName"] === "string"
2442
+ ? (body["functionName"] as string)
2443
+ : undefined;
2444
+
2445
+ if (!functionName) {
2446
+ return Response.sendErrorResponse(
2447
+ req,
2448
+ res,
2449
+ new BadDataException("functionName is required"),
2450
+ );
2451
+ }
2452
+
2453
+ /*
2454
+ * fileName participates in frame identity (frames match on
2455
+ * functionName + fileName; line numbers are ignored so identity
2456
+ * survives deploys) but may legitimately be empty: folded uploads
2457
+ * produce bare frames with no file information.
2458
+ */
2459
+ const fileName: string =
2460
+ typeof body["fileName"] === "string"
2461
+ ? (body["fileName"] as string)
2462
+ : "";
2463
+
2464
+ const profileId: string | undefined = body["profileId"]
2465
+ ? (body["profileId"] as string)
2466
+ : undefined;
2467
+
2468
+ const startTime: Date | undefined = body["startTime"]
2469
+ ? OneUptimeDate.fromString(body["startTime"] as string)
2470
+ : undefined;
2471
+
2472
+ const endTime: Date | undefined = body["endTime"]
2473
+ ? OneUptimeDate.fromString(body["endTime"] as string)
2474
+ : undefined;
2475
+
2476
+ const serviceIds: Array<ObjectID> | undefined = body["serviceIds"]
2477
+ ? (body["serviceIds"] as Array<string>).map((id: string) => {
2478
+ return new ObjectID(id);
2479
+ })
2480
+ : undefined;
2481
+
2482
+ const profileType: string | undefined = body["profileType"]
2483
+ ? (body["profileType"] as string)
2484
+ : undefined;
2485
+
2486
+ const profileTypes: Array<string> | undefined = Array.isArray(
2487
+ body["profileTypes"],
2488
+ )
2489
+ ? (body["profileTypes"] as Array<string>).filter(
2490
+ (t: unknown): t is string => {
2491
+ return typeof t === "string" && t.length > 0;
2492
+ },
2493
+ )
2494
+ : undefined;
2495
+
2496
+ if (!profileId && !startTime) {
2497
+ return Response.sendErrorResponse(
2498
+ req,
2499
+ res,
2500
+ new BadDataException(
2501
+ "Either profileId or startTime must be provided",
2502
+ ),
2503
+ );
2504
+ }
2505
+
2506
+ const request: FunctionFocusRequest = {
2507
+ projectId: databaseProps.tenantId,
2508
+ functionName,
2509
+ fileName,
2510
+ ...(profileId !== undefined && { profileId }),
2511
+ ...(startTime !== undefined && { startTime }),
2512
+ ...(endTime !== undefined && { endTime }),
2513
+ ...(serviceIds !== undefined && { serviceIds }),
2514
+ ...(profileType !== undefined && { profileType }),
2515
+ ...(profileTypes !== undefined &&
2516
+ profileTypes.length > 0 && { profileTypes }),
2517
+ };
2518
+
2519
+ const result: FunctionFocusResult =
2520
+ await ProfileAggregationService.getFunctionFocus(request);
2521
+
2522
+ return Response.sendJsonObjectResponse(req, res, {
2523
+ functionName: result.functionName,
2524
+ fileName: result.fileName,
2525
+ totalValue: result.totalValue,
2526
+ selfValue: result.selfValue,
2527
+ sampleCount: result.sampleCount,
2528
+ windowTotal: result.windowTotal,
2529
+ callers: result.callers as unknown as JSONObject,
2530
+ callees: result.callees as unknown as JSONObject,
2531
+ truncated: result.truncated,
2532
+ });
2533
+ } catch (err: unknown) {
2534
+ next(err);
2535
+ }
2536
+ },
2537
+ );
2538
+
2539
+ // --- Profile Breakdown Endpoint ---
2540
+
2541
+ router.post(
2542
+ "/telemetry/profiles/breakdown",
2543
+ ...requireProfileReadAccess,
2544
+ async (
2545
+ req: ExpressRequest,
2546
+ res: ExpressResponse,
2547
+ next: NextFunction,
2548
+ ): Promise<void> => {
2549
+ try {
2550
+ const databaseProps: DatabaseCommonInteractionProps =
2551
+ await CommonAPI.getDatabaseCommonInteractionProps(req);
2552
+
2553
+ if (!databaseProps?.tenantId) {
2554
+ return Response.sendErrorResponse(
2555
+ req,
2556
+ res,
2557
+ new BadDataException("Invalid Project ID"),
2558
+ );
2559
+ }
2560
+
2561
+ const body: JSONObject = req.body as JSONObject;
2562
+
2563
+ const startTime: Date | undefined = body["startTime"]
2564
+ ? OneUptimeDate.fromString(body["startTime"] as string)
2565
+ : undefined;
2566
+
2567
+ const endTime: Date | undefined = body["endTime"]
2568
+ ? OneUptimeDate.fromString(body["endTime"] as string)
2569
+ : undefined;
2570
+
2571
+ /*
2572
+ * breakdownBy is either the reserved key 'service' (grouping by
2573
+ * primaryEntityId, resolved to display names by the UI) or a Profile
2574
+ * attribute key.
2575
+ */
2576
+ const breakdownBy: string | undefined =
2577
+ body["breakdownBy"] && typeof body["breakdownBy"] === "string"
2578
+ ? (body["breakdownBy"] as string)
2579
+ : undefined;
2580
+
2581
+ if (!startTime || !endTime || !breakdownBy) {
2582
+ return Response.sendErrorResponse(
2583
+ req,
2584
+ res,
2585
+ new BadDataException(
2586
+ "startTime, endTime, and breakdownBy are all required",
2587
+ ),
2588
+ );
2589
+ }
2590
+
2591
+ const serviceIds: Array<ObjectID> | undefined = body["serviceIds"]
2592
+ ? (body["serviceIds"] as Array<string>).map((id: string) => {
2593
+ return new ObjectID(id);
2594
+ })
2595
+ : undefined;
2596
+
2597
+ const profileType: string | undefined = body["profileType"]
2598
+ ? (body["profileType"] as string)
2599
+ : undefined;
2600
+
2601
+ const profileTypes: Array<string> | undefined = Array.isArray(
2602
+ body["profileTypes"],
2603
+ )
2604
+ ? (body["profileTypes"] as Array<string>).filter(
2605
+ (t: unknown): t is string => {
2606
+ return typeof t === "string" && t.length > 0;
2607
+ },
2608
+ )
2609
+ : undefined;
2610
+
2611
+ const limit: number | undefined = body["limit"]
2612
+ ? (body["limit"] as number)
2613
+ : undefined;
2614
+
2615
+ const request: BreakdownRequest = {
2616
+ projectId: databaseProps.tenantId,
2617
+ startTime,
2618
+ endTime,
2619
+ breakdownBy,
2620
+ ...(serviceIds !== undefined && { serviceIds }),
2621
+ ...(profileType !== undefined && { profileType }),
2622
+ ...(profileTypes !== undefined &&
2623
+ profileTypes.length > 0 && { profileTypes }),
2624
+ ...(limit !== undefined && { limit }),
2625
+ };
2626
+
2627
+ const result: BreakdownResult =
2628
+ await ProfileAggregationService.getBreakdown(request);
2629
+
2116
2630
  return Response.sendJsonObjectResponse(req, res, {
2117
- diffFlamegraph: diffFlamegraph as unknown as JSONObject,
2631
+ items: result.items as unknown as JSONObject,
2632
+ totalSampleCount: result.totalSampleCount,
2118
2633
  });
2119
2634
  } catch (err: unknown) {
2120
2635
  next(err);