unleash-server 4.3.0 → 4.4.1

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 (178) hide show
  1. package/CHANGELOG.md +1266 -0
  2. package/dist/lib/app.d.ts +1 -3
  3. package/dist/lib/app.js +3 -3
  4. package/dist/lib/app.js.map +1 -1
  5. package/dist/lib/create-config.js +2 -0
  6. package/dist/lib/create-config.js.map +1 -1
  7. package/dist/lib/db/client-instance-store.d.ts +1 -0
  8. package/dist/lib/db/client-instance-store.js +7 -0
  9. package/dist/lib/db/client-instance-store.js.map +1 -1
  10. package/dist/lib/db/client-metrics-store-v2.d.ts +1 -0
  11. package/dist/lib/db/client-metrics-store-v2.js +8 -0
  12. package/dist/lib/db/client-metrics-store-v2.js.map +1 -1
  13. package/dist/lib/db/feature-strategy-store.js +1 -0
  14. package/dist/lib/db/feature-strategy-store.js.map +1 -1
  15. package/dist/lib/db/index.d.ts +1 -2
  16. package/dist/lib/db/index.js +2 -6
  17. package/dist/lib/db/index.js.map +1 -1
  18. package/dist/lib/db/project-store.js +10 -2
  19. package/dist/lib/db/project-store.js.map +1 -1
  20. package/dist/lib/metrics.js +2 -2
  21. package/dist/lib/metrics.js.map +1 -1
  22. package/dist/lib/metrics.test.js +1 -1
  23. package/dist/lib/metrics.test.js.map +1 -1
  24. package/dist/lib/middleware/oss-authentication.test.js +1 -3
  25. package/dist/lib/middleware/oss-authentication.test.js.map +1 -1
  26. package/dist/lib/routes/admin-api/client-metrics.js +2 -2
  27. package/dist/lib/routes/admin-api/client-metrics.js.map +1 -1
  28. package/dist/lib/routes/admin-api/config.test.js +2 -4
  29. package/dist/lib/routes/admin-api/config.test.js.map +1 -1
  30. package/dist/lib/routes/admin-api/context.test.js +2 -4
  31. package/dist/lib/routes/admin-api/context.test.js.map +1 -1
  32. package/dist/lib/routes/admin-api/email.test.js +1 -3
  33. package/dist/lib/routes/admin-api/email.test.js.map +1 -1
  34. package/dist/lib/routes/admin-api/events.test.js +1 -3
  35. package/dist/lib/routes/admin-api/events.test.js.map +1 -1
  36. package/dist/lib/routes/admin-api/feature.js +1 -1
  37. package/dist/lib/routes/admin-api/feature.js.map +1 -1
  38. package/dist/lib/routes/admin-api/metrics.d.ts +3 -6
  39. package/dist/lib/routes/admin-api/metrics.js +17 -31
  40. package/dist/lib/routes/admin-api/metrics.js.map +1 -1
  41. package/dist/lib/routes/admin-api/metrics.test.js +6 -65
  42. package/dist/lib/routes/admin-api/metrics.test.js.map +1 -1
  43. package/dist/lib/routes/admin-api/strategy.test.js +2 -4
  44. package/dist/lib/routes/admin-api/strategy.test.js.map +1 -1
  45. package/dist/lib/routes/admin-api/tag.test.js +2 -4
  46. package/dist/lib/routes/admin-api/tag.test.js.map +1 -1
  47. package/dist/lib/routes/admin-api/user.test.js +1 -3
  48. package/dist/lib/routes/admin-api/user.test.js.map +1 -1
  49. package/dist/lib/routes/backstage.test.js +2 -4
  50. package/dist/lib/routes/backstage.test.js.map +1 -1
  51. package/dist/lib/routes/client-api/feature.test.js +2 -4
  52. package/dist/lib/routes/client-api/feature.test.js.map +1 -1
  53. package/dist/lib/routes/client-api/metrics.d.ts +4 -4
  54. package/dist/lib/routes/client-api/metrics.js +3 -3
  55. package/dist/lib/routes/client-api/metrics.js.map +1 -1
  56. package/dist/lib/routes/client-api/metrics.test.js +5 -7
  57. package/dist/lib/routes/client-api/metrics.test.js.map +1 -1
  58. package/dist/lib/routes/client-api/register.d.ts +3 -3
  59. package/dist/lib/routes/client-api/register.js +2 -2
  60. package/dist/lib/routes/client-api/register.js.map +1 -1
  61. package/dist/lib/routes/client-api/register.test.js +2 -4
  62. package/dist/lib/routes/client-api/register.test.js.map +1 -1
  63. package/dist/lib/routes/health-check.test.js +3 -5
  64. package/dist/lib/routes/health-check.test.js.map +1 -1
  65. package/dist/lib/routes/index.test.js +2 -4
  66. package/dist/lib/routes/index.test.js.map +1 -1
  67. package/dist/lib/server-impl.js +4 -7
  68. package/dist/lib/server-impl.js.map +1 -1
  69. package/dist/lib/services/client-metrics/instance-service.d.ts +31 -0
  70. package/dist/lib/services/client-metrics/instance-service.js +125 -0
  71. package/dist/lib/services/client-metrics/instance-service.js.map +1 -0
  72. package/dist/lib/{db/client-metrics-store.test.d.ts → services/client-metrics/instance-service.test.d.ts} +0 -0
  73. package/dist/lib/services/client-metrics/instance-service.test.js +193 -0
  74. package/dist/lib/services/client-metrics/instance-service.test.js.map +1 -0
  75. package/dist/lib/services/client-metrics/{client-metrics-service-v2.d.ts → metrics-service-v2.d.ts} +3 -1
  76. package/dist/lib/services/client-metrics/{client-metrics-service-v2.js → metrics-service-v2.js} +12 -5
  77. package/dist/lib/services/client-metrics/metrics-service-v2.js.map +1 -0
  78. package/dist/lib/services/client-metrics/schema.d.ts +4 -0
  79. package/dist/lib/services/client-metrics/schema.js +63 -0
  80. package/dist/lib/services/client-metrics/schema.js.map +1 -0
  81. package/dist/lib/services/index.js +5 -5
  82. package/dist/lib/services/index.js.map +1 -1
  83. package/dist/lib/services/project-health-service.js +1 -0
  84. package/dist/lib/services/project-health-service.js.map +1 -1
  85. package/dist/lib/types/events.d.ts +1 -0
  86. package/dist/lib/types/events.js +2 -1
  87. package/dist/lib/types/events.js.map +1 -1
  88. package/dist/lib/types/model.d.ts +2 -0
  89. package/dist/lib/types/model.js.map +1 -1
  90. package/dist/lib/types/option.d.ts +3 -0
  91. package/dist/lib/types/option.js.map +1 -1
  92. package/dist/lib/types/services.d.ts +3 -3
  93. package/dist/lib/types/stores/client-instance-store.d.ts +1 -0
  94. package/dist/lib/types/stores/client-metrics-store-v2.d.ts +1 -0
  95. package/dist/lib/types/stores/project-store.d.ts +1 -0
  96. package/dist/lib/types/stores.d.ts +0 -2
  97. package/dist/migrations/20211130142314-add-updated-at-to-projects.d.ts +2 -0
  98. package/dist/migrations/20211130142314-add-updated-at-to-projects.js +8 -0
  99. package/dist/migrations/20211130142314-add-updated-at-to-projects.js.map +1 -0
  100. package/dist/migrations/20211209205201-drop-client-metrics.d.ts +2 -0
  101. package/dist/migrations/20211209205201-drop-client-metrics.js +13 -0
  102. package/dist/migrations/20211209205201-drop-client-metrics.js.map +1 -0
  103. package/dist/test/e2e/api/admin/metrics.e2e.test.js +6 -74
  104. package/dist/test/e2e/api/admin/metrics.e2e.test.js.map +1 -1
  105. package/dist/test/e2e/api/admin/project/features.e2e.test.js +43 -0
  106. package/dist/test/e2e/api/admin/project/features.e2e.test.js.map +1 -1
  107. package/dist/test/e2e/api/admin/project/project.health.e2e.test.js +12 -0
  108. package/dist/test/e2e/api/admin/project/project.health.e2e.test.js.map +1 -1
  109. package/dist/test/e2e/api/client/metrics.e2e.access.e2e.test.js +3 -3
  110. package/dist/test/e2e/api/client/metrics.e2e.access.e2e.test.js.map +1 -1
  111. package/dist/test/e2e/helpers/database-init.js +2 -6
  112. package/dist/test/e2e/helpers/database-init.js.map +1 -1
  113. package/dist/test/e2e/helpers/test-helper.js +2 -2
  114. package/dist/test/e2e/helpers/test-helper.js.map +1 -1
  115. package/dist/test/e2e/services/client-metrics-service.e2e.test.js +7 -7
  116. package/dist/test/e2e/services/client-metrics-service.e2e.test.js.map +1 -1
  117. package/dist/test/e2e/stores/project-store.e2e.test.js +1 -0
  118. package/dist/test/e2e/stores/project-store.e2e.test.js.map +1 -1
  119. package/dist/test/fixtures/fake-client-instance-store.d.ts +1 -0
  120. package/dist/test/fixtures/fake-client-instance-store.js +3 -0
  121. package/dist/test/fixtures/fake-client-instance-store.js.map +1 -1
  122. package/dist/test/fixtures/fake-client-metrics-store-v2.d.ts +2 -2
  123. package/dist/test/fixtures/fake-client-metrics-store-v2.js +3 -0
  124. package/dist/test/fixtures/fake-client-metrics-store-v2.js.map +1 -1
  125. package/dist/test/fixtures/store.js +0 -2
  126. package/dist/test/fixtures/store.js.map +1 -1
  127. package/package.json +9 -9
  128. package/dist/lib/db/client-metrics-db.d.ts +0 -18
  129. package/dist/lib/db/client-metrics-db.js +0 -94
  130. package/dist/lib/db/client-metrics-db.js.map +0 -1
  131. package/dist/lib/db/client-metrics-store.d.ts +0 -31
  132. package/dist/lib/db/client-metrics-store.js +0 -85
  133. package/dist/lib/db/client-metrics-store.js.map +0 -1
  134. package/dist/lib/db/client-metrics-store.test.js +0 -87
  135. package/dist/lib/db/client-metrics-store.test.js.map +0 -1
  136. package/dist/lib/services/client-metrics/client-metrics-schema.d.ts +0 -2
  137. package/dist/lib/services/client-metrics/client-metrics-schema.js +0 -32
  138. package/dist/lib/services/client-metrics/client-metrics-schema.js.map +0 -1
  139. package/dist/lib/services/client-metrics/client-metrics-service-v2.js.map +0 -1
  140. package/dist/lib/services/client-metrics/client-metrics.test.d.ts +0 -1
  141. package/dist/lib/services/client-metrics/client-metrics.test.js +0 -524
  142. package/dist/lib/services/client-metrics/client-metrics.test.js.map +0 -1
  143. package/dist/lib/services/client-metrics/index.d.ts +0 -50
  144. package/dist/lib/services/client-metrics/index.js +0 -267
  145. package/dist/lib/services/client-metrics/index.js.map +0 -1
  146. package/dist/lib/services/client-metrics/list.d.ts +0 -21
  147. package/dist/lib/services/client-metrics/list.js +0 -109
  148. package/dist/lib/services/client-metrics/list.js.map +0 -1
  149. package/dist/lib/services/client-metrics/list.test.d.ts +0 -1
  150. package/dist/lib/services/client-metrics/list.test.js +0 -100
  151. package/dist/lib/services/client-metrics/list.test.js.map +0 -1
  152. package/dist/lib/services/client-metrics/metrics-schema.d.ts +0 -2
  153. package/dist/lib/services/client-metrics/metrics-schema.js +0 -24
  154. package/dist/lib/services/client-metrics/metrics-schema.js.map +0 -1
  155. package/dist/lib/services/client-metrics/projection.d.ts +0 -7
  156. package/dist/lib/services/client-metrics/projection.js +0 -37
  157. package/dist/lib/services/client-metrics/projection.js.map +0 -1
  158. package/dist/lib/services/client-metrics/projection.test.d.ts +0 -1
  159. package/dist/lib/services/client-metrics/projection.test.js +0 -24
  160. package/dist/lib/services/client-metrics/projection.test.js.map +0 -1
  161. package/dist/lib/services/client-metrics/register-schema.d.ts +0 -2
  162. package/dist/lib/services/client-metrics/register-schema.js +0 -23
  163. package/dist/lib/services/client-metrics/register-schema.js.map +0 -1
  164. package/dist/lib/services/client-metrics/ttl-list.d.ts +0 -26
  165. package/dist/lib/services/client-metrics/ttl-list.js +0 -60
  166. package/dist/lib/services/client-metrics/ttl-list.js.map +0 -1
  167. package/dist/lib/services/client-metrics/ttl-list.test.d.ts +0 -1
  168. package/dist/lib/services/client-metrics/ttl-list.test.js +0 -71
  169. package/dist/lib/services/client-metrics/ttl-list.test.js.map +0 -1
  170. package/dist/lib/types/stores/client-metrics-db.d.ts +0 -11
  171. package/dist/lib/types/stores/client-metrics-db.js +0 -3
  172. package/dist/lib/types/stores/client-metrics-db.js.map +0 -1
  173. package/dist/lib/types/stores/client-metrics-store.d.ts +0 -7
  174. package/dist/lib/types/stores/client-metrics-store.js +0 -3
  175. package/dist/lib/types/stores/client-metrics-store.js.map +0 -1
  176. package/dist/test/fixtures/fake-client-metrics-store.d.ts +0 -16
  177. package/dist/test/fixtures/fake-client-metrics-store.js +0 -42
  178. package/dist/test/fixtures/fake-client-metrics-store.js.map +0 -1
