@libp2p/prometheus-metrics 0.0.0 → 1.0.0
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/README.md +62 -1
- package/dist/src/counter-group.d.ts +9 -0
- package/dist/src/counter-group.d.ts.map +1 -0
- package/dist/src/counter-group.js +40 -0
- package/dist/src/counter-group.js.map +1 -0
- package/dist/src/counter.d.ts +8 -0
- package/dist/src/counter.d.ts.map +1 -0
- package/dist/src/counter.js +33 -0
- package/dist/src/counter.js.map +1 -0
- package/dist/src/index.d.ts +14 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +84 -57
- package/dist/src/index.js.map +1 -1
- package/dist/src/metric-group.d.ts +4 -4
- package/dist/src/metric-group.d.ts.map +1 -1
- package/dist/src/metric-group.js +25 -5
- package/dist/src/metric-group.js.map +1 -1
- package/dist/src/metric.d.ts +5 -5
- package/dist/src/metric.d.ts.map +1 -1
- package/dist/src/metric.js +23 -5
- 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 +7 -1
- package/dist/src/utils.js.map +1 -1
- package/package.json +12 -11
- package/src/counter-group.ts +51 -0
- package/src/counter.ts +42 -0
- package/src/index.ts +122 -69
- package/src/metric-group.ts +33 -10
- package/src/metric.ts +32 -11
- package/src/utils.ts +7 -1
- package/dist/src/moving-average.d.ts +0 -20
- package/dist/src/moving-average.d.ts.map +0 -1
- package/dist/src/moving-average.js +0 -40
- package/dist/src/moving-average.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,11 +5,18 @@
|
|
|
5
5
|
[](https://codecov.io/gh/libp2p/js-libp2p-prometheus-metrics)
|
|
6
6
|
[](https://github.com/libp2p/js-libp2p-prometheus-metrics/actions/workflows/js-test-and-release.yml)
|
|
7
7
|
|
|
8
|
-
> Collect libp2p metrics for scraping by Prometheus
|
|
8
|
+
> Collect libp2p metrics for scraping by Prometheus or Graphana
|
|
9
9
|
|
|
10
10
|
## Table of contents <!-- omit in toc -->
|
|
11
11
|
|
|
12
12
|
- [Install](#install)
|
|
13
|
+
- [Usage](#usage)
|
|
14
|
+
- [Queries](#queries)
|
|
15
|
+
- [Data sent/received](#data-sentreceived)
|
|
16
|
+
- [CPU usage](#cpu-usage)
|
|
17
|
+
- [Memory usage](#memory-usage)
|
|
18
|
+
- [DHT query time](#dht-query-time)
|
|
19
|
+
- [TCP transport dialer errors](#tcp-transport-dialer-errors)
|
|
13
20
|
- [License](#license)
|
|
14
21
|
- [Contribute](#contribute)
|
|
15
22
|
|
|
@@ -19,6 +26,60 @@
|
|
|
19
26
|
$ npm i @libp2p/prometheus-metrics
|
|
20
27
|
```
|
|
21
28
|
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
Configure your libp2p node with Prometheus metrics:
|
|
32
|
+
|
|
33
|
+
```js
|
|
34
|
+
import { createLibp2p } from 'libp2p'
|
|
35
|
+
import { prometheusMetrics } from '@libp2p/prometheus-metrics'
|
|
36
|
+
|
|
37
|
+
const node = await createLibp2p({
|
|
38
|
+
metrics: prometheusMetrics()
|
|
39
|
+
})
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Then use the `prom-client` module to supply metrics to the Prometheus/Graphana client using your http framework:
|
|
43
|
+
|
|
44
|
+
```js
|
|
45
|
+
import client from 'prom-client'
|
|
46
|
+
|
|
47
|
+
async handler (request, h) {
|
|
48
|
+
return h.response(await client.register.metrics())
|
|
49
|
+
.type(client.register.contentType)
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
All Prometheus metrics are global so there's no other work required to extract them.
|
|
54
|
+
|
|
55
|
+
### Queries
|
|
56
|
+
|
|
57
|
+
Some useful queries are:
|
|
58
|
+
|
|
59
|
+
#### Data sent/received
|
|
60
|
+
|
|
61
|
+
rate(libp2p_data_transfer_bytes_total[30s])
|
|
62
|
+
|
|
63
|
+
#### CPU usage
|
|
64
|
+
|
|
65
|
+
rate(process_cpu_user_seconds_total[30s]) * 100
|
|
66
|
+
|
|
67
|
+
#### Memory usage
|
|
68
|
+
|
|
69
|
+
nodejs_memory_usage_bytes
|
|
70
|
+
|
|
71
|
+
#### DHT query time
|
|
72
|
+
|
|
73
|
+
libp2p_kad_dht_wan_query_time_seconds
|
|
74
|
+
|
|
75
|
+
or
|
|
76
|
+
|
|
77
|
+
libp2p_kad_dht_lan_query_time_seconds
|
|
78
|
+
|
|
79
|
+
#### TCP transport dialer errors
|
|
80
|
+
|
|
81
|
+
rate(libp2p_tcp_dialer_errors_total[30s])
|
|
82
|
+
|
|
22
83
|
## License
|
|
23
84
|
|
|
24
85
|
Licensed under either of
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CounterGroup, CalculatedMetricOptions } from '@libp2p/interface-metrics';
|
|
2
|
+
export declare class PrometheusCounterGroup implements CounterGroup {
|
|
3
|
+
private readonly counter;
|
|
4
|
+
private readonly label;
|
|
5
|
+
constructor(name: string, opts: CalculatedMetricOptions<Record<string, number | bigint>>);
|
|
6
|
+
increment(values: Record<string, number | bigint | unknown>): void;
|
|
7
|
+
reset(): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=counter-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter-group.d.ts","sourceRoot":"","sources":["../../src/counter-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,uBAAuB,EAAmB,MAAM,2BAA2B,CAAA;AAIvG,qBAAa,sBAAuB,YAAW,YAAY;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAEjB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IA6BzF,SAAS,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI;IAUnE,KAAK,IAAK,IAAI;CAGf"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Counter as PromCounter } from 'prom-client';
|
|
2
|
+
import { normaliseString } from './utils.js';
|
|
3
|
+
export class PrometheusCounterGroup {
|
|
4
|
+
constructor(name, opts) {
|
|
5
|
+
name = normaliseString(name);
|
|
6
|
+
const help = normaliseString(opts.help ?? name);
|
|
7
|
+
const label = this.label = normaliseString(opts.label ?? name);
|
|
8
|
+
let collect;
|
|
9
|
+
// calculated metric
|
|
10
|
+
if (opts?.calculate != null) {
|
|
11
|
+
const calculate = opts.calculate;
|
|
12
|
+
collect = async function () {
|
|
13
|
+
const values = await calculate();
|
|
14
|
+
Object.entries(values).forEach(([key, value]) => {
|
|
15
|
+
// prom-client does not support bigints for values
|
|
16
|
+
// https://github.com/siimon/prom-client/issues/259
|
|
17
|
+
this.inc({ [label]: key }, Number(value));
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
this.counter = new PromCounter({
|
|
22
|
+
name,
|
|
23
|
+
help,
|
|
24
|
+
labelNames: [this.label],
|
|
25
|
+
collect
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
increment(values) {
|
|
29
|
+
Object.entries(values).forEach(([key, value]) => {
|
|
30
|
+
// prom-client does not support bigints for values
|
|
31
|
+
// https://github.com/siimon/prom-client/issues/259
|
|
32
|
+
const inc = typeof value === 'number' || typeof value === 'bigint' ? Number(value) : 1;
|
|
33
|
+
this.counter.inc({ [this.label]: key }, inc);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
reset() {
|
|
37
|
+
this.counter.reset();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=counter-group.js.map
|
|
@@ -0,0 +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,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,OAAO,sBAAsB;IAIjC,YAAa,IAAY,EAAE,IAA8D;QACvF,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;QAE1D,oBAAoB;QACpB,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE;YAC3B,MAAM,SAAS,GAAqD,IAAI,CAAC,SAAS,CAAA;YAElF,OAAO,GAAG,KAAK;gBACb,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAA;gBAEhC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;oBAC9C,kDAAkD;oBAClD,mDAAmD;oBACnD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBAC3C,CAAC,CAAC,CAAA;YACJ,CAAC,CAAA;SACF;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC;YAC7B,IAAI;YACJ,IAAI;YACJ,UAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACxB,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,CAAE,MAAiD;QAC1D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC9C,kDAAkD;YAClD,mDAAmD;YACnD,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAEtF,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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Counter, CalculatedMetricOptions } from '@libp2p/interface-metrics';
|
|
2
|
+
export declare class PrometheusCounter implements Counter {
|
|
3
|
+
private readonly counter;
|
|
4
|
+
constructor(name: string, opts: CalculatedMetricOptions);
|
|
5
|
+
increment(value?: number | bigint): void;
|
|
6
|
+
reset(): void;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=counter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter.d.ts","sourceRoot":"","sources":["../../src/counter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAIjF,qBAAa,iBAAkB,YAAW,OAAO;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;gBAExB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB;IAyBxD,SAAS,CAAE,KAAK,GAAE,MAAM,GAAG,MAAU,GAAG,IAAI;IAM5C,KAAK,IAAK,IAAI;CAGf"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Counter as PromCounter } from 'prom-client';
|
|
2
|
+
import { normaliseString } from './utils.js';
|
|
3
|
+
export class PrometheusCounter {
|
|
4
|
+
constructor(name, opts) {
|
|
5
|
+
name = normaliseString(name);
|
|
6
|
+
const help = normaliseString(opts.help ?? name);
|
|
7
|
+
const labels = opts.label != null ? [normaliseString(opts.label)] : [];
|
|
8
|
+
let collect;
|
|
9
|
+
// calculated metric
|
|
10
|
+
if (opts?.calculate != null) {
|
|
11
|
+
const calculate = opts.calculate;
|
|
12
|
+
collect = async function () {
|
|
13
|
+
const value = await calculate();
|
|
14
|
+
this.inc(Number(value));
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
this.counter = new PromCounter({
|
|
18
|
+
name,
|
|
19
|
+
help,
|
|
20
|
+
labelNames: labels,
|
|
21
|
+
collect
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
increment(value = 1) {
|
|
25
|
+
// prom-client does not support bigints for values
|
|
26
|
+
// https://github.com/siimon/prom-client/issues/259
|
|
27
|
+
this.counter.inc(Number(value));
|
|
28
|
+
}
|
|
29
|
+
reset() {
|
|
30
|
+
this.counter.reset();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=counter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter.js","sourceRoot":"","sources":["../../src/counter.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,OAAO,IAAI,WAAW,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,OAAO,iBAAiB;IAG5B,YAAa,IAAY,EAAE,IAA6B;QACtD,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;QAE1D,oBAAoB;QACpB,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;YAEhC,OAAO,GAAG,KAAK;gBACb,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAA;gBAE/B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YACzB,CAAC,CAAA;SACF;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC;YAC7B,IAAI;YACJ,IAAI;YACJ,UAAU,EAAE,MAAM;YAClB,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,CAAE,QAAyB,CAAC;QACnC,kDAAkD;QAClD,mDAAmD;QACnD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACjC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;CACF"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
import type { Metrics } from '@libp2p/interface-metrics';
|
|
2
2
|
import { DefaultMetricsCollectorConfiguration } from 'prom-client';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
export interface PrometheusMetricsInit {
|
|
4
|
+
/**
|
|
5
|
+
* By default we collect default metrics - CPU, memory etc, to not do
|
|
6
|
+
* this, pass true here
|
|
7
|
+
*/
|
|
8
|
+
collectDefaultMetrics?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* prom-client options to pass to the `collectDefaultMetrics` function
|
|
11
|
+
*/
|
|
5
12
|
defaultMetrics?: DefaultMetricsCollectorConfiguration;
|
|
13
|
+
/**
|
|
14
|
+
* All metrics in prometheus are global so to prevent clashes in naming
|
|
15
|
+
* we reset the global metrics registry on creation - to not do this,
|
|
16
|
+
* pass true here
|
|
17
|
+
*/
|
|
6
18
|
preserveExistingMetrics?: boolean;
|
|
7
|
-
collectDefaultMetrics?: boolean;
|
|
8
19
|
}
|
|
9
20
|
export declare function prometheusMetrics(init?: Partial<PrometheusMetricsInit>): () => Metrics;
|
|
10
21
|
//# 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,EAAsF,OAAO,EAAE,MAAM,2BAA2B,CAAA;AAC5I,OAAO,EAAyB,oCAAoC,EAAY,MAAM,aAAa,CAAA;AAYnG,MAAM,WAAW,qBAAqB;IACpC;;;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;AAwJD,wBAAgB,iBAAiB,CAAE,IAAI,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,MAAM,OAAO,CAIvF"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,38 +1,37 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { collectDefaultMetrics, register } from 'prom-client';
|
|
2
|
+
import each from 'it-foreach';
|
|
2
3
|
import { PrometheusMetric } from './metric.js';
|
|
3
4
|
import { PrometheusMetricGroup } from './metric-group.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
5
|
+
import { PrometheusCounter } from './counter.js';
|
|
6
|
+
import { PrometheusCounterGroup } from './counter-group.js';
|
|
7
|
+
import { logger } from '@libp2p/logger';
|
|
8
|
+
const log = logger('libp2p:prometheus-metrics');
|
|
9
|
+
class PrometheusMetrics {
|
|
6
10
|
constructor(init) {
|
|
7
|
-
super(init);
|
|
8
11
|
if (init?.preserveExistingMetrics !== true) {
|
|
9
|
-
|
|
10
|
-
// existing metrics to make sure we don't error when setting up metrics
|
|
12
|
+
log('Clearing existing metrics');
|
|
11
13
|
register.clear();
|
|
12
14
|
}
|
|
13
15
|
if (init?.preserveExistingMetrics !== false) {
|
|
14
|
-
|
|
16
|
+
log('Collecting default metrics');
|
|
15
17
|
collectDefaultMetrics(init?.defaultMetrics);
|
|
16
18
|
}
|
|
17
|
-
|
|
19
|
+
// holds global and per-protocol sent/received stats
|
|
20
|
+
this.transferStats = new Map();
|
|
21
|
+
log('Collecting data transfer metrics');
|
|
22
|
+
this.registerCounterGroup('libp2p_data_transfer_bytes_total', {
|
|
18
23
|
label: 'protocol',
|
|
19
24
|
calculate: () => {
|
|
20
25
|
const output = {};
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
output['global received'] = Number(global.dataReceived);
|
|
24
|
-
for (const protocol of this.getProtocols()) {
|
|
25
|
-
const stats = this.forProtocol(protocol);
|
|
26
|
-
if (stats == null) {
|
|
27
|
-
continue;
|
|
28
|
-
}
|
|
29
|
-
const snapshot = stats.getSnapshot();
|
|
30
|
-
output[`${protocol} sent`] = Number(snapshot.dataSent);
|
|
31
|
-
output[`${protocol} received`] = Number(snapshot.dataReceived);
|
|
26
|
+
for (const [key, value] of this.transferStats.entries()) {
|
|
27
|
+
output[key] = value;
|
|
32
28
|
}
|
|
29
|
+
// reset counts for next time
|
|
30
|
+
this.transferStats = new Map();
|
|
33
31
|
return output;
|
|
34
32
|
}
|
|
35
33
|
});
|
|
34
|
+
log('Collecting memory metrics');
|
|
36
35
|
this.registerMetricGroup('nodejs_memory_usage_bytes', {
|
|
37
36
|
label: 'memory',
|
|
38
37
|
calculate: () => {
|
|
@@ -42,53 +41,81 @@ class PrometheusMetrics extends DefaultMetrics {
|
|
|
42
41
|
}
|
|
43
42
|
});
|
|
44
43
|
}
|
|
45
|
-
|
|
44
|
+
/**
|
|
45
|
+
* Increment the transfer stat for the passed key, making sure
|
|
46
|
+
* it exists first
|
|
47
|
+
*/
|
|
48
|
+
_incrementValue(key, value) {
|
|
49
|
+
const existing = this.transferStats.get(key) ?? 0;
|
|
50
|
+
this.transferStats.set(key, existing + value);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Override the sink/source of the stream to count the bytes
|
|
54
|
+
* in and out
|
|
55
|
+
*/
|
|
56
|
+
_track(stream, name) {
|
|
57
|
+
const self = this;
|
|
58
|
+
const sink = stream.sink;
|
|
59
|
+
stream.sink = async function trackedSink(source) {
|
|
60
|
+
await sink(each(source, buf => {
|
|
61
|
+
self._incrementValue(`${name} sent`, buf.byteLength);
|
|
62
|
+
}));
|
|
63
|
+
};
|
|
64
|
+
const source = stream.source;
|
|
65
|
+
stream.source = each(source, buf => {
|
|
66
|
+
self._incrementValue(`${name} received`, buf.byteLength);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
trackMultiaddrConnection(maConn) {
|
|
70
|
+
this._track(maConn, 'global');
|
|
71
|
+
}
|
|
72
|
+
trackProtocolStream(stream, connection) {
|
|
73
|
+
if (stream.stat.protocol == null) {
|
|
74
|
+
// protocol not negotiated yet, should not happen as the upgrader
|
|
75
|
+
// calls this handler after protocol negotiation
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this._track(stream, stream.stat.protocol);
|
|
79
|
+
}
|
|
80
|
+
registerMetric(name, opts = {}) {
|
|
46
81
|
if (name == null ?? name.trim() === '') {
|
|
47
82
|
throw new Error('Metric name is required');
|
|
48
83
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const value = await calculate();
|
|
54
|
-
this.set(value);
|
|
55
|
-
};
|
|
56
|
-
// prom-client metrics are global
|
|
57
|
-
new Gauge({
|
|
58
|
-
name,
|
|
59
|
-
help: opts.help ?? name,
|
|
60
|
-
labelNames: [opts.label ?? name],
|
|
61
|
-
collect
|
|
62
|
-
});
|
|
63
|
-
return;
|
|
84
|
+
log('Register metric', name);
|
|
85
|
+
const metric = new PrometheusMetric(name, opts ?? {});
|
|
86
|
+
if (opts.calculate == null) {
|
|
87
|
+
return metric;
|
|
64
88
|
}
|
|
65
|
-
return new PrometheusMetric(name, opts ?? {});
|
|
66
89
|
}
|
|
67
|
-
registerMetricGroup(name, opts) {
|
|
90
|
+
registerMetricGroup(name, opts = {}) {
|
|
68
91
|
if (name == null ?? name.trim() === '') {
|
|
69
92
|
throw new Error('Metric name is required');
|
|
70
93
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
94
|
+
log('Register metric group', name);
|
|
95
|
+
const group = new PrometheusMetricGroup(name, opts ?? {});
|
|
96
|
+
if (opts.calculate == null) {
|
|
97
|
+
return group;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
registerCounter(name, opts = {}) {
|
|
101
|
+
if (name == null ?? name.trim() === '') {
|
|
102
|
+
throw new Error('Counter name is required');
|
|
103
|
+
}
|
|
104
|
+
log('Register counter', name);
|
|
105
|
+
const counter = new PrometheusCounter(name, opts);
|
|
106
|
+
if (opts.calculate == null) {
|
|
107
|
+
return counter;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
registerCounterGroup(name, opts = {}) {
|
|
111
|
+
if (name == null ?? name.trim() === '') {
|
|
112
|
+
throw new Error('Metric name is required');
|
|
113
|
+
}
|
|
114
|
+
log('Register counter group', name);
|
|
115
|
+
const group = new PrometheusCounterGroup(name, opts);
|
|
116
|
+
if (opts.calculate == null) {
|
|
117
|
+
return group;
|
|
90
118
|
}
|
|
91
|
-
return new PrometheusMetricGroup(name, opts ?? {});
|
|
92
119
|
}
|
|
93
120
|
}
|
|
94
121
|
export function prometheusMetrics(init) {
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CalculatedMetricOptions, MetricGroup, StopTimer } from '@libp2p/interface-metrics';
|
|
2
2
|
export declare class PrometheusMetricGroup implements MetricGroup {
|
|
3
3
|
private readonly gauge;
|
|
4
4
|
private readonly label;
|
|
5
|
-
constructor(name: string, opts:
|
|
6
|
-
update(values: Record<string, number>): void;
|
|
7
|
-
increment(values: Record<string, number | unknown>): void;
|
|
5
|
+
constructor(name: string, opts: CalculatedMetricOptions<Record<string, number | bigint>>);
|
|
6
|
+
update(values: Record<string, number | bigint>): void;
|
|
7
|
+
increment(values: Record<string, number | bigint | unknown>): void;
|
|
8
8
|
decrement(values: Record<string, number | unknown>): void;
|
|
9
9
|
reset(): void;
|
|
10
10
|
timer(key: string): StopTimer;
|
|
@@ -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,uBAAuB,EAAmB,WAAW,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAIjH,qBAAa,qBAAsB,YAAW,WAAW;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAEjB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IA6BzF,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,IAAI;IAQtD,SAAS,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI;IAUnE,SAAS,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI;IAU1D,KAAK,IAAK,IAAI;IAId,KAAK,CAAE,GAAG,EAAE,MAAM,GAAG,SAAS;CAK/B"}
|
package/dist/src/metric-group.js
CHANGED
|
@@ -4,27 +4,47 @@ export class PrometheusMetricGroup {
|
|
|
4
4
|
constructor(name, opts) {
|
|
5
5
|
name = normaliseString(name);
|
|
6
6
|
const help = normaliseString(opts.help ?? name);
|
|
7
|
-
this.label = normaliseString(opts.label ?? name);
|
|
7
|
+
const label = this.label = normaliseString(opts.label ?? name);
|
|
8
|
+
let collect;
|
|
9
|
+
// calculated metric
|
|
10
|
+
if (opts?.calculate != null) {
|
|
11
|
+
const calculate = opts.calculate;
|
|
12
|
+
collect = async function () {
|
|
13
|
+
const values = await calculate();
|
|
14
|
+
Object.entries(values).forEach(([key, value]) => {
|
|
15
|
+
// prom-client does not support bigints for values
|
|
16
|
+
// https://github.com/siimon/prom-client/issues/259
|
|
17
|
+
this.set({ [label]: key }, Number(value));
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
}
|
|
8
21
|
this.gauge = new Gauge({
|
|
9
22
|
name,
|
|
10
23
|
help,
|
|
11
|
-
labelNames: [this.label]
|
|
24
|
+
labelNames: [this.label],
|
|
25
|
+
collect
|
|
12
26
|
});
|
|
13
27
|
}
|
|
14
28
|
update(values) {
|
|
15
29
|
Object.entries(values).forEach(([key, value]) => {
|
|
16
|
-
|
|
30
|
+
// prom-client does not support bigints for values
|
|
31
|
+
// https://github.com/siimon/prom-client/issues/259
|
|
32
|
+
this.gauge.set({ [this.label]: key }, Number(value));
|
|
17
33
|
});
|
|
18
34
|
}
|
|
19
35
|
increment(values) {
|
|
20
36
|
Object.entries(values).forEach(([key, value]) => {
|
|
21
|
-
|
|
37
|
+
// prom-client does not support bigints for values
|
|
38
|
+
// https://github.com/siimon/prom-client/issues/259
|
|
39
|
+
const inc = typeof value === 'number' || typeof value === 'bigint' ? Number(value) : 1;
|
|
22
40
|
this.gauge.inc({ [this.label]: key }, inc);
|
|
23
41
|
});
|
|
24
42
|
}
|
|
25
43
|
decrement(values) {
|
|
26
44
|
Object.entries(values).forEach(([key, value]) => {
|
|
27
|
-
|
|
45
|
+
// prom-client does not support bigints for values
|
|
46
|
+
// https://github.com/siimon/prom-client/issues/259
|
|
47
|
+
const dec = typeof value === 'number' || typeof value === 'bigint' ? Number(value) : 1;
|
|
28
48
|
this.gauge.dec({ [this.label]: key }, dec);
|
|
29
49
|
});
|
|
30
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metric-group.js","sourceRoot":"","sources":["../../src/metric-group.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
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,10 +1,10 @@
|
|
|
1
|
-
import type { Metric,
|
|
1
|
+
import type { Metric, CalculatedMetricOptions, StopTimer } from '@libp2p/interface-metrics';
|
|
2
2
|
export declare class PrometheusMetric implements Metric {
|
|
3
3
|
private readonly gauge;
|
|
4
|
-
constructor(name: string, opts:
|
|
5
|
-
update(value: number): void;
|
|
6
|
-
increment(value?: number): void;
|
|
7
|
-
decrement(value?: number): void;
|
|
4
|
+
constructor(name: string, opts: CalculatedMetricOptions);
|
|
5
|
+
update(value: number | bigint): void;
|
|
6
|
+
increment(value?: number | bigint): void;
|
|
7
|
+
decrement(value?: number | bigint): void;
|
|
8
8
|
reset(): void;
|
|
9
9
|
timer(): StopTimer;
|
|
10
10
|
}
|
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,uBAAuB,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAI3F,qBAAa,gBAAiB,YAAW,MAAM;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;gBAEhB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB;IA2BxD,MAAM,CAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMrC,SAAS,CAAE,KAAK,GAAE,MAAM,GAAG,MAAU,GAAG,IAAI;IAM5C,SAAS,CAAE,KAAK,GAAE,MAAM,GAAG,MAAU,GAAG,IAAI;IAM5C,KAAK,IAAK,IAAI;IAId,KAAK,IAAK,SAAS;CAGpB"}
|
package/dist/src/metric.js
CHANGED
|
@@ -4,21 +4,39 @@ export class PrometheusMetric {
|
|
|
4
4
|
constructor(name, opts) {
|
|
5
5
|
name = normaliseString(name);
|
|
6
6
|
const help = normaliseString(opts.help ?? name);
|
|
7
|
-
const
|
|
7
|
+
const labels = opts.label != null ? [normaliseString(opts.label)] : [];
|
|
8
|
+
let collect;
|
|
9
|
+
// calculated metric
|
|
10
|
+
if (opts?.calculate != null) {
|
|
11
|
+
const calculate = opts.calculate;
|
|
12
|
+
collect = async function () {
|
|
13
|
+
const value = await calculate();
|
|
14
|
+
// prom-client does not support bigints for values
|
|
15
|
+
// https://github.com/siimon/prom-client/issues/259
|
|
16
|
+
this.set(Number(value));
|
|
17
|
+
};
|
|
18
|
+
}
|
|
8
19
|
this.gauge = new Gauge({
|
|
9
20
|
name,
|
|
10
21
|
help,
|
|
11
|
-
labelNames:
|
|
22
|
+
labelNames: labels,
|
|
23
|
+
collect
|
|
12
24
|
});
|
|
13
25
|
}
|
|
14
26
|
update(value) {
|
|
15
|
-
|
|
27
|
+
// prom-client does not support bigints for values
|
|
28
|
+
// https://github.com/siimon/prom-client/issues/259
|
|
29
|
+
this.gauge.set(Number(value));
|
|
16
30
|
}
|
|
17
31
|
increment(value = 1) {
|
|
18
|
-
|
|
32
|
+
// prom-client does not support bigints for values
|
|
33
|
+
// https://github.com/siimon/prom-client/issues/259
|
|
34
|
+
this.gauge.inc(Number(value));
|
|
19
35
|
}
|
|
20
36
|
decrement(value = 1) {
|
|
21
|
-
|
|
37
|
+
// prom-client does not support bigints for values
|
|
38
|
+
// https://github.com/siimon/prom-client/issues/259
|
|
39
|
+
this.gauge.dec(Number(value));
|
|
22
40
|
}
|
|
23
41
|
reset() {
|
|
24
42
|
this.gauge.reset();
|
package/dist/src/metric.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metric.js","sourceRoot":"","sources":["../../src/metric.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"metric.js","sourceRoot":"","sources":["../../src/metric.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,OAAO,gBAAgB;IAG3B,YAAa,IAAY,EAAE,IAA6B;QACtD,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;QAEpD,oBAAoB;QACpB,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE;YAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;YAEhC,OAAO,GAAG,KAAK;gBACb,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAA;gBAE/B,kDAAkD;gBAClD,mDAAmD;gBACnD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YACzB,CAAC,CAAA;SACF;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC;YACrB,IAAI;YACJ,IAAI;YACJ,UAAU,EAAE,MAAM;YAClB,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAE,KAAsB;QAC5B,kDAAkD;QAClD,mDAAmD;QACnD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/B,CAAC;IAED,SAAS,CAAE,QAAyB,CAAC;QACnC,kDAAkD;QAClD,mDAAmD;QACnD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/B,CAAC;IAED,SAAS,CAAE,QAAyB,CAAC;QACnC,kDAAkD;QAClD,mDAAmD;QACnD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/B,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,4 +1,8 @@
|
|
|
1
1
|
export declare const ONE_SECOND = 1000;
|
|
2
2
|
export declare const ONE_MINUTE: number;
|
|
3
|
+
/**
|
|
4
|
+
* See https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels
|
|
5
|
+
* for rules on valid naming
|
|
6
|
+
*/
|
|
3
7
|
export declare function normaliseString(str: string): string;
|
|
4
8
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/src/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,UAAU,OAAO,CAAA;AAC9B,eAAO,MAAM,UAAU,QAAkB,CAAA;AAEzC,wBAAgB,eAAe,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AACA,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
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
export const ONE_SECOND = 1000;
|
|
2
2
|
export const ONE_MINUTE = 60 * ONE_SECOND;
|
|
3
|
+
/**
|
|
4
|
+
* See https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels
|
|
5
|
+
* for rules on valid naming
|
|
6
|
+
*/
|
|
3
7
|
export function normaliseString(str) {
|
|
4
|
-
return str
|
|
8
|
+
return str
|
|
9
|
+
.replace(/[^a-zA-Z0-9_]/g, '_')
|
|
10
|
+
.replace(/_+/g, '_');
|
|
5
11
|
}
|
|
6
12
|
//# sourceMappingURL=utils.js.map
|