Skip to content

Commit b94d718

Browse files
authored
[ResponseOps] add parallel number arrays to task manager metric histograms (#176881)
towards: elastic/response-ops-team#151 ## Summary As we've found the elasticsearch histogram mapping type to be difficult to use in practice, we're switching to an "array of numbers" approach - keeping the histograms for now. We'll eventually remove the histograms, once we ensure they aren't being used.
1 parent 1dae2d9 commit b94d718

9 files changed

Lines changed: 392 additions & 57 deletions

x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts

Lines changed: 277 additions & 34 deletions
Large diffs are not rendered by default.

x-pack/plugins/task_manager/server/metrics/lib/simple_histogram.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ describe('SimpleHistogram', () => {
2828
{ value: 90, count: 0 },
2929
{ value: 100, count: 0 },
3030
]);
31+
expect(histogram.getAllValues()).toEqual([]);
3132
});
3233

3334
test('should correctly initialize when bucketSize does not evenly divides range', () => {
@@ -49,6 +50,7 @@ describe('SimpleHistogram', () => {
4950
{ value: 98, count: 0 },
5051
{ value: 105, count: 0 },
5152
]);
53+
expect(histogram.getAllValues()).toEqual([]);
5254
});
5355

5456
test('should correctly record values', () => {
@@ -77,6 +79,7 @@ describe('SimpleHistogram', () => {
7779
{ value: 90, count: 0 },
7880
{ value: 100, count: 1 },
7981
]);
82+
expect(histogram.getAllValues()).toEqual([0, 10, 23, 34, 21, 56, 78, 33, 99, 1, 2]);
8083
});
8184

8285
test('should correctly record values with specific increment', () => {
@@ -104,6 +107,9 @@ describe('SimpleHistogram', () => {
104107
{ value: 90, count: 0 },
105108
{ value: 100, count: 5 },
106109
]);
110+
expect(histogram.getAllValues()).toEqual([
111+
0, 23, 23, 34, 21, 56, 78, 33, 33, 33, 33, 99, 99, 99, 99, 99, 1, 2,
112+
]);
107113
});
108114

109115
test('should ignore values less than 0 and greater than max', () => {
@@ -119,11 +125,13 @@ describe('SimpleHistogram', () => {
119125
histogram.record(2);
120126

121127
const hist1 = histogram.get();
128+
const hist1AllValues = histogram.getAllValues();
122129

123130
histogram.record(-1);
124131
histogram.record(200);
125132

126133
expect(histogram.get()).toEqual(hist1);
134+
expect(histogram.getAllValues()).toEqual(hist1AllValues);
127135
});
128136

129137
test('should correctly reset values', () => {
@@ -150,6 +158,7 @@ describe('SimpleHistogram', () => {
150158
{ value: 90, count: 0 },
151159
{ value: 100, count: 1 },
152160
]);
161+
expect(histogram.getAllValues()).toEqual([23, 34, 21, 56, 78, 33, 99, 1, 2]);
153162

154163
histogram.reset();
155164

@@ -165,6 +174,7 @@ describe('SimpleHistogram', () => {
165174
{ value: 90, count: 0 },
166175
{ value: 100, count: 0 },
167176
]);
177+
expect(histogram.getAllValues()).toEqual([]);
168178
});
169179

170180
test('should correctly truncate zero values', () => {
@@ -189,6 +199,7 @@ describe('SimpleHistogram', () => {
189199
{ value: 90, count: 0 },
190200
{ value: 100, count: 0 },
191201
]);
202+
expect(histogram.getAllValues()).toEqual([23, 34, 21, 56, 33, 1, 2]);
192203

193204
expect(histogram.get(true)).toEqual([
194205
{ value: 10, count: 2 },
@@ -204,6 +215,7 @@ describe('SimpleHistogram', () => {
204215
const histogram = new SimpleHistogram(100, 10);
205216

206217
expect(histogram.get(true)).toEqual([]);
218+
expect(histogram.getAllValues()).toEqual([]);
207219
});
208220

209221
test('should correctly serialize histogram data', () => {

x-pack/plugins/task_manager/server/metrics/lib/simple_histogram.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export class SimpleHistogram {
2323
private maxValue: number;
2424
private bucketSize: number;
2525
private histogramBuckets: Bucket[] = [];
26+
private allValues: number[] = [];
2627

2728
constructor(max: number, bucketSize: number) {
2829
if (bucketSize > max) {
@@ -38,6 +39,7 @@ export class SimpleHistogram {
3839
for (let i = 0; i < this.histogramBuckets.length; i++) {
3940
this.histogramBuckets[i].count = 0;
4041
}
42+
this.allValues = [];
4143
}
4244

4345
public record(value: number, increment: number = 1) {
@@ -52,6 +54,10 @@ export class SimpleHistogram {
5254
break;
5355
}
5456
}
57+
58+
for (let i = 0; i < increment; i++) {
59+
this.allValues.push(value);
60+
}
5561
}
5662

5763
public get(truncate: boolean = false) {
@@ -74,6 +80,10 @@ export class SimpleHistogram {
7480
}));
7581
}
7682

83+
public getAllValues(truncate: boolean = false) {
84+
return this.allValues.slice();
85+
}
86+
7787
public serialize(): SerializedHistogram {
7888
const counts: number[] = [];
7989
const values: number[] = [];

x-pack/plugins/task_manager/server/metrics/task_claim_metrics_aggregator.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ describe('TaskClaimMetricsAggregator', () => {
4747
success: 0,
4848
total: 0,
4949
duration: { counts: [], values: [] },
50+
duration_values: [],
5051
});
5152
});
5253

@@ -55,6 +56,7 @@ describe('TaskClaimMetricsAggregator', () => {
5556
success: 0,
5657
total: 0,
5758
duration: { counts: [], values: [] },
59+
duration_values: [],
5860
});
5961
});
6062

@@ -65,6 +67,7 @@ describe('TaskClaimMetricsAggregator', () => {
6567
success: 2,
6668
total: 2,
6769
duration: { counts: [2], values: [100] },
70+
duration_values: [10, 10],
6871
});
6972
});
7073

@@ -75,6 +78,7 @@ describe('TaskClaimMetricsAggregator', () => {
7578
success: 0,
7679
total: 2,
7780
duration: { counts: [], values: [] },
81+
duration_values: [],
7882
});
7983
});
8084

@@ -90,13 +94,15 @@ describe('TaskClaimMetricsAggregator', () => {
9094
success: 4,
9195
total: 7,
9296
duration: { counts: [4], values: [100] },
97+
duration_values: [10, 10, 10, 10],
9398
});
9499

95100
taskClaimMetricsAggregator.reset();
96101
expect(taskClaimMetricsAggregator.collect()).toEqual({
97102
success: 0,
98103
total: 0,
99104
duration: { counts: [], values: [] },
105+
duration_values: [],
100106
});
101107
});
102108
});

