@libp2p/prometheus-metrics 1.0.1 → 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 +7 -3
- package/dist/src/counter-group.d.ts.map +1 -1
- package/dist/src/counter-group.js +13 -5
- package/dist/src/counter-group.js.map +1 -1
- package/dist/src/counter.d.ts +7 -3
- package/dist/src/counter.d.ts.map +1 -1
- package/dist/src/counter.js +10 -3
- package/dist/src/counter.js.map +1 -1
- package/dist/src/index.d.ts +10 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +50 -10
- package/dist/src/index.js.map +1 -1
- package/dist/src/metric-group.d.ts +7 -3
- package/dist/src/metric-group.d.ts.map +1 -1
- package/dist/src/metric-group.js +13 -5
- package/dist/src/metric-group.js.map +1 -1
- package/dist/src/metric.d.ts +5 -2
- package/dist/src/metric.d.ts.map +1 -1
- package/dist/src/metric.js +10 -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 +20 -9
- package/src/counter.ts +17 -7
- package/src/index.ts +88 -15
- package/src/metric-group.ts +20 -9
- package/src/metric.ts +15 -5
- package/src/utils.ts +5 -0
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import type { CounterGroup,
|
|
2
|
-
|
|
1
|
+
import type { CounterGroup, CalculateMetric } from '@libp2p/interface-metrics';
|
|
2
|
+
import { CalculatedMetric } from './utils.js';
|
|
3
|
+
import type { PrometheusCalculatedMetricOptions } from './index.js';
|
|
4
|
+
export declare class PrometheusCounterGroup implements CounterGroup, CalculatedMetric<Record<string, number>> {
|
|
3
5
|
private readonly counter;
|
|
4
6
|
private readonly label;
|
|
5
|
-
|
|
7
|
+
private readonly calculators;
|
|
8
|
+
constructor(name: string, opts: PrometheusCalculatedMetricOptions<Record<string, number>>);
|
|
9
|
+
addCalculator(calculator: CalculateMetric<Record<string, number>>): void;
|
|
6
10
|
increment(values: Record<string, number | unknown>): void;
|
|
7
11
|
reset(): void;
|
|
8
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counter-group.d.ts","sourceRoot":"","sources":["../../src/counter-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,
|
|
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,23 +6,31 @@ 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({
|
|
20
24
|
name,
|
|
21
25
|
help,
|
|
22
26
|
labelNames: [this.label],
|
|
27
|
+
registers: opts.registry !== undefined ? [opts.registry] : undefined,
|
|
23
28
|
collect
|
|
24
29
|
});
|
|
25
30
|
}
|
|
31
|
+
addCalculator(calculator) {
|
|
32
|
+
this.calculators.push(calculator);
|
|
33
|
+
}
|
|
26
34
|
increment(values) {
|
|
27
35
|
Object.entries(values).forEach(([key, value]) => {
|
|
28
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;AACrE,OAAO,EAAE,eAAe,
|
|
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,7 +1,11 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { CalculateMetric, Counter } from '@libp2p/interface-metrics';
|
|
2
|
+
import type { PrometheusCalculatedMetricOptions } from './index.js';
|
|
3
|
+
import { CalculatedMetric } from './utils.js';
|
|
4
|
+
export declare class PrometheusCounter implements Counter, CalculatedMetric {
|
|
3
5
|
private readonly counter;
|
|
4
|
-
|
|
6
|
+
private readonly calculators;
|
|
7
|
+
constructor(name: string, opts: PrometheusCalculatedMetricOptions);
|
|
8
|
+
addCalculator(calculator: CalculateMetric): void;
|
|
5
9
|
increment(value?: number): void;
|
|
6
10
|
reset(): void;
|
|
7
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../../src/counter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
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,21 +6,28 @@ 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({
|
|
18
21
|
name,
|
|
19
22
|
help,
|
|
20
23
|
labelNames: labels,
|
|
24
|
+
registers: opts.registry !== undefined ? [opts.registry] : undefined,
|
|
21
25
|
collect
|
|
22
26
|
});
|
|
23
27
|
}
|
|
28
|
+
addCalculator(calculator) {
|
|
29
|
+
this.calculators.push(calculator);
|
|
30
|
+
}
|
|
24
31
|
increment(value = 1) {
|
|
25
32
|
this.counter.inc(value);
|
|
26
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;
|
|
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
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import type { Metrics } from '@libp2p/interface-metrics';
|
|
2
|
-
import { DefaultMetricsCollectorConfiguration } from 'prom-client';
|
|
1
|
+
import type { CalculatedMetricOptions, Metrics } from '@libp2p/interface-metrics';
|
|
2
|
+
import { DefaultMetricsCollectorConfiguration, Registry } from 'prom-client';
|
|
3
3
|
export interface PrometheusMetricsInit {
|
|
4
|
+
/**
|
|
5
|
+
* Use a custom registry to register metrics.
|
|
6
|
+
* By default, the global registry is used to register metrics.
|
|
7
|
+
*/
|
|
8
|
+
registry?: Registry;
|
|
4
9
|
/**
|
|
5
10
|
* By default we collect default metrics - CPU, memory etc, to not do
|
|
6
11
|
* this, pass true here
|
|
@@ -17,5 +22,8 @@ export interface PrometheusMetricsInit {
|
|
|
17
22
|
*/
|
|
18
23
|
preserveExistingMetrics?: boolean;
|
|
19
24
|
}
|
|
25
|
+
export interface PrometheusCalculatedMetricOptions<T = number> extends CalculatedMetricOptions<T> {
|
|
26
|
+
registry?: Registry;
|
|
27
|
+
}
|
|
20
28
|
export declare function prometheusMetrics(init?: Partial<PrometheusMetricsInit>): () => Metrics;
|
|
21
29
|
//# sourceMappingURL=index.d.ts.map
|
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,
|
|
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,15 +6,19 @@ 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) {
|
|
13
|
+
this.registry = init?.registry;
|
|
11
14
|
if (init?.preserveExistingMetrics !== true) {
|
|
12
15
|
log('Clearing existing metrics');
|
|
13
|
-
|
|
16
|
+
metrics.clear();
|
|
17
|
+
(this.registry ?? register).clear();
|
|
14
18
|
}
|
|
15
19
|
if (init?.preserveExistingMetrics !== false) {
|
|
16
20
|
log('Collecting default metrics');
|
|
17
|
-
collectDefaultMetrics(init?.defaultMetrics);
|
|
21
|
+
collectDefaultMetrics({ ...init?.defaultMetrics, register: this.registry ?? init?.defaultMetrics?.register });
|
|
18
22
|
}
|
|
19
23
|
// holds global and per-protocol sent/received stats
|
|
20
24
|
this.transferStats = new Map();
|
|
@@ -81,40 +85,76 @@ class PrometheusMetrics {
|
|
|
81
85
|
if (name == null ?? name.trim() === '') {
|
|
82
86
|
throw new Error('Metric name is required');
|
|
83
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
|
+
}
|
|
84
96
|
log('Register metric', name);
|
|
85
|
-
|
|
97
|
+
metric = new PrometheusMetric(name, { registry: this.registry, ...opts });
|
|
98
|
+
metrics.set(name, metric);
|
|
86
99
|
if (opts.calculate == null) {
|
|
87
100
|
return metric;
|
|
88
101
|
}
|
|
89
102
|
}
|
|
90
103
|
registerMetricGroup(name, opts = {}) {
|
|
91
104
|
if (name == null ?? name.trim() === '') {
|
|
92
|
-
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;
|
|
93
114
|
}
|
|
94
115
|
log('Register metric group', name);
|
|
95
|
-
|
|
116
|
+
metricGroup = new PrometheusMetricGroup(name, { registry: this.registry, ...opts });
|
|
117
|
+
metrics.set(name, metricGroup);
|
|
96
118
|
if (opts.calculate == null) {
|
|
97
|
-
return
|
|
119
|
+
return metricGroup;
|
|
98
120
|
}
|
|
99
121
|
}
|
|
100
122
|
registerCounter(name, opts = {}) {
|
|
101
123
|
if (name == null ?? name.trim() === '') {
|
|
102
124
|
throw new Error('Counter name is required');
|
|
103
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
|
+
}
|
|
104
134
|
log('Register counter', name);
|
|
105
|
-
|
|
135
|
+
counter = new PrometheusCounter(name, { registry: this.registry, ...opts });
|
|
136
|
+
metrics.set(name, counter);
|
|
106
137
|
if (opts.calculate == null) {
|
|
107
138
|
return counter;
|
|
108
139
|
}
|
|
109
140
|
}
|
|
110
141
|
registerCounterGroup(name, opts = {}) {
|
|
111
142
|
if (name == null ?? name.trim() === '') {
|
|
112
|
-
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;
|
|
113
152
|
}
|
|
114
153
|
log('Register counter group', name);
|
|
115
|
-
|
|
154
|
+
counterGroup = new PrometheusCounterGroup(name, { registry: this.registry, ...opts });
|
|
155
|
+
metrics.set(name, counterGroup);
|
|
116
156
|
if (opts.calculate == null) {
|
|
117
|
-
return
|
|
157
|
+
return counterGroup;
|
|
118
158
|
}
|
|
119
159
|
}
|
|
120
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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { CalculateMetric, MetricGroup, StopTimer } from '@libp2p/interface-metrics';
|
|
2
|
+
import type { PrometheusCalculatedMetricOptions } from './index.js';
|
|
3
|
+
import { CalculatedMetric } from './utils.js';
|
|
4
|
+
export declare class PrometheusMetricGroup implements MetricGroup, CalculatedMetric<Record<string, number>> {
|
|
3
5
|
private readonly gauge;
|
|
4
6
|
private readonly label;
|
|
5
|
-
|
|
7
|
+
private readonly calculators;
|
|
8
|
+
constructor(name: string, opts: PrometheusCalculatedMetricOptions<Record<string, number>>);
|
|
9
|
+
addCalculator(calculator: CalculateMetric<Record<string, number>>): void;
|
|
6
10
|
update(values: Record<string, number>): void;
|
|
7
11
|
increment(values: Record<string, number | unknown>): void;
|
|
8
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,EAAE,
|
|
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,23 +6,31 @@ 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({
|
|
20
24
|
name,
|
|
21
25
|
help,
|
|
22
26
|
labelNames: [this.label],
|
|
27
|
+
registers: opts.registry !== undefined ? [opts.registry] : undefined,
|
|
23
28
|
collect
|
|
24
29
|
});
|
|
25
30
|
}
|
|
31
|
+
addCalculator(calculator) {
|
|
32
|
+
this.calculators.push(calculator);
|
|
33
|
+
}
|
|
26
34
|
update(values) {
|
|
27
35
|
Object.entries(values).forEach(([key, value]) => {
|
|
28
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;
|
|
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,7 +1,10 @@
|
|
|
1
|
-
import type { Metric,
|
|
1
|
+
import type { Metric, StopTimer, CalculateMetric } from '@libp2p/interface-metrics';
|
|
2
|
+
import type { PrometheusCalculatedMetricOptions } from './index.js';
|
|
2
3
|
export declare class PrometheusMetric implements Metric {
|
|
3
4
|
private readonly gauge;
|
|
4
|
-
|
|
5
|
+
private readonly calculators;
|
|
6
|
+
constructor(name: string, opts: PrometheusCalculatedMetricOptions);
|
|
7
|
+
addCalculator(calculator: CalculateMetric): void;
|
|
5
8
|
update(value: number): void;
|
|
6
9
|
increment(value?: number): void;
|
|
7
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,
|
|
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,21 +6,28 @@ 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({
|
|
18
21
|
name,
|
|
19
22
|
help,
|
|
20
23
|
labelNames: labels,
|
|
24
|
+
registers: opts.registry !== undefined ? [opts.registry] : undefined,
|
|
21
25
|
collect
|
|
22
26
|
});
|
|
23
27
|
}
|
|
28
|
+
addCalculator(calculator) {
|
|
29
|
+
this.calculators.push(calculator);
|
|
30
|
+
}
|
|
24
31
|
update(value) {
|
|
25
32
|
this.gauge.set(value);
|
|
26
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;
|
|
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,27 +1,33 @@
|
|
|
1
|
-
import type { CounterGroup,
|
|
1
|
+
import type { CounterGroup, CalculateMetric } from '@libp2p/interface-metrics'
|
|
2
2
|
import { Counter as PromCounter, CollectFunction } from 'prom-client'
|
|
3
|
-
import { normaliseString } from './utils.js'
|
|
3
|
+
import { normaliseString, CalculatedMetric } from './utils.js'
|
|
4
|
+
import type { PrometheusCalculatedMetricOptions } from './index.js'
|
|
4
5
|
|
|
5
|
-
export class PrometheusCounterGroup implements CounterGroup {
|
|
6
|
+
export class PrometheusCounterGroup implements CounterGroup, CalculatedMetric<Record<string, number>> {
|
|
6
7
|
private readonly counter: PromCounter
|
|
7
8
|
private readonly label: string
|
|
9
|
+
private readonly calculators: Array<CalculateMetric<Record<string, number>>>
|
|
8
10
|
|
|
9
|
-
constructor (name: string, opts:
|
|
11
|
+
constructor (name: string, opts: PrometheusCalculatedMetricOptions<Record<string, number>>) {
|
|
10
12
|
name = normaliseString(name)
|
|
11
13
|
const help = normaliseString(opts.help ?? name)
|
|
12
14
|
const label = this.label = normaliseString(opts.label ?? name)
|
|
13
15
|
let collect: CollectFunction<PromCounter<any>> | undefined
|
|
16
|
+
this.calculators = []
|
|
14
17
|
|
|
15
18
|
// calculated metric
|
|
16
19
|
if (opts?.calculate != null) {
|
|
17
|
-
|
|
20
|
+
this.calculators.push(opts.calculate)
|
|
21
|
+
const self = this
|
|
18
22
|
|
|
19
23
|
collect = async function () {
|
|
20
|
-
|
|
24
|
+
await Promise.all(self.calculators.map(async calculate => {
|
|
25
|
+
const values = await calculate()
|
|
21
26
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
Object.entries(values).forEach(([key, value]) => {
|
|
28
|
+
this.inc({ [label]: key }, value)
|
|
29
|
+
})
|
|
30
|
+
}))
|
|
25
31
|
}
|
|
26
32
|
}
|
|
27
33
|
|
|
@@ -29,10 +35,15 @@ export class PrometheusCounterGroup implements CounterGroup {
|
|
|
29
35
|
name,
|
|
30
36
|
help,
|
|
31
37
|
labelNames: [this.label],
|
|
38
|
+
registers: opts.registry !== undefined ? [opts.registry] : undefined,
|
|
32
39
|
collect
|
|
33
40
|
})
|
|
34
41
|
}
|
|
35
42
|
|
|
43
|
+
addCalculator (calculator: CalculateMetric<Record<string, number>>) {
|
|
44
|
+
this.calculators.push(calculator)
|
|
45
|
+
}
|
|
46
|
+
|
|
36
47
|
increment (values: Record<string, number | unknown>): void {
|
|
37
48
|
Object.entries(values).forEach(([key, value]) => {
|
|
38
49
|
const inc = typeof value === 'number' ? value : 1
|
package/src/counter.ts
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CalculateMetric, Counter } from '@libp2p/interface-metrics'
|
|
2
2
|
import { CollectFunction, Counter as PromCounter } from 'prom-client'
|
|
3
|
-
import {
|
|
3
|
+
import type { PrometheusCalculatedMetricOptions } from './index.js'
|
|
4
|
+
import { normaliseString, CalculatedMetric } from './utils.js'
|
|
4
5
|
|
|
5
|
-
export class PrometheusCounter implements Counter {
|
|
6
|
+
export class PrometheusCounter implements Counter, CalculatedMetric {
|
|
6
7
|
private readonly counter: PromCounter
|
|
8
|
+
private readonly calculators: CalculateMetric[]
|
|
7
9
|
|
|
8
|
-
constructor (name: string, opts:
|
|
10
|
+
constructor (name: string, opts: PrometheusCalculatedMetricOptions) {
|
|
9
11
|
name = normaliseString(name)
|
|
10
12
|
const help = normaliseString(opts.help ?? name)
|
|
11
13
|
const labels = opts.label != null ? [normaliseString(opts.label)] : []
|
|
12
14
|
let collect: CollectFunction<PromCounter<any>> | undefined
|
|
15
|
+
this.calculators = []
|
|
13
16
|
|
|
14
17
|
// calculated metric
|
|
15
18
|
if (opts?.calculate != null) {
|
|
16
|
-
|
|
19
|
+
this.calculators.push(opts.calculate)
|
|
20
|
+
const self = this
|
|
17
21
|
|
|
18
22
|
collect = async function () {
|
|
19
|
-
const
|
|
23
|
+
const values = await Promise.all(self.calculators.map(async calculate => await calculate()))
|
|
24
|
+
const sum = values.reduce((acc, curr) => acc + curr, 0)
|
|
20
25
|
|
|
21
|
-
this.inc(
|
|
26
|
+
this.inc(sum)
|
|
22
27
|
}
|
|
23
28
|
}
|
|
24
29
|
|
|
@@ -26,10 +31,15 @@ export class PrometheusCounter implements Counter {
|
|
|
26
31
|
name,
|
|
27
32
|
help,
|
|
28
33
|
labelNames: labels,
|
|
34
|
+
registers: opts.registry !== undefined ? [opts.registry] : undefined,
|
|
29
35
|
collect
|
|
30
36
|
})
|
|
31
37
|
}
|
|
32
38
|
|
|
39
|
+
addCalculator (calculator: CalculateMetric) {
|
|
40
|
+
this.calculators.push(calculator)
|
|
41
|
+
}
|
|
42
|
+
|
|
33
43
|
increment (value: number = 1): void {
|
|
34
44
|
this.counter.inc(value)
|
|
35
45
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CalculatedMetricOptions, Counter, CounterGroup, Metric, MetricGroup, MetricOptions, Metrics } from '@libp2p/interface-metrics'
|
|
2
|
-
import { collectDefaultMetrics, DefaultMetricsCollectorConfiguration, register } from 'prom-client'
|
|
2
|
+
import { collectDefaultMetrics, DefaultMetricsCollectorConfiguration, register, Registry } from 'prom-client'
|
|
3
3
|
import type { MultiaddrConnection, Stream, Connection } from '@libp2p/interface-connection'
|
|
4
4
|
import type { Duplex } from 'it-stream-types'
|
|
5
5
|
import each from 'it-foreach'
|
|
@@ -11,7 +11,16 @@ 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 {
|
|
18
|
+
/**
|
|
19
|
+
* Use a custom registry to register metrics.
|
|
20
|
+
* By default, the global registry is used to register metrics.
|
|
21
|
+
*/
|
|
22
|
+
registry?: Registry
|
|
23
|
+
|
|
15
24
|
/**
|
|
16
25
|
* By default we collect default metrics - CPU, memory etc, to not do
|
|
17
26
|
* this, pass true here
|
|
@@ -31,18 +40,26 @@ export interface PrometheusMetricsInit {
|
|
|
31
40
|
preserveExistingMetrics?: boolean
|
|
32
41
|
}
|
|
33
42
|
|
|
43
|
+
export interface PrometheusCalculatedMetricOptions<T=number> extends CalculatedMetricOptions<T> {
|
|
44
|
+
registry?: Registry
|
|
45
|
+
}
|
|
46
|
+
|
|
34
47
|
class PrometheusMetrics implements Metrics {
|
|
35
48
|
private transferStats: Map<string, number>
|
|
49
|
+
private readonly registry?: Registry
|
|
36
50
|
|
|
37
51
|
constructor (init?: Partial<PrometheusMetricsInit>) {
|
|
52
|
+
this.registry = init?.registry
|
|
53
|
+
|
|
38
54
|
if (init?.preserveExistingMetrics !== true) {
|
|
39
55
|
log('Clearing existing metrics')
|
|
40
|
-
|
|
56
|
+
metrics.clear()
|
|
57
|
+
;(this.registry ?? register).clear()
|
|
41
58
|
}
|
|
42
59
|
|
|
43
60
|
if (init?.preserveExistingMetrics !== false) {
|
|
44
61
|
log('Collecting default metrics')
|
|
45
|
-
collectDefaultMetrics(init?.defaultMetrics)
|
|
62
|
+
collectDefaultMetrics({ ...init?.defaultMetrics, register: this.registry ?? init?.defaultMetrics?.register })
|
|
46
63
|
}
|
|
47
64
|
|
|
48
65
|
// holds global and per-protocol sent/received stats
|
|
@@ -120,63 +137,119 @@ class PrometheusMetrics implements Metrics {
|
|
|
120
137
|
this._track(stream, stream.stat.protocol)
|
|
121
138
|
}
|
|
122
139
|
|
|
123
|
-
registerMetric (name: string, opts:
|
|
140
|
+
registerMetric (name: string, opts: PrometheusCalculatedMetricOptions): void
|
|
124
141
|
registerMetric (name: string, opts?: MetricOptions): Metric
|
|
125
142
|
registerMetric (name: string, opts: any = {}): any {
|
|
126
143
|
if (name == null ?? name.trim() === '') {
|
|
127
144
|
throw new Error('Metric name is required')
|
|
128
145
|
}
|
|
129
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
|
+
|
|
130
159
|
log('Register metric', name)
|
|
131
|
-
|
|
160
|
+
metric = new PrometheusMetric(name, { registry: this.registry, ...opts })
|
|
161
|
+
|
|
162
|
+
metrics.set(name, metric)
|
|
132
163
|
|
|
133
164
|
if (opts.calculate == null) {
|
|
134
165
|
return metric
|
|
135
166
|
}
|
|
136
167
|
}
|
|
137
168
|
|
|
138
|
-
registerMetricGroup (name: string, opts:
|
|
169
|
+
registerMetricGroup (name: string, opts: PrometheusCalculatedMetricOptions<Record<string, number>>): void
|
|
139
170
|
registerMetricGroup (name: string, opts?: MetricOptions): MetricGroup
|
|
140
171
|
registerMetricGroup (name: string, opts: any = {}): any {
|
|
141
172
|
if (name == null ?? name.trim() === '') {
|
|
142
|
-
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
|
|
143
186
|
}
|
|
144
187
|
|
|
145
188
|
log('Register metric group', name)
|
|
146
|
-
|
|
189
|
+
metricGroup = new PrometheusMetricGroup(name, { registry: this.registry, ...opts })
|
|
190
|
+
|
|
191
|
+
metrics.set(name, metricGroup)
|
|
147
192
|
|
|
148
193
|
if (opts.calculate == null) {
|
|
149
|
-
return
|
|
194
|
+
return metricGroup
|
|
150
195
|
}
|
|
151
196
|
}
|
|
152
197
|
|
|
153
|
-
registerCounter (name: string, opts:
|
|
198
|
+
registerCounter (name: string, opts: PrometheusCalculatedMetricOptions): void
|
|
154
199
|
registerCounter (name: string, opts?: MetricOptions): Counter
|
|
155
200
|
registerCounter (name: string, opts: any = {}): any {
|
|
156
201
|
if (name == null ?? name.trim() === '') {
|
|
157
202
|
throw new Error('Counter name is required')
|
|
158
203
|
}
|
|
159
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
|
+
|
|
160
217
|
log('Register counter', name)
|
|
161
|
-
|
|
218
|
+
counter = new PrometheusCounter(name, { registry: this.registry, ...opts })
|
|
219
|
+
|
|
220
|
+
metrics.set(name, counter)
|
|
162
221
|
|
|
163
222
|
if (opts.calculate == null) {
|
|
164
223
|
return counter
|
|
165
224
|
}
|
|
166
225
|
}
|
|
167
226
|
|
|
168
|
-
registerCounterGroup (name: string, opts:
|
|
227
|
+
registerCounterGroup (name: string, opts: PrometheusCalculatedMetricOptions<Record<string, number>>): void
|
|
169
228
|
registerCounterGroup (name: string, opts?: MetricOptions): CounterGroup
|
|
170
229
|
registerCounterGroup (name: string, opts: any = {}): any {
|
|
171
230
|
if (name == null ?? name.trim() === '') {
|
|
172
|
-
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
|
|
173
244
|
}
|
|
174
245
|
|
|
175
246
|
log('Register counter group', name)
|
|
176
|
-
|
|
247
|
+
counterGroup = new PrometheusCounterGroup(name, { registry: this.registry, ...opts })
|
|
248
|
+
|
|
249
|
+
metrics.set(name, counterGroup)
|
|
177
250
|
|
|
178
251
|
if (opts.calculate == null) {
|
|
179
|
-
return
|
|
252
|
+
return counterGroup
|
|
180
253
|
}
|
|
181
254
|
}
|
|
182
255
|
}
|
package/src/metric-group.ts
CHANGED
|
@@ -1,27 +1,33 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CalculateMetric, MetricGroup, StopTimer } from '@libp2p/interface-metrics'
|
|
2
2
|
import { CollectFunction, Gauge } from 'prom-client'
|
|
3
|
-
import {
|
|
3
|
+
import type { PrometheusCalculatedMetricOptions } from './index.js'
|
|
4
|
+
import { normaliseString, CalculatedMetric } from './utils.js'
|
|
4
5
|
|
|
5
|
-
export class PrometheusMetricGroup implements MetricGroup {
|
|
6
|
+
export class PrometheusMetricGroup implements MetricGroup, CalculatedMetric<Record<string, number>> {
|
|
6
7
|
private readonly gauge: Gauge
|
|
7
8
|
private readonly label: string
|
|
9
|
+
private readonly calculators: Array<CalculateMetric<Record<string, number>>>
|
|
8
10
|
|
|
9
|
-
constructor (name: string, opts:
|
|
11
|
+
constructor (name: string, opts: PrometheusCalculatedMetricOptions<Record<string, number>>) {
|
|
10
12
|
name = normaliseString(name)
|
|
11
13
|
const help = normaliseString(opts.help ?? name)
|
|
12
14
|
const label = this.label = normaliseString(opts.label ?? name)
|
|
13
15
|
let collect: CollectFunction<Gauge<any>> | undefined
|
|
16
|
+
this.calculators = []
|
|
14
17
|
|
|
15
18
|
// calculated metric
|
|
16
19
|
if (opts?.calculate != null) {
|
|
17
|
-
|
|
20
|
+
this.calculators.push(opts.calculate)
|
|
21
|
+
const self = this
|
|
18
22
|
|
|
19
23
|
collect = async function () {
|
|
20
|
-
|
|
24
|
+
await Promise.all(self.calculators.map(async calculate => {
|
|
25
|
+
const values = await calculate()
|
|
21
26
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
Object.entries(values).forEach(([key, value]) => {
|
|
28
|
+
this.set({ [label]: key }, value)
|
|
29
|
+
})
|
|
30
|
+
}))
|
|
25
31
|
}
|
|
26
32
|
}
|
|
27
33
|
|
|
@@ -29,10 +35,15 @@ export class PrometheusMetricGroup implements MetricGroup {
|
|
|
29
35
|
name,
|
|
30
36
|
help,
|
|
31
37
|
labelNames: [this.label],
|
|
38
|
+
registers: opts.registry !== undefined ? [opts.registry] : undefined,
|
|
32
39
|
collect
|
|
33
40
|
})
|
|
34
41
|
}
|
|
35
42
|
|
|
43
|
+
addCalculator (calculator: CalculateMetric<Record<string, number>>) {
|
|
44
|
+
this.calculators.push(calculator)
|
|
45
|
+
}
|
|
46
|
+
|
|
36
47
|
update (values: Record<string, number>): void {
|
|
37
48
|
Object.entries(values).forEach(([key, value]) => {
|
|
38
49
|
this.gauge.set({ [this.label]: key }, value)
|
package/src/metric.ts
CHANGED
|
@@ -1,24 +1,29 @@
|
|
|
1
|
-
import type { Metric,
|
|
1
|
+
import type { Metric, StopTimer, CalculateMetric } from '@libp2p/interface-metrics'
|
|
2
2
|
import { CollectFunction, Gauge } from 'prom-client'
|
|
3
|
+
import type { PrometheusCalculatedMetricOptions } from './index.js'
|
|
3
4
|
import { normaliseString } from './utils.js'
|
|
4
5
|
|
|
5
6
|
export class PrometheusMetric implements Metric {
|
|
6
7
|
private readonly gauge: Gauge
|
|
8
|
+
private readonly calculators: CalculateMetric[]
|
|
7
9
|
|
|
8
|
-
constructor (name: string, opts:
|
|
10
|
+
constructor (name: string, opts: PrometheusCalculatedMetricOptions) {
|
|
9
11
|
name = normaliseString(name)
|
|
10
12
|
const help = normaliseString(opts.help ?? name)
|
|
11
13
|
const labels = opts.label != null ? [normaliseString(opts.label)] : []
|
|
12
14
|
let collect: CollectFunction<Gauge<any>> | undefined
|
|
15
|
+
this.calculators = []
|
|
13
16
|
|
|
14
17
|
// calculated metric
|
|
15
18
|
if (opts?.calculate != null) {
|
|
16
|
-
|
|
19
|
+
this.calculators.push(opts.calculate)
|
|
20
|
+
const self = this
|
|
17
21
|
|
|
18
22
|
collect = async function () {
|
|
19
|
-
const
|
|
23
|
+
const values = await Promise.all(self.calculators.map(async calculate => await calculate()))
|
|
24
|
+
const sum = values.reduce((acc, curr) => acc + curr, 0)
|
|
20
25
|
|
|
21
|
-
this.set(
|
|
26
|
+
this.set(sum)
|
|
22
27
|
}
|
|
23
28
|
}
|
|
24
29
|
|
|
@@ -26,10 +31,15 @@ export class PrometheusMetric implements Metric {
|
|
|
26
31
|
name,
|
|
27
32
|
help,
|
|
28
33
|
labelNames: labels,
|
|
34
|
+
registers: opts.registry !== undefined ? [opts.registry] : undefined,
|
|
29
35
|
collect
|
|
30
36
|
})
|
|
31
37
|
}
|
|
32
38
|
|
|
39
|
+
addCalculator (calculator: CalculateMetric) {
|
|
40
|
+
this.calculators.push(calculator)
|
|
41
|
+
}
|
|
42
|
+
|
|
33
43
|
update (value: number): void {
|
|
34
44
|
this.gauge.set(value)
|
|
35
45
|
}
|
package/src/utils.ts
CHANGED