@libp2p/prometheus-metrics 1.1.0 → 1.1.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.
- package/dist/src/counter-group.d.ts +5 -2
- package/dist/src/counter-group.d.ts.map +1 -1
- package/dist/src/counter-group.js +12 -5
- package/dist/src/counter-group.js.map +1 -1
- package/dist/src/counter.d.ts +5 -2
- package/dist/src/counter.d.ts.map +1 -1
- package/dist/src/counter.js +9 -3
- package/dist/src/counter.js.map +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +47 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/metric-group.d.ts +5 -2
- package/dist/src/metric-group.d.ts.map +1 -1
- package/dist/src/metric-group.js +12 -5
- package/dist/src/metric-group.js.map +1 -1
- package/dist/src/metric.d.ts +3 -1
- package/dist/src/metric.d.ts.map +1 -1
- package/dist/src/metric.js +9 -3
- package/dist/src/metric.js.map +1 -1
- package/dist/src/utils.d.ts +4 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/counter-group.ts +16 -7
- package/src/counter.ts +14 -6
- package/src/index.ts +68 -8
- package/src/metric-group.ts +16 -7
- package/src/metric.ts +12 -4
- package/src/utils.ts +5 -0
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import type { CounterGroup } from '@libp2p/interface-metrics';
|
|
1
|
+
import type { CounterGroup, CalculateMetric } from '@libp2p/interface-metrics';
|
|
2
|
+
import { CalculatedMetric } from './utils.js';
|
|
2
3
|
import type { PrometheusCalculatedMetricOptions } from './index.js';
|
|
3
|
-
export declare class PrometheusCounterGroup implements CounterGroup {
|
|
4
|
+
export declare class PrometheusCounterGroup implements CounterGroup, CalculatedMetric<Record<string, number>> {
|
|
4
5
|
private readonly counter;
|
|
5
6
|
private readonly label;
|
|
7
|
+
private readonly calculators;
|
|
6
8
|
constructor(name: string, opts: PrometheusCalculatedMetricOptions<Record<string, number>>);
|
|
9
|
+
addCalculator(calculator: CalculateMetric<Record<string, number>>): void;
|
|
7
10
|
increment(values: Record<string, number | unknown>): void;
|
|
8
11
|
reset(): void;
|
|
9
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counter-group.d.ts","sourceRoot":"","sources":["../../src/counter-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"counter-group.d.ts","sourceRoot":"","sources":["../../src/counter-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAE9E,OAAO,EAAmB,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAA;AAEnE,qBAAa,sBAAuB,YAAW,YAAY,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;gBAE/D,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAgC1F,aAAa,CAAE,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIlE,SAAS,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI;IAQ1D,KAAK,IAAK,IAAI;CAGf"}
|
|
@@ -6,14 +6,18 @@ export class PrometheusCounterGroup {
|
|
|
6
6
|
const help = normaliseString(opts.help ?? name);
|
|
7
7
|
const label = this.label = normaliseString(opts.label ?? name);
|
|
8
8
|
let collect;
|
|
9
|
+
this.calculators = [];
|
|
9
10
|
// calculated metric
|
|
10
11
|
if (opts?.calculate != null) {
|
|
11
|
-
|
|
12
|
+
this.calculators.push(opts.calculate);
|
|
13
|
+
const self = this;
|
|
12
14
|
collect = async function () {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
await Promise.all(self.calculators.map(async (calculate) => {
|
|
16
|
+
const values = await calculate();
|
|
17
|
+
Object.entries(values).forEach(([key, value]) => {
|
|
18
|
+
this.inc({ [label]: key }, value);
|
|
19
|
+
});
|
|
20
|
+
}));
|
|
17
21
|
};
|
|
18
22
|
}
|
|
19
23
|
this.counter = new PromCounter({
|
|
@@ -24,6 +28,9 @@ export class PrometheusCounterGroup {
|
|
|
24
28
|
collect
|
|
25
29
|
});
|
|
26
30
|
}
|
|
31
|
+
addCalculator(calculator) {
|
|
32
|
+
this.calculators.push(calculator);
|
|
33
|
+
}
|
|
27
34
|
increment(values) {
|
|
28
35
|
Object.entries(values).forEach(([key, value]) => {
|
|
29
36
|
const inc = typeof value === 'number' ? value : 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counter-group.js","sourceRoot":"","sources":["../../src/counter-group.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAmB,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"counter-group.js","sourceRoot":"","sources":["../../src/counter-group.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAmB,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,eAAe,EAAoB,MAAM,YAAY,CAAA;AAG9D,MAAM,OAAO,sBAAsB;IAKjC,YAAa,IAAY,EAAE,IAA+D;QACxF,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;QAC5B,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAA;QAC9D,IAAI,OAAsD,CAAA;QAC1D,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;QAErB,oBAAoB;QACpB,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE;YAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACrC,MAAM,IAAI,GAAG,IAAI,CAAA;YAEjB,OAAO,GAAG,KAAK;gBACb,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAC,SAAS,EAAC,EAAE;oBACvD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAA;oBAEhC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;wBAC9C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAA;oBACnC,CAAC,CAAC,CAAA;gBACJ,CAAC,CAAC,CAAC,CAAA;YACL,CAAC,CAAA;SACF;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC;YAC7B,IAAI;YACJ,IAAI;YACJ,UAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACxB,SAAS,EAAE,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;YACpE,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED,aAAa,CAAE,UAAmD;QAChE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACnC,CAAC;IAED,SAAS,CAAE,MAAwC;QACjD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC9C,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAEjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;CACF"}
|
package/dist/src/counter.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import type { Counter } from '@libp2p/interface-metrics';
|
|
1
|
+
import type { CalculateMetric, Counter } from '@libp2p/interface-metrics';
|
|
2
2
|
import type { PrometheusCalculatedMetricOptions } from './index.js';
|
|
3
|
-
|
|
3
|
+
import { CalculatedMetric } from './utils.js';
|
|
4
|
+
export declare class PrometheusCounter implements Counter, CalculatedMetric {
|
|
4
5
|
private readonly counter;
|
|
6
|
+
private readonly calculators;
|
|
5
7
|
constructor(name: string, opts: PrometheusCalculatedMetricOptions);
|
|
8
|
+
addCalculator(calculator: CalculateMetric): void;
|
|
6
9
|
increment(value?: number): void;
|
|
7
10
|
reset(): void;
|
|
8
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../../src/counter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../../src/counter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAEzE,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAmB,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE9D,qBAAa,iBAAkB,YAAW,OAAO,EAAE,gBAAgB;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;gBAElC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC;IA6BlE,aAAa,CAAE,UAAU,EAAE,eAAe;IAI1C,SAAS,CAAE,KAAK,GAAE,MAAU,GAAG,IAAI;IAInC,KAAK,IAAK,IAAI;CAGf"}
|
package/dist/src/counter.js
CHANGED
|
@@ -6,12 +6,15 @@ export class PrometheusCounter {
|
|
|
6
6
|
const help = normaliseString(opts.help ?? name);
|
|
7
7
|
const labels = opts.label != null ? [normaliseString(opts.label)] : [];
|
|
8
8
|
let collect;
|
|
9
|
+
this.calculators = [];
|
|
9
10
|
// calculated metric
|
|
10
11
|
if (opts?.calculate != null) {
|
|
11
|
-
|
|
12
|
+
this.calculators.push(opts.calculate);
|
|
13
|
+
const self = this;
|
|
12
14
|
collect = async function () {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
+
const values = await Promise.all(self.calculators.map(async (calculate) => await calculate()));
|
|
16
|
+
const sum = values.reduce((acc, curr) => acc + curr, 0);
|
|
17
|
+
this.inc(sum);
|
|
15
18
|
};
|
|
16
19
|
}
|
|
17
20
|
this.counter = new PromCounter({
|
|
@@ -22,6 +25,9 @@ export class PrometheusCounter {
|
|
|
22
25
|
collect
|
|
23
26
|
});
|
|
24
27
|
}
|
|
28
|
+
addCalculator(calculator) {
|
|
29
|
+
this.calculators.push(calculator);
|
|
30
|
+
}
|
|
25
31
|
increment(value = 1) {
|
|
26
32
|
this.counter.inc(value);
|
|
27
33
|
}
|
package/dist/src/counter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counter.js","sourceRoot":"","sources":["../../src/counter.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,OAAO,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AAErE,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"counter.js","sourceRoot":"","sources":["../../src/counter.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,OAAO,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AAErE,OAAO,EAAE,eAAe,EAAoB,MAAM,YAAY,CAAA;AAE9D,MAAM,OAAO,iBAAiB;IAI5B,YAAa,IAAY,EAAE,IAAuC;QAChE,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;QAC5B,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACtE,IAAI,OAAsD,CAAA;QAC1D,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;QAErB,oBAAoB;QACpB,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE;YAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACrC,MAAM,IAAI,GAAG,IAAI,CAAA;YAEjB,OAAO,GAAG,KAAK;gBACb,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAC,SAAS,EAAC,EAAE,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,CAAA;gBAC5F,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAA;gBAEvD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACf,CAAC,CAAA;SACF;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC;YAC7B,IAAI;YACJ,IAAI;YACJ,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;YACpE,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED,aAAa,CAAE,UAA2B;QACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACnC,CAAC;IAED,SAAS,CAAE,QAAgB,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;CACF"}
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAA6D,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAC5I,OAAO,EAAyB,oCAAoC,EAAY,QAAQ,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAA6D,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAC5I,OAAO,EAAyB,oCAAoC,EAAY,QAAQ,EAAE,MAAM,aAAa,CAAA;AAe7G,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAA;IAEnB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAE/B;;OAEG;IACH,cAAc,CAAC,EAAE,oCAAoC,CAAA;IAErD;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAClC;AAED,MAAM,WAAW,iCAAiC,CAAC,CAAC,GAAC,MAAM,CAAE,SAAQ,uBAAuB,CAAC,CAAC,CAAC;IAC7F,QAAQ,CAAC,EAAE,QAAQ,CAAA;CACpB;AAoND,wBAAgB,iBAAiB,CAAE,IAAI,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,OAAO,CAIvF"}
|
package/dist/src/index.js
CHANGED
|
@@ -6,11 +6,14 @@ import { PrometheusCounter } from './counter.js';
|
|
|
6
6
|
import { PrometheusCounterGroup } from './counter-group.js';
|
|
7
7
|
import { logger } from '@libp2p/logger';
|
|
8
8
|
const log = logger('libp2p:prometheus-metrics');
|
|
9
|
+
// prom-client metrics are global
|
|
10
|
+
const metrics = new Map();
|
|
9
11
|
class PrometheusMetrics {
|
|
10
12
|
constructor(init) {
|
|
11
13
|
this.registry = init?.registry;
|
|
12
14
|
if (init?.preserveExistingMetrics !== true) {
|
|
13
15
|
log('Clearing existing metrics');
|
|
16
|
+
metrics.clear();
|
|
14
17
|
(this.registry ?? register).clear();
|
|
15
18
|
}
|
|
16
19
|
if (init?.preserveExistingMetrics !== false) {
|
|
@@ -82,40 +85,76 @@ class PrometheusMetrics {
|
|
|
82
85
|
if (name == null ?? name.trim() === '') {
|
|
83
86
|
throw new Error('Metric name is required');
|
|
84
87
|
}
|
|
88
|
+
let metric = metrics.get(name);
|
|
89
|
+
if (metrics.has(name)) {
|
|
90
|
+
log('Reuse existing metric', name);
|
|
91
|
+
if (opts.calculate != null) {
|
|
92
|
+
metric.addCalculator(opts.calculate);
|
|
93
|
+
}
|
|
94
|
+
return metrics.get(name);
|
|
95
|
+
}
|
|
85
96
|
log('Register metric', name);
|
|
86
|
-
|
|
97
|
+
metric = new PrometheusMetric(name, { registry: this.registry, ...opts });
|
|
98
|
+
metrics.set(name, metric);
|
|
87
99
|
if (opts.calculate == null) {
|
|
88
100
|
return metric;
|
|
89
101
|
}
|
|
90
102
|
}
|
|
91
103
|
registerMetricGroup(name, opts = {}) {
|
|
92
104
|
if (name == null ?? name.trim() === '') {
|
|
93
|
-
throw new Error('Metric name is required');
|
|
105
|
+
throw new Error('Metric group name is required');
|
|
106
|
+
}
|
|
107
|
+
let metricGroup = metrics.get(name);
|
|
108
|
+
if (metricGroup != null) {
|
|
109
|
+
log('Reuse existing metric group', name);
|
|
110
|
+
if (opts.calculate != null) {
|
|
111
|
+
metricGroup.addCalculator(opts.calculate);
|
|
112
|
+
}
|
|
113
|
+
return metricGroup;
|
|
94
114
|
}
|
|
95
115
|
log('Register metric group', name);
|
|
96
|
-
|
|
116
|
+
metricGroup = new PrometheusMetricGroup(name, { registry: this.registry, ...opts });
|
|
117
|
+
metrics.set(name, metricGroup);
|
|
97
118
|
if (opts.calculate == null) {
|
|
98
|
-
return
|
|
119
|
+
return metricGroup;
|
|
99
120
|
}
|
|
100
121
|
}
|
|
101
122
|
registerCounter(name, opts = {}) {
|
|
102
123
|
if (name == null ?? name.trim() === '') {
|
|
103
124
|
throw new Error('Counter name is required');
|
|
104
125
|
}
|
|
126
|
+
let counter = metrics.get(name);
|
|
127
|
+
if (counter != null) {
|
|
128
|
+
log('Reuse existing counter', name);
|
|
129
|
+
if (opts.calculate != null) {
|
|
130
|
+
counter.addCalculator(opts.calculate);
|
|
131
|
+
}
|
|
132
|
+
return metrics.get(name);
|
|
133
|
+
}
|
|
105
134
|
log('Register counter', name);
|
|
106
|
-
|
|
135
|
+
counter = new PrometheusCounter(name, { registry: this.registry, ...opts });
|
|
136
|
+
metrics.set(name, counter);
|
|
107
137
|
if (opts.calculate == null) {
|
|
108
138
|
return counter;
|
|
109
139
|
}
|
|
110
140
|
}
|
|
111
141
|
registerCounterGroup(name, opts = {}) {
|
|
112
142
|
if (name == null ?? name.trim() === '') {
|
|
113
|
-
throw new Error('
|
|
143
|
+
throw new Error('Counter group name is required');
|
|
144
|
+
}
|
|
145
|
+
let counterGroup = metrics.get(name);
|
|
146
|
+
if (counterGroup != null) {
|
|
147
|
+
log('Reuse existing counter group', name);
|
|
148
|
+
if (opts.calculate != null) {
|
|
149
|
+
counterGroup.addCalculator(opts.calculate);
|
|
150
|
+
}
|
|
151
|
+
return counterGroup;
|
|
114
152
|
}
|
|
115
153
|
log('Register counter group', name);
|
|
116
|
-
|
|
154
|
+
counterGroup = new PrometheusCounterGroup(name, { registry: this.registry, ...opts });
|
|
155
|
+
metrics.set(name, counterGroup);
|
|
117
156
|
if (opts.calculate == null) {
|
|
118
|
-
return
|
|
157
|
+
return counterGroup;
|
|
119
158
|
}
|
|
120
159
|
}
|
|
121
160
|
}
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAwC,QAAQ,EAAY,MAAM,aAAa,CAAA;AAG7G,OAAO,IAAI,MAAM,YAAY,CAAA;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,MAAM,GAAG,GAAG,MAAM,CAAC,2BAA2B,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import type { MetricGroup, StopTimer } from '@libp2p/interface-metrics';
|
|
1
|
+
import type { CalculateMetric, MetricGroup, StopTimer } from '@libp2p/interface-metrics';
|
|
2
2
|
import type { PrometheusCalculatedMetricOptions } from './index.js';
|
|
3
|
-
|
|
3
|
+
import { CalculatedMetric } from './utils.js';
|
|
4
|
+
export declare class PrometheusMetricGroup implements MetricGroup, CalculatedMetric<Record<string, number>> {
|
|
4
5
|
private readonly gauge;
|
|
5
6
|
private readonly label;
|
|
7
|
+
private readonly calculators;
|
|
6
8
|
constructor(name: string, opts: PrometheusCalculatedMetricOptions<Record<string, number>>);
|
|
9
|
+
addCalculator(calculator: CalculateMetric<Record<string, number>>): void;
|
|
7
10
|
update(values: Record<string, number>): void;
|
|
8
11
|
increment(values: Record<string, number | unknown>): void;
|
|
9
12
|
decrement(values: Record<string, number | unknown>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metric-group.d.ts","sourceRoot":"","sources":["../../src/metric-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"metric-group.d.ts","sourceRoot":"","sources":["../../src/metric-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAExF,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAmB,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE9D,qBAAa,qBAAsB,YAAW,WAAW,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgD;gBAE/D,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAgC1F,aAAa,CAAE,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIlE,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAM7C,SAAS,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI;IAQ1D,SAAS,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI;IAQ1D,KAAK,IAAK,IAAI;IAId,KAAK,CAAE,GAAG,EAAE,MAAM,GAAG,SAAS;CAK/B"}
|
package/dist/src/metric-group.js
CHANGED
|
@@ -6,14 +6,18 @@ export class PrometheusMetricGroup {
|
|
|
6
6
|
const help = normaliseString(opts.help ?? name);
|
|
7
7
|
const label = this.label = normaliseString(opts.label ?? name);
|
|
8
8
|
let collect;
|
|
9
|
+
this.calculators = [];
|
|
9
10
|
// calculated metric
|
|
10
11
|
if (opts?.calculate != null) {
|
|
11
|
-
|
|
12
|
+
this.calculators.push(opts.calculate);
|
|
13
|
+
const self = this;
|
|
12
14
|
collect = async function () {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
await Promise.all(self.calculators.map(async (calculate) => {
|
|
16
|
+
const values = await calculate();
|
|
17
|
+
Object.entries(values).forEach(([key, value]) => {
|
|
18
|
+
this.set({ [label]: key }, value);
|
|
19
|
+
});
|
|
20
|
+
}));
|
|
17
21
|
};
|
|
18
22
|
}
|
|
19
23
|
this.gauge = new Gauge({
|
|
@@ -24,6 +28,9 @@ export class PrometheusMetricGroup {
|
|
|
24
28
|
collect
|
|
25
29
|
});
|
|
26
30
|
}
|
|
31
|
+
addCalculator(calculator) {
|
|
32
|
+
this.calculators.push(calculator);
|
|
33
|
+
}
|
|
27
34
|
update(values) {
|
|
28
35
|
Object.entries(values).forEach(([key, value]) => {
|
|
29
36
|
this.gauge.set({ [this.label]: key }, value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metric-group.js","sourceRoot":"","sources":["../../src/metric-group.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"metric-group.js","sourceRoot":"","sources":["../../src/metric-group.ts"],"names":[],"mappings":"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"}
|
package/dist/src/metric.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type { Metric, StopTimer } from '@libp2p/interface-metrics';
|
|
1
|
+
import type { Metric, StopTimer, CalculateMetric } from '@libp2p/interface-metrics';
|
|
2
2
|
import type { PrometheusCalculatedMetricOptions } from './index.js';
|
|
3
3
|
export declare class PrometheusMetric implements Metric {
|
|
4
4
|
private readonly gauge;
|
|
5
|
+
private readonly calculators;
|
|
5
6
|
constructor(name: string, opts: PrometheusCalculatedMetricOptions);
|
|
7
|
+
addCalculator(calculator: CalculateMetric): void;
|
|
6
8
|
update(value: number): void;
|
|
7
9
|
increment(value?: number): void;
|
|
8
10
|
decrement(value?: number): void;
|
package/dist/src/metric.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metric.d.ts","sourceRoot":"","sources":["../../src/metric.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"metric.d.ts","sourceRoot":"","sources":["../../src/metric.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAEnF,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAA;AAGnE,qBAAa,gBAAiB,YAAW,MAAM;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;gBAElC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iCAAiC;IA6BlE,aAAa,CAAE,UAAU,EAAE,eAAe;IAI1C,MAAM,CAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI5B,SAAS,CAAE,KAAK,GAAE,MAAU,GAAG,IAAI;IAInC,SAAS,CAAE,KAAK,GAAE,MAAU,GAAG,IAAI;IAInC,KAAK,IAAK,IAAI;IAId,KAAK,IAAK,SAAS;CAGpB"}
|
package/dist/src/metric.js
CHANGED
|
@@ -6,12 +6,15 @@ export class PrometheusMetric {
|
|
|
6
6
|
const help = normaliseString(opts.help ?? name);
|
|
7
7
|
const labels = opts.label != null ? [normaliseString(opts.label)] : [];
|
|
8
8
|
let collect;
|
|
9
|
+
this.calculators = [];
|
|
9
10
|
// calculated metric
|
|
10
11
|
if (opts?.calculate != null) {
|
|
11
|
-
|
|
12
|
+
this.calculators.push(opts.calculate);
|
|
13
|
+
const self = this;
|
|
12
14
|
collect = async function () {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
+
const values = await Promise.all(self.calculators.map(async (calculate) => await calculate()));
|
|
16
|
+
const sum = values.reduce((acc, curr) => acc + curr, 0);
|
|
17
|
+
this.set(sum);
|
|
15
18
|
};
|
|
16
19
|
}
|
|
17
20
|
this.gauge = new Gauge({
|
|
@@ -22,6 +25,9 @@ export class PrometheusMetric {
|
|
|
22
25
|
collect
|
|
23
26
|
});
|
|
24
27
|
}
|
|
28
|
+
addCalculator(calculator) {
|
|
29
|
+
this.calculators.push(calculator);
|
|
30
|
+
}
|
|
25
31
|
update(value) {
|
|
26
32
|
this.gauge.set(value);
|
|
27
33
|
}
|
package/dist/src/metric.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metric.js","sourceRoot":"","sources":["../../src/metric.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,OAAO,gBAAgB;
|
|
1
|
+
{"version":3,"file":"metric.js","sourceRoot":"","sources":["../../src/metric.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,EAAE,MAAM,aAAa,CAAA;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,OAAO,gBAAgB;IAI3B,YAAa,IAAY,EAAE,IAAuC;QAChE,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;QAC5B,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACtE,IAAI,OAAgD,CAAA;QACpD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;QAErB,oBAAoB;QACpB,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE;YAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACrC,MAAM,IAAI,GAAG,IAAI,CAAA;YAEjB,OAAO,GAAG,KAAK;gBACb,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAC,SAAS,EAAC,EAAE,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,CAAA;gBAC5F,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAA;gBAEvD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACf,CAAC,CAAA;SACF;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC;YACrB,IAAI;YACJ,IAAI;YACJ,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;YACpE,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED,aAAa,CAAE,UAA2B;QACxC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACnC,CAAC;IAED,MAAM,CAAE,KAAa;QACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC;IAED,SAAS,CAAE,QAAgB,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC;IAED,SAAS,CAAE,QAAgB,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAA;IAChC,CAAC;CACF"}
|
package/dist/src/utils.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import type { CalculateMetric } from '@libp2p/interface-metrics';
|
|
2
|
+
export interface CalculatedMetric<T = number> {
|
|
3
|
+
addCalculator: (calculator: CalculateMetric<T>) => void;
|
|
4
|
+
}
|
|
1
5
|
export declare const ONE_SECOND = 1000;
|
|
2
6
|
export declare const ONE_MINUTE: number;
|
|
3
7
|
/**
|
package/dist/src/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAEhE,MAAM,WAAW,gBAAgB,CAAE,CAAC,GAAG,MAAM;IAC3C,aAAa,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;CACxD;AAED,eAAO,MAAM,UAAU,OAAO,CAAA;AAC9B,eAAO,MAAM,UAAU,QAAkB,CAAA;AAEzC;;;GAGG;AACH,wBAAgB,eAAe,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIpD"}
|
package/dist/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAA;AAC9B,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,GAAG,UAAU,CAAA;AAEzC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAE,GAAW;IAC1C,OAAO,GAAG;SACP,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AACxB,CAAC"}
|
package/package.json
CHANGED
package/src/counter-group.ts
CHANGED
|
@@ -1,28 +1,33 @@
|
|
|
1
1
|
import type { CounterGroup, CalculateMetric } from '@libp2p/interface-metrics'
|
|
2
2
|
import { Counter as PromCounter, CollectFunction } from 'prom-client'
|
|
3
|
+
import { normaliseString, CalculatedMetric } from './utils.js'
|
|
3
4
|
import type { PrometheusCalculatedMetricOptions } from './index.js'
|
|
4
|
-
import { normaliseString } from './utils.js'
|
|
5
5
|
|
|
6
|
-
export class PrometheusCounterGroup implements CounterGroup {
|
|
6
|
+
export class PrometheusCounterGroup implements CounterGroup, CalculatedMetric<Record<string, number>> {
|
|
7
7
|
private readonly counter: PromCounter
|
|
8
8
|
private readonly label: string
|
|
9
|
+
private readonly calculators: Array<CalculateMetric<Record<string, number>>>
|
|
9
10
|
|
|
10
11
|
constructor (name: string, opts: PrometheusCalculatedMetricOptions<Record<string, number>>) {
|
|
11
12
|
name = normaliseString(name)
|
|
12
13
|
const help = normaliseString(opts.help ?? name)
|
|
13
14
|
const label = this.label = normaliseString(opts.label ?? name)
|
|
14
15
|
let collect: CollectFunction<PromCounter<any>> | undefined
|
|
16
|
+
this.calculators = []
|
|
15
17
|
|
|
16
18
|
// calculated metric
|
|
17
19
|
if (opts?.calculate != null) {
|
|
18
|
-
|
|
20
|
+
this.calculators.push(opts.calculate)
|
|
21
|
+
const self = this
|
|
19
22
|
|
|
20
23
|
collect = async function () {
|
|
21
|
-
|
|
24
|
+
await Promise.all(self.calculators.map(async calculate => {
|
|
25
|
+
const values = await calculate()
|
|
22
26
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
Object.entries(values).forEach(([key, value]) => {
|
|
28
|
+
this.inc({ [label]: key }, value)
|
|
29
|
+
})
|
|
30
|
+
}))
|
|
26
31
|
}
|
|
27
32
|
}
|
|
28
33
|
|
|
@@ -35,6 +40,10 @@ export class PrometheusCounterGroup implements CounterGroup {
|
|
|
35
40
|
})
|
|
36
41
|
}
|
|
37
42
|
|
|
43
|
+
addCalculator (calculator: CalculateMetric<Record<string, number>>) {
|
|
44
|
+
this.calculators.push(calculator)
|
|
45
|
+
}
|
|
46
|
+
|
|
38
47
|
increment (values: Record<string, number | unknown>): void {
|
|
39
48
|
Object.entries(values).forEach(([key, value]) => {
|
|
40
49
|
const inc = typeof value === 'number' ? value : 1
|
package/src/counter.ts
CHANGED
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
import type { Counter } from '@libp2p/interface-metrics'
|
|
1
|
+
import type { CalculateMetric, Counter } from '@libp2p/interface-metrics'
|
|
2
2
|
import { CollectFunction, Counter as PromCounter } from 'prom-client'
|
|
3
3
|
import type { PrometheusCalculatedMetricOptions } from './index.js'
|
|
4
|
-
import { normaliseString } from './utils.js'
|
|
4
|
+
import { normaliseString, CalculatedMetric } from './utils.js'
|
|
5
5
|
|
|
6
|
-
export class PrometheusCounter implements Counter {
|
|
6
|
+
export class PrometheusCounter implements Counter, CalculatedMetric {
|
|
7
7
|
private readonly counter: PromCounter
|
|
8
|
+
private readonly calculators: CalculateMetric[]
|
|
8
9
|
|
|
9
10
|
constructor (name: string, opts: PrometheusCalculatedMetricOptions) {
|
|
10
11
|
name = normaliseString(name)
|
|
11
12
|
const help = normaliseString(opts.help ?? name)
|
|
12
13
|
const labels = opts.label != null ? [normaliseString(opts.label)] : []
|
|
13
14
|
let collect: CollectFunction<PromCounter<any>> | undefined
|
|
15
|
+
this.calculators = []
|
|
14
16
|
|
|
15
17
|
// calculated metric
|
|
16
18
|
if (opts?.calculate != null) {
|
|
17
|
-
|
|
19
|
+
this.calculators.push(opts.calculate)
|
|
20
|
+
const self = this
|
|
18
21
|
|
|
19
22
|
collect = async function () {
|
|
20
|
-
const
|
|
23
|
+
const values = await Promise.all(self.calculators.map(async calculate => await calculate()))
|
|
24
|
+
const sum = values.reduce((acc, curr) => acc + curr, 0)
|
|
21
25
|
|
|
22
|
-
this.inc(
|
|
26
|
+
this.inc(sum)
|
|
23
27
|
}
|
|
24
28
|
}
|
|
25
29
|
|
|
@@ -32,6 +36,10 @@ export class PrometheusCounter implements Counter {
|
|
|
32
36
|
})
|
|
33
37
|
}
|
|
34
38
|
|
|
39
|
+
addCalculator (calculator: CalculateMetric) {
|
|
40
|
+
this.calculators.push(calculator)
|
|
41
|
+
}
|
|
42
|
+
|
|
35
43
|
increment (value: number = 1): void {
|
|
36
44
|
this.counter.inc(value)
|
|
37
45
|
}
|
package/src/index.ts
CHANGED
|
@@ -11,6 +11,9 @@ import { logger } from '@libp2p/logger'
|
|
|
11
11
|
|
|
12
12
|
const log = logger('libp2p:prometheus-metrics')
|
|
13
13
|
|
|
14
|
+
// prom-client metrics are global
|
|
15
|
+
const metrics = new Map<string, any>()
|
|
16
|
+
|
|
14
17
|
export interface PrometheusMetricsInit {
|
|
15
18
|
/**
|
|
16
19
|
* Use a custom registry to register metrics.
|
|
@@ -50,6 +53,7 @@ class PrometheusMetrics implements Metrics {
|
|
|
50
53
|
|
|
51
54
|
if (init?.preserveExistingMetrics !== true) {
|
|
52
55
|
log('Clearing existing metrics')
|
|
56
|
+
metrics.clear()
|
|
53
57
|
;(this.registry ?? register).clear()
|
|
54
58
|
}
|
|
55
59
|
|
|
@@ -140,8 +144,22 @@ class PrometheusMetrics implements Metrics {
|
|
|
140
144
|
throw new Error('Metric name is required')
|
|
141
145
|
}
|
|
142
146
|
|
|
147
|
+
let metric = metrics.get(name)
|
|
148
|
+
|
|
149
|
+
if (metrics.has(name)) {
|
|
150
|
+
log('Reuse existing metric', name)
|
|
151
|
+
|
|
152
|
+
if (opts.calculate != null) {
|
|
153
|
+
metric.addCalculator(opts.calculate)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return metrics.get(name)
|
|
157
|
+
}
|
|
158
|
+
|
|
143
159
|
log('Register metric', name)
|
|
144
|
-
|
|
160
|
+
metric = new PrometheusMetric(name, { registry: this.registry, ...opts })
|
|
161
|
+
|
|
162
|
+
metrics.set(name, metric)
|
|
145
163
|
|
|
146
164
|
if (opts.calculate == null) {
|
|
147
165
|
return metric
|
|
@@ -152,14 +170,28 @@ class PrometheusMetrics implements Metrics {
|
|
|
152
170
|
registerMetricGroup (name: string, opts?: MetricOptions): MetricGroup
|
|
153
171
|
registerMetricGroup (name: string, opts: any = {}): any {
|
|
154
172
|
if (name == null ?? name.trim() === '') {
|
|
155
|
-
throw new Error('Metric name is required')
|
|
173
|
+
throw new Error('Metric group name is required')
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
let metricGroup = metrics.get(name)
|
|
177
|
+
|
|
178
|
+
if (metricGroup != null) {
|
|
179
|
+
log('Reuse existing metric group', name)
|
|
180
|
+
|
|
181
|
+
if (opts.calculate != null) {
|
|
182
|
+
metricGroup.addCalculator(opts.calculate)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return metricGroup
|
|
156
186
|
}
|
|
157
187
|
|
|
158
188
|
log('Register metric group', name)
|
|
159
|
-
|
|
189
|
+
metricGroup = new PrometheusMetricGroup(name, { registry: this.registry, ...opts })
|
|
190
|
+
|
|
191
|
+
metrics.set(name, metricGroup)
|
|
160
192
|
|
|
161
193
|
if (opts.calculate == null) {
|
|
162
|
-
return
|
|
194
|
+
return metricGroup
|
|
163
195
|
}
|
|
164
196
|
}
|
|
165
197
|
|
|
@@ -170,8 +202,22 @@ class PrometheusMetrics implements Metrics {
|
|
|
170
202
|
throw new Error('Counter name is required')
|
|
171
203
|
}
|
|
172
204
|
|
|
205
|
+
let counter = metrics.get(name)
|
|
206
|
+
|
|
207
|
+
if (counter != null) {
|
|
208
|
+
log('Reuse existing counter', name)
|
|
209
|
+
|
|
210
|
+
if (opts.calculate != null) {
|
|
211
|
+
counter.addCalculator(opts.calculate)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return metrics.get(name)
|
|
215
|
+
}
|
|
216
|
+
|
|
173
217
|
log('Register counter', name)
|
|
174
|
-
|
|
218
|
+
counter = new PrometheusCounter(name, { registry: this.registry, ...opts })
|
|
219
|
+
|
|
220
|
+
metrics.set(name, counter)
|
|
175
221
|
|
|
176
222
|
if (opts.calculate == null) {
|
|
177
223
|
return counter
|
|
@@ -182,14 +228,28 @@ class PrometheusMetrics implements Metrics {
|
|
|
182
228
|
registerCounterGroup (name: string, opts?: MetricOptions): CounterGroup
|
|
183
229
|
registerCounterGroup (name: string, opts: any = {}): any {
|
|
184
230
|
if (name == null ?? name.trim() === '') {
|
|
185
|
-
throw new Error('
|
|
231
|
+
throw new Error('Counter group name is required')
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
let counterGroup = metrics.get(name)
|
|
235
|
+
|
|
236
|
+
if (counterGroup != null) {
|
|
237
|
+
log('Reuse existing counter group', name)
|
|
238
|
+
|
|
239
|
+
if (opts.calculate != null) {
|
|
240
|
+
counterGroup.addCalculator(opts.calculate)
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return counterGroup
|
|
186
244
|
}
|
|
187
245
|
|
|
188
246
|
log('Register counter group', name)
|
|
189
|
-
|
|
247
|
+
counterGroup = new PrometheusCounterGroup(name, { registry: this.registry, ...opts })
|
|
248
|
+
|
|
249
|
+
metrics.set(name, counterGroup)
|
|
190
250
|
|
|
191
251
|
if (opts.calculate == null) {
|
|
192
|
-
return
|
|
252
|
+
return counterGroup
|
|
193
253
|
}
|
|
194
254
|
}
|
|
195
255
|
}
|
package/src/metric-group.ts
CHANGED
|
@@ -1,28 +1,33 @@
|
|
|
1
1
|
import type { CalculateMetric, MetricGroup, StopTimer } from '@libp2p/interface-metrics'
|
|
2
2
|
import { CollectFunction, Gauge } from 'prom-client'
|
|
3
3
|
import type { PrometheusCalculatedMetricOptions } from './index.js'
|
|
4
|
-
import { normaliseString } from './utils.js'
|
|
4
|
+
import { normaliseString, CalculatedMetric } from './utils.js'
|
|
5
5
|
|
|
6
|
-
export class PrometheusMetricGroup implements MetricGroup {
|
|
6
|
+
export class PrometheusMetricGroup implements MetricGroup, CalculatedMetric<Record<string, number>> {
|
|
7
7
|
private readonly gauge: Gauge
|
|
8
8
|
private readonly label: string
|
|
9
|
+
private readonly calculators: Array<CalculateMetric<Record<string, number>>>
|
|
9
10
|
|
|
10
11
|
constructor (name: string, opts: PrometheusCalculatedMetricOptions<Record<string, number>>) {
|
|
11
12
|
name = normaliseString(name)
|
|
12
13
|
const help = normaliseString(opts.help ?? name)
|
|
13
14
|
const label = this.label = normaliseString(opts.label ?? name)
|
|
14
15
|
let collect: CollectFunction<Gauge<any>> | undefined
|
|
16
|
+
this.calculators = []
|
|
15
17
|
|
|
16
18
|
// calculated metric
|
|
17
19
|
if (opts?.calculate != null) {
|
|
18
|
-
|
|
20
|
+
this.calculators.push(opts.calculate)
|
|
21
|
+
const self = this
|
|
19
22
|
|
|
20
23
|
collect = async function () {
|
|
21
|
-
|
|
24
|
+
await Promise.all(self.calculators.map(async calculate => {
|
|
25
|
+
const values = await calculate()
|
|
22
26
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
Object.entries(values).forEach(([key, value]) => {
|
|
28
|
+
this.set({ [label]: key }, value)
|
|
29
|
+
})
|
|
30
|
+
}))
|
|
26
31
|
}
|
|
27
32
|
}
|
|
28
33
|
|
|
@@ -35,6 +40,10 @@ export class PrometheusMetricGroup implements MetricGroup {
|
|
|
35
40
|
})
|
|
36
41
|
}
|
|
37
42
|
|
|
43
|
+
addCalculator (calculator: CalculateMetric<Record<string, number>>) {
|
|
44
|
+
this.calculators.push(calculator)
|
|
45
|
+
}
|
|
46
|
+
|
|
38
47
|
update (values: Record<string, number>): void {
|
|
39
48
|
Object.entries(values).forEach(([key, value]) => {
|
|
40
49
|
this.gauge.set({ [this.label]: key }, value)
|
package/src/metric.ts
CHANGED
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
import type { Metric, StopTimer } from '@libp2p/interface-metrics'
|
|
1
|
+
import type { Metric, StopTimer, CalculateMetric } from '@libp2p/interface-metrics'
|
|
2
2
|
import { CollectFunction, Gauge } from 'prom-client'
|
|
3
3
|
import type { PrometheusCalculatedMetricOptions } from './index.js'
|
|
4
4
|
import { normaliseString } from './utils.js'
|
|
5
5
|
|
|
6
6
|
export class PrometheusMetric implements Metric {
|
|
7
7
|
private readonly gauge: Gauge
|
|
8
|
+
private readonly calculators: CalculateMetric[]
|
|
8
9
|
|
|
9
10
|
constructor (name: string, opts: PrometheusCalculatedMetricOptions) {
|
|
10
11
|
name = normaliseString(name)
|
|
11
12
|
const help = normaliseString(opts.help ?? name)
|
|
12
13
|
const labels = opts.label != null ? [normaliseString(opts.label)] : []
|
|
13
14
|
let collect: CollectFunction<Gauge<any>> | undefined
|
|
15
|
+
this.calculators = []
|
|
14
16
|
|
|
15
17
|
// calculated metric
|
|
16
18
|
if (opts?.calculate != null) {
|
|
17
|
-
|
|
19
|
+
this.calculators.push(opts.calculate)
|
|
20
|
+
const self = this
|
|
18
21
|
|
|
19
22
|
collect = async function () {
|
|
20
|
-
const
|
|
23
|
+
const values = await Promise.all(self.calculators.map(async calculate => await calculate()))
|
|
24
|
+
const sum = values.reduce((acc, curr) => acc + curr, 0)
|
|
21
25
|
|
|
22
|
-
this.set(
|
|
26
|
+
this.set(sum)
|
|
23
27
|
}
|
|
24
28
|
}
|
|
25
29
|
|
|
@@ -32,6 +36,10 @@ export class PrometheusMetric implements Metric {
|
|
|
32
36
|
})
|
|
33
37
|
}
|
|
34
38
|
|
|
39
|
+
addCalculator (calculator: CalculateMetric) {
|
|
40
|
+
this.calculators.push(calculator)
|
|
41
|
+
}
|
|
42
|
+
|
|
35
43
|
update (value: number): void {
|
|
36
44
|
this.gauge.set(value)
|
|
37
45
|
}
|
package/src/utils.ts
CHANGED