x-pack/plugins/task_manager/server/metrics/task_claim_metrics_aggregator.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ interface TaskClaimCounts extends JsonObject {
2626

2727
export type TaskClaimMetric = TaskClaimCounts & {
2828
duration: SerializedHistogram;
29+
duration_values: number[];
2930
};
3031

3132
export class TaskClaimMetricsAggregator implements ITaskMetricsAggregator<TaskClaimMetric> {
@@ -38,12 +39,14 @@ export class TaskClaimMetricsAggregator implements ITaskMetricsAggregator<TaskCl
3839
return {
3940
...this.counter.initialMetrics(),
4041
duration: { counts: [], values: [] },
42+
duration_values: [],
4143
};
4244
}
4345
public collect(): TaskClaimMetric {
4446
return {
4547
...this.counter.collect(),
4648
duration: this.durationHistogram.serialize(),
49+
duration_values: this.durationHistogram.getAllValues(),
4750
};
4851
}
4952

x-pack/plugins/task_manager/server/metrics/task_overdue_metrics_aggregator.test.ts

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,20 @@ describe('TaskOverdueMetricsAggregator', () => {
2222

2323
test('should correctly initialize', () => {
2424
expect(taskOverdueMetricsAggregator.collect()).toEqual({
25-
overall: { overdue_by: { counts: [], values: [] } },
25+
overall: {
26+
overdue_by: { counts: [], values: [] },
27+
overdue_by_values: [],
28+
},
2629
by_type: {},
2730
});
2831
});
2932

3033
test('should correctly return initialMetrics', () => {
3134
expect(taskOverdueMetricsAggregator.initialMetric()).toEqual({
32-
overall: { overdue_by: { counts: [], values: [] } },
35+
overall: {
36+
overdue_by: { counts: [], values: [] },
37+
overdue_by_values: [],
38+
},
3339
by_type: {},
3440
});
3541
});
@@ -50,9 +56,15 @@ describe('TaskOverdueMetricsAggregator', () => {
5056
})
5157
);
5258
expect(taskOverdueMetricsAggregator.collect()).toEqual({
53-
overall: { overdue_by: { counts: [1, 0, 1], values: [10, 20, 30] } },
59+
overall: {
60+
overdue_by: { counts: [1, 0, 1], values: [10, 20, 30] },
61+
overdue_by_values: [0, 20],
62+
},
5463
by_type: {
55-
telemetry: { overdue_by: { counts: [1, 0, 1], values: [10, 20, 30] } },
64+
telemetry: {
65+
overdue_by: { counts: [1, 0, 1], values: [10, 20, 30] },
66+
overdue_by_values: [0, 20],
67+
},
5668
},
5769
});
5870
});
@@ -66,7 +78,10 @@ describe('TaskOverdueMetricsAggregator', () => {
6678
})
6779
);
6880
expect(taskOverdueMetricsAggregator.collect()).toEqual({
69-
overall: { overdue_by: { counts: [], values: [] } },
81+
overall: {
82+
overdue_by: { counts: [], values: [] },
83+
overdue_by_values: [],
84+
},
7085
by_type: {},
7186
});
7287
});
@@ -95,9 +110,15 @@ describe('TaskOverdueMetricsAggregator', () => {
95110
})
96111
);
97112
expect(taskOverdueMetricsAggregator.collect()).toEqual({
98-
overall: { overdue_by: { counts: [0, 0, 0, 0, 1], values: [10, 20, 30, 40, 50] } },
113+
overall: {
114+
overdue_by: { counts: [0, 0, 0, 0, 1], values: [10, 20, 30, 40, 50] },
115+
overdue_by_values: [40],
116+
},
99117
by_type: {
100-
telemetry: { overdue_by: { counts: [0, 0, 0, 0, 1], values: [10, 20, 30, 40, 50] } },
118+
telemetry: {
119+
overdue_by: { counts: [0, 0, 0, 0, 1], values: [10, 20, 30, 40, 50] },
120+
overdue_by_values: [40],
121+
},
101122
},
102123
});
103124
});
@@ -129,43 +150,50 @@ describe('TaskOverdueMetricsAggregator', () => {
129150
counts: [3, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1],
130151
values: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130],
131152
},
153+
overdue_by_values: [0, 0, 0, 20, 20, 40, 120],
132154
},
133155
by_type: {
134156
'alerting:example': {
135157
overdue_by: {
136158
counts: [0, 0, 0, 0, 1],
137159
values: [10, 20, 30, 40, 50],
138160
},
161+
overdue_by_values: [40],
139162
},
140163
'alerting:__index-threshold': {
141164
overdue_by: {
142165
counts: [0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
143166
values: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130],
144167
},
168+
overdue_by_values: [20, 20, 120],
145169
},
146170
alerting: {
147171
overdue_by: {
148172
counts: [0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1],
149173
values: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130],
150174
},
175+
overdue_by_values: [40, 20, 20, 120],
151176
},
152177
'actions:webhook': {
153178
overdue_by: {
154179
counts: [2],
155180
values: [10],
156181
},
182+
overdue_by_values: [0, 0],
157183
},
158184
'actions:__email': {
159185
overdue_by: {
160186
counts: [1],
161187
values: [10],
162188
},
189+
overdue_by_values: [0],
163190
},
164191
actions: {
165192
overdue_by: {
166193
counts: [3],
167194
values: [10],
168195
},
196+
overdue_by_values: [0, 0, 0],
169197
},
170198
},
171199
});
@@ -198,44 +226,50 @@ describe('TaskOverdueMetricsAggregator', () => {
198226
counts: [3, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1],
199227
values: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130],
200228
},
229+
overdue_by_values: [0, 0, 0, 20, 20, 40, 120],
201230
},
202231
by_type: {
203232
'alerting:example': {
204233
overdue_by: {
205234
counts: [0, 0, 0, 0, 1],
206-
207235
values: [10, 20, 30, 40, 50],
208236
},
237+
overdue_by_values: [40],
209238
},
210239
'alerting:__index-threshold': {
211240
overdue_by: {
212241
counts: [0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
213242
values: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130],
214243
},
244+
overdue_by_values: [20, 20, 120],
215245
},
216246
alerting: {
217247
overdue_by: {
218248
counts: [0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1],
219249
values: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130],
220250
},
251+
overdue_by_values: [40, 20, 20, 120],
221252
},
222253
'actions:webhook': {
223254
overdue_by: {
224255
counts: [2],
225256
values: [10],
226257
},
258+
overdue_by_values: [0, 0],
227259
},
228260
'actions:__email': {
229261
overdue_by: {
230262
counts: [1],
231263
values: [10],
232264
},
265+
overdue_by_values: [0],
233266
},
234267
actions: {
235268
overdue_by: {
236269
counts: [3],
237270
values: [10],
238271
},
272+
overdue_by_values: [0, 0, 0],
239273
},
240274
},
241275
});

0 commit comments

Comments
 (0)