Skip to content

Commit ae1185d

Browse files
AndrewGrachovlegendecasdyladan
authored
fix: make prometheus histogram export cumulative (#1570)
Co-authored-by: legendecas <[email protected]> Co-authored-by: Daniel Dyla <[email protected]>
1 parent 240f852 commit ae1185d

File tree

2 files changed

+18
-12
lines changed

2 files changed

+18
-12
lines changed

packages/opentelemetry-exporter-prometheus/src/PrometheusSerializer.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,12 +239,15 @@ export class PrometheusSerializer {
239239
undefined
240240
);
241241
}
242+
243+
let cumulativeSum = 0;
242244
for (const [idx, val] of value.buckets.counts.entries()) {
245+
cumulativeSum += val;
243246
const upperBound = value.buckets.boundaries[idx];
244247
results += stringify(
245248
name + '_bucket',
246249
record.labels,
247-
val,
250+
cumulativeSum,
248251
this._appendTimestamp ? timestamp : undefined,
249252
{
250253
le: upperBound === undefined ? '+Inf' : String(upperBound),

packages/opentelemetry-exporter-prometheus/test/PrometheusSerializer.test.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,8 @@ describe('PrometheusSerializer', () => {
168168
`test_sum{foo1="bar1",foo2="bar2"} 5 ${mockedHrTimeMs}\n` +
169169
`test_bucket{foo1="bar1",foo2="bar2",le="1"} 0 ${mockedHrTimeMs}\n` +
170170
`test_bucket{foo1="bar1",foo2="bar2",le="10"} 1 ${mockedHrTimeMs}\n` +
171-
`test_bucket{foo1="bar1",foo2="bar2",le="100"} 0 ${mockedHrTimeMs}\n` +
172-
`test_bucket{foo1="bar1",foo2="bar2",le="+Inf"} 0 ${mockedHrTimeMs}\n`
171+
`test_bucket{foo1="bar1",foo2="bar2",le="100"} 1 ${mockedHrTimeMs}\n` +
172+
`test_bucket{foo1="bar1",foo2="bar2",le="+Inf"} 1 ${mockedHrTimeMs}\n`
173173
);
174174
});
175175

@@ -196,8 +196,8 @@ describe('PrometheusSerializer', () => {
196196
'test_sum{foo1="bar1",foo2="bar2"} 5\n' +
197197
'test_bucket{foo1="bar1",foo2="bar2",le="1"} 0\n' +
198198
'test_bucket{foo1="bar1",foo2="bar2",le="10"} 1\n' +
199-
'test_bucket{foo1="bar1",foo2="bar2",le="100"} 0\n' +
200-
'test_bucket{foo1="bar1",foo2="bar2",le="+Inf"} 0\n'
199+
'test_bucket{foo1="bar1",foo2="bar2",le="100"} 1\n' +
200+
'test_bucket{foo1="bar1",foo2="bar2",le="+Inf"} 1\n'
201201
);
202202
});
203203
});
@@ -302,7 +302,7 @@ describe('PrometheusSerializer', () => {
302302
describe('with HistogramAggregator', () => {
303303
mockAggregator(HistogramAggregator);
304304

305-
it('serialize metric record with MinMaxLastSumCountAggregator aggregator', async () => {
305+
it('serialize metric record with HistogramAggregator aggregator, cumulative', async () => {
306306
const serializer = new PrometheusSerializer();
307307

308308
const batcher = new ExactBatcher(HistogramAggregator, [1, 10, 100]);
@@ -311,6 +311,9 @@ describe('PrometheusSerializer', () => {
311311
description: 'foobar',
312312
}) as ValueRecorderMetric;
313313
recorder.bind({ val: '1' }).record(5);
314+
recorder.bind({ val: '1' }).record(50);
315+
recorder.bind({ val: '1' }).record(120);
316+
314317
recorder.bind({ val: '2' }).record(5);
315318

316319
const records = await recorder.getMetricRecord();
@@ -323,18 +326,18 @@ describe('PrometheusSerializer', () => {
323326
result,
324327
'# HELP test foobar\n' +
325328
'# TYPE test histogram\n' +
326-
`test_count{val="1"} 1 ${mockedHrTimeMs}\n` +
327-
`test_sum{val="1"} 5 ${mockedHrTimeMs}\n` +
329+
`test_count{val="1"} 3 ${mockedHrTimeMs}\n` +
330+
`test_sum{val="1"} 175 ${mockedHrTimeMs}\n` +
328331
`test_bucket{val="1",le="1"} 0 ${mockedHrTimeMs}\n` +
329332
`test_bucket{val="1",le="10"} 1 ${mockedHrTimeMs}\n` +
330-
`test_bucket{val="1",le="100"} 0 ${mockedHrTimeMs}\n` +
331-
`test_bucket{val="1",le="+Inf"} 0 ${mockedHrTimeMs}\n` +
333+
`test_bucket{val="1",le="100"} 2 ${mockedHrTimeMs}\n` +
334+
`test_bucket{val="1",le="+Inf"} 3 ${mockedHrTimeMs}\n` +
332335
`test_count{val="2"} 1 ${mockedHrTimeMs}\n` +
333336
`test_sum{val="2"} 5 ${mockedHrTimeMs}\n` +
334337
`test_bucket{val="2",le="1"} 0 ${mockedHrTimeMs}\n` +
335338
`test_bucket{val="2",le="10"} 1 ${mockedHrTimeMs}\n` +
336-
`test_bucket{val="2",le="100"} 0 ${mockedHrTimeMs}\n` +
337-
`test_bucket{val="2",le="+Inf"} 0 ${mockedHrTimeMs}\n`
339+
`test_bucket{val="2",le="100"} 1 ${mockedHrTimeMs}\n` +
340+
`test_bucket{val="2",le="+Inf"} 1 ${mockedHrTimeMs}\n`
338341
);
339342
});
340343
});

0 commit comments

Comments
 (0)