@@ -1,32 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.clientMetricsSchema = void 0;
7
- const joi_1 = __importDefault(require("joi"));
8
- const countSchema = joi_1.default
9
- .object()
10
- .options({ stripUnknown: true })
11
- .keys({
12
- yes: joi_1.default.number().min(0).empty('').default(0),
13
- no: joi_1.default.number().min(0).empty('').default(0),
14
- variants: joi_1.default.object().pattern(joi_1.default.string(), joi_1.default.number().min(0)),
15
- });
16
- exports.clientMetricsSchema = joi_1.default
17
- .object()
18
- .options({ stripUnknown: true })
19
- .keys({
20
- environment: joi_1.default.string().optional(),
21
- appName: joi_1.default.string().required(),
22
- instanceId: joi_1.default.string().required(),
23
- bucket: joi_1.default
24
- .object()
25
- .required()
26
- .keys({
27
- start: joi_1.default.date().required(),
28
- stop: joi_1.default.date().required(),
29
- toggles: joi_1.default.object().pattern(/.*/, countSchema),
30
- }),
31
- });
32
- //# sourceMappingURL=client-metrics-schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-metrics-schema.js","sourceRoot":"","sources":["../../../../src/lib/services/client-metrics/client-metrics-schema.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAsB;AAEtB,MAAM,WAAW,GAAG,aAAG;KAClB,MAAM,EAAE;KACR,OAAO,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KAC/B,IAAI,CAAC;IACF,GAAG,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,EAAE,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,QAAQ,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAG,CAAC,MAAM,EAAE,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACpE,CAAC,CAAC;AAEM,QAAA,mBAAmB,GAAG,aAAG;KACjC,MAAM,EAAE;KACR,OAAO,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;KAC/B,IAAI,CAAC;IACF,WAAW,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,OAAO,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,MAAM,EAAE,aAAG;SACN,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,IAAI,CAAC;QACF,KAAK,EAAE,aAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;QAC5B,IAAI,EAAE,aAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;QAC3B,OAAO,EAAE,aAAG,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC;KACnD,CAAC;CACT,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-metrics-service-v2.js","sourceRoot":"","sources":["../../../../src/lib/services/client-metrics/client-metrics-service-v2.ts"],"names":[],"mappings":"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"}
@@ -1,524 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const events_1 = __importDefault(require("events"));
7
- const index_1 = __importDefault(require("./index"));
8
- const no_logger_1 = __importDefault(require("../../../test/fixtures/no-logger"));
9
- const date_fns_1 = require("date-fns");
10
- /**
11
- * A utility to wait for any pending promises in the test subject code.
12
- * For instance, if the test needs to wait for a timeout/interval handler,
13
- * and that handler does something async, advancing the timers is not enough:
14
- * We have to explicitly wait for the second promise.
15
- * For more info, see https://stackoverflow.com/a/51045733/2868829
16
- *
17
- * Usage in test code after advancing timers, but before making assertions:
18
- *
19
- * test('hello', async () => {
20
- * jest.useFakeTimers('modern');
21
- *
22
- * // Schedule a timeout with a callback that does something async
23
- * // before calling our spy
24
- * const spy = jest.fn();
25
- * setTimeout(async () => {
26
- * await Promise.resolve();
27
- * spy();
28
- * }, 1000);
29
- *
30
- * expect(spy).not.toHaveBeenCalled();
31
- *
32
- * jest.advanceTimersByTime(1500);
33
- * await flushPromises(); // this is required to make it work!
34
- *
35
- * expect(spy).toHaveBeenCalledTimes(1);
36
- *
37
- * jest.useRealTimers();
38
- * });
39
- */
40
- function flushPromises() {
41
- return Promise.resolve(setImmediate);
42
- }
43
- const appName = 'appName';
44
- const instanceId = 'instanceId';
45
- const createMetricsService = (cms) => new index_1.default({
46
- clientMetricsStore: cms,
47
- strategyStore: null,
48
- featureToggleStore: null,
49
- clientApplicationsStore: null,
50
- clientInstanceStore: null,
51
- eventStore: null,
52
- }, { getLogger: no_logger_1.default });
53
- test('should work without state', () => {
54
- const clientMetricsStore = new events_1.default();
55
- const metrics = createMetricsService(clientMetricsStore);
56
- expect(metrics.getAppsWithToggles()).toBeTruthy();
57
- expect(metrics.getTogglesMetrics()).toBeTruthy();
58
- metrics.destroy();
59
- });
60
- test('data should expire', () => {
61
- jest.useFakeTimers('modern');
62
- const clientMetricsStore = new events_1.default();
63
- const metrics = createMetricsService(clientMetricsStore);
64
- metrics.addPayload({
65
- appName,
66
- instanceId,
67
- bucket: {
68
- start: (0, date_fns_1.subSeconds)(Date.now(), 2),
69
- stop: (0, date_fns_1.subSeconds)(Date.now(), 1),
70
- toggles: {
71
- toggleX: {
72
- yes: 123,
73
- no: 0,
74
- },
75
- },
76
- },
77
- });
78
- let lastHourExpires = 0;
79
- metrics.lastHourList.on('expire', () => {
80
- lastHourExpires++;
81
- });
82
- let lastMinExpires = 0;
83
- metrics.lastMinuteList.on('expire', () => {
84
- lastMinExpires++;
85
- });
86
- jest.advanceTimersByTime((0, date_fns_1.minutesToMilliseconds)(1));
87
- expect(lastMinExpires).toBe(1);
88
- expect(lastHourExpires).toBe(0);
89
- jest.advanceTimersByTime((0, date_fns_1.hoursToMilliseconds)(1));
90
- expect(lastMinExpires).toBe(1);
91
- expect(lastHourExpires).toBe(1);
92
- jest.useRealTimers();
93
- metrics.destroy();
94
- });
95
- test('should listen to metrics from store', () => {
96
- const clientMetricsStore = new events_1.default();
97
- const metrics = createMetricsService(clientMetricsStore);
98
- clientMetricsStore.emit('metrics', {
99
- appName,
100
- instanceId,
101
- bucket: {
102
- start: new Date(),
103
- stop: new Date(),
104
- toggles: {
105
- toggleX: {
106
- yes: 123,
107
- no: 0,
108
- },
109
- },
110
- },
111
- });
112
- expect(metrics.apps[appName].count).toBe(123);
113
- expect(metrics.globalCount).toBe(123);
114
- expect(metrics.getTogglesMetrics().lastHour.toggleX).toEqual({
115
- yes: 123,
116
- no: 0,
117
- });
118
- expect(metrics.getTogglesMetrics().lastMinute.toggleX).toEqual({
119
- yes: 123,
120
- no: 0,
121
- });
122
- metrics.addPayload({
123
- appName,
124
- instanceId,
125
- bucket: {
126
- start: new Date(),
127
- stop: new Date(),
128
- toggles: {
129
- toggleX: {
130
- yes: 10,
131
- no: 10,
132
- },
133
- },
134
- },
135
- });
136
- expect(metrics.globalCount).toBe(143);
137
- expect(metrics.getTogglesMetrics().lastHour.toggleX).toEqual({
138
- yes: 133,
139
- no: 10,
140
- });
141
- expect(metrics.getTogglesMetrics().lastMinute.toggleX).toEqual({
142
- yes: 133,
143
- no: 10,
144
- });
145
- metrics.destroy();
146
- });
147
- test('should build up list of seen toggles when new metrics arrives', () => {
148
- const clientMetricsStore = new events_1.default();
149
- const metrics = createMetricsService(clientMetricsStore);
150
- clientMetricsStore.emit('metrics', {
151
- appName,
152
- instanceId,
153
- bucket: {
154
- start: new Date(),
155
- stop: new Date(),
156
- toggles: {
157
- toggleX: {
158
- yes: 123,
159
- no: 0,
160
- },
161
- toggleY: {
162
- yes: 50,
163
- no: 50,
164
- },
165
- },
166
- },
167
- });
168
- const appToggles = metrics.getAppsWithToggles();
169
- const togglesForApp = metrics.getSeenTogglesByAppName(appName);
170
- expect(appToggles.length).toBe(1);
171
- expect(appToggles[0].seenToggles.length).toBe(2);
172
- expect(appToggles[0].seenToggles).toContain('toggleX');
173
- expect(appToggles[0].seenToggles).toContain('toggleY');
174
- expect(togglesForApp.length === 2);
175
- expect(togglesForApp).toContain('toggleX');
176
- expect(togglesForApp).toContain('toggleY');
177
- metrics.destroy();
178
- });
179
- test('should handle a lot of toggles', () => {
180
- const clientMetricsStore = new events_1.default();
181
- const metrics = createMetricsService(clientMetricsStore);
182
- const toggleCounts = {};
183
- for (let i = 0; i < 100; i++) {
184
- toggleCounts[`toggle${i}`] = { yes: i, no: i };
185
- }
186
- clientMetricsStore.emit('metrics', {
187
- appName,
188
- instanceId,
189
- bucket: {
190
- start: new Date(),
191
- stop: new Date(),
192
- toggles: toggleCounts,
193
- },
194
- });
195
- const seenToggles = metrics.getSeenTogglesByAppName(appName);
196
- expect(seenToggles.length).toBe(100);
197
- metrics.destroy();
198
- });
199
- test('should have correct values for lastMinute', () => {
200
- jest.useFakeTimers('modern');
201
- const clientMetricsStore = new events_1.default();
202
- const metrics = createMetricsService(clientMetricsStore);
203
- const now = new Date();
204
- const input = [
205
- {
206
- start: (0, date_fns_1.subHours)(now, 1),
207
- stop: (0, date_fns_1.subMinutes)(now, 59),
208
- toggles: {
209
- toggle: { yes: 10, no: 10 },
210
- },
211
- },
212
- {
213
- start: (0, date_fns_1.subMinutes)(now, 30),
214
- stop: (0, date_fns_1.subMinutes)(now, 29),
215
- toggles: {
216
- toggle: { yes: 10, no: 10 },
217
- },
218
- },
219
- {
220
- start: (0, date_fns_1.subMinutes)(now, 2),
221
- stop: (0, date_fns_1.subMinutes)(now, 1),
222
- toggles: {
223
- toggle: { yes: 10, no: 10 },
224
- },
225
- },
226
- {
227
- start: (0, date_fns_1.subMinutes)(now, 2),
228
- stop: (0, date_fns_1.subSeconds)(now, 59),
229
- toggles: {
230
- toggle: { yes: 10, no: 10 },
231
- },
232
- },
233
- {
234
- start: now,
235
- stop: (0, date_fns_1.subSeconds)(now, 30),
236
- toggles: {
237
- toggle: { yes: 10, no: 10 },
238
- },
239
- },
240
- ];
241
- input.forEach((bucket) => {
242
- clientMetricsStore.emit('metrics', {
243
- appName,
244
- instanceId,
245
- bucket,
246
- });
247
- });
248
- const seenToggles = metrics.getSeenTogglesByAppName(appName);
249
- expect(seenToggles.length).toBe(1);
250
- // metrics.se
251
- let c = metrics.getTogglesMetrics();
252
- expect(c.lastMinute.toggle).toEqual({ yes: 20, no: 20 });
253
- jest.advanceTimersByTime(10000);
254
- c = metrics.getTogglesMetrics();
255
- expect(c.lastMinute.toggle).toEqual({ yes: 10, no: 10 });
256
- jest.advanceTimersByTime(20000);
257
- c = metrics.getTogglesMetrics();
258
- expect(c.lastMinute.toggle).toEqual({ yes: 0, no: 0 });
259
- metrics.destroy();
260
- jest.useRealTimers();
261
- });
262
- test('should have correct values for lastHour', () => {
263
- jest.useFakeTimers('modern');
264
- const clientMetricsStore = new events_1.default();
265
- const metrics = createMetricsService(clientMetricsStore);
266
- const now = Date.now();
267
- const input = [
268
- {
269
- start: (0, date_fns_1.subHours)(now, 1),
270
- stop: (0, date_fns_1.subMinutes)(now, 59),
271
- toggles: {
272
- toggle: { yes: 10, no: 10 },
273
- },
274
- },
275
- {
276
- start: (0, date_fns_1.subMinutes)(now, 30),
277
- stop: (0, date_fns_1.subMinutes)(now, 29),
278
- toggles: {
279
- toggle: { yes: 10, no: 10 },
280
- },
281
- },
282
- {
283
- start: (0, date_fns_1.subMinutes)(now, 15),
284
- stop: (0, date_fns_1.subMinutes)(now, 14),
285
- toggles: {
286
- toggle: { yes: 10, no: 10 },
287
- },
288
- },
289
- {
290
- start: (0, date_fns_1.addMinutes)(now, 59),
291
- stop: (0, date_fns_1.addHours)(now, 1),
292
- toggles: {
293
- toggle: { yes: 11, no: 11 },
294
- },
295
- },
296
- ];
297
- input.forEach((bucket) => {
298
- clientMetricsStore.emit('metrics', {
299
- appName,
300
- instanceId,
301
- bucket,
302
- });
303
- });
304
- const seenToggles = metrics.getSeenTogglesByAppName(appName);
305
- expect(seenToggles.length).toBe(1);
306
- // metrics.se
307
- let c = metrics.getTogglesMetrics();
308
- expect(c.lastHour.toggle).toEqual({ yes: 41, no: 41 });
309
- jest.advanceTimersByTime(10000);
310
- c = metrics.getTogglesMetrics();
311
- expect(c.lastHour.toggle).toEqual({ yes: 41, no: 41 });
312
- // at 30
313
- jest.advanceTimersByTime((0, date_fns_1.minutesToMilliseconds)(30));
314
- c = metrics.getTogglesMetrics();
315
- expect(c.lastHour.toggle).toEqual({ yes: 31, no: 31 });
316
- // at 45
317
- jest.advanceTimersByTime((0, date_fns_1.minutesToMilliseconds)(15));
318
- c = metrics.getTogglesMetrics();
319
- expect(c.lastHour.toggle).toEqual({ yes: 21, no: 21 });
320
- // at 1:15
321
- jest.advanceTimersByTime((0, date_fns_1.minutesToMilliseconds)(30));
322
- c = metrics.getTogglesMetrics();
323
- expect(c.lastHour.toggle).toEqual({ yes: 11, no: 11 });
324
- // at 2:00
325
- jest.advanceTimersByTime((0, date_fns_1.minutesToMilliseconds)(45));
326
- c = metrics.getTogglesMetrics();
327
- expect(c.lastHour.toggle).toEqual({ yes: 0, no: 0 });
328
- metrics.destroy();
329
- jest.useRealTimers();
330
- });
331
- test('should not fail when toggle metrics is missing yes/no field', () => {
332
- const clientMetricsStore = new events_1.default();
333
- const metrics = createMetricsService(clientMetricsStore);
334
- clientMetricsStore.emit('metrics', {
335
- appName,
336
- instanceId,
337
- bucket: {
338
- start: new Date(),
339
- stop: new Date(),
340
- toggles: {
341
- toggleX: {
342
- yes: 123,
343
- no: 0,
344
- },
345
- },
346
- },
347
- });
348
- metrics.addPayload({
349
- appName,
350
- instanceId,
351
- bucket: {
352
- start: new Date(),
353
- stop: new Date(),
354
- toggles: {
355
- toggleX: {
356
- blue: 10,
357
- green: 10,
358
- },
359
- },
360
- },
361
- });
362
- expect(metrics.globalCount).toBe(123);
363
- expect(metrics.getTogglesMetrics().lastMinute.toggleX).toEqual({
364
- yes: 123,
365
- no: 0,
366
- });
367
- metrics.destroy();
368
- });
369
- test('Multiple registrations of same appname and instanceid within same time period should only cause one registration', async () => {
370
- jest.useFakeTimers('modern');
371
- const clientMetricsStore = new events_1.default();
372
- const appStoreSpy = jest.fn();
373
- const bulkSpy = jest.fn();
374
- const clientApplicationsStore = {
375
- bulkUpsert: appStoreSpy,
376
- };
377
- const clientInstanceStore = {
378
- bulkUpsert: bulkSpy,
379
- };
380
- const clientMetrics = new index_1.default({
381
- clientMetricsStore,
382
- strategyStore: null,
383
- featureToggleStore: null,
384
- clientApplicationsStore,
385
- clientInstanceStore,
386
- eventStore: null,
387
- }, { getLogger: no_logger_1.default });
388
- const client1 = {
389
- appName: 'test_app',
390
- instanceId: 'ava',
391
- strategies: [{ name: 'defaullt' }],
392
- started: new Date(),
393
- interval: 10,
394
- };
395
- await clientMetrics.registerClient(client1, '127.0.0.1');
396
- await clientMetrics.registerClient(client1, '127.0.0.1');
397
- await clientMetrics.registerClient(client1, '127.0.0.1');
398
- await clientMetrics.registerClient(client1, '127.0.0.1');
399
- jest.advanceTimersByTime(7000);
400
- await flushPromises();
401
- expect(appStoreSpy).toHaveBeenCalledTimes(1);
402
- expect(bulkSpy).toHaveBeenCalledTimes(1);
403
- const registrations = appStoreSpy.mock.calls[0][0];
404
- expect(registrations.length).toBe(1);
405
- expect(registrations[0].appName).toBe(client1.appName);
406
- expect(registrations[0].instanceId).toBe(client1.instanceId);
407
- expect(registrations[0].started).toBe(client1.started);
408
- expect(registrations[0].interval).toBe(client1.interval);
409
- jest.useRealTimers();
410
- });
411
- test('Multiple unique clients causes multiple registrations', async () => {
412
- jest.useFakeTimers('modern');
413
- const clientMetricsStore = new events_1.default();
414
- const appStoreSpy = jest.fn();
415
- const bulkSpy = jest.fn();
416
- const clientApplicationsStore = {
417
- bulkUpsert: appStoreSpy,
418
- };
419
- const clientInstanceStore = {
420
- bulkUpsert: bulkSpy,
421
- };
422
- const clientMetrics = new index_1.default({
423
- clientMetricsStore,
424
- strategyStore: null,
425
- featureToggleStore: null,
426
- clientApplicationsStore,
427
- clientInstanceStore,
428
- eventStore: null,
429
- }, { getLogger: no_logger_1.default });
430
- const client1 = {
431
- appName: 'test_app',
432
- instanceId: 'client1',
433
- strategies: [{ name: 'defaullt' }],
434
- started: new Date(),
435
- interval: 10,
436
- };
437
- const client2 = {
438
- appName: 'test_app_2',
439
- instanceId: 'client2',
440
- strategies: [{ name: 'defaullt' }],
441
- started: new Date(),
442
- interval: 10,
443
- };
444
- await clientMetrics.registerClient(client1, '127.0.0.1');
445
- await clientMetrics.registerClient(client1, '127.0.0.1');
446
- await clientMetrics.registerClient(client1, '127.0.0.1');
447
- await clientMetrics.registerClient(client2, '127.0.0.1');
448
- await clientMetrics.registerClient(client2, '127.0.0.1');
449
- await clientMetrics.registerClient(client2, '127.0.0.1');
450
- jest.advanceTimersByTime(7000);
451
- await flushPromises();
452
- const registrations = appStoreSpy.mock.calls[0][0];
453
- expect(registrations.length).toBe(2);
454
- jest.useRealTimers();
455
- });
456
- test('Same client registered outside of dedup interval will be registered twice', async () => {
457
- jest.useFakeTimers('modern');
458
- const clientMetricsStore = new events_1.default();
459
- const appStoreSpy = jest.fn();
460
- const bulkSpy = jest.fn();
461
- const clientApplicationsStore = {
462
- bulkUpsert: appStoreSpy,
463
- };
464
- const clientInstanceStore = {
465
- bulkUpsert: bulkSpy,
466
- };
467
- const bulkInterval = (0, date_fns_1.secondsToMilliseconds)(2);
468
- const clientMetrics = new index_1.default({
469
- clientMetricsStore,
470
- strategyStore: null,
471
- featureToggleStore: null,
472
- clientApplicationsStore,
473
- clientInstanceStore,
474
- eventStore: null,
475
- }, { getLogger: no_logger_1.default }, bulkInterval);
476
- const client1 = {
477
- appName: 'test_app',
478
- instanceId: 'client1',
479
- strategies: [{ name: 'defaullt' }],
480
- started: new Date(),
481
- interval: 10,
482
- };
483
- await clientMetrics.registerClient(client1, '127.0.0.1');
484
- await clientMetrics.registerClient(client1, '127.0.0.1');
485
- await clientMetrics.registerClient(client1, '127.0.0.1');
486
- jest.advanceTimersByTime(3000);
487
- await clientMetrics.registerClient(client1, '127.0.0.1');
488
- await clientMetrics.registerClient(client1, '127.0.0.1');
489
- await clientMetrics.registerClient(client1, '127.0.0.1');
490
- jest.advanceTimersByTime(3000);
491
- await flushPromises();
492
- expect(appStoreSpy).toHaveBeenCalledTimes(2);
493
- expect(bulkSpy).toHaveBeenCalledTimes(2);
494
- const firstRegistrations = appStoreSpy.mock.calls[0][0][0];
495
- const secondRegistrations = appStoreSpy.mock.calls[1][0][0];
496
- expect(firstRegistrations.appName).toBe(secondRegistrations.appName);
497
- expect(firstRegistrations.instanceId).toBe(secondRegistrations.instanceId);
498
- jest.useRealTimers();
499
- });
500
- test('No registrations during a time period will not call stores', async () => {
501
- jest.useFakeTimers('modern');
502
- const clientMetricsStore = new events_1.default();
503
- const appStoreSpy = jest.fn();
504
- const bulkSpy = jest.fn();
505
- const clientApplicationsStore = {
506
- bulkUpsert: appStoreSpy,
507
- };
508
- const clientInstanceStore = {
509
- bulkUpsert: bulkSpy,
510
- };
511
- new index_1.default({
512
- clientMetricsStore,
513
- strategyStore: null,
514
- featureToggleStore: null,
515
- clientApplicationsStore,
516
- clientInstanceStore,
517
- eventStore: null,
518
- }, { getLogger: no_logger_1.default });
519
- jest.advanceTimersByTime(6000);
520
- expect(appStoreSpy).toHaveBeenCalledTimes(0);
521
- expect(bulkSpy).toHaveBeenCalledTimes(0);
522
- jest.useRealTimers();
523
- });
524
- //# sourceMappingURL=client-metrics.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-metrics.test.js","sourceRoot":"","sources":["../../../../src/lib/services/client-metrics/client-metrics.test.ts"],"names":[],"mappings":"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"}
@@ -1,50 +0,0 @@
1
- import { Projection } from './projection';
2
- import { IBaseEvent } from '../../types/events';
3
- import { IApplication, IYesNoCount } from './models';
4
- import { IUnleashStores } from '../../types/stores';
5
- import { IUnleashConfig } from '../../types/option';
6
- import { IClientApplication } from '../../types/stores/client-applications-store';
7
- import { IApplicationQuery } from '../../types/query';
8
- import { IClientApp, IMetricCounts, IMetricsBucket } from '../../types/model';
9
- import TTLList from './ttl-list';
10
- export default class ClientMetricsService {
11
- globalCount: number;
12
- apps: {};
13
- lastHourProjection: Projection;
14
- lastMinuteProjection: Projection;
15
- lastHourList: TTLList<IMetricCounts>;
16
- logger: any;
17
- lastMinuteList: TTLList<IMetricCounts>;
18
- seenClients: Record<string, IClientApp>;
19
- private timers;
20
- private clientMetricsStore;
21
- private strategyStore;
22
- private featureToggleStore;
23
- private clientApplicationsStore;
24
- private clientInstanceStore;
25
- private eventStore;
26
- private bulkInterval;
27
- private announcementInterval;
28
- constructor({ clientMetricsStore, strategyStore, featureToggleStore, clientInstanceStore, clientApplicationsStore, eventStore, }: Pick<IUnleashStores, 'clientMetricsStore' | 'strategyStore' | 'featureToggleStore' | 'clientApplicationsStore' | 'clientInstanceStore' | 'eventStore'>, { getLogger }: Pick<IUnleashConfig, 'getLogger'>, bulkInterval?: number, announcementInterval?: number);
29
- registerClientMetrics(data: IClientApp, clientIp: string): Promise<void>;
30
- announceUnannounced(): Promise<void>;
31
- registerClient(data: IClientApp, clientIp: string): Promise<void>;
32
- clientKey(client: IClientApp): string;
33
- bulkAdd(): Promise<void>;
34
- appToEvent(app: IClientApp): IBaseEvent;
35
- getAppsWithToggles(): IClientApp[];
36
- getSeenTogglesByAppName(appName: string): string[];
37
- getSeenApps(): Promise<Record<string, IApplication[]>>;
38
- getApplications(query: IApplicationQuery): Promise<IClientApplication[]>;
39
- getApplication(appName: string): Promise<IApplication>;
40
- getSeenAppsPerToggle(): Record<string, IApplication[]>;
41
- getTogglesMetrics(): Record<string, Record<string, IYesNoCount>>;
42
- addPayload(data: IClientApp): void;
43
- getApp(appName: string): IClientApp;
44
- createCountObject(entry: IMetricCounts): IYesNoCount;
45
- addBucket(app: IClientApp, bucket: IMetricsBucket): void;
46
- addSeenToggles(app: IClientApp, toggleNames: string[]): void;
47
- deleteApplication(appName: string): Promise<void>;
48
- createApplication(input: IApplication): Promise<void>;
49
- destroy(): void;
50
- }