@generazioneai/events 0.1.0 → 0.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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.1 — 2026-10-31
4
+
5
+ - Le metriche `events_*` passano anche all'API di OpenTelemetry (contatori e gauge osservabili, no-op senza SDK; `@opentelemetry/api` ~1.9.0
6
+ come `@generazioneai/jobs`): con `@generazioneai/telemetry` arrivano al Collector e a VictoriaMetrics senza un endpoint in ogni servizio.
7
+ `EventsMetrics.render()` e i nomi non cambiano. I servizi la prendono alzando la versione, senza altro codice.
8
+
3
9
  ## 0.1.0 — 2026-10-25
4
10
 
5
11
  Prima versione (treno 3+4, tappa E1; ADR-009, spec «Fondamenta enterprise» §1).
package/dist/metrics.d.ts CHANGED
@@ -4,10 +4,18 @@ type Labels = Record<string, string>;
4
4
  * endpoint delle metriche (o `@generazioneai/telemetry` lo legge). Nomi del contratto: events_outbox_pending,
5
5
  * events_outbox_oldest_seconds, events_published_total, events_delivered_total{consumer}, events_nak_total,
6
6
  * events_term_total, events_consumer_lag{consumer}.
7
+ *
8
+ * Le stesse serie passano anche all'API di OpenTelemetry (come fa `@generazioneai/jobs`): senza SDK sono no-op, con
9
+ * `@generazioneai/telemetry` le esporta il Collector e finiscono in VictoriaMetrics, dove le regole di allarme
10
+ * (`outbox-in-ritardo`, `consumer-in-ritardo`) le leggono. Nessun servizio deve aggiungere un endpoint.
7
11
  */
8
12
  export declare class EventsMetrics {
9
13
  private counters;
10
14
  private gauges;
15
+ private readonly gaugeLabels;
16
+ private readonly otelCounters;
17
+ private readonly otelGauges;
18
+ private readonly meter;
11
19
  private static key;
12
20
  inc(name: string, labels?: Labels, by?: number): void;
13
21
  set(name: string, value: number, labels?: Labels): void;
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAEA,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErC;;;;;GAKG;AACH,qBACa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,MAAM,CAA0C;IAExD,OAAO,CAAC,MAAM,CAAC,GAAG;IAQlB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,SAAI,GAAG,IAAI;IAOhD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAMvD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAK1C,MAAM,IAAI,MAAM;CAYjB"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAGA,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErC;;;;;;;;;GASG;AACH,qBACa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0C;IACtE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8B;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoD;IAE1E,OAAO,CAAC,MAAM,CAAC,GAAG;IAQlB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,SAAI,GAAG,IAAI;IAahD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAmBvD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAK1C,MAAM,IAAI,MAAM;CAYjB"}
package/dist/metrics.js CHANGED
@@ -9,16 +9,25 @@ var EventsMetrics_1;
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.EventsMetrics = void 0;
11
11
  const common_1 = require("@nestjs/common");
12
+ const api_1 = require("@opentelemetry/api");
12
13
  /**
13
14
  * Registro minimo di metriche (nessuna dipendenza). `render()` produce il testo Prometheus: il servizio lo aggiunge al suo
14
15
  * endpoint delle metriche (o `@generazioneai/telemetry` lo legge). Nomi del contratto: events_outbox_pending,
15
16
  * events_outbox_oldest_seconds, events_published_total, events_delivered_total{consumer}, events_nak_total,
16
17
  * events_term_total, events_consumer_lag{consumer}.
18
+ *
19
+ * Le stesse serie passano anche all'API di OpenTelemetry (come fa `@generazioneai/jobs`): senza SDK sono no-op, con
20
+ * `@generazioneai/telemetry` le esporta il Collector e finiscono in VictoriaMetrics, dove le regole di allarme
21
+ * (`outbox-in-ritardo`, `consumer-in-ritardo`) le leggono. Nessun servizio deve aggiungere un endpoint.
17
22
  */
18
23
  let EventsMetrics = EventsMetrics_1 = class EventsMetrics {
19
24
  constructor() {
20
25
  this.counters = new Map();
21
26
  this.gauges = new Map();
27
+ this.gaugeLabels = new Map();
28
+ this.otelCounters = new Map();
29
+ this.otelGauges = new Set();
30
+ this.meter = api_1.metrics.getMeter('@generazioneai/events');
22
31
  }
23
32
  static key(l) {
24
33
  if (!l)
@@ -33,11 +42,30 @@ let EventsMetrics = EventsMetrics_1 = class EventsMetrics {
33
42
  const k = EventsMetrics_1.key(labels);
34
43
  m.set(k, (m.get(k) ?? 0) + by);
35
44
  this.counters.set(name, m);
45
+ let c = this.otelCounters.get(name);
46
+ if (!c) {
47
+ c = this.meter.createCounter(name);
48
+ this.otelCounters.set(name, c);
49
+ }
50
+ c.add(by, labels ?? {});
36
51
  }
37
52
  set(name, value, labels) {
38
53
  const m = this.gauges.get(name) ?? new Map();
39
54
  m.set(EventsMetrics_1.key(labels), value);
40
55
  this.gauges.set(name, m);
56
+ const k = EventsMetrics_1.key(labels);
57
+ const l = this.gaugeLabels.get(name) ?? new Map();
58
+ l.set(k, labels ?? {});
59
+ this.gaugeLabels.set(name, l);
60
+ if (!this.otelGauges.has(name)) {
61
+ this.otelGauges.add(name);
62
+ // Il callback legge i valori correnti al momento dell'esportazione.
63
+ this.meter.createObservableGauge(name).addCallback((result) => {
64
+ for (const [key, value] of this.gauges.get(name) ?? []) {
65
+ result.observe(value, this.gaugeLabels.get(name)?.get(key) ?? {});
66
+ }
67
+ });
68
+ }
41
69
  }
42
70
  get(name, labels) {
43
71
  const k = EventsMetrics_1.key(labels);
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@generazioneai/events",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Eventi durevoli fra i servizi (ADR-009): outbox transazionale, relay su NATS JetStream, consumer durevoli con inbox idempotente, riprove con attesa crescente e dead letter comune.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -31,6 +31,7 @@
31
31
  "test:prepare": "prisma generate --config test/prisma/prisma.config.ts"
32
32
  },
33
33
  "dependencies": {
34
+ "@opentelemetry/api": "~1.9.0",
34
35
  "@nats-io/jetstream": "^3.4.0",
35
36
  "@nats-io/transport-node": "^3.4.0"
36
37
  },