unleash-server 7.2.1 → 7.2.3

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 (385) hide show
  1. package/README.md +21 -10
  2. package/dist/lib/db/feature-environment-store.d.ts +1 -1
  3. package/dist/lib/db/feature-environment-store.d.ts.map +1 -1
  4. package/dist/lib/db/feature-environment-store.js +42 -35
  5. package/dist/lib/db/feature-environment-store.js.map +1 -1
  6. package/dist/lib/db/index.d.ts.map +1 -1
  7. package/dist/lib/db/index.js +2 -0
  8. package/dist/lib/db/index.js.map +1 -1
  9. package/dist/lib/error/unleash-error.d.ts.map +1 -1
  10. package/dist/lib/error/unleash-error.js +2 -2
  11. package/dist/lib/error/unleash-error.js.map +1 -1
  12. package/dist/lib/events/index.d.ts +7 -1
  13. package/dist/lib/events/index.d.ts.map +1 -1
  14. package/dist/lib/events/index.js +12 -0
  15. package/dist/lib/events/index.js.map +1 -1
  16. package/dist/lib/features/api-tokens/createApiTokenService.d.ts +2 -0
  17. package/dist/lib/features/api-tokens/createApiTokenService.d.ts.map +1 -1
  18. package/dist/lib/features/api-tokens/createApiTokenService.js +6 -2
  19. package/dist/lib/features/api-tokens/createApiTokenService.js.map +1 -1
  20. package/dist/lib/features/client-feature-toggles/client-feature-toggle.controller.d.ts.map +1 -1
  21. package/dist/lib/features/client-feature-toggles/client-feature-toggle.controller.js +2 -9
  22. package/dist/lib/features/client-feature-toggles/client-feature-toggle.controller.js.map +1 -1
  23. package/dist/lib/features/dependent-features/dependent.features.e2e.test.js +28 -29
  24. package/dist/lib/features/dependent-features/dependent.features.e2e.test.js.map +1 -1
  25. package/dist/lib/features/feature-toggle/createFeatureToggleService.d.ts.map +1 -1
  26. package/dist/lib/features/feature-toggle/createFeatureToggleService.js +14 -4
  27. package/dist/lib/features/feature-toggle/createFeatureToggleService.js.map +1 -1
  28. package/dist/lib/features/feature-toggle/fakes/fake-feature-strategies-store.d.ts.map +1 -1
  29. package/dist/lib/features/feature-toggle/fakes/fake-feature-strategies-store.js +2 -1
  30. package/dist/lib/features/feature-toggle/fakes/fake-feature-strategies-store.js.map +1 -1
  31. package/dist/lib/features/feature-toggle/feature-toggle-service.d.ts +9 -3
  32. package/dist/lib/features/feature-toggle/feature-toggle-service.d.ts.map +1 -1
  33. package/dist/lib/features/feature-toggle/feature-toggle-service.js +23 -7
  34. package/dist/lib/features/feature-toggle/feature-toggle-service.js.map +1 -1
  35. package/dist/lib/features/feature-toggle/feature-toggle-strategies-store.d.ts.map +1 -1
  36. package/dist/lib/features/feature-toggle/feature-toggle-strategies-store.js +3 -3
  37. package/dist/lib/features/feature-toggle/feature-toggle-strategies-store.js.map +1 -1
  38. package/dist/lib/features/feature-toggle/tests/feature-toggles.e2e.test.js +34 -35
  39. package/dist/lib/features/feature-toggle/tests/feature-toggles.e2e.test.js.map +1 -1
  40. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.js +1 -1
  41. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.js.map +1 -1
  42. package/dist/lib/features/metrics/impact/batch-histogram.d.ts +36 -0
  43. package/dist/lib/features/metrics/impact/batch-histogram.d.ts.map +1 -0
  44. package/dist/lib/features/metrics/impact/batch-histogram.js +87 -0
  45. package/dist/lib/features/metrics/impact/batch-histogram.js.map +1 -0
  46. package/dist/lib/features/metrics/impact/batch-histogram.test.d.ts +2 -0
  47. package/dist/lib/features/metrics/impact/batch-histogram.test.d.ts.map +1 -0
  48. package/dist/lib/features/metrics/impact/batch-histogram.test.js +137 -0
  49. package/dist/lib/features/metrics/impact/batch-histogram.test.js.map +1 -0
  50. package/dist/lib/features/metrics/impact/define-impact-metrics.d.ts +2 -0
  51. package/dist/lib/features/metrics/impact/define-impact-metrics.d.ts.map +1 -1
  52. package/dist/lib/features/metrics/impact/define-impact-metrics.js +4 -0
  53. package/dist/lib/features/metrics/impact/define-impact-metrics.js.map +1 -1
  54. package/dist/lib/features/metrics/impact/impact-metrics.e2e.test.js +49 -0
  55. package/dist/lib/features/metrics/impact/impact-metrics.e2e.test.js.map +1 -1
  56. package/dist/lib/features/metrics/impact/metrics-translator.d.ts +22 -4
  57. package/dist/lib/features/metrics/impact/metrics-translator.d.ts.map +1 -1
  58. package/dist/lib/features/metrics/impact/metrics-translator.js +58 -2
  59. package/dist/lib/features/metrics/impact/metrics-translator.js.map +1 -1
  60. package/dist/lib/features/metrics/impact/metrics-translator.test.js +83 -0
  61. package/dist/lib/features/metrics/impact/metrics-translator.test.js.map +1 -1
  62. package/dist/lib/features/metrics/shared/schema.d.ts +1 -0
  63. package/dist/lib/features/metrics/shared/schema.d.ts.map +1 -1
  64. package/dist/lib/features/metrics/shared/schema.js +27 -1
  65. package/dist/lib/features/metrics/shared/schema.js.map +1 -1
  66. package/dist/lib/features/project/createProjectService.d.ts.map +1 -1
  67. package/dist/lib/features/project/createProjectService.js +7 -5
  68. package/dist/lib/features/project/createProjectService.js.map +1 -1
  69. package/dist/lib/features/project/project-service.d.ts +3 -2
  70. package/dist/lib/features/project/project-service.d.ts.map +1 -1
  71. package/dist/lib/features/project/project-service.js +4 -3
  72. package/dist/lib/features/project/project-service.js.map +1 -1
  73. package/dist/lib/features/release-plans/release-plan-milestone-store.d.ts +2 -2
  74. package/dist/lib/features/release-plans/release-plan-milestone-store.d.ts.map +1 -1
  75. package/dist/lib/features/release-plans/release-plan-milestone-store.js +3 -0
  76. package/dist/lib/features/release-plans/release-plan-milestone-store.js.map +1 -1
  77. package/dist/lib/features/release-plans/release-plan-milestone.d.ts +6 -0
  78. package/dist/lib/features/release-plans/release-plan-milestone.d.ts.map +1 -1
  79. package/dist/lib/features/release-plans/release-plan-read-model-type.d.ts +5 -0
  80. package/dist/lib/features/release-plans/release-plan-read-model-type.d.ts.map +1 -0
  81. package/dist/lib/features/release-plans/release-plan-read-model-type.js +2 -0
  82. package/dist/lib/features/release-plans/release-plan-read-model-type.js.map +1 -0
  83. package/dist/lib/features/release-plans/release-plan-read-model.d.ts +11 -0
  84. package/dist/lib/features/release-plans/release-plan-read-model.d.ts.map +1 -0
  85. package/dist/lib/features/release-plans/release-plan-read-model.js +133 -0
  86. package/dist/lib/features/release-plans/release-plan-read-model.js.map +1 -0
  87. package/dist/lib/features/release-plans/release-plan-read-model.test.d.ts +2 -0
  88. package/dist/lib/features/release-plans/release-plan-read-model.test.d.ts.map +1 -0
  89. package/dist/lib/features/release-plans/release-plan-read-model.test.js +166 -0
  90. package/dist/lib/features/release-plans/release-plan-read-model.test.js.map +1 -0
  91. package/dist/lib/features/release-plans/release-plan-store.d.ts +1 -1
  92. package/dist/lib/features/release-plans/release-plan-store.d.ts.map +1 -1
  93. package/dist/lib/features/release-plans/release-plan-store.js +16 -15
  94. package/dist/lib/features/release-plans/release-plan-store.js.map +1 -1
  95. package/dist/lib/features/release-plans/release-plan-template.d.ts +2 -2
  96. package/dist/lib/features/release-plans/release-plan-template.d.ts.map +1 -1
  97. package/dist/lib/features/release-plans/release-plan.d.ts +1 -1
  98. package/dist/lib/features/release-plans/release-plan.d.ts.map +1 -1
  99. package/dist/lib/features/resource-limits/resource-limits-service.d.ts +8 -0
  100. package/dist/lib/features/resource-limits/resource-limits-service.d.ts.map +1 -0
  101. package/dist/lib/features/resource-limits/resource-limits-service.js +9 -0
  102. package/dist/lib/features/resource-limits/resource-limits-service.js.map +1 -0
  103. package/dist/lib/features/segment/createSegmentService.d.ts.map +1 -1
  104. package/dist/lib/features/segment/createSegmentService.js +5 -3
  105. package/dist/lib/features/segment/createSegmentService.js.map +1 -1
  106. package/dist/lib/features/segment/segment-service.d.ts +3 -2
  107. package/dist/lib/features/segment/segment-service.d.ts.map +1 -1
  108. package/dist/lib/features/segment/segment-service.js +3 -3
  109. package/dist/lib/features/segment/segment-service.js.map +1 -1
  110. package/dist/lib/features/users/user-store.d.ts +2 -0
  111. package/dist/lib/features/users/user-store.d.ts.map +1 -1
  112. package/dist/lib/features/users/user-store.js +3 -2
  113. package/dist/lib/features/users/user-store.js.map +1 -1
  114. package/dist/lib/features/users/user-updates-read-model.d.ts +27 -0
  115. package/dist/lib/features/users/user-updates-read-model.d.ts.map +1 -0
  116. package/dist/lib/features/users/user-updates-read-model.js +68 -0
  117. package/dist/lib/features/users/user-updates-read-model.js.map +1 -0
  118. package/dist/lib/features/users/user-updates-read-model.test.d.ts +2 -0
  119. package/dist/lib/features/users/user-updates-read-model.test.d.ts.map +1 -0
  120. package/dist/lib/features/users/user-updates-read-model.test.js +50 -0
  121. package/dist/lib/features/users/user-updates-read-model.test.js.map +1 -0
  122. package/dist/lib/metrics.d.ts.map +1 -1
  123. package/dist/lib/metrics.js +8 -6
  124. package/dist/lib/metrics.js.map +1 -1
  125. package/dist/lib/openapi/spec/bulk-metrics-schema.d.ts +126 -39
  126. package/dist/lib/openapi/spec/bulk-metrics-schema.d.ts.map +1 -1
  127. package/dist/lib/openapi/spec/event-schema.d.ts +1 -1
  128. package/dist/lib/openapi/spec/event-search-response-schema.d.ts +1 -1
  129. package/dist/lib/openapi/spec/events-schema.d.ts +1 -1
  130. package/dist/lib/openapi/spec/export-result-schema.d.ts +12304 -1250
  131. package/dist/lib/openapi/spec/export-result-schema.d.ts.map +1 -1
  132. package/dist/lib/openapi/spec/export-result-schema.js +12 -0
  133. package/dist/lib/openapi/spec/export-result-schema.js.map +1 -1
  134. package/dist/lib/openapi/spec/feature-environment-schema.d.ts +2767 -0
  135. package/dist/lib/openapi/spec/feature-environment-schema.d.ts.map +1 -1
  136. package/dist/lib/openapi/spec/feature-environment-schema.js +19 -0
  137. package/dist/lib/openapi/spec/feature-environment-schema.js.map +1 -1
  138. package/dist/lib/openapi/spec/feature-events-schema.d.ts +1 -1
  139. package/dist/lib/openapi/spec/feature-schema.d.ts +5808 -281
  140. package/dist/lib/openapi/spec/feature-schema.d.ts.map +1 -1
  141. package/dist/lib/openapi/spec/feature-schema.js +12 -0
  142. package/dist/lib/openapi/spec/feature-schema.js.map +1 -1
  143. package/dist/lib/openapi/spec/feature-search-environment-schema.d.ts +5613 -79
  144. package/dist/lib/openapi/spec/feature-search-environment-schema.d.ts.map +1 -1
  145. package/dist/lib/openapi/spec/feature-search-environment-schema.js +12 -0
  146. package/dist/lib/openapi/spec/feature-search-environment-schema.js.map +1 -1
  147. package/dist/lib/openapi/spec/feature-search-query-parameters.d.ts +2 -1
  148. package/dist/lib/openapi/spec/feature-search-query-parameters.d.ts.map +1 -1
  149. package/dist/lib/openapi/spec/feature-search-query-parameters.js +2 -1
  150. package/dist/lib/openapi/spec/feature-search-query-parameters.js.map +1 -1
  151. package/dist/lib/openapi/spec/feature-search-response-schema.d.ts +5613 -79
  152. package/dist/lib/openapi/spec/feature-search-response-schema.d.ts.map +1 -1
  153. package/dist/lib/openapi/spec/health-overview-schema.d.ts +11432 -605
  154. package/dist/lib/openapi/spec/health-overview-schema.d.ts.map +1 -1
  155. package/dist/lib/openapi/spec/health-overview-schema.js +8 -0
  156. package/dist/lib/openapi/spec/health-overview-schema.js.map +1 -1
  157. package/dist/lib/openapi/spec/health-report-schema.d.ts +11432 -605
  158. package/dist/lib/openapi/spec/health-report-schema.d.ts.map +1 -1
  159. package/dist/lib/openapi/spec/impact-metrics-schema.d.ts +126 -39
  160. package/dist/lib/openapi/spec/impact-metrics-schema.d.ts.map +1 -1
  161. package/dist/lib/openapi/spec/impact-metrics-schema.js +128 -39
  162. package/dist/lib/openapi/spec/impact-metrics-schema.js.map +1 -1
  163. package/dist/lib/openapi/spec/import-toggles-schema.d.ts +24822 -2714
  164. package/dist/lib/openapi/spec/import-toggles-schema.d.ts.map +1 -1
  165. package/dist/lib/openapi/spec/import-toggles-schema.js +12 -0
  166. package/dist/lib/openapi/spec/import-toggles-schema.js.map +1 -1
  167. package/dist/lib/openapi/spec/index.d.ts +6 -0
  168. package/dist/lib/openapi/spec/index.d.ts.map +1 -1
  169. package/dist/lib/openapi/spec/index.js +6 -0
  170. package/dist/lib/openapi/spec/index.js.map +1 -1
  171. package/dist/lib/openapi/spec/integration-event-schema.d.ts +1 -1
  172. package/dist/lib/openapi/spec/integration-events-schema.d.ts +2 -2
  173. package/dist/lib/openapi/spec/patch-schema.d.ts +1 -1
  174. package/dist/lib/openapi/spec/patch-schema.js +1 -1
  175. package/dist/lib/openapi/spec/patch-schema.js.map +1 -1
  176. package/dist/lib/openapi/spec/patches-schema.d.ts +1 -1
  177. package/dist/lib/openapi/spec/profile-schema.d.ts +5808 -281
  178. package/dist/lib/openapi/spec/profile-schema.d.ts.map +1 -1
  179. package/dist/lib/openapi/spec/project-overview-schema.d.ts +11641 -814
  180. package/dist/lib/openapi/spec/project-overview-schema.d.ts.map +1 -1
  181. package/dist/lib/openapi/spec/project-overview-schema.js +8 -0
  182. package/dist/lib/openapi/spec/project-overview-schema.js.map +1 -1
  183. package/dist/lib/openapi/spec/release-plan-milestone-schema.d.ts +716 -0
  184. package/dist/lib/openapi/spec/release-plan-milestone-schema.d.ts.map +1 -0
  185. package/dist/lib/openapi/spec/release-plan-milestone-schema.js +72 -0
  186. package/dist/lib/openapi/spec/release-plan-milestone-schema.js.map +1 -0
  187. package/dist/lib/openapi/spec/release-plan-milestone-strategy-schema.d.ts +361 -0
  188. package/dist/lib/openapi/spec/release-plan-milestone-strategy-schema.d.ts.map +1 -0
  189. package/dist/lib/openapi/spec/release-plan-milestone-strategy-schema.js +40 -0
  190. package/dist/lib/openapi/spec/release-plan-milestone-strategy-schema.js.map +1 -0
  191. package/dist/lib/openapi/spec/release-plan-schema.d.ts +1449 -0
  192. package/dist/lib/openapi/spec/release-plan-schema.d.ts.map +1 -0
  193. package/dist/lib/openapi/spec/release-plan-schema.js +74 -0
  194. package/dist/lib/openapi/spec/release-plan-schema.js.map +1 -0
  195. package/dist/lib/openapi/spec/release-plan-template-id-schema.d.ts +19 -0
  196. package/dist/lib/openapi/spec/release-plan-template-id-schema.d.ts.map +1 -0
  197. package/dist/lib/openapi/spec/release-plan-template-id-schema.js +17 -0
  198. package/dist/lib/openapi/spec/release-plan-template-id-schema.js.map +1 -0
  199. package/dist/lib/openapi/spec/release-plan-template-schema.d.ts +1434 -0
  200. package/dist/lib/openapi/spec/release-plan-template-schema.d.ts.map +1 -0
  201. package/dist/lib/openapi/spec/release-plan-template-schema.js +79 -0
  202. package/dist/lib/openapi/spec/release-plan-template-schema.js.map +1 -0
  203. package/dist/lib/openapi/spec/search-features-schema.d.ts +11793 -725
  204. package/dist/lib/openapi/spec/search-features-schema.d.ts.map +1 -1
  205. package/dist/lib/openapi/spec/transition-condition-schema.d.ts +19 -0
  206. package/dist/lib/openapi/spec/transition-condition-schema.d.ts.map +1 -0
  207. package/dist/lib/openapi/spec/transition-condition-schema.js +17 -0
  208. package/dist/lib/openapi/spec/transition-condition-schema.js.map +1 -0
  209. package/dist/lib/routes/admin-api/index.js +2 -2
  210. package/dist/lib/routes/admin-api/index.js.map +1 -1
  211. package/dist/lib/routes/backstage.test.js +17 -5
  212. package/dist/lib/routes/backstage.test.js.map +1 -1
  213. package/dist/lib/routes/util.d.ts.map +1 -1
  214. package/dist/lib/routes/util.js +19 -1
  215. package/dist/lib/routes/util.js.map +1 -1
  216. package/dist/lib/server-impl.d.ts +8 -3
  217. package/dist/lib/server-impl.d.ts.map +1 -1
  218. package/dist/lib/server-impl.js +5 -1
  219. package/dist/lib/server-impl.js.map +1 -1
  220. package/dist/lib/services/api-token-service.d.ts +3 -2
  221. package/dist/lib/services/api-token-service.d.ts.map +1 -1
  222. package/dist/lib/services/api-token-service.js +3 -3
  223. package/dist/lib/services/api-token-service.js.map +1 -1
  224. package/dist/lib/services/index.d.ts +5 -1
  225. package/dist/lib/services/index.d.ts.map +1 -1
  226. package/dist/lib/services/index.js +16 -2
  227. package/dist/lib/services/index.js.map +1 -1
  228. package/dist/lib/services/user-service.d.ts.map +1 -1
  229. package/dist/lib/services/user-service.js +19 -3
  230. package/dist/lib/services/user-service.js.map +1 -1
  231. package/dist/lib/types/events.d.ts +41 -0
  232. package/dist/lib/types/events.d.ts.map +1 -1
  233. package/dist/lib/types/events.js +29 -1
  234. package/dist/lib/types/events.js.map +1 -1
  235. package/dist/lib/types/experimental.d.ts +3 -1
  236. package/dist/lib/types/experimental.d.ts.map +1 -1
  237. package/dist/lib/types/experimental.js +7 -6
  238. package/dist/lib/types/experimental.js.map +1 -1
  239. package/dist/lib/types/stores/feature-environment-store.d.ts +1 -1
  240. package/dist/lib/types/stores/feature-environment-store.d.ts.map +1 -1
  241. package/dist/lib/types/stores.d.ts +2 -0
  242. package/dist/lib/types/stores.d.ts.map +1 -1
  243. package/dist/lib/types/stores.js.map +1 -1
  244. package/dist/lib/ui-config/ui-config-controller.d.ts +24 -0
  245. package/dist/lib/ui-config/ui-config-controller.d.ts.map +1 -0
  246. package/dist/lib/{routes/admin-api/config.js → ui-config/ui-config-controller.js} +21 -17
  247. package/dist/lib/ui-config/ui-config-controller.js.map +1 -0
  248. package/dist/lib/ui-config/ui-config-service.d.ts +18 -0
  249. package/dist/lib/ui-config/ui-config-service.d.ts.map +1 -0
  250. package/dist/lib/ui-config/ui-config-service.js +64 -0
  251. package/dist/lib/ui-config/ui-config-service.js.map +1 -0
  252. package/dist/lib/ui-config/ui-config.test.d.ts +2 -0
  253. package/dist/lib/ui-config/ui-config.test.d.ts.map +1 -0
  254. package/dist/lib/{routes/admin-api/config.test.js → ui-config/ui-config.test.js} +6 -6
  255. package/dist/lib/ui-config/ui-config.test.js.map +1 -0
  256. package/dist/lib/util/metrics/createGauge.d.ts +17 -1
  257. package/dist/lib/util/metrics/createGauge.d.ts.map +1 -1
  258. package/dist/lib/util/metrics/createGauge.js +49 -4
  259. package/dist/lib/util/metrics/createGauge.js.map +1 -1
  260. package/dist/lib/util/random-id.js +2 -2
  261. package/dist/lib/util/random-id.js.map +1 -1
  262. package/dist/lib/util/random-id.test.d.ts +2 -0
  263. package/dist/lib/util/random-id.test.d.ts.map +1 -0
  264. package/dist/lib/util/random-id.test.js +7 -0
  265. package/dist/lib/util/random-id.test.js.map +1 -0
  266. package/dist/migrations/20210218090213-generate-server-identifier.js +2 -2
  267. package/dist/migrations/20210218090213-generate-server-identifier.js.map +1 -1
  268. package/dist/migrations/20210615115226-migrate-strategies-to-feature-strategies.js +2 -2
  269. package/dist/migrations/20210615115226-migrate-strategies-to-feature-strategies.js.map +1 -1
  270. package/dist/migrations/20250923130348-add-users-updated-at.d.ts +3 -0
  271. package/dist/migrations/20250923130348-add-users-updated-at.d.ts.map +1 -0
  272. package/dist/migrations/20250923130348-add-users-updated-at.js +40 -0
  273. package/dist/migrations/20250923130348-add-users-updated-at.js.map +1 -0
  274. package/dist/migrations/20251002095623-not-null-constraints.d.ts +3 -0
  275. package/dist/migrations/20251002095623-not-null-constraints.d.ts.map +1 -0
  276. package/dist/migrations/20251002095623-not-null-constraints.js +20 -0
  277. package/dist/migrations/20251002095623-not-null-constraints.js.map +1 -0
  278. package/dist/migrations/20251003105758-add-milestone-started-at.d.ts +3 -0
  279. package/dist/migrations/20251003105758-add-milestone-started-at.d.ts.map +1 -0
  280. package/dist/migrations/20251003105758-add-milestone-started-at.js +8 -0
  281. package/dist/migrations/20251003105758-add-milestone-started-at.js.map +1 -0
  282. package/dist/migrations/20251006111609-add-milestone-progressions.d.ts +3 -0
  283. package/dist/migrations/20251006111609-add-milestone-progressions.d.ts.map +1 -0
  284. package/dist/migrations/20251006111609-add-milestone-progressions.js +15 -0
  285. package/dist/migrations/20251006111609-add-milestone-progressions.js.map +1 -0
  286. package/dist/migrations/20251009081052-add-milestone-progression-executed-at.d.ts +3 -0
  287. package/dist/migrations/20251009081052-add-milestone-progression-executed-at.d.ts.map +1 -0
  288. package/dist/migrations/20251009081052-add-milestone-progression-executed-at.js +14 -0
  289. package/dist/migrations/20251009081052-add-milestone-progression-executed-at.js.map +1 -0
  290. package/dist/migrations/20251009132935-add-edge-node-presence.d.ts +3 -0
  291. package/dist/migrations/20251009132935-add-edge-node-presence.d.ts.map +1 -0
  292. package/dist/migrations/20251009132935-add-edge-node-presence.js +29 -0
  293. package/dist/migrations/20251009132935-add-edge-node-presence.js.map +1 -0
  294. package/dist/migrations/20251013131405-milestone-progression-uniqueness.d.ts +3 -0
  295. package/dist/migrations/20251013131405-milestone-progression-uniqueness.d.ts.map +1 -0
  296. package/dist/migrations/20251013131405-milestone-progression-uniqueness.js +9 -0
  297. package/dist/migrations/20251013131405-milestone-progression-uniqueness.js.map +1 -0
  298. package/dist/server-dev.js +7 -1
  299. package/dist/server-dev.js.map +1 -1
  300. package/dist/test/e2e/api/admin/context.e2e.test.js +2 -3
  301. package/dist/test/e2e/api/admin/context.e2e.test.js.map +1 -1
  302. package/dist/test/e2e/api/admin/user-admin.e2e.test.js +2 -3
  303. package/dist/test/e2e/api/admin/user-admin.e2e.test.js.map +1 -1
  304. package/dist/test/e2e/api/client/feature.optimal304.e2e.test.js +17 -41
  305. package/dist/test/e2e/api/client/feature.optimal304.e2e.test.js.map +1 -1
  306. package/dist/test/e2e/helpers/database-init.js +2 -2
  307. package/dist/test/e2e/helpers/database-init.js.map +1 -1
  308. package/dist/test/e2e/services/user-service.e2e.test.js +129 -99
  309. package/dist/test/e2e/services/user-service.e2e.test.js.map +1 -1
  310. package/dist/test/e2e/stores/feature-environment-store.e2e.test.js +3 -1
  311. package/dist/test/e2e/stores/feature-environment-store.e2e.test.js.map +1 -1
  312. package/dist/test/e2e/users/user-store.e2e.test.d.ts.map +1 -0
  313. package/dist/test/e2e/users/user-store.e2e.test.js.map +1 -0
  314. package/dist/test/e2e/users/user-updates-read-model.e2e.test.d.ts +2 -0
  315. package/dist/test/e2e/users/user-updates-read-model.e2e.test.d.ts.map +1 -0
  316. package/dist/test/e2e/users/user-updates-read-model.e2e.test.js +88 -0
  317. package/dist/test/e2e/users/user-updates-read-model.e2e.test.js.map +1 -0
  318. package/dist/test/fixtures/fake/fake-release-plan-read-model.d.ts +8 -0
  319. package/dist/test/fixtures/fake/fake-release-plan-read-model.d.ts.map +1 -0
  320. package/dist/test/fixtures/fake/fake-release-plan-read-model.js +9 -0
  321. package/dist/test/fixtures/fake/fake-release-plan-read-model.js.map +1 -0
  322. package/dist/test/fixtures/store.d.ts.map +1 -1
  323. package/dist/test/fixtures/store.js +1 -0
  324. package/dist/test/fixtures/store.js.map +1 -1
  325. package/frontend/build/index.html +1 -1
  326. package/frontend/build/static/{AdvancedPlayground-CUkOz1YF.js → AdvancedPlayground-HWcSRQrt.js} +1 -1
  327. package/frontend/build/static/BackendConnections-Cug76pb0.js +1 -0
  328. package/frontend/build/static/{CreateProject-COHPsP3X.js → CreateProject-3uUrdDWJ.js} +1 -1
  329. package/frontend/build/static/FeatureMetricsChart-DLvE4xPU.js +2 -0
  330. package/frontend/build/static/FeatureStaleDialog-BFWmPzw7.js +7 -0
  331. package/frontend/build/static/FeatureViewLazyExport-DfivW7sC.js +10 -0
  332. package/frontend/build/static/{FlagMetricsChart-D0GI-ltv.js → FlagMetricsChart-DFDJ4xPh.js} +2 -2
  333. package/frontend/build/static/FrontendNetworkTrafficUsage-DVa2I8CC.js +1 -0
  334. package/frontend/build/static/GridLayoutWrapper-Mt7n_5lt.js +3 -0
  335. package/frontend/build/static/ImpactMetricsPage-B3ERxAH0.js +1 -0
  336. package/frontend/build/static/LazyAdminExport-s8FIvcqq.js +38 -0
  337. package/frontend/build/static/LazyProjectExport-DN00bJrc.js +728 -0
  338. package/frontend/build/static/{LifecycleChartComponent-BigwXcU3.js → LifecycleChartComponent-BOcT_Zpy.js} +3 -3
  339. package/frontend/build/static/LineChartComponent-CudSs6ri.js +1 -0
  340. package/frontend/build/static/{MarkCompletedDialogue-CS-kM4vW.js → MarkCompletedDialogue-4XT7ryE9.js} +1 -1
  341. package/frontend/build/static/{NetworkConnectedEdges-C2nfTRKM.js → NetworkConnectedEdges-CnEFuyuC.js} +1 -1
  342. package/frontend/build/static/{NetworkOverview-BKozpi8w.js → NetworkOverview-KDe9n7ZE.js} +1 -1
  343. package/frontend/build/static/{NetworkPrometheusAPIWarning-wqCXwcem.js → NetworkPrometheusAPIWarning-Cy93jJcu.js} +1 -1
  344. package/frontend/build/static/{NetworkTraffic-Co7oakIE.js → NetworkTraffic-BTN3OABv.js} +1 -1
  345. package/frontend/build/static/NetworkTrafficUsage-DwnXvons.js +1 -0
  346. package/frontend/build/static/PercentageDonut-CmWbqKEA.js +1 -0
  347. package/frontend/build/static/{ReactJSONEditor-BDMT4-_1.js → ReactJSONEditor-xNDjbhPU.js} +1 -1
  348. package/frontend/build/static/{RoleCell-COtuTPWk.js → RoleCell-DSglYWti.js} +1 -1
  349. package/frontend/build/static/{aggregateFeatureMetrics-ClblY5Ev.js → aggregateFeatureMetrics-B7oOoe9g.js} +1 -1
  350. package/frontend/build/static/{formatTickValue-DojfJagm.js → formatTickValue-4OyGeZqN.js} +2 -2
  351. package/frontend/build/static/index-D02pkj6r.js +542 -0
  352. package/frontend/build/static/metricsFormatters-7MLBOEud.js +1 -0
  353. package/frontend/build/static/{networkTrafficUsageHighlightPlugin-BMMmh5e_.js → networkTrafficUsageHighlightPlugin-CT-MfVrm.js} +1 -1
  354. package/frontend/build/static/strategyCustom-Db-ZtYWl.svg +23 -0
  355. package/frontend/build/static/strategyDefault-LnSyH2eZ.svg +17 -0
  356. package/frontend/build/static/strategyGradual-oCA99tj3.svg +18 -0
  357. package/frontend/build/static/strategyHosts-4lVYC2Bf.svg +23 -0
  358. package/frontend/build/static/strategyIPs-BHaXsOYV.svg +24 -0
  359. package/frontend/build/static/strategyOn-CX-xL0oK.svg +18 -0
  360. package/frontend/build/static/useApiTokens-wTDjjd8a.js +1 -0
  361. package/frontend/package.json +2 -2
  362. package/package.json +5 -7
  363. package/dist/lib/routes/admin-api/config.d.ts +0 -24
  364. package/dist/lib/routes/admin-api/config.d.ts.map +0 -1
  365. package/dist/lib/routes/admin-api/config.js.map +0 -1
  366. package/dist/lib/routes/admin-api/config.test.d.ts +0 -2
  367. package/dist/lib/routes/admin-api/config.test.d.ts.map +0 -1
  368. package/dist/lib/routes/admin-api/config.test.js.map +0 -1
  369. package/dist/test/e2e/stores/user-store.e2e.test.d.ts.map +0 -1
  370. package/dist/test/e2e/stores/user-store.e2e.test.js.map +0 -1
  371. package/frontend/build/static/BackendConnections-Bi1Fsohi.js +0 -1
  372. package/frontend/build/static/ChartItem-Ci-KFL7s.js +0 -1
  373. package/frontend/build/static/FeatureMetricsChart-ClbKeGOa.js +0 -2
  374. package/frontend/build/static/FeatureStaleDialog-DZvKjxPB.js +0 -7
  375. package/frontend/build/static/FeatureViewLazyExport-yCIrczZt.js +0 -10
  376. package/frontend/build/static/FrontendNetworkTrafficUsage-DlRkx8CV.js +0 -1
  377. package/frontend/build/static/ImpactMetricsPage-BYcbHNWC.js +0 -3
  378. package/frontend/build/static/LazyAdminExport-BjSYZTvt.js +0 -38
  379. package/frontend/build/static/LazyProjectExport-9mNkV9Jq.js +0 -728
  380. package/frontend/build/static/LineChartComponent-CPcDsiNa.js +0 -1
  381. package/frontend/build/static/NetworkTrafficUsage-DNDJZGXi.js +0 -1
  382. package/frontend/build/static/index-CqYZiU1N.js +0 -542
  383. package/frontend/build/static/useApiTokens-B6vbGXUF.js +0 -1
  384. /package/dist/test/e2e/{stores → users}/user-store.e2e.test.d.ts +0 -0
  385. /package/dist/test/e2e/{stores → users}/user-store.e2e.test.js +0 -0
@@ -0,0 +1,87 @@
1
+ export class BatchHistogram {
2
+ constructor(config) {
3
+ this.labelNames = [];
4
+ this.bucketBoundaries = new Set();
5
+ // Store accumulated data for each label combination
6
+ this.store = new Map();
7
+ this.name = config.name;
8
+ this.help = config.help;
9
+ this.registry = config.registry;
10
+ this.labelNames = config.labelNames || [];
11
+ this.registry.registerMetric(this);
12
+ }
13
+ recordBatch(labels, data) {
14
+ const labelKey = this.createLabelKey(labels);
15
+ let entry = this.store.get(labelKey);
16
+ if (!entry) {
17
+ entry = {
18
+ count: 0,
19
+ sum: 0,
20
+ buckets: new Map(),
21
+ };
22
+ this.store.set(labelKey, entry);
23
+ }
24
+ entry.count += data.count;
25
+ entry.sum += data.sum;
26
+ for (const bucket of data.buckets) {
27
+ const current = entry.buckets.get(bucket.le) || 0;
28
+ entry.buckets.set(bucket.le, current + bucket.count);
29
+ this.bucketBoundaries.add(bucket.le);
30
+ }
31
+ }
32
+ createLabelKey(labels) {
33
+ const sortedKeys = Object.keys(labels).sort();
34
+ return JSON.stringify(sortedKeys.map((key) => [key, labels[key]]));
35
+ }
36
+ reset() {
37
+ this.store.clear();
38
+ this.bucketBoundaries.clear();
39
+ }
40
+ get() {
41
+ const values = [];
42
+ for (const [labelKey, data] of this.store) {
43
+ const labels = {};
44
+ if (labelKey) {
45
+ const parsedLabels = JSON.parse(labelKey);
46
+ parsedLabels.forEach(([key, value]) => {
47
+ labels[key] = value;
48
+ });
49
+ }
50
+ for (const [le, cumulativeCount] of Array.from(data.buckets.entries()).sort((a, b) => {
51
+ // Sort buckets: numbers first (ascending), then '+Inf' last
52
+ if (a[0] === '+Inf')
53
+ return 1;
54
+ if (b[0] === '+Inf')
55
+ return -1;
56
+ return a[0] - b[0];
57
+ })) {
58
+ values.push({
59
+ value: cumulativeCount,
60
+ labels: {
61
+ ...labels,
62
+ le: le.toString(),
63
+ },
64
+ metricName: `${this.name}_bucket`,
65
+ });
66
+ }
67
+ values.push({
68
+ value: data.sum,
69
+ labels,
70
+ metricName: `${this.name}_sum`,
71
+ });
72
+ values.push({
73
+ value: data.count,
74
+ labels,
75
+ metricName: `${this.name}_count`,
76
+ });
77
+ }
78
+ return {
79
+ name: this.name,
80
+ help: this.help,
81
+ type: 'histogram',
82
+ values,
83
+ aggregator: 'sum',
84
+ };
85
+ }
86
+ }
87
+ //# sourceMappingURL=batch-histogram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-histogram.js","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/batch-histogram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=batch-histogram.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-histogram.test.d.ts","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/batch-histogram.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,137 @@
1
+ import { Registry } from 'prom-client';
2
+ import { BatchHistogram } from './batch-histogram.js';
3
+ describe('BatchHistogram', () => {
4
+ let registry;
5
+ let histogram;
6
+ beforeEach(() => {
7
+ registry = new Registry();
8
+ histogram = new BatchHistogram({
9
+ name: 'test_histogram',
10
+ help: 'Test histogram',
11
+ registry: registry,
12
+ });
13
+ });
14
+ test('should record batch data and preserve bucket distribution', async () => {
15
+ histogram.recordBatch({ label1: 'value1' }, {
16
+ count: 10,
17
+ sum: 15.5,
18
+ buckets: [
19
+ { le: 0.1, count: 2 },
20
+ { le: 0.5, count: 5 },
21
+ { le: 1, count: 7 },
22
+ { le: 2.5, count: 9 },
23
+ { le: 5, count: 10 },
24
+ { le: '+Inf', count: 10 },
25
+ ],
26
+ });
27
+ const metrics = await registry.metrics();
28
+ expect(metrics).toContain('# HELP test_histogram Test histogram');
29
+ expect(metrics).toContain('# TYPE test_histogram histogram');
30
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="0.1"} 2/);
31
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="0.5"} 5/);
32
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="1"} 7/);
33
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="2.5"} 9/);
34
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="5"} 10/);
35
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="\+Inf"} 10/);
36
+ expect(metrics).toMatch(/test_histogram_sum{label1="value1"} 15\.5/);
37
+ expect(metrics).toMatch(/test_histogram_count{label1="value1"} 10/);
38
+ });
39
+ test('should aggregate multiple batches correctly', async () => {
40
+ histogram.recordBatch({ label1: 'value1' }, {
41
+ count: 5,
42
+ sum: 7.5,
43
+ buckets: [
44
+ { le: 0.1, count: 1 },
45
+ { le: 0.5, count: 3 },
46
+ { le: 1, count: 4 },
47
+ { le: 2.5, count: 5 },
48
+ { le: 5, count: 5 },
49
+ { le: '+Inf', count: 5 },
50
+ ],
51
+ });
52
+ histogram.recordBatch({ label1: 'value1' }, {
53
+ count: 3,
54
+ sum: 4.2,
55
+ buckets: [
56
+ { le: 0.1, count: 0 },
57
+ { le: 0.5, count: 1 },
58
+ { le: 1, count: 2 },
59
+ { le: 2.5, count: 3 },
60
+ { le: 5, count: 3 },
61
+ { le: '+Inf', count: 3 },
62
+ ],
63
+ });
64
+ const metrics = await registry.metrics();
65
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="0.1"} 1/);
66
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="0.5"} 4/);
67
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="1"} 6/);
68
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="2.5"} 8/);
69
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="5"} 8/);
70
+ expect(metrics).toMatch(/test_histogram_bucket{label1="value1",le="\+Inf"} 8/);
71
+ expect(metrics).toMatch(/test_histogram_sum{label1="value1"} 11\.7/);
72
+ expect(metrics).toMatch(/test_histogram_count{label1="value1"} 8/);
73
+ });
74
+ test('should record different labels separately and handle special characters', async () => {
75
+ histogram.recordBatch({ service: 'api', url: 'http://example.com:8080/api' }, {
76
+ count: 3,
77
+ sum: 1.5,
78
+ buckets: [
79
+ { le: 1, count: 2 },
80
+ { le: '+Inf', count: 3 },
81
+ ],
82
+ });
83
+ histogram.recordBatch({ service: 'web', url: 'https://app.example.com/dashboard' }, {
84
+ count: 2,
85
+ sum: 3.0,
86
+ buckets: [
87
+ { le: 1, count: 1 },
88
+ { le: '+Inf', count: 2 },
89
+ ],
90
+ });
91
+ const metrics = await registry.metrics();
92
+ expect(metrics).toMatch(/test_histogram_bucket{service="api",url="http:\/\/example\.com:8080\/api",le="1"} 2/);
93
+ expect(metrics).toMatch(/test_histogram_bucket{service="api",url="http:\/\/example\.com:8080\/api",le="\+Inf"} 3/);
94
+ expect(metrics).toMatch(/test_histogram_sum{service="api",url="http:\/\/example\.com:8080\/api"} 1\.5/);
95
+ expect(metrics).toMatch(/test_histogram_count{service="api",url="http:\/\/example\.com:8080\/api"} 3/);
96
+ // Web service metrics (with HTTPS URL)
97
+ expect(metrics).toMatch(/test_histogram_bucket{service="web",url="https:\/\/app\.example\.com\/dashboard",le="1"} 1/);
98
+ expect(metrics).toMatch(/test_histogram_bucket{service="web",url="https:\/\/app\.example\.com\/dashboard",le="\+Inf"} 2/);
99
+ expect(metrics).toMatch(/test_histogram_sum{service="web",url="https:\/\/app\.example\.com\/dashboard"} 3/);
100
+ expect(metrics).toMatch(/test_histogram_count{service="web",url="https:\/\/app\.example\.com\/dashboard"} 2/);
101
+ });
102
+ test('should handle "+Inf" string from SDK serialization', async () => {
103
+ histogram.recordBatch({ client: 'sdk' }, {
104
+ count: 5,
105
+ sum: 12.3,
106
+ buckets: [
107
+ { le: 1, count: 3 },
108
+ { le: '+Inf', count: 5 }, // String instead of Infinity
109
+ ],
110
+ });
111
+ const metrics = await registry.metrics();
112
+ expect(metrics).toMatch(/test_histogram_bucket{client="sdk",le="1"} 3/);
113
+ expect(metrics).toMatch(/test_histogram_bucket{client="sdk",le="\+Inf"} 5/);
114
+ expect(metrics).toMatch(/test_histogram_sum{client="sdk"} 12\.3/);
115
+ expect(metrics).toMatch(/test_histogram_count{client="sdk"} 5/);
116
+ });
117
+ test('should handle unsorted bucket input', async () => {
118
+ histogram.recordBatch({ service: 'test' }, {
119
+ count: 5,
120
+ sum: 7.5,
121
+ buckets: [
122
+ { le: '+Inf', count: 5 }, // Infinity first (unsorted)
123
+ { le: 2.5, count: 4 }, // Out of order
124
+ { le: 0.5, count: 2 }, // Out of order
125
+ { le: 1, count: 3 }, // Out of order
126
+ ],
127
+ });
128
+ const metrics = await registry.metrics();
129
+ expect(metrics).toMatch(/test_histogram_bucket{service="test",le="0.5"} 2/);
130
+ expect(metrics).toMatch(/test_histogram_bucket{service="test",le="1"} 3/);
131
+ expect(metrics).toMatch(/test_histogram_bucket{service="test",le="2.5"} 4/);
132
+ expect(metrics).toMatch(/test_histogram_bucket{service="test",le="\+Inf"} 5/);
133
+ expect(metrics).toMatch(/test_histogram_sum{service="test"} 7\.5/);
134
+ expect(metrics).toMatch(/test_histogram_count{service="test"} 5/);
135
+ });
136
+ });
137
+ //# sourceMappingURL=batch-histogram.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-histogram.test.js","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/batch-histogram.test.ts"],"names":[],"mappings":"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"}
@@ -4,5 +4,7 @@ export declare const CLIENT_ERROR_COUNT = "client_error_count";
4
4
  export declare const SERVER_ERROR_COUNT = "server_error_count";
5
5
  export declare const REQUEST_COUNT = "request_count";
6
6
  export declare const HEAP_MEMORY_TOTAL = "heap_memory_total";
7
+ export declare const REQUEST_TIME_MS = "request_time_ms";
8
+ export declare const SCHEDULER_JOB_TIME_SECONDS = "scheduler_job_time_seconds";
7
9
  export declare const defineImpactMetrics: (flagResolver: IFlagResolver) => void;
8
10
  //# sourceMappingURL=define-impact-metrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"define-impact-metrics.d.ts","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/define-impact-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AAErD,eAAO,MAAM,mBAAmB,GAAI,cAAc,aAAa,SAqB9D,CAAC"}
1
+ {"version":3,"file":"define-impact-metrics.d.ts","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/define-impact-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AACrD,eAAO,MAAM,eAAe,oBAAoB,CAAC;AACjD,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AAEvE,eAAO,MAAM,mBAAmB,GAAI,cAAc,aAAa,SA+B9D,CAAC"}
@@ -3,11 +3,15 @@ export const CLIENT_ERROR_COUNT = 'client_error_count';
3
3
  export const SERVER_ERROR_COUNT = 'server_error_count';
4
4
  export const REQUEST_COUNT = 'request_count';
5
5
  export const HEAP_MEMORY_TOTAL = 'heap_memory_total';
6
+ export const REQUEST_TIME_MS = 'request_time_ms';
7
+ export const SCHEDULER_JOB_TIME_SECONDS = 'scheduler_job_time_seconds';
6
8
  export const defineImpactMetrics = (flagResolver) => {
7
9
  flagResolver.impactMetrics?.defineCounter(FEAUTRE_LINK_COUNT, 'Count of feature links');
8
10
  flagResolver.impactMetrics?.defineCounter(CLIENT_ERROR_COUNT, 'Count of 4xx errors');
9
11
  flagResolver.impactMetrics?.defineCounter(SERVER_ERROR_COUNT, 'Count of 5xx errors');
10
12
  flagResolver.impactMetrics?.defineCounter(REQUEST_COUNT, 'Count of all requests');
11
13
  flagResolver.impactMetrics?.defineGauge(HEAP_MEMORY_TOTAL, 'Total heap memory used by the application process');
14
+ flagResolver.impactMetrics?.defineHistogram(REQUEST_TIME_MS, 'Request handling time', [10, 25, 50, 100, 200, 500, 1000, 2000, 5000]);
15
+ flagResolver.impactMetrics?.defineHistogram(SCHEDULER_JOB_TIME_SECONDS, 'Job execution time', [1, 2, 3, 4, 5, 7, 10, 15, 20, 30, 45, 60, 120]);
12
16
  };
13
17
  //# sourceMappingURL=define-impact-metrics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"define-impact-metrics.js","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/define-impact-metrics.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AAErD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,YAA2B,EAAE,EAAE;IAC/D,YAAY,CAAC,aAAa,EAAE,aAAa,CACrC,kBAAkB,EAClB,wBAAwB,CAC3B,CAAC;IACF,YAAY,CAAC,aAAa,EAAE,aAAa,CACrC,kBAAkB,EAClB,qBAAqB,CACxB,CAAC;IACF,YAAY,CAAC,aAAa,EAAE,aAAa,CACrC,kBAAkB,EAClB,qBAAqB,CACxB,CAAC;IACF,YAAY,CAAC,aAAa,EAAE,aAAa,CACrC,aAAa,EACb,uBAAuB,CAC1B,CAAC;IACF,YAAY,CAAC,aAAa,EAAE,WAAW,CACnC,iBAAiB,EACjB,mDAAmD,CACtD,CAAC;AACN,CAAC,CAAC"}
1
+ {"version":3,"file":"define-impact-metrics.js","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/define-impact-metrics.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AACrD,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,CAAC;AACjD,MAAM,CAAC,MAAM,0BAA0B,GAAG,4BAA4B,CAAC;AAEvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,YAA2B,EAAE,EAAE;IAC/D,YAAY,CAAC,aAAa,EAAE,aAAa,CACrC,kBAAkB,EAClB,wBAAwB,CAC3B,CAAC;IACF,YAAY,CAAC,aAAa,EAAE,aAAa,CACrC,kBAAkB,EAClB,qBAAqB,CACxB,CAAC;IACF,YAAY,CAAC,aAAa,EAAE,aAAa,CACrC,kBAAkB,EAClB,qBAAqB,CACxB,CAAC;IACF,YAAY,CAAC,aAAa,EAAE,aAAa,CACrC,aAAa,EACb,uBAAuB,CAC1B,CAAC;IACF,YAAY,CAAC,aAAa,EAAE,WAAW,CACnC,iBAAiB,EACjB,mDAAmD,CACtD,CAAC;IACF,YAAY,CAAC,aAAa,EAAE,eAAe,CACvC,eAAe,EACf,uBAAuB,EACvB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAChD,CAAC;IACF,YAAY,CAAC,aAAa,EAAE,eAAe,CACvC,0BAA0B,EAC1B,oBAAoB,EACpB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAClD,CAAC;AACN,CAAC,CAAC"}
@@ -128,4 +128,53 @@ test('should store impact metrics sent via bulk metrics endpoint', async () => {
128
128
  expect(metricsText).toContain('# TYPE unleash_counter_bulk_counter counter');
129
129
  expect(metricsText).toMatch(/unleash_counter_bulk_counter{unleash_source="bulk",unleash_origin="sdk"} 15/);
130
130
  });
131
+ test('should store histogram metrics with batch data', async () => {
132
+ await sendImpactMetrics([
133
+ {
134
+ name: 'response_time',
135
+ help: 'Response time histogram',
136
+ type: 'histogram',
137
+ samples: [
138
+ {
139
+ labels: { foo: 'bar' },
140
+ count: 10,
141
+ sum: 8.5,
142
+ buckets: [
143
+ { le: 1, count: 7 },
144
+ { le: '+Inf', count: 10 },
145
+ ],
146
+ },
147
+ ],
148
+ },
149
+ ]);
150
+ await sendImpactMetrics([
151
+ {
152
+ name: 'response_time',
153
+ help: 'Response time histogram',
154
+ type: 'histogram',
155
+ samples: [
156
+ {
157
+ labels: { foo: 'bar' },
158
+ count: 5,
159
+ sum: 3.2,
160
+ buckets: [
161
+ { le: 1, count: 3 },
162
+ { le: '+Inf', count: 5 },
163
+ ],
164
+ },
165
+ ],
166
+ },
167
+ ]);
168
+ const response = await app.request
169
+ .get('/internal-backstage/impact/metrics')
170
+ .expect('Content-Type', /text/)
171
+ .expect(200);
172
+ const metricsText = response.text;
173
+ expect(metricsText).toContain('# HELP unleash_histogram_response_time Response time histogram');
174
+ expect(metricsText).toContain('# TYPE unleash_histogram_response_time histogram');
175
+ expect(metricsText).toContain('unleash_histogram_response_time_bucket{unleash_foo="bar",unleash_origin="sdk",le="1"} 10');
176
+ expect(metricsText).toContain('unleash_histogram_response_time_bucket{unleash_foo="bar",unleash_origin="sdk",le="+Inf"} 15');
177
+ expect(metricsText).toContain('unleash_histogram_response_time_sum{unleash_foo="bar",unleash_origin="sdk"} 11.7');
178
+ expect(metricsText).toContain('unleash_histogram_response_time_count{unleash_foo="bar",unleash_origin="sdk"} 15');
179
+ });
131
180
  //# sourceMappingURL=impact-metrics.e2e.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"impact-metrics.e2e.test.js","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/impact-metrics.e2e.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"impact-metrics.e2e.test.js","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/impact-metrics.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,40 @@
1
1
  import { Counter, Gauge, type Registry } from 'prom-client';
2
- export interface MetricSample {
2
+ import { BatchHistogram } from './batch-histogram.js';
3
+ export interface NumericMetricSample {
3
4
  labels?: Record<string, string | number>;
4
5
  value: number;
5
6
  }
6
- export interface Metric {
7
+ export interface BucketMetricSample {
8
+ labels?: Record<string, string | number>;
9
+ count: number;
10
+ sum: number;
11
+ buckets: Array<{
12
+ le: number | '+Inf';
13
+ count: number;
14
+ }>;
15
+ }
16
+ export interface NumericMetric {
7
17
  name: string;
8
18
  help: string;
9
19
  type: 'counter' | 'gauge';
10
- samples: MetricSample[];
20
+ samples: NumericMetricSample[];
21
+ }
22
+ export interface BucketMetric {
23
+ name: string;
24
+ help: string;
25
+ type: 'histogram';
26
+ samples: BucketMetricSample[];
11
27
  }
28
+ export type Metric = NumericMetric | BucketMetric;
12
29
  export declare class MetricsTranslator {
13
30
  private registry;
14
31
  constructor(registry: Registry);
15
32
  sanitizeName(name: string): string;
16
33
  private hasNewLabels;
34
+ private hasNewBuckets;
17
35
  private transformLabels;
18
36
  private addOriginLabel;
19
- translateMetric(metric: Metric): Counter<string> | Gauge<string> | null;
37
+ translateMetric(metric: Metric): Counter<string> | Gauge<string> | BatchHistogram | null;
20
38
  translateMetrics(metrics: Metric[]): Registry;
21
39
  serializeMetrics(): Promise<string>;
22
40
  translateAndSerializeMetrics(metrics: Metric[]): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-translator.d.ts","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/metrics-translator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5D,MAAM,WAAW,YAAY;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,OAAO,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,QAAQ,CAAW;gBAEf,QAAQ,EAAE,QAAQ;IAI9B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAQlC,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,cAAc;IAStB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI;IAyFvE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ;IAQ7C,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAInE"}
1
+ {"version":3,"file":"metrics-translator.d.ts","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/metrics-translator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,MAAM,MAAM,MAAM,GAAG,aAAa,GAAG,YAAY,CAAC;AAElD,qBAAa,iBAAiB;IAC1B,OAAO,CAAC,QAAQ,CAAW;gBAEf,QAAQ,EAAE,QAAQ;IAI9B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAMlC,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,cAAc;IAStB,eAAe,CACX,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,cAAc,GAAG,IAAI;IA0I1D,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ;IAQ7C,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAInE"}
@@ -1,17 +1,29 @@
1
1
  import { Counter, Gauge } from 'prom-client';
2
+ import { BatchHistogram } from './batch-histogram.js';
2
3
  export class MetricsTranslator {
3
4
  constructor(registry) {
4
5
  this.registry = registry;
5
6
  }
6
7
  sanitizeName(name) {
7
8
  const regex = /[^a-zA-Z0-9_]/g;
8
- const sanitized = name.replace(regex, '_');
9
- return sanitized;
9
+ return name.replace(regex, '_');
10
10
  }
11
11
  hasNewLabels(existingMetric, newLabelNames) {
12
12
  const existingLabelNames = existingMetric.labelNames || [];
13
13
  return newLabelNames.some((label) => !existingLabelNames.includes(label));
14
14
  }
15
+ hasNewBuckets(existingHistogram, newBuckets) {
16
+ const existingBoundaries = existingHistogram.bucketBoundaries;
17
+ if (existingBoundaries.size !== newBuckets.length) {
18
+ return true;
19
+ }
20
+ for (const bucket of newBuckets) {
21
+ if (!existingBoundaries.has(bucket.le)) {
22
+ return true;
23
+ }
24
+ }
25
+ return false;
26
+ }
15
27
  transformLabels(labels) {
16
28
  return Object.fromEntries(Object.entries(labels).map(([labelKey, value]) => [
17
29
  `unleash_${this.sanitizeName(labelKey)}`,
@@ -94,6 +106,50 @@ export class MetricsTranslator {
94
106
  }
95
107
  return gauge;
96
108
  }
109
+ else if (metric.type === 'histogram') {
110
+ if (!metric.samples || metric.samples.length === 0) {
111
+ return null;
112
+ }
113
+ let histogram;
114
+ if (existingMetric && existingMetric instanceof BatchHistogram) {
115
+ const firstSample = metric.samples[0]; // all samples should have same buckets
116
+ const needsRecreation = !firstSample?.buckets ||
117
+ this.hasNewLabels(existingMetric, labelNames) ||
118
+ this.hasNewBuckets(existingMetric, firstSample.buckets);
119
+ if (needsRecreation) {
120
+ this.registry.removeSingleMetric(prefixedName);
121
+ histogram = new BatchHistogram({
122
+ name: prefixedName,
123
+ help: metric.help,
124
+ registry: this.registry,
125
+ labelNames,
126
+ });
127
+ }
128
+ else {
129
+ histogram = existingMetric;
130
+ }
131
+ }
132
+ else {
133
+ histogram = new BatchHistogram({
134
+ name: prefixedName,
135
+ help: metric.help,
136
+ registry: this.registry,
137
+ labelNames,
138
+ });
139
+ }
140
+ for (const sample of metric.samples) {
141
+ const transformedLabels = this.transformLabels({
142
+ ...sample.labels,
143
+ origin: sample.labels?.origin || 'sdk',
144
+ });
145
+ histogram.recordBatch(transformedLabels, {
146
+ count: sample.count,
147
+ sum: sample.sum,
148
+ buckets: sample.buckets,
149
+ });
150
+ }
151
+ return histogram;
152
+ }
97
153
  return null;
98
154
  }
99
155
  translateMetrics(metrics) {
@@ -1 +1 @@
1
- {"version":3,"file":"metrics-translator.js","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/metrics-translator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics-translator.js","sourceRoot":"","sources":["../../../../../src/lib/features/metrics/impact/metrics-translator.ts"],"names":[],"mappings":"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"}
@@ -149,10 +149,27 @@ describe('MetricsTranslator', () => {
149
149
  },
150
150
  ],
151
151
  },
152
+ {
153
+ name: 'histogram_with_labels',
154
+ help: 'histogram with labels',
155
+ type: 'histogram',
156
+ samples: [
157
+ {
158
+ labels: { service: 'api' },
159
+ count: 5,
160
+ sum: 2.5,
161
+ buckets: [
162
+ { le: 1, count: 3 },
163
+ { le: '+Inf', count: 5 },
164
+ ],
165
+ },
166
+ ],
167
+ },
152
168
  ];
153
169
  const result1 = await translator.translateAndSerializeMetrics(metrics1);
154
170
  expect(result1).toContain('unleash_counter_counter_with_labels{unleash_foo="bar",unleash_origin="sdk"} 5');
155
171
  expect(result1).toContain('unleash_gauge_gauge_with_labels{unleash_env="prod",unleash_origin="sdk"} 10');
172
+ expect(result1).toContain('unleash_histogram_histogram_with_labels_count{unleash_origin="sdk",unleash_service="api"} 5');
156
173
  const metrics2 = [
157
174
  {
158
175
  name: 'counter_with_labels',
@@ -176,10 +193,76 @@ describe('MetricsTranslator', () => {
176
193
  },
177
194
  ],
178
195
  },
196
+ {
197
+ name: 'histogram_with_labels',
198
+ help: 'histogram with labels',
199
+ type: 'histogram',
200
+ buckets: [1],
201
+ samples: [
202
+ {
203
+ labels: { service: 'api', region: 'us-east' }, // Added a new label
204
+ count: 3,
205
+ sum: 1.8,
206
+ buckets: [
207
+ { le: 1, count: 2 },
208
+ { le: '+Inf', count: 3 },
209
+ ],
210
+ },
211
+ ],
212
+ },
179
213
  ];
180
214
  const result2 = await translator.translateAndSerializeMetrics(metrics2);
181
215
  expect(result2).toContain('unleash_counter_counter_with_labels{unleash_foo="bar",unleash_baz="qux",unleash_origin="sdk"} 15');
182
216
  expect(result2).toContain('unleash_gauge_gauge_with_labels{unleash_env="prod",unleash_region="us-east",unleash_origin="sdk"} 20');
217
+ expect(result2).toContain('unleash_histogram_histogram_with_labels_count{unleash_origin="sdk",unleash_region="us-east",unleash_service="api"} 3');
218
+ expect(result2).not.toContain('unleash_histogram_histogram_with_labels_count{unleash_origin="sdk",unleash_service="api"} 5');
219
+ });
220
+ it('should handle histogram bucket changes', async () => {
221
+ const registry = new Registry();
222
+ const translator = new MetricsTranslator(registry);
223
+ // Initial histogram with 2 buckets
224
+ const metrics1 = [
225
+ {
226
+ name: 'test_histogram',
227
+ help: 'test histogram',
228
+ type: 'histogram',
229
+ samples: [
230
+ {
231
+ count: 5,
232
+ sum: 2.5,
233
+ buckets: [
234
+ { le: 1, count: 3 },
235
+ { le: '+Inf', count: 5 },
236
+ ],
237
+ },
238
+ ],
239
+ },
240
+ ];
241
+ const result1 = await translator.translateAndSerializeMetrics(metrics1);
242
+ expect(result1).toContain('unleash_histogram_test_histogram_bucket{unleash_origin="sdk",le="1"} 3');
243
+ expect(result1).toContain('unleash_histogram_test_histogram_count{unleash_origin="sdk"} 5');
244
+ // Same histogram with different bucket (0.5 instead of 1)
245
+ const metrics2 = [
246
+ {
247
+ name: 'test_histogram',
248
+ help: 'test histogram',
249
+ type: 'histogram',
250
+ samples: [
251
+ {
252
+ count: 7,
253
+ sum: 3.5,
254
+ buckets: [
255
+ { le: 0.5, count: 4 }, // Different bucket boundary
256
+ { le: '+Inf', count: 7 },
257
+ ],
258
+ },
259
+ ],
260
+ },
261
+ ];
262
+ const result2 = await translator.translateAndSerializeMetrics(metrics2);
263
+ expect(result2).toContain('unleash_histogram_test_histogram_bucket{unleash_origin="sdk",le="0.5"} 4');
264
+ expect(result2).toContain('unleash_histogram_test_histogram_count{unleash_origin="sdk"} 7');
265
+ expect(result2).not.toContain('unleash_histogram_test_histogram_count{unleash_origin="sdk"} 5');
183
266
  });
184
267
  });
185
268
  //# sourceMappingURL=metrics-translator.test.js.map