@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
@@ -0,0 +1,783 @@
1
+ import {
2
+ computeEntityKey as computeEntityKeyShared,
3
+ canonicalizeEntityValue,
4
+ setSha256Provider,
5
+ } from "../../../Utils/Telemetry/EntityKey";
6
+ import EntityType from "../../../Types/Telemetry/EntityType";
7
+ import Dictionary from "../../../Types/Dictionary";
8
+ import logger from "../Logger";
9
+ import { ONEUPTIME_LABEL_ATTRIBUTE_PREFIX } from "./OneuptimeLabel";
10
+ import crypto from "crypto";
11
+
12
+ /*
13
+ * Generalized OpenTelemetry entity extraction (the identity layer of the
14
+ * entity model — see Internal/Docs/OpenTelemetryEntities.md, phase 1).
15
+ *
16
+ * An OTLP `Resource` is a composition of N entities. This module derives
17
+ * *all* of them from a flat resource-attribute dictionary and assigns
18
+ * each a stable, payload-derived `entityKey`. Two properties make this
19
+ * the keystone of the multi-entity design:
20
+ *
21
+ * 1. Pure & synchronous. The key is a hash of the resource attributes
22
+ * plus the projectId — no database round trip. So a signal can be
23
+ * stamped with `entityKeys` at ingest without blocking on registry
24
+ * resolution, which is reconciled asynchronously.
25
+ * 2. Deterministic & tenant-scoped. The same identifying attributes in
26
+ * the same project always produce the same key, and keys never
27
+ * collide across tenants (projectId is in the hash preimage).
28
+ *
29
+ * The same `computeEntityKey` MUST be used on the read side so a
30
+ * cross-cutting query (`has(entityKeys, :hostKey)`) computes the identical
31
+ * key that ingest stamped. The canonicalization here (trim + lowercase)
32
+ * mirrors `OtelIngestBaseService.canonicalizeHostName` and the
33
+ * case-insensitive Service lookup, so identity stays consistent end to end.
34
+ */
35
+
36
+ /*
37
+ * Ingest hashes an entity key per resolver per signal batch, so use the
38
+ * native node:crypto SHA-256 instead of EntityKey's pure-JS crypto-js
39
+ * default. Both emit identical lowercase hex, so keys do not fork against
40
+ * browser-computed read-side keys.
41
+ */
42
+ setSha256Provider((input: string): string => {
43
+ return crypto.createHash("sha256").update(input).digest("hex");
44
+ });
45
+
46
+ /** Scalar attribute value as seen after `TelemetryUtil.getAttributes`. */
47
+ export type EntityAttributeValue = string | number | boolean | null | undefined;
48
+
49
+ /**
50
+ * A flat resource-attribute map keyed by the *raw* semconv attribute name
51
+ * (e.g. `service.name`, `host.id`, `k8s.pod.name`) — i.e. NOT prefixed
52
+ * with `resource.`. Build it with
53
+ * `TelemetryUtil.getAttributes({ items, prefixKeysWithString: "" })`.
54
+ * Array/object values are ignored for identity purposes.
55
+ */
56
+ export type EntityAttributes = Dictionary<
57
+ EntityAttributeValue | Array<EntityAttributeValue>
58
+ >;
59
+
60
+ /** One entity derived from a resource. */
61
+ export interface ExtractedEntity {
62
+ entityType: EntityType;
63
+ /** Stable 16-hex-char identity hash (per project + type + identity set). */
64
+ entityKey: string;
65
+ /**
66
+ * The canonicalized immutable identifying attribute set. This is the
67
+ * entity's identity — descriptive attributes (image tag, version, IP,
68
+ * ...) are deliberately excluded so they can change without changing
69
+ * the key.
70
+ */
71
+ identifyingAttributes: Dictionary<string>;
72
+ /**
73
+ * A small allowlisted set of mutable, non-identifying attributes
74
+ * (os.type, sdk language, image tag, ...) persisted onto the registry
75
+ * row (last-writer-wins merge). NEVER part of identity — changing any
76
+ * of these MUST NOT change `entityKey`.
77
+ */
78
+ descriptiveAttributes?: Record<string, string>;
79
+ /**
80
+ * Label names promoted from `oneuptime.label.<name>` resource
81
+ * attributes (the suffix after the prefix, trimmed). Non-identifying;
82
+ * the registry attaches them via the existing project label system.
83
+ */
84
+ labels?: Array<string>;
85
+ }
86
+
87
+ /**
88
+ * A normalized OTLP `Resource.entity_refs` entry (proto `EntityRef`,
89
+ * Development status). When producers emit refs they are authoritative:
90
+ * `idKeys`/`descriptionKeys` partition the flat resource attributes
91
+ * into identity vs description for the entity of `type`.
92
+ */
93
+ export interface ResourceEntityRef {
94
+ schemaUrl?: string | undefined;
95
+ type?: string | undefined;
96
+ idKeys?: Array<string> | undefined;
97
+ descriptionKeys?: Array<string> | undefined;
98
+ }
99
+
100
+ export default class TelemetryEntity {
101
+ /**
102
+ * Compute the stable identity key for an entity. Pure: same inputs →
103
+ * same 16-char hex key. Keys are sorted so attribute order is
104
+ * irrelevant; values are trimmed + lowercased so casing drift (Windows
105
+ * host names, etc.) does not fork identity. projectId is folded into
106
+ * the preimage so keys are tenant-unique and a `has(entityKeys, key)`
107
+ * predicate is implicitly project-scoped.
108
+ */
109
+ public static computeEntityKey(data: {
110
+ projectId: string;
111
+ entityType: EntityType;
112
+ identifyingAttributes: Dictionary<string>;
113
+ }): string {
114
+ /*
115
+ * Delegate to the shared isomorphic implementation so ingest (here) and
116
+ * reads (server/browser) produce byte-identical keys.
117
+ */
118
+ return computeEntityKeyShared(data);
119
+ }
120
+
121
+ /**
122
+ * Derive every entity present in a resource. When the producer emitted
123
+ * OTLP `entity_refs`, those are authoritative and entities are built
124
+ * directly from them; otherwise (refs absent, or none usable) each
125
+ * supported type whose identifying attributes are all present is
126
+ * emitted exactly once via the heuristic resolvers; types with missing
127
+ * identity are skipped (no phantom entities). The result is deduped by
128
+ * key and stable-ordered. Descriptive attributes and labels are
129
+ * attached after identity is fixed — they NEVER feed the key.
130
+ */
131
+ public static extractEntities(data: {
132
+ projectId: string;
133
+ attributes: EntityAttributes;
134
+ entityRefs?: Array<ResourceEntityRef> | undefined;
135
+ }): Array<ExtractedEntity> {
136
+ let out: Array<ExtractedEntity> = [];
137
+
138
+ if (data.entityRefs && data.entityRefs.length > 0) {
139
+ out = this.entitiesFromRefs({
140
+ projectId: data.projectId,
141
+ attributes: data.attributes,
142
+ entityRefs: data.entityRefs,
143
+ });
144
+ }
145
+
146
+ /*
147
+ * Fall back to the heuristic resolvers when no refs were provided —
148
+ * and also when every provided ref was unusable (unknown type /
149
+ * missing id values), so a producer with a malformed or
150
+ * unsupported-only ref set does not lose membership keys entirely.
151
+ */
152
+ if (out.length === 0) {
153
+ out = this.entitiesFromResolvers(data);
154
+ }
155
+
156
+ const labels: Array<string> = this.extractLabels(data.attributes);
157
+ if (labels.length > 0) {
158
+ for (const entity of out) {
159
+ entity.labels = labels;
160
+ }
161
+ }
162
+
163
+ return out;
164
+ }
165
+
166
+ private static entitiesFromResolvers(data: {
167
+ projectId: string;
168
+ attributes: EntityAttributes;
169
+ }): Array<ExtractedEntity> {
170
+ const out: Array<ExtractedEntity> = [];
171
+ const seen: Set<string> = new Set<string>();
172
+
173
+ for (const resolve of this.resolvers) {
174
+ const identity: {
175
+ entityType: EntityType;
176
+ id: Dictionary<string>;
177
+ } | null = resolve(data.attributes);
178
+
179
+ if (!identity) {
180
+ continue;
181
+ }
182
+
183
+ const entityKey: string = this.computeEntityKey({
184
+ projectId: data.projectId,
185
+ entityType: identity.entityType,
186
+ identifyingAttributes: identity.id,
187
+ });
188
+
189
+ if (seen.has(entityKey)) {
190
+ continue;
191
+ }
192
+ seen.add(entityKey);
193
+
194
+ const descriptiveAttributes: Record<string, string> =
195
+ this.descriptiveAttributesFor(identity.entityType, data.attributes);
196
+
197
+ out.push({
198
+ entityType: identity.entityType,
199
+ entityKey,
200
+ identifyingAttributes: this.canonObject(identity.id),
201
+ ...(Object.keys(descriptiveAttributes).length > 0
202
+ ? { descriptiveAttributes }
203
+ : {}),
204
+ });
205
+ }
206
+
207
+ return out;
208
+ }
209
+
210
+ /*
211
+ * Build entities from OTLP `entity_refs` (the authoritative path).
212
+ * Identity = the values of the ref's `id_keys` read from the flat
213
+ * resource attributes; description = the `description_keys` values.
214
+ * Refs with a type outside our EntityType vocabulary, with no
215
+ * id_keys, or whose identifying values are missing from the resource
216
+ * are skipped (debug-logged) — never half-identified.
217
+ */
218
+ private static entitiesFromRefs(data: {
219
+ projectId: string;
220
+ attributes: EntityAttributes;
221
+ entityRefs: Array<ResourceEntityRef>;
222
+ }): Array<ExtractedEntity> {
223
+ const out: Array<ExtractedEntity> = [];
224
+ const seen: Set<string> = new Set<string>();
225
+
226
+ for (const ref of data.entityRefs) {
227
+ const refType: string =
228
+ typeof ref.type === "string" ? ref.type.trim() : "";
229
+ const entityType: EntityType | undefined = this.entityTypeByRefType.get(
230
+ refType.toLowerCase(),
231
+ );
232
+
233
+ if (!entityType) {
234
+ logger.debug(
235
+ `Skipping OTLP entity_ref with unsupported type "${refType}" — not in the supported EntityType vocabulary.`,
236
+ );
237
+ continue;
238
+ }
239
+
240
+ const idKeys: Array<string> = (ref.idKeys || []).filter((key: string) => {
241
+ return typeof key === "string" && key.trim().length > 0;
242
+ });
243
+
244
+ if (idKeys.length === 0) {
245
+ logger.debug(
246
+ `Skipping OTLP entity_ref of type "${refType}" with no id_keys.`,
247
+ );
248
+ continue;
249
+ }
250
+
251
+ const id: Dictionary<string> = {};
252
+ let missingIdValue: boolean = false;
253
+
254
+ for (const key of idKeys) {
255
+ const value: string | null = this.str(data.attributes, key);
256
+ if (!value) {
257
+ missingIdValue = true;
258
+ break;
259
+ }
260
+ /*
261
+ * The producer's ref is honored verbatim — but a known-mutable
262
+ * attribute used as identity forks the entity key every time the
263
+ * value changes (image tag bump, redeploy, ...), inflating
264
+ * entity cardinality. Warn so the source can be fixed; do NOT
265
+ * drop the key (see OpenTelemetryEntities.md, Edge Cases).
266
+ */
267
+ if (this.knownMutableAttributeKeys.has(key)) {
268
+ logger.warn(
269
+ `OTLP entity_ref of type "${refType}" declares mutable attribute "${key}" as identifying — honoring it, but this forks entity identity whenever the value changes (cardinality risk).`,
270
+ );
271
+ }
272
+ id[key] = value;
273
+ }
274
+
275
+ if (missingIdValue) {
276
+ logger.debug(
277
+ `Skipping OTLP entity_ref of type "${refType}" — an id_keys attribute is missing from the resource attributes.`,
278
+ );
279
+ continue;
280
+ }
281
+
282
+ const entityKey: string = this.computeEntityKey({
283
+ projectId: data.projectId,
284
+ entityType,
285
+ identifyingAttributes: id,
286
+ });
287
+
288
+ if (seen.has(entityKey)) {
289
+ continue;
290
+ }
291
+ seen.add(entityKey);
292
+
293
+ const descriptiveAttributes: Record<string, string> = {};
294
+ for (const key of ref.descriptionKeys || []) {
295
+ if (typeof key !== "string" || key.trim().length === 0) {
296
+ continue;
297
+ }
298
+ const value: string | null = this.strOrFirst(data.attributes, key);
299
+ if (value) {
300
+ descriptiveAttributes[key] = value;
301
+ }
302
+ }
303
+
304
+ out.push({
305
+ entityType,
306
+ entityKey,
307
+ identifyingAttributes: this.canonObject(id),
308
+ ...(Object.keys(descriptiveAttributes).length > 0
309
+ ? { descriptiveAttributes }
310
+ : {}),
311
+ });
312
+ }
313
+
314
+ return out;
315
+ }
316
+
317
+ /**
318
+ * Normalize a decoded OTLP `resource.entityRefs` JSON value (protobuf
319
+ * `.toJSON()` output or OTLP/JSON, camelCase or snake_case) into typed
320
+ * refs. Malformed entries are dropped, not thrown.
321
+ */
322
+ public static parseEntityRefs(raw: unknown): Array<ResourceEntityRef> {
323
+ if (!raw || !Array.isArray(raw)) {
324
+ return [];
325
+ }
326
+
327
+ const out: Array<ResourceEntityRef> = [];
328
+
329
+ for (const item of raw) {
330
+ if (!item || typeof item !== "object" || Array.isArray(item)) {
331
+ continue;
332
+ }
333
+ const record: Record<string, unknown> = item as Record<string, unknown>;
334
+ const type: unknown = record["type"];
335
+ const schemaUrl: unknown = record["schemaUrl"] ?? record["schema_url"];
336
+ const idKeys: unknown = record["idKeys"] ?? record["id_keys"];
337
+ const descriptionKeys: unknown =
338
+ record["descriptionKeys"] ?? record["description_keys"];
339
+
340
+ out.push({
341
+ schemaUrl: typeof schemaUrl === "string" ? schemaUrl : undefined,
342
+ type: typeof type === "string" ? type : undefined,
343
+ idKeys: this.stringList(idKeys),
344
+ descriptionKeys: this.stringList(descriptionKeys),
345
+ });
346
+ }
347
+
348
+ return out;
349
+ }
350
+
351
+ /**
352
+ * Convenience: just the membership keys to stamp into the `entityKeys`
353
+ * Array(String) column on a signal. Sorted + deduped for a stable
354
+ * column value (which also compresses better in ClickHouse).
355
+ */
356
+ public static extractEntityKeys(data: {
357
+ projectId: string;
358
+ attributes: EntityAttributes;
359
+ entityRefs?: Array<ResourceEntityRef> | undefined;
360
+ }): Array<string> {
361
+ return this.extractEntities(data)
362
+ .map((e: ExtractedEntity) => {
363
+ return e.entityKey;
364
+ })
365
+ .sort();
366
+ }
367
+
368
+ /**
369
+ * Label names promoted from `oneuptime.label.<name>` resource
370
+ * attributes — the suffix after the prefix, trimmed, deduped, sorted.
371
+ * Purely descriptive; never identity-bearing.
372
+ */
373
+ public static extractLabels(attrs: EntityAttributes): Array<string> {
374
+ const seen: Set<string> = new Set<string>();
375
+
376
+ for (const key of Object.keys(attrs || {})) {
377
+ if (!key.startsWith(ONEUPTIME_LABEL_ATTRIBUTE_PREFIX)) {
378
+ continue;
379
+ }
380
+ const labelName: string = key
381
+ .substring(ONEUPTIME_LABEL_ATTRIBUTE_PREFIX.length)
382
+ .trim();
383
+ if (labelName) {
384
+ seen.add(labelName);
385
+ }
386
+ }
387
+
388
+ return Array.from(seen).sort();
389
+ }
390
+
391
+ /*
392
+ * ---- Per-type identity resolvers ----------------------------------
393
+ *
394
+ * Each resolver returns the entity's immutable identifying attribute
395
+ * set, or null when the resource carries no identity for that type.
396
+ * Identity sets are semconv-aligned (see OpenTelemetryEntities.md §1).
397
+ * Composite types (namespace/node/pod/deployment) fold in their parent
398
+ * cluster/namespace identity so e.g. the "default" namespace in two
399
+ * clusters does not collide.
400
+ */
401
+ private static readonly resolvers: Array<
402
+ (
403
+ attrs: EntityAttributes,
404
+ ) => { entityType: EntityType; id: Dictionary<string> } | null
405
+ > = [
406
+ // service — service.name (+ service.namespace if present).
407
+ (attrs: EntityAttributes) => {
408
+ const name: string | null = TelemetryEntity.str(attrs, "service.name");
409
+ if (!name) {
410
+ return null;
411
+ }
412
+ const id: Dictionary<string> = { "service.name": name };
413
+ TelemetryEntity.addIfPresent(id, attrs, "service.namespace");
414
+ return { entityType: EntityType.Service, id };
415
+ },
416
+
417
+ // service.instance — service.name + service.instance.id (+ namespace).
418
+ (attrs: EntityAttributes) => {
419
+ const name: string | null = TelemetryEntity.str(attrs, "service.name");
420
+ const instanceId: string | null = TelemetryEntity.str(
421
+ attrs,
422
+ "service.instance.id",
423
+ );
424
+ if (!name || !instanceId) {
425
+ return null;
426
+ }
427
+ const id: Dictionary<string> = {
428
+ "service.name": name,
429
+ "service.instance.id": instanceId,
430
+ };
431
+ TelemetryEntity.addIfPresent(id, attrs, "service.namespace");
432
+ return { entityType: EntityType.ServiceInstance, id };
433
+ },
434
+
435
+ /*
436
+ * host — keyed on host.name only (canonicalized via computeEntityKey),
437
+ * matching OneUptime's `hostIdentifier` (= canonicalized host.name; see
438
+ * OtelIngestBaseService.autoDiscoverHost / canonicalizeHostName). host.id
439
+ * is deliberately NOT part of host identity: existing Host rows and the
440
+ * host rollup MV (MetricItemAggMV1mByHost) key on host.name, so keying
441
+ * here on host.id would make the host entity key unmatchable on the read
442
+ * side (`TelemetryEntity.keyForHost(hostIdentifier)`). Moving host
443
+ * identity to host.id is a separate, deferred hardening that would
444
+ * migrate the MV and this identity together. A k8s node (which carries
445
+ * k8s.node.name, not host.name, and is rejected by autoDiscoverHost) is
446
+ * cataloged via the dedicated `k8s.node` entity, not as a host.
447
+ */
448
+ (attrs: EntityAttributes) => {
449
+ const hostName: string | null = TelemetryEntity.str(attrs, "host.name");
450
+ if (!hostName) {
451
+ return null;
452
+ }
453
+ return { entityType: EntityType.Host, id: { "host.name": hostName } };
454
+ },
455
+
456
+ // k8s.cluster — k8s.cluster.name only (see k8sClusterIdentity).
457
+ (attrs: EntityAttributes) => {
458
+ const id: Dictionary<string> | null =
459
+ TelemetryEntity.k8sClusterIdentity(attrs);
460
+ return id ? { entityType: EntityType.KubernetesCluster, id } : null;
461
+ },
462
+
463
+ // k8s.namespace — cluster + k8s.namespace.name.
464
+ (attrs: EntityAttributes) => {
465
+ const ns: string | null = TelemetryEntity.str(
466
+ attrs,
467
+ "k8s.namespace.name",
468
+ );
469
+ if (!ns) {
470
+ return null;
471
+ }
472
+ const id: Dictionary<string> = {
473
+ ...(TelemetryEntity.k8sClusterIdentity(attrs) || {}),
474
+ "k8s.namespace.name": ns,
475
+ };
476
+ return { entityType: EntityType.KubernetesNamespace, id };
477
+ },
478
+
479
+ // k8s.node — cluster + k8s.node.uid/k8s.node.name.
480
+ (attrs: EntityAttributes) => {
481
+ const nodeUid: string | null = TelemetryEntity.str(attrs, "k8s.node.uid");
482
+ const nodeName: string | null = TelemetryEntity.str(
483
+ attrs,
484
+ "k8s.node.name",
485
+ );
486
+ if (!nodeUid && !nodeName) {
487
+ return null;
488
+ }
489
+ const id: Dictionary<string> = {
490
+ ...(TelemetryEntity.k8sClusterIdentity(attrs) || {}),
491
+ };
492
+ if (nodeUid) {
493
+ id["k8s.node.uid"] = nodeUid;
494
+ } else if (nodeName) {
495
+ id["k8s.node.name"] = nodeName;
496
+ }
497
+ return { entityType: EntityType.KubernetesNode, id };
498
+ },
499
+
500
+ // k8s.pod — cluster + namespace + k8s.pod.uid/k8s.pod.name.
501
+ (attrs: EntityAttributes) => {
502
+ const podUid: string | null = TelemetryEntity.str(attrs, "k8s.pod.uid");
503
+ const podName: string | null = TelemetryEntity.str(attrs, "k8s.pod.name");
504
+ if (!podUid && !podName) {
505
+ return null;
506
+ }
507
+ const id: Dictionary<string> = {
508
+ ...(TelemetryEntity.k8sClusterIdentity(attrs) || {}),
509
+ };
510
+ TelemetryEntity.addIfPresent(id, attrs, "k8s.namespace.name");
511
+ if (podUid) {
512
+ id["k8s.pod.uid"] = podUid;
513
+ } else if (podName) {
514
+ id["k8s.pod.name"] = podName;
515
+ }
516
+ return { entityType: EntityType.KubernetesPod, id };
517
+ },
518
+
519
+ // k8s.deployment — cluster + namespace + k8s.deployment.name.
520
+ (attrs: EntityAttributes) => {
521
+ const dep: string | null = TelemetryEntity.str(
522
+ attrs,
523
+ "k8s.deployment.name",
524
+ );
525
+ if (!dep) {
526
+ return null;
527
+ }
528
+ const id: Dictionary<string> = {
529
+ ...(TelemetryEntity.k8sClusterIdentity(attrs) || {}),
530
+ };
531
+ TelemetryEntity.addIfPresent(id, attrs, "k8s.namespace.name");
532
+ id["k8s.deployment.name"] = dep;
533
+ return { entityType: EntityType.KubernetesDeployment, id };
534
+ },
535
+
536
+ /*
537
+ * container — container.id. High-churn: flows as a membership key but
538
+ * is membership-only by default (not promoted to a registry row
539
+ * unless a project opts in — see OpenTelemetryEntities.md Edge Cases).
540
+ */
541
+ (attrs: EntityAttributes) => {
542
+ const containerId: string | null = TelemetryEntity.str(
543
+ attrs,
544
+ "container.id",
545
+ );
546
+ return containerId
547
+ ? {
548
+ entityType: EntityType.Container,
549
+ id: { "container.id": containerId },
550
+ }
551
+ : null;
552
+ },
553
+
554
+ /*
555
+ * process — host identity + process.pid (+ process.start_time if
556
+ * present, which disambiguates pid reuse). High-churn: membership-only
557
+ * by default, same as container.
558
+ */
559
+ (attrs: EntityAttributes) => {
560
+ const pid: string | null = TelemetryEntity.str(attrs, "process.pid");
561
+ if (!pid) {
562
+ return null;
563
+ }
564
+ const id: Dictionary<string> = { "process.pid": pid };
565
+ const hostId: string | null = TelemetryEntity.str(attrs, "host.id");
566
+ const hostName: string | null = TelemetryEntity.str(attrs, "host.name");
567
+ if (hostId) {
568
+ id["host.id"] = hostId;
569
+ } else if (hostName) {
570
+ id["host.name"] = hostName;
571
+ }
572
+ TelemetryEntity.addIfPresent(id, attrs, "process.start_time");
573
+ return { entityType: EntityType.Process, id };
574
+ },
575
+
576
+ /*
577
+ * telemetry.sdk — telemetry.sdk.name (+ language). Low value as a
578
+ * first-class entity; membership-only. Very low cardinality.
579
+ */
580
+ (attrs: EntityAttributes) => {
581
+ const sdkName: string | null = TelemetryEntity.str(
582
+ attrs,
583
+ "telemetry.sdk.name",
584
+ );
585
+ if (!sdkName) {
586
+ return null;
587
+ }
588
+ const id: Dictionary<string> = { "telemetry.sdk.name": sdkName };
589
+ TelemetryEntity.addIfPresent(id, attrs, "telemetry.sdk.language");
590
+ return { entityType: EntityType.TelemetrySdk, id };
591
+ },
592
+ ];
593
+
594
+ /*
595
+ * OTLP `entity_refs.type` values are the same semconv-style dotted
596
+ * names our EntityType enum uses as values ("service", "host",
597
+ * "k8s.pod", ...), so the map is just value → enum member. Unknown
598
+ * types are skipped by the caller.
599
+ */
600
+ private static readonly entityTypeByRefType: Map<string, EntityType> =
601
+ new Map(
602
+ Object.values(EntityType).map((entityType: EntityType) => {
603
+ return [String(entityType), entityType];
604
+ }),
605
+ );
606
+
607
+ /*
608
+ * Attributes our model treats as mutable/descriptive (image tag,
609
+ * version, IP, command line, ...). Advisory only: when a producer's
610
+ * entity_ref declares one as identifying we honor it but log a
611
+ * cardinality warning (see OpenTelemetryEntities.md, Edge Cases).
612
+ */
613
+ private static readonly knownMutableAttributeKeys: ReadonlySet<string> =
614
+ new Set([
615
+ "service.version",
616
+ "telemetry.sdk.version",
617
+ "host.ip",
618
+ "host.image.id",
619
+ "os.version",
620
+ "os.description",
621
+ "container.image.tag",
622
+ "container.image.tags",
623
+ "container.image.id",
624
+ "process.command_line",
625
+ "process.command_args",
626
+ ]);
627
+
628
+ /*
629
+ * Per-type descriptive allowlists (heuristic path). Deliberately tiny
630
+ * (<= ~6 keys each): the registry merges these last-writer-wins, so
631
+ * only stable, dashboard-worthy metadata belongs here. Types not
632
+ * listed emit no descriptive attributes.
633
+ */
634
+ private static readonly descriptiveAttributeKeysByType: Partial<
635
+ Record<EntityType, Array<string>>
636
+ > = {
637
+ [EntityType.Host]: [
638
+ "os.type",
639
+ "host.arch",
640
+ "cloud.provider",
641
+ "cloud.region",
642
+ "cloud.availability_zone",
643
+ ],
644
+ [EntityType.Service]: [
645
+ "telemetry.sdk.language",
646
+ "telemetry.sdk.name",
647
+ "telemetry.sdk.version",
648
+ ],
649
+ [EntityType.KubernetesNode]: ["node.kubernetes.io/instance-type"],
650
+ [EntityType.Container]: [
651
+ "container.image.name",
652
+ "container.image.tag",
653
+ "container.image.tags",
654
+ ],
655
+ };
656
+
657
+ private static descriptiveAttributesFor(
658
+ entityType: EntityType,
659
+ attrs: EntityAttributes,
660
+ ): Record<string, string> {
661
+ const out: Record<string, string> = {};
662
+ const keys: Array<string> | undefined =
663
+ this.descriptiveAttributeKeysByType[entityType];
664
+
665
+ if (!keys) {
666
+ return out;
667
+ }
668
+
669
+ for (const key of keys) {
670
+ const value: string | null = this.strOrFirst(attrs, key);
671
+ if (value) {
672
+ out[key] = value;
673
+ }
674
+ }
675
+
676
+ return out;
677
+ }
678
+
679
+ /**
680
+ * Like `str`, but additionally accepts an array-valued attribute by
681
+ * taking its first scalar element (e.g. semconv `container.image.tags`
682
+ * is an array). Descriptive use only — identity stays scalar-strict.
683
+ */
684
+ private static strOrFirst(
685
+ attrs: EntityAttributes,
686
+ key: string,
687
+ ): string | null {
688
+ const direct: string | null = this.str(attrs, key);
689
+ if (direct) {
690
+ return direct;
691
+ }
692
+
693
+ const value: EntityAttributeValue | Array<EntityAttributeValue> = attrs
694
+ ? attrs[key]
695
+ : undefined;
696
+
697
+ if (Array.isArray(value)) {
698
+ for (const item of value) {
699
+ if (typeof item === "string" && item.trim().length > 0) {
700
+ return item.trim();
701
+ }
702
+ if (typeof item === "number" || typeof item === "boolean") {
703
+ return String(item);
704
+ }
705
+ }
706
+ }
707
+
708
+ return null;
709
+ }
710
+
711
+ private static stringList(value: unknown): Array<string> {
712
+ if (!Array.isArray(value)) {
713
+ return [];
714
+ }
715
+ return value.filter((item: unknown): item is string => {
716
+ return typeof item === "string" && item.trim().length > 0;
717
+ });
718
+ }
719
+
720
+ /*
721
+ * k8s cluster identity — k8s.cluster.name only, for the same reason host
722
+ * identity is host.name-only (see the host resolver above): the typed
723
+ * Postgres row (KubernetesCluster.clusterIdentifier) and the
724
+ * primary-entity discovery path (getClusterNameFromAttributes) are
725
+ * name-based, so a uid-keyed entity would be unmatchable by the read
726
+ * side (`EntityKey.keyForKubernetesCluster(clusterIdentifier)`).
727
+ * uid-based cluster identity is deferred alongside the host.id
728
+ * hardening. This identity is also folded into the composite k8s
729
+ * namespace/node/pod/deployment identities, which must stay name-based
730
+ * with it.
731
+ */
732
+ private static k8sClusterIdentity(
733
+ attrs: EntityAttributes,
734
+ ): Dictionary<string> | null {
735
+ const name: string | null = this.str(attrs, "k8s.cluster.name");
736
+ if (name) {
737
+ return { "k8s.cluster.name": name };
738
+ }
739
+ return null;
740
+ }
741
+
742
+ /** Copy `key` from attrs into `id` (canonicalized) when scalar & present. */
743
+ private static addIfPresent(
744
+ id: Dictionary<string>,
745
+ attrs: EntityAttributes,
746
+ key: string,
747
+ ): void {
748
+ const value: string | null = this.str(attrs, key);
749
+ if (value) {
750
+ id[key] = value;
751
+ }
752
+ }
753
+
754
+ /**
755
+ * Read a scalar attribute as a trimmed string. Numbers/booleans coerce;
756
+ * null/undefined/empty/arrays/objects return null (not identity-bearing).
757
+ */
758
+ private static str(attrs: EntityAttributes, key: string): string | null {
759
+ const value: EntityAttributeValue | Array<EntityAttributeValue> = attrs
760
+ ? attrs[key]
761
+ : undefined;
762
+
763
+ if (value === undefined || value === null) {
764
+ return null;
765
+ }
766
+ if (typeof value === "string") {
767
+ const trimmed: string = value.trim();
768
+ return trimmed.length > 0 ? trimmed : null;
769
+ }
770
+ if (typeof value === "number" || typeof value === "boolean") {
771
+ return String(value);
772
+ }
773
+ return null;
774
+ }
775
+
776
+ private static canonObject(id: Dictionary<string>): Dictionary<string> {
777
+ const out: Dictionary<string> = {};
778
+ for (const key of Object.keys(id)) {
779
+ out[key] = canonicalizeEntityValue(id[key]);
780
+ }
781
+ return out;
782
+ }
783
+ }