@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.
@@ -1,8 +1,12 @@
1
- import type { CounterGroup, CalculatedMetricOptions } from '@libp2p/interface-metrics';
2
- export declare class PrometheusCounterGroup implements CounterGroup {
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
- constructor(name: string, opts: CalculatedMetricOptions<Record<string, number>>);
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,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,CAAC,CAAC;IA2BhF,SAAS,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI;IAQ1D,KAAK,IAAK,IAAI;CAGf"}
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
- const calculate = opts.calculate;
12
+ this.calculators.push(opts.calculate);
13
+ const self = this;
12
14
  collect = async function () {
13
- const values = await calculate();
14
- Object.entries(values).forEach(([key, value]) => {
15
- this.inc({ [label]: key }, value);
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,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,OAAO,sBAAsB;IAIjC,YAAa,IAAY,EAAE,IAAqD;QAC9E,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,GAA4C,IAAI,CAAC,SAAS,CAAA;YAEzE,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,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAA;gBACnC,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,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"}
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"}
@@ -1,7 +1,11 @@
1
- import type { Counter, CalculatedMetricOptions } from '@libp2p/interface-metrics';
2
- export declare class PrometheusCounter implements Counter {
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
- constructor(name: string, opts: CalculatedMetricOptions);
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,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,MAAU,GAAG,IAAI;IAInC,KAAK,IAAK,IAAI;CAGf"}
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"}
@@ -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
- const calculate = opts.calculate;
12
+ this.calculators.push(opts.calculate);
13
+ const self = this;
12
14
  collect = async function () {
13
- const value = await calculate();
14
- this.inc(value);
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
  }
@@ -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;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,KAAK,CAAC,CAAA;YACjB,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,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"}
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"}
@@ -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
@@ -1 +1 @@
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"}
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
- register.clear();
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
- const metric = new PrometheusMetric(name, opts ?? {});
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
- const group = new PrometheusMetricGroup(name, opts ?? {});
116
+ metricGroup = new PrometheusMetricGroup(name, { registry: this.registry, ...opts });
117
+ metrics.set(name, metricGroup);
96
118
  if (opts.calculate == null) {
97
- return group;
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
- const counter = new PrometheusCounter(name, opts);
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('Metric name is required');
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
- const group = new PrometheusCounterGroup(name, opts);
154
+ counterGroup = new PrometheusCounterGroup(name, { registry: this.registry, ...opts });
155
+ metrics.set(name, counterGroup);
116
156
  if (opts.calculate == null) {
117
- return group;
157
+ return counterGroup;
118
158
  }
119
159
  }
120
160
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,12 @@
1
- import type { CalculatedMetricOptions, MetricGroup, StopTimer } from '@libp2p/interface-metrics';
2
- export declare class PrometheusMetricGroup implements MetricGroup {
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
- constructor(name: string, opts: CalculatedMetricOptions<Record<string, number>>);
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,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,CAAC,CAAC;IA2BhF,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"}
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"}
@@ -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
- const calculate = opts.calculate;
12
+ this.calculators.push(opts.calculate);
13
+ const self = this;
12
14
  collect = async function () {
13
- const values = await calculate();
14
- Object.entries(values).forEach(([key, value]) => {
15
- this.set({ [label]: key }, value);
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;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,OAAO,qBAAqB;IAIhC,YAAa,IAAY,EAAE,IAAqD;QAC9E,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,OAAgD,CAAA;QAEpD,oBAAoB;QACpB,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE;YAC3B,MAAM,SAAS,GAA4C,IAAI,CAAC,SAAS,CAAA;YAEzE,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,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAA;gBACnC,CAAC,CAAC,CAAA;YACJ,CAAC,CAAA;SACF;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC;YACrB,IAAI;YACJ,IAAI;YACJ,UAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;YACxB,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,CAAE,MAA8B;QACpC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;IACJ,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,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;IACJ,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,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAED,KAAK,CAAE,GAAW;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAC3B,GAAG,EAAE,CAAC;SACP,CAAC,CAAA;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"metric-group.js","sourceRoot":"","sources":["../../src/metric-group.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,10 @@
1
- import type { Metric, CalculatedMetricOptions, StopTimer } from '@libp2p/interface-metrics';
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
- constructor(name: string, opts: CalculatedMetricOptions);
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;
@@ -1 +1 @@
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;IAyBxD,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"}
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"}
@@ -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
- const calculate = opts.calculate;
12
+ this.calculators.push(opts.calculate);
13
+ const self = this;
12
14
  collect = async function () {
13
- const value = await calculate();
14
- this.set(value);
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
  }
@@ -1 +1 @@
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,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACjB,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,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"}
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"}
@@ -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
  /**
@@ -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;;;GAGG;AACH,wBAAgB,eAAe,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIpD"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AACA,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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/prometheus-metrics",
3
- "version": "1.0.1",
3
+ "version": "1.1.1",
4
4
  "description": "Collect libp2p metrics for scraping by Prometheus or Graphana",
5
5
  "author": "",
6
6
  "license": "Apache-2.0 OR MIT",
@@ -1,27 +1,33 @@
1
- import type { CounterGroup, CalculatedMetricOptions, CalculateMetric } from '@libp2p/interface-metrics'
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: CalculatedMetricOptions<Record<string, number>>) {
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
- const calculate: CalculateMetric<Record<string, number>> = opts.calculate
20
+ this.calculators.push(opts.calculate)
21
+ const self = this
18
22
 
19
23
  collect = async function () {
20
- const values = await calculate()
24
+ await Promise.all(self.calculators.map(async calculate => {
25
+ const values = await calculate()
21
26
 
22
- Object.entries(values).forEach(([key, value]) => {
23
- this.inc({ [label]: key }, value)
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 { Counter, CalculatedMetricOptions } from '@libp2p/interface-metrics'
1
+ import type { CalculateMetric, Counter } from '@libp2p/interface-metrics'
2
2
  import { CollectFunction, Counter as PromCounter } from 'prom-client'
3
- import { normaliseString } from './utils.js'
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: CalculatedMetricOptions) {
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
- const calculate = opts.calculate
19
+ this.calculators.push(opts.calculate)
20
+ const self = this
17
21
 
18
22
  collect = async function () {
19
- const value = await calculate()
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(value)
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
- register.clear()
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: CalculatedMetricOptions): void
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
- const metric = new PrometheusMetric(name, opts ?? {})
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: CalculatedMetricOptions<Record<string, number>>): void
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
- const group = new PrometheusMetricGroup(name, opts ?? {})
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 group
194
+ return metricGroup
150
195
  }
151
196
  }
152
197
 
153
- registerCounter (name: string, opts: CalculatedMetricOptions): void
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
- const counter = new PrometheusCounter(name, opts)
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: CalculatedMetricOptions<Record<string, number>>): void
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('Metric name is required')
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
- const group = new PrometheusCounterGroup(name, opts)
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 group
252
+ return counterGroup
180
253
  }
181
254
  }
182
255
  }
@@ -1,27 +1,33 @@
1
- import type { CalculatedMetricOptions, CalculateMetric, MetricGroup, StopTimer } from '@libp2p/interface-metrics'
1
+ import type { CalculateMetric, MetricGroup, StopTimer } from '@libp2p/interface-metrics'
2
2
  import { CollectFunction, Gauge } from 'prom-client'
3
- import { normaliseString } from './utils.js'
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: CalculatedMetricOptions<Record<string, number>>) {
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
- const calculate: CalculateMetric<Record<string, number>> = opts.calculate
20
+ this.calculators.push(opts.calculate)
21
+ const self = this
18
22
 
19
23
  collect = async function () {
20
- const values = await calculate()
24
+ await Promise.all(self.calculators.map(async calculate => {
25
+ const values = await calculate()
21
26
 
22
- Object.entries(values).forEach(([key, value]) => {
23
- this.set({ [label]: key }, value)
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, CalculatedMetricOptions, StopTimer } from '@libp2p/interface-metrics'
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: CalculatedMetricOptions) {
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
- const calculate = opts.calculate
19
+ this.calculators.push(opts.calculate)
20
+ const self = this
17
21
 
18
22
  collect = async function () {
19
- const value = await calculate()
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(value)
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
@@ -1,3 +1,8 @@
1
+ import type { CalculateMetric } from '@libp2p/interface-metrics'
2
+
3
+ export interface CalculatedMetric <T = number> {
4
+ addCalculator: (calculator: CalculateMetric<T>) => void
5
+ }
1
6
 
2
7
  export const ONE_SECOND = 1000
3
8
  export const ONE_MINUTE = 60 * ONE_SECOND