@aztec/telemetry-client 0.0.0-test.0 → 0.0.1-commit.023c3e5

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.
Files changed (90) hide show
  1. package/dest/attributes.d.ts +33 -9
  2. package/dest/attributes.d.ts.map +1 -1
  3. package/dest/attributes.js +22 -8
  4. package/dest/bench.d.ts +6 -1
  5. package/dest/bench.d.ts.map +1 -1
  6. package/dest/bench.js +31 -14
  7. package/dest/config.d.ts +7 -2
  8. package/dest/config.d.ts.map +1 -1
  9. package/dest/config.js +29 -1
  10. package/dest/index.d.ts +2 -1
  11. package/dest/index.d.ts.map +1 -1
  12. package/dest/index.js +1 -0
  13. package/dest/l1_metrics.d.ts +17 -0
  14. package/dest/l1_metrics.d.ts.map +1 -0
  15. package/dest/l1_metrics.js +54 -0
  16. package/dest/lmdb_metrics.d.ts +5 -3
  17. package/dest/lmdb_metrics.d.ts.map +1 -1
  18. package/dest/lmdb_metrics.js +7 -15
  19. package/dest/metric-utils.d.ts +24 -0
  20. package/dest/metric-utils.d.ts.map +1 -0
  21. package/dest/metric-utils.js +59 -0
  22. package/dest/metrics.d.ts +247 -122
  23. package/dest/metrics.d.ts.map +1 -1
  24. package/dest/metrics.js +1239 -120
  25. package/dest/nodejs_metrics_monitor.d.ts +19 -0
  26. package/dest/nodejs_metrics_monitor.d.ts.map +1 -0
  27. package/dest/nodejs_metrics_monitor.js +115 -0
  28. package/dest/noop.d.ts +9 -4
  29. package/dest/noop.d.ts.map +1 -1
  30. package/dest/noop.js +34 -1
  31. package/dest/otel.d.ts +13 -7
  32. package/dest/otel.d.ts.map +1 -1
  33. package/dest/otel.js +142 -21
  34. package/dest/otel_filter_metric_exporter.d.ts +12 -4
  35. package/dest/otel_filter_metric_exporter.d.ts.map +1 -1
  36. package/dest/otel_filter_metric_exporter.js +38 -4
  37. package/dest/otel_logger_provider.d.ts +1 -1
  38. package/dest/otel_propagation.d.ts +1 -1
  39. package/dest/otel_resource.d.ts +1 -1
  40. package/dest/otel_resource.d.ts.map +1 -1
  41. package/dest/otel_resource.js +43 -2
  42. package/dest/prom_otel_adapter.d.ts +61 -12
  43. package/dest/prom_otel_adapter.d.ts.map +1 -1
  44. package/dest/prom_otel_adapter.js +157 -48
  45. package/dest/start.d.ts +3 -2
  46. package/dest/start.d.ts.map +1 -1
  47. package/dest/start.js +8 -7
  48. package/dest/telemetry.d.ts +63 -34
  49. package/dest/telemetry.d.ts.map +1 -1
  50. package/dest/telemetry.js +47 -24
  51. package/dest/vendor/attributes.d.ts +1 -1
  52. package/dest/vendor/otel-pino-stream.d.ts +1 -2
  53. package/dest/vendor/otel-pino-stream.d.ts.map +1 -1
  54. package/dest/vendor/otel-pino-stream.js +2 -2
  55. package/dest/with_tracer.d.ts +1 -1
  56. package/dest/with_tracer.d.ts.map +1 -1
  57. package/dest/wrappers/fetch.d.ts +2 -2
  58. package/dest/wrappers/fetch.d.ts.map +1 -1
  59. package/dest/wrappers/fetch.js +7 -5
  60. package/dest/wrappers/index.d.ts +1 -1
  61. package/dest/wrappers/json_rpc_server.d.ts +2 -2
  62. package/dest/wrappers/json_rpc_server.d.ts.map +1 -1
  63. package/dest/wrappers/l2_block_stream.d.ts +4 -3
  64. package/dest/wrappers/l2_block_stream.d.ts.map +1 -1
  65. package/dest/wrappers/l2_block_stream.js +385 -11
  66. package/package.json +21 -15
  67. package/src/attributes.ts +42 -11
  68. package/src/bench.ts +37 -15
  69. package/src/config.ts +54 -2
  70. package/src/index.ts +1 -0
  71. package/src/l1_metrics.ts +65 -0
  72. package/src/lmdb_metrics.ts +24 -24
  73. package/src/metric-utils.ts +75 -0
  74. package/src/metrics.ts +1313 -145
  75. package/src/nodejs_metrics_monitor.ts +135 -0
  76. package/src/noop.ts +65 -4
  77. package/src/otel.ts +155 -26
  78. package/src/otel_filter_metric_exporter.ts +47 -5
  79. package/src/otel_resource.ts +57 -2
  80. package/src/prom_otel_adapter.ts +195 -70
  81. package/src/start.ts +12 -8
  82. package/src/telemetry.ts +153 -76
  83. package/src/vendor/otel-pino-stream.ts +1 -4
  84. package/src/wrappers/fetch.ts +24 -31
  85. package/src/wrappers/json_rpc_server.ts +1 -1
  86. package/src/wrappers/l2_block_stream.ts +6 -2
  87. package/dest/event_loop_monitor.d.ts +0 -18
  88. package/dest/event_loop_monitor.d.ts.map +0 -1
  89. package/dest/event_loop_monitor.js +0 -93
  90. package/src/event_loop_monitor.ts +0 -119
@@ -0,0 +1,19 @@
1
+ import type { Meter } from './telemetry.js';
2
+ /** Monitors Node.js runtime metrics */
3
+ export declare class NodejsMetricsMonitor {
4
+ private meter;
5
+ private eventLoopDelayGauges;
6
+ private memoryGauges;
7
+ private eventLoopUilization;
8
+ private eventLoopTime;
9
+ private started;
10
+ private lastELU;
11
+ private eventLoopDelay;
12
+ constructor(meter: Meter);
13
+ start(): void;
14
+ stop(): void;
15
+ private measure;
16
+ private measureMemoryUsage;
17
+ private measureEventLoopDelay;
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZWpzX21ldHJpY3NfbW9uaXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25vZGVqc19tZXRyaWNzX21vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxLQUFLLEVBQXlCLEtBQUssRUFBa0MsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRyx1Q0FBdUM7QUFDdkMscUJBQWEsb0JBQW9CO0lBdUJuQixPQUFPLENBQUMsS0FBSztJQXRCekIsT0FBTyxDQUFDLG9CQUFvQixDQVExQjtJQUlGLE9BQU8sQ0FBQyxZQUFZLENBQW9FO0lBRXhGLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBa0I7SUFDN0MsT0FBTyxDQUFDLGFBQWEsQ0FBZ0I7SUFFckMsT0FBTyxDQUFDLE9BQU8sQ0FBUztJQUV4QixPQUFPLENBQUMsT0FBTyxDQUFtQztJQUNsRCxPQUFPLENBQUMsY0FBYyxDQUFvQjtJQUUxQyxZQUFvQixLQUFLLEVBQUUsS0FBSyxFQXVCL0I7SUFFRCxLQUFLLElBQUksSUFBSSxDQVlaO0lBRUQsSUFBSSxJQUFJLElBQUksQ0FZWDtJQUVELE9BQU8sQ0FBQyxPQUFPLENBR2I7SUFFRixPQUFPLENBQUMsa0JBQWtCLENBT3hCO0lBRUYsT0FBTyxDQUFDLHFCQUFxQixDQXlCM0I7Q0FDSCJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodejs_metrics_monitor.d.ts","sourceRoot":"","sources":["../src/nodejs_metrics_monitor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAyB,KAAK,EAAkC,MAAM,gBAAgB,CAAC;AAEnG,uCAAuC;AACvC,qBAAa,oBAAoB;IAuBnB,OAAO,CAAC,KAAK;IAtBzB,OAAO,CAAC,oBAAoB,CAQ1B;IAIF,OAAO,CAAC,YAAY,CAAoE;IAExF,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,cAAc,CAAoB;IAE1C,YAAoB,KAAK,EAAE,KAAK,EAuB/B;IAED,KAAK,IAAI,IAAI,CAYZ;IAED,IAAI,IAAI,IAAI,CAYX;IAED,OAAO,CAAC,OAAO,CAGb;IAEF,OAAO,CAAC,kBAAkB,CAOxB;IAEF,OAAO,CAAC,qBAAqB,CAyB3B;CACH"}
@@ -0,0 +1,115 @@
1
+ import { monitorEventLoopDelay, performance } from 'node:perf_hooks';
2
+ import * as Attributes from './attributes.js';
3
+ import { createUpDownCounterWithDefault } from './metric-utils.js';
4
+ import * as Metrics from './metrics.js';
5
+ /** Monitors Node.js runtime metrics */ export class NodejsMetricsMonitor {
6
+ meter;
7
+ eventLoopDelayGauges;
8
+ // skip `rss` because that's already tracked by @opentelemetry/host-metrics
9
+ // description of each field here https://nodejs.org/api/process.html#processmemoryusage
10
+ memoryGauges;
11
+ eventLoopUilization;
12
+ eventLoopTime;
13
+ started;
14
+ lastELU;
15
+ eventLoopDelay;
16
+ constructor(meter){
17
+ this.meter = meter;
18
+ this.started = false;
19
+ this.measure = (obs)=>{
20
+ this.measureMemoryUsage(obs);
21
+ this.measureEventLoopDelay(obs);
22
+ };
23
+ this.measureMemoryUsage = (observer)=>{
24
+ const mem = process.memoryUsage();
25
+ observer.observe(this.memoryGauges.heapUsed, mem.heapUsed);
26
+ observer.observe(this.memoryGauges.heapTotal, mem.heapTotal);
27
+ observer.observe(this.memoryGauges.arrayBuffers, mem.arrayBuffers);
28
+ observer.observe(this.memoryGauges.external, mem.external);
29
+ };
30
+ this.measureEventLoopDelay = (obs)=>{
31
+ const newELU = performance.eventLoopUtilization();
32
+ const delta = performance.eventLoopUtilization(newELU, this.lastELU);
33
+ this.lastELU = newELU;
34
+ // `utilization` [0,1] represents how much the event loop is busy vs waiting for new events to come in
35
+ // This should be corelated with CPU usage to gauge the performance characteristics of services
36
+ // 100% utilization leads to high latency because the event loop is _always_ busy, there's no breathing room for events to be processed quickly.
37
+ // Docs and examples:
38
+ // - https://nodesource.com/blog/event-loop-utilization-nodejs
39
+ // - https://youtu.be/WetXnEPraYM
40
+ obs.observe(this.eventLoopUilization, delta.utilization);
41
+ this.eventLoopTime.add(Math.trunc(delta.idle), {
42
+ [Attributes.NODEJS_EVENT_LOOP_STATE]: 'idle'
43
+ });
44
+ this.eventLoopTime.add(Math.trunc(delta.active), {
45
+ [Attributes.NODEJS_EVENT_LOOP_STATE]: 'active'
46
+ });
47
+ safeObserveInt(obs, this.eventLoopDelayGauges.min, this.eventLoopDelay.min);
48
+ safeObserveInt(obs, this.eventLoopDelayGauges.mean, this.eventLoopDelay.mean);
49
+ safeObserveInt(obs, this.eventLoopDelayGauges.max, this.eventLoopDelay.max);
50
+ safeObserveInt(obs, this.eventLoopDelayGauges.stddev, this.eventLoopDelay.stddev);
51
+ safeObserveInt(obs, this.eventLoopDelayGauges.p50, this.eventLoopDelay.percentile(50));
52
+ safeObserveInt(obs, this.eventLoopDelayGauges.p90, this.eventLoopDelay.percentile(90));
53
+ safeObserveInt(obs, this.eventLoopDelayGauges.p99, this.eventLoopDelay.percentile(99));
54
+ this.eventLoopDelay.reset();
55
+ };
56
+ this.eventLoopDelayGauges = {
57
+ min: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_MIN),
58
+ mean: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_MEAN),
59
+ max: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_MAX),
60
+ stddev: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_STDDEV),
61
+ p50: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_P50),
62
+ p90: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_P90),
63
+ p99: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_P99)
64
+ };
65
+ this.eventLoopUilization = meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_UTILIZATION);
66
+ this.eventLoopTime = createUpDownCounterWithDefault(meter, Metrics.NODEJS_EVENT_LOOP_TIME, {
67
+ [Attributes.NODEJS_EVENT_LOOP_STATE]: [
68
+ 'idle',
69
+ 'active'
70
+ ]
71
+ });
72
+ this.eventLoopDelay = monitorEventLoopDelay();
73
+ this.memoryGauges = {
74
+ heapUsed: meter.createObservableGauge(Metrics.NODEJS_MEMORY_HEAP_USAGE),
75
+ heapTotal: meter.createObservableGauge(Metrics.NODEJS_MEMORY_HEAP_TOTAL),
76
+ arrayBuffers: meter.createObservableGauge(Metrics.NODEJS_MEMORY_BUFFER_USAGE),
77
+ external: meter.createObservableGauge(Metrics.NODEJS_MEMORY_NATIVE_USAGE)
78
+ };
79
+ }
80
+ start() {
81
+ if (this.started) {
82
+ return;
83
+ }
84
+ this.lastELU = performance.eventLoopUtilization();
85
+ this.eventLoopDelay.enable();
86
+ this.meter.addBatchObservableCallback(this.measure, [
87
+ this.eventLoopUilization,
88
+ ...Object.values(this.eventLoopDelayGauges),
89
+ ...Object.values(this.memoryGauges)
90
+ ]);
91
+ }
92
+ stop() {
93
+ if (!this.started) {
94
+ return;
95
+ }
96
+ this.meter.removeBatchObservableCallback(this.measure, [
97
+ this.eventLoopUilization,
98
+ ...Object.values(this.eventLoopDelayGauges),
99
+ ...Object.values(this.memoryGauges)
100
+ ]);
101
+ this.eventLoopDelay.disable();
102
+ this.eventLoopDelay.reset();
103
+ this.lastELU = undefined;
104
+ }
105
+ measure;
106
+ measureMemoryUsage;
107
+ measureEventLoopDelay;
108
+ }
109
+ function safeObserveInt(observer, metric, value, attrs) {
110
+ // discard NaN, Infinity, -Infinity
111
+ if (!Number.isFinite(value)) {
112
+ return;
113
+ }
114
+ observer.observe(metric, Math.trunc(value), attrs);
115
+ }
package/dest/noop.d.ts CHANGED
@@ -1,14 +1,19 @@
1
- import { type Meter, type Span, type Tracer } from '@opentelemetry/api';
2
- import type { TelemetryClient } from './telemetry.js';
1
+ import { type Context, type Span, type Tracer } from '@opentelemetry/api';
2
+ import type { Meter, TelemetryClient } from './telemetry.js';
3
3
  export declare class NoopTelemetryClient implements TelemetryClient {
4
+ private meter;
5
+ setExportedPublicTelemetry(_prefixes: string[]): void;
6
+ setPublicTelemetryCollectFrom(_roles: string[]): void;
4
7
  getMeter(): Meter;
5
8
  getTracer(): Tracer;
6
9
  stop(): Promise<void>;
7
10
  flush(): Promise<void>;
8
11
  isEnabled(): boolean;
12
+ getTraceContext(): string | undefined;
13
+ extractPropagatedContext(_traceContext: string): Context | undefined;
9
14
  }
10
15
  export declare class NoopTracer implements Tracer {
11
16
  startSpan(): Span;
12
- startActiveSpan<F extends (...args: any[]) => any>(_name: string, ...args: (unknown | F)[]): ReturnType<F>;
17
+ startActiveSpan<F extends (...args: any[]) => any>(_name: string, ...args: unknown[]): ReturnType<F>;
13
18
  }
14
- //# sourceMappingURL=noop.d.ts.map
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25vb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFvQixLQUFLLE1BQU0sRUFBbUIsTUFBTSxvQkFBb0IsQ0FBQztBQUc3RyxPQUFPLEtBQUssRUFHVixLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGdCQUFnQixDQUFDO0FBeUN4QixxQkFBYSxtQkFBb0IsWUFBVyxlQUFlO0lBQ3pELE9BQU8sQ0FBQyxLQUFLLENBQW1CO0lBRWhDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUc7SUFDeEQsNkJBQTZCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBRztJQUV4RCxRQUFRLElBQUksS0FBSyxDQUVoQjtJQUVELFNBQVMsSUFBSSxNQUFNLENBRWxCO0lBRUQsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFcEI7SUFFRCxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUVyQjtJQUVELFNBQVMsWUFFUjtJQUVELGVBQWUsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUVwQztJQUVELHdCQUF3QixDQUFDLGFBQWEsRUFBRSxNQUFNLEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FFbkU7Q0FDRjtBQUtELHFCQUFhLFVBQVcsWUFBVyxNQUFNO0lBQ3ZDLFNBQVMsSUFBSSxJQUFJLENBRWhCO0lBRUQsZUFBZSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FJbkc7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,EAAoB,KAAK,MAAM,EAAmB,MAAM,oBAAoB,CAAC;AAE3G,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,qBAAa,mBAAoB,YAAW,eAAe;IACzD,QAAQ,IAAI,KAAK;IAIjB,SAAS,IAAI,MAAM;IAInB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,SAAS;CAGV;AAKD,qBAAa,UAAW,YAAW,MAAM;IACvC,SAAS,IAAI,IAAI;IAIjB,eAAe,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;CAK3G"}
1
+ {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAoB,KAAK,MAAM,EAAmB,MAAM,oBAAoB,CAAC;AAG7G,OAAO,KAAK,EAGV,KAAK,EAGL,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AAyCxB,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,KAAK,CAAmB;IAEhC,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAG;IACxD,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAG;IAExD,QAAQ,IAAI,KAAK,CAEhB;IAED,SAAS,IAAI,MAAM,CAElB;IAED,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpB;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAErB;IAED,SAAS,YAER;IAED,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpC;IAED,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEnE;CACF;AAKD,qBAAa,UAAW,YAAW,MAAM;IACvC,SAAS,IAAI,IAAI,CAEhB;IAED,eAAe,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAInG;CACF"}
package/dest/noop.js CHANGED
@@ -1,7 +1,34 @@
1
1
  import { createNoopMeter } from '@opentelemetry/api';
2
+ /** A no-op meter that implements our custom Meter interface */ class NoopMeter {
3
+ otelMeter = createNoopMeter();
4
+ createGauge(_metric) {
5
+ return this.otelMeter.createGauge('');
6
+ }
7
+ createObservableGauge(_metric) {
8
+ return this.otelMeter.createObservableGauge('');
9
+ }
10
+ createHistogram(_metric, _extraOptions) {
11
+ return this.otelMeter.createHistogram('');
12
+ }
13
+ createUpDownCounter(_metric) {
14
+ return this.otelMeter.createUpDownCounter('');
15
+ }
16
+ createObservableUpDownCounter(_metric) {
17
+ return this.otelMeter.createObservableUpDownCounter('');
18
+ }
19
+ addBatchObservableCallback(callback, observables) {
20
+ this.otelMeter.addBatchObservableCallback(callback, observables);
21
+ }
22
+ removeBatchObservableCallback(callback, observables) {
23
+ this.otelMeter.removeBatchObservableCallback(callback, observables);
24
+ }
25
+ }
2
26
  export class NoopTelemetryClient {
27
+ meter = new NoopMeter();
28
+ setExportedPublicTelemetry(_prefixes) {}
29
+ setPublicTelemetryCollectFrom(_roles) {}
3
30
  getMeter() {
4
- return createNoopMeter();
31
+ return this.meter;
5
32
  }
6
33
  getTracer() {
7
34
  return new NoopTracer();
@@ -15,6 +42,12 @@ export class NoopTelemetryClient {
15
42
  isEnabled() {
16
43
  return false;
17
44
  }
45
+ getTraceContext() {
46
+ return undefined;
47
+ }
48
+ extractPropagatedContext(_traceContext) {
49
+ return undefined;
50
+ }
18
51
  }
19
52
  // @opentelemetry/api internally uses NoopTracer and NoopSpan but they're not exported
20
53
  // make our own versions
package/dest/otel.d.ts CHANGED
@@ -1,32 +1,38 @@
1
1
  import { type Logger } from '@aztec/foundation/log';
2
- import { type Meter, type Tracer, type TracerProvider } from '@opentelemetry/api';
2
+ import { type Context, type Tracer, type TracerProvider } from '@opentelemetry/api';
3
3
  import { HostMetrics } from '@opentelemetry/host-metrics';
4
4
  import type { IResource } from '@opentelemetry/resources';
5
5
  import type { LoggerProvider } from '@opentelemetry/sdk-logs';
6
6
  import { MeterProvider, type PeriodicExportingMetricReaderOptions } from '@opentelemetry/sdk-metrics';
7
7
  import type { TelemetryClientConfig } from './config.js';
8
- import { EventLoopMonitor } from './event_loop_monitor.js';
9
- import type { TelemetryClient } from './telemetry.js';
8
+ import { NodejsMetricsMonitor } from './nodejs_metrics_monitor.js';
9
+ import { PublicOtelFilterMetricExporter } from './otel_filter_metric_exporter.js';
10
+ import type { Meter, TelemetryClient } from './telemetry.js';
10
11
  export type OpenTelemetryClientFactory = (resource: IResource, log: Logger) => OpenTelemetryClient;
11
12
  export declare class OpenTelemetryClient implements TelemetryClient {
12
13
  private resource;
13
14
  private meterProvider;
14
15
  private traceProvider;
15
16
  private loggerProvider;
17
+ private publicMetricExporter;
16
18
  private log;
17
19
  hostMetrics: HostMetrics | undefined;
18
- eventLoopMonitor: EventLoopMonitor | undefined;
20
+ nodejsMetricsMonitor: NodejsMetricsMonitor | undefined;
19
21
  private meters;
20
22
  private tracers;
21
- protected constructor(resource: IResource, meterProvider: MeterProvider, traceProvider: TracerProvider, loggerProvider: LoggerProvider | undefined, log: Logger);
23
+ protected constructor(resource: IResource, meterProvider: MeterProvider, traceProvider: TracerProvider, loggerProvider: LoggerProvider | undefined, publicMetricExporter: PublicOtelFilterMetricExporter | undefined, log: Logger);
24
+ setExportedPublicTelemetry(metrics: string[]): void;
25
+ setPublicTelemetryCollectFrom(roles: string[]): void;
22
26
  getMeter(name: string): Meter;
23
27
  getTracer(name: string): Tracer;
24
28
  start(): void;
25
29
  isEnabled(): boolean;
26
30
  flush(): Promise<void>;
27
31
  stop(): Promise<void>;
28
- static createMeterProvider(resource: IResource, options: Partial<PeriodicExportingMetricReaderOptions>): MeterProvider;
32
+ getTraceContext(): string | undefined;
33
+ extractPropagatedContext(traceContext: string): Context;
34
+ static createMeterProvider(resource: IResource, exporters: Array<PeriodicExportingMetricReaderOptions>): MeterProvider;
29
35
  private static getCustomClientFactory;
30
36
  static createAndStart(config: TelemetryClientConfig, log: Logger): OpenTelemetryClient;
31
37
  }
32
- //# sourceMappingURL=otel.d.ts.map
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL290ZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixLQUFLLE1BQU0sRUFBcUIsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRixPQUFPLEVBQ0wsS0FBSyxPQUFPLEVBS1osS0FBSyxNQUFNLEVBQ1gsS0FBSyxjQUFjLEVBTXBCLE1BQU0sb0JBQW9CLENBQUM7QUFJNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFHTCxhQUFhLEVBRWIsS0FBSyxvQ0FBb0MsRUFFMUMsTUFBTSw0QkFBNEIsQ0FBQztBQUlwQyxPQUFPLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQTRCLDhCQUE4QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHNUcsT0FBTyxLQUFLLEVBR1YsS0FBSyxFQUdMLGVBQWUsRUFFaEIsTUFBTSxnQkFBZ0IsQ0FBQztBQXlDeEIsTUFBTSxNQUFNLDBCQUEwQixHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxLQUFLLG1CQUFtQixDQUFDO0FBRW5HLHFCQUFhLG1CQUFvQixZQUFXLGVBQWU7SUFPdkQsT0FBTyxDQUFDLFFBQVE7SUFDaEIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLGNBQWM7SUFDdEIsT0FBTyxDQUFDLG9CQUFvQjtJQUM1QixPQUFPLENBQUMsR0FBRztJQVhiLFdBQVcsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQ3JDLG9CQUFvQixFQUFFLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztJQUN2RCxPQUFPLENBQUMsTUFBTSxDQUE4RDtJQUM1RSxPQUFPLENBQUMsT0FBTyxDQUFrRDtJQUVqRSxTQUFTLGFBQ0MsUUFBUSxFQUFFLFNBQVMsRUFDbkIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsYUFBYSxFQUFFLGNBQWMsRUFDN0IsY0FBYyxFQUFFLGNBQWMsR0FBRyxTQUFTLEVBQzFDLG9CQUFvQixFQUFFLDhCQUE4QixHQUFHLFNBQVMsRUFDaEUsR0FBRyxFQUFFLE1BQU0sRUFDakI7SUFFSiwwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUVsRDtJQUVELDZCQUE2QixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBRW5EO0lBRUQsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsS0FBSyxDQVE1QjtJQUVELFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FPOUI7SUFFTSxLQUFLLFNBOEJYO0lBRU0sU0FBUyxZQUVmO0lBRVksS0FBSyxrQkFNakI7SUFFWSxJQUFJLGtCQWdCaEI7SUFFTSxlQUFlLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FJM0M7SUFFTSx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FLN0Q7SUFFRCxPQUFjLG1CQUFtQixDQUMvQixRQUFRLEVBQUUsU0FBUyxFQUNuQixTQUFTLEVBQUUsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLEdBQ3JELGFBQWEsQ0ErSGY7SUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtJQWlFckMsT0FBYyxjQUFjLENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxNQUFNLEdBQUcsbUJBQW1CLENBUTVGO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAqB,MAAM,uBAAuB,CAAC;AAErF,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,MAAM,EACX,KAAK,cAAc,EAKpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAGL,aAAa,EAEb,KAAK,oCAAoC,EAE1C,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAI3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,MAAM,0BAA0B,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,mBAAmB,CAAC;AAEnG,qBAAa,mBAAoB,YAAW,eAAe;IAOvD,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,GAAG;IAVb,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC/C,OAAO,CAAC,MAAM,CAAgD;IAC9D,OAAO,CAAC,OAAO,CAAkD;IAEjE,SAAS,aACC,QAAQ,EAAE,SAAS,EACnB,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,cAAc,EAC7B,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,GAAG,EAAE,MAAM;IAGrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;IAS7B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IASxB,KAAK;IA+BL,SAAS;IAIH,KAAK;IAQL,IAAI;WAkBH,mBAAmB,CAC/B,QAAQ,EAAE,SAAS,EACnB,OAAO,EAAE,OAAO,CAAC,oCAAoC,CAAC,GACrD,aAAa;IAkHhB,OAAO,CAAC,MAAM,CAAC,sBAAsB;WA4BvB,cAAc,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,EAAE,MAAM,GAAG,mBAAmB;CAS9F"}
1
+ {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAqB,MAAM,uBAAuB,CAAC;AAErF,OAAO,EACL,KAAK,OAAO,EAKZ,KAAK,MAAM,EACX,KAAK,cAAc,EAMpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAGL,aAAa,EAEb,KAAK,oCAAoC,EAE1C,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAA4B,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAG5G,OAAO,KAAK,EAGV,KAAK,EAGL,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AAyCxB,MAAM,MAAM,0BAA0B,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,mBAAmB,CAAC;AAEnG,qBAAa,mBAAoB,YAAW,eAAe;IAOvD,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,oBAAoB;IAC5B,OAAO,CAAC,GAAG;IAXb,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,oBAAoB,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACvD,OAAO,CAAC,MAAM,CAA8D;IAC5E,OAAO,CAAC,OAAO,CAAkD;IAEjE,SAAS,aACC,QAAQ,EAAE,SAAS,EACnB,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,cAAc,EAC7B,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,oBAAoB,EAAE,8BAA8B,GAAG,SAAS,EAChE,GAAG,EAAE,MAAM,EACjB;IAEJ,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAElD;IAED,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAEnD;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAQ5B;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO9B;IAEM,KAAK,SA8BX;IAEM,SAAS,YAEf;IAEY,KAAK,kBAMjB;IAEY,IAAI,kBAgBhB;IAEM,eAAe,IAAI,MAAM,GAAG,SAAS,CAI3C;IAEM,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAK7D;IAED,OAAc,mBAAmB,CAC/B,QAAQ,EAAE,SAAS,EACnB,SAAS,EAAE,KAAK,CAAC,oCAAoC,CAAC,GACrD,aAAa,CA+Hf;IAED,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAiErC,OAAc,cAAc,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAQ5F;CACF"}
package/dest/otel.js CHANGED
@@ -1,38 +1,79 @@
1
1
  import { addLogDataHandler } from '@aztec/foundation/log';
2
- import { DiagConsoleLogger, DiagLogLevel, context, diag, isSpanContextValid, trace } from '@opentelemetry/api';
2
+ import { DiagConsoleLogger, DiagLogLevel, ROOT_CONTEXT, context, diag, isSpanContextValid, propagation, trace } from '@opentelemetry/api';
3
+ import { W3CTraceContextPropagator } from '@opentelemetry/core';
3
4
  import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
4
5
  import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
5
6
  import { HostMetrics } from '@opentelemetry/host-metrics';
6
7
  import { ExplicitBucketHistogramAggregation, InstrumentType, MeterProvider, PeriodicExportingMetricReader, View } from '@opentelemetry/sdk-metrics';
7
8
  import { BatchSpanProcessor, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
8
9
  import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
9
- import { EventLoopMonitor } from './event_loop_monitor.js';
10
- import { OtelFilterMetricExporter } from './otel_filter_metric_exporter.js';
10
+ import { toMetricOptions } from './metric-utils.js';
11
+ import { NodejsMetricsMonitor } from './nodejs_metrics_monitor.js';
12
+ import { OtelFilterMetricExporter, PublicOtelFilterMetricExporter } from './otel_filter_metric_exporter.js';
11
13
  import { registerOtelLoggerProvider } from './otel_logger_provider.js';
12
14
  import { getOtelResource } from './otel_resource.js';
15
+ /** Wraps an OpenTelemetry Meter to implement our custom Meter interface */ class WrappedMeter {
16
+ otelMeter;
17
+ constructor(otelMeter){
18
+ this.otelMeter = otelMeter;
19
+ }
20
+ createGauge(metric) {
21
+ return this.otelMeter.createGauge(metric.name, toMetricOptions(metric));
22
+ }
23
+ createObservableGauge(metric) {
24
+ return this.otelMeter.createObservableGauge(metric.name, toMetricOptions(metric));
25
+ }
26
+ createHistogram(metric, extraOptions) {
27
+ return this.otelMeter.createHistogram(metric.name, {
28
+ ...toMetricOptions(metric),
29
+ ...extraOptions
30
+ });
31
+ }
32
+ createUpDownCounter(metric) {
33
+ return this.otelMeter.createUpDownCounter(metric.name, toMetricOptions(metric));
34
+ }
35
+ createObservableUpDownCounter(metric) {
36
+ return this.otelMeter.createObservableUpDownCounter(metric.name, toMetricOptions(metric));
37
+ }
38
+ addBatchObservableCallback(callback, observables) {
39
+ this.otelMeter.addBatchObservableCallback(callback, observables);
40
+ }
41
+ removeBatchObservableCallback(callback, observables) {
42
+ this.otelMeter.removeBatchObservableCallback(callback, observables);
43
+ }
44
+ }
13
45
  export class OpenTelemetryClient {
14
46
  resource;
15
47
  meterProvider;
16
48
  traceProvider;
17
49
  loggerProvider;
50
+ publicMetricExporter;
18
51
  log;
19
52
  hostMetrics;
20
- eventLoopMonitor;
53
+ nodejsMetricsMonitor;
21
54
  meters;
22
55
  tracers;
23
- constructor(resource, meterProvider, traceProvider, loggerProvider, log){
56
+ constructor(resource, meterProvider, traceProvider, loggerProvider, publicMetricExporter, log){
24
57
  this.resource = resource;
25
58
  this.meterProvider = meterProvider;
26
59
  this.traceProvider = traceProvider;
27
60
  this.loggerProvider = loggerProvider;
61
+ this.publicMetricExporter = publicMetricExporter;
28
62
  this.log = log;
29
63
  this.meters = new Map();
30
64
  this.tracers = new Map();
31
65
  }
66
+ setExportedPublicTelemetry(metrics) {
67
+ this.publicMetricExporter?.setMetricPrefixes(metrics);
68
+ }
69
+ setPublicTelemetryCollectFrom(roles) {
70
+ this.publicMetricExporter?.setAllowedRoles(roles);
71
+ }
32
72
  getMeter(name) {
33
73
  let meter = this.meters.get(name);
34
74
  if (!meter) {
35
- meter = this.meterProvider.getMeter(name, this.resource.attributes[ATTR_SERVICE_VERSION]);
75
+ const otelMeter = this.meterProvider.getMeter(name, this.resource.attributes[ATTR_SERVICE_VERSION]);
76
+ meter = new WrappedMeter(otelMeter);
36
77
  this.meters.set(name, meter);
37
78
  }
38
79
  return meter;
@@ -63,9 +104,10 @@ export class OpenTelemetryClient {
63
104
  name: this.resource.attributes[ATTR_SERVICE_NAME],
64
105
  meterProvider: this.meterProvider
65
106
  });
66
- this.eventLoopMonitor = new EventLoopMonitor(this.meterProvider.getMeter(this.resource.attributes[ATTR_SERVICE_NAME]));
107
+ const nodejsMeter = new WrappedMeter(this.meterProvider.getMeter(this.resource.attributes[ATTR_SERVICE_NAME]));
108
+ this.nodejsMetricsMonitor = new NodejsMetricsMonitor(nodejsMeter);
67
109
  this.hostMetrics.start();
68
- this.eventLoopMonitor.start();
110
+ this.nodejsMetricsMonitor.start();
69
111
  }
70
112
  isEnabled() {
71
113
  return true;
@@ -78,7 +120,7 @@ export class OpenTelemetryClient {
78
120
  ]);
79
121
  }
80
122
  async stop() {
81
- this.eventLoopMonitor?.stop();
123
+ this.nodejsMetricsMonitor?.stop();
82
124
  const flushAndShutdown = async (provider)=>{
83
125
  if (!provider) {
84
126
  return;
@@ -92,14 +134,58 @@ export class OpenTelemetryClient {
92
134
  this.traceProvider instanceof NodeTracerProvider ? flushAndShutdown(this.traceProvider) : Promise.resolve()
93
135
  ]);
94
136
  }
95
- static createMeterProvider(resource, options) {
137
+ getTraceContext() {
138
+ const carrier = {};
139
+ propagation.inject(context.active(), carrier);
140
+ return carrier['traceparent'];
141
+ }
142
+ extractPropagatedContext(traceContext) {
143
+ const extractedContext = propagation.extract(ROOT_CONTEXT, {
144
+ traceparent: traceContext
145
+ });
146
+ return extractedContext;
147
+ }
148
+ static createMeterProvider(resource, exporters) {
96
149
  return new MeterProvider({
97
150
  resource,
98
- readers: options.exporter ? [
99
- new PeriodicExportingMetricReader(options)
100
- ] : [],
151
+ readers: exporters.map((options)=>new PeriodicExportingMetricReader(options)),
101
152
  views: [
102
153
  // Every histogram matching the selector (type + unit) gets these custom buckets assigned
154
+ new View({
155
+ instrumentType: InstrumentType.HISTOGRAM,
156
+ instrumentUnit: 'Mmana',
157
+ aggregation: new ExplicitBucketHistogramAggregation([
158
+ 0.1,
159
+ 0.5,
160
+ 1,
161
+ 2,
162
+ 4,
163
+ 8,
164
+ 10,
165
+ 25,
166
+ 50,
167
+ 100,
168
+ 500,
169
+ 1000,
170
+ 5000,
171
+ 10000
172
+ ], true)
173
+ }),
174
+ new View({
175
+ instrumentType: InstrumentType.HISTOGRAM,
176
+ instrumentUnit: 'tx',
177
+ aggregation: new ExplicitBucketHistogramAggregation(// TPS
178
+ [
179
+ 0.1 * 36,
180
+ 0.2 * 36,
181
+ 0.5 * 36,
182
+ 1 * 36,
183
+ 2 * 36,
184
+ 5 * 36,
185
+ 10 * 36,
186
+ 15 * 36
187
+ ].map(Math.ceil), true)
188
+ }),
103
189
  new View({
104
190
  instrumentType: InstrumentType.HISTOGRAM,
105
191
  instrumentUnit: 's',
@@ -297,16 +383,51 @@ export class OpenTelemetryClient {
297
383
  }))
298
384
  ] : []
299
385
  });
300
- tracerProvider.register();
301
- const meterProvider = OpenTelemetryClient.createMeterProvider(resource, {
302
- exporter: config.metricsCollectorUrl ? new OtelFilterMetricExporter(new OTLPMetricExporter({
303
- url: config.metricsCollectorUrl.href
304
- }), config.otelExcludeMetrics ?? []) : undefined,
305
- exportTimeoutMillis: config.otelExportTimeoutMs,
306
- exportIntervalMillis: config.otelCollectIntervalMs
386
+ tracerProvider.register({
387
+ propagator: new W3CTraceContextPropagator()
307
388
  });
389
+ const exporters = [];
390
+ if (config.metricsCollectorUrl) {
391
+ // Default to a blacklist that is empty (allow all metrics)
392
+ let filter = [];
393
+ let mode = 'deny';
394
+ if (config.otelExcludeMetrics.length > 0) {
395
+ // Implement a blacklist as specified in config
396
+ log.info(`Excluding metrics from export: ${config.otelExcludeMetrics}`);
397
+ filter = config.otelExcludeMetrics;
398
+ mode = 'deny';
399
+ } else if (config.otelIncludeMetrics.length > 0) {
400
+ // Implement a whitelist as specified in config
401
+ log.info(`Including only specified metrics for export: ${config.otelIncludeMetrics}`);
402
+ filter = config.otelIncludeMetrics;
403
+ mode = 'allow';
404
+ }
405
+ exporters.push({
406
+ exporter: new OtelFilterMetricExporter(new OTLPMetricExporter({
407
+ url: config.metricsCollectorUrl.href
408
+ }), filter, mode),
409
+ exportTimeoutMillis: config.otelExportTimeoutMs,
410
+ exportIntervalMillis: config.otelCollectIntervalMs
411
+ });
412
+ }
413
+ let publicExporter;
414
+ if (config.publicMetricsCollectorUrl && !config.publicMetricsOptOut) {
415
+ log.info(`Exporting public metrics: ${config.publicIncludeMetrics}`, {
416
+ publicMetrics: config.publicIncludeMetrics,
417
+ collectorUrl: config.publicMetricsCollectorUrl
418
+ });
419
+ publicExporter = new PublicOtelFilterMetricExporter(config.publicMetricsCollectFrom, new OTLPMetricExporter({
420
+ url: config.publicMetricsCollectorUrl.href
421
+ }), config.publicIncludeMetrics);
422
+ exporters.push({
423
+ exporter: publicExporter,
424
+ exportTimeoutMillis: config.otelExportTimeoutMs,
425
+ exportIntervalMillis: config.otelCollectIntervalMs
426
+ });
427
+ }
428
+ const meterProvider = OpenTelemetryClient.createMeterProvider(resource, exporters);
308
429
  const loggerProvider = registerOtelLoggerProvider(resource, config.logsCollectorUrl);
309
- return new OpenTelemetryClient(resource, meterProvider, tracerProvider, loggerProvider, log);
430
+ return new OpenTelemetryClient(resource, meterProvider, tracerProvider, loggerProvider, publicExporter, log);
310
431
  };
311
432
  }
312
433
  static createAndStart(config, log) {
@@ -1,12 +1,20 @@
1
- import type { ExportResult } from '@opentelemetry/core';
1
+ import { type ExportResult } from '@opentelemetry/core';
2
2
  import type { PushMetricExporter, ResourceMetrics } from '@opentelemetry/sdk-metrics';
3
3
  export declare class OtelFilterMetricExporter implements PushMetricExporter {
4
4
  private readonly exporter;
5
- private readonly excludeMetricPrefixes;
6
- constructor(exporter: PushMetricExporter, excludeMetricPrefixes: string[]);
5
+ private metricPrefix;
6
+ private readonly filter;
7
+ constructor(exporter: PushMetricExporter, metricPrefix: string[], filter?: 'allow' | 'deny');
7
8
  export(metrics: ResourceMetrics, resultCallback: (result: ExportResult) => void): void;
8
9
  private filterMetrics;
9
10
  forceFlush(): Promise<void>;
10
11
  shutdown(): Promise<void>;
12
+ setMetricPrefixes(metrics: string[]): void;
11
13
  }
12
- //# sourceMappingURL=otel_filter_metric_exporter.d.ts.map
14
+ export declare class PublicOtelFilterMetricExporter extends OtelFilterMetricExporter {
15
+ private allowedRoles;
16
+ constructor(allowedRoles: string[], exporter: PushMetricExporter, metricPrefix: string[]);
17
+ export(metrics: ResourceMetrics, resultCallback: (result: ExportResult) => void): void;
18
+ setAllowedRoles(roles: string[]): void;
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbF9maWx0ZXJfbWV0cmljX2V4cG9ydGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvb3RlbF9maWx0ZXJfbWV0cmljX2V4cG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLFlBQVksRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRSxPQUFPLEtBQUssRUFBYyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUlsRyxxQkFBYSx3QkFBeUIsWUFBVyxrQkFBa0I7SUFFL0QsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRO0lBQ3pCLE9BQU8sQ0FBQyxZQUFZO0lBQ3BCLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtJQUh6QixZQUNtQixRQUFRLEVBQUUsa0JBQWtCLEVBQ3JDLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFDYixNQUFNLEdBQUUsT0FBTyxHQUFHLE1BQWUsRUFRbkQ7SUFFTSxNQUFNLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxLQUFLLElBQUksR0FBRyxJQUFJLENBUzVGO0lBRUQsT0FBTyxDQUFDLGFBQWE7SUFjZCxVQUFVLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUVqQztJQUVNLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBRS9CO0lBRU0saUJBQWlCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUV6QztDQUNGO0FBRUQscUJBQWEsOEJBQStCLFNBQVEsd0JBQXdCO0lBRXhFLE9BQU8sQ0FBQyxZQUFZO0lBRHRCLFlBQ1UsWUFBWSxFQUFFLE1BQU0sRUFBRSxFQUM5QixRQUFRLEVBQUUsa0JBQWtCLEVBQzVCLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFHdkI7SUFFZSxNQUFNLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxLQUFLLElBQUksR0FBRyxJQUFJLENBUXJHO0lBRU0sZUFBZSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFFckM7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"otel_filter_metric_exporter.d.ts","sourceRoot":"","sources":["../src/otel_filter_metric_exporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAc,kBAAkB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElG,qBAAa,wBAAyB,YAAW,kBAAkB;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAsB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAApE,QAAQ,EAAE,kBAAkB,EAAmB,qBAAqB,EAAE,MAAM,EAAE;IASpG,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAW7F,OAAO,CAAC,aAAa;IAMd,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC"}
1
+ {"version":3,"file":"otel_filter_metric_exporter.d.ts","sourceRoot":"","sources":["../src/otel_filter_metric_exporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAc,kBAAkB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAIlG,qBAAa,wBAAyB,YAAW,kBAAkB;IAE/D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHzB,YACmB,QAAQ,EAAE,kBAAkB,EACrC,YAAY,EAAE,MAAM,EAAE,EACb,MAAM,GAAE,OAAO,GAAG,MAAe,EAQnD;IAEM,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAS5F;IAED,OAAO,CAAC,aAAa;IAcd,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjC;IAEM,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAE/B;IAEM,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAEzC;CACF;AAED,qBAAa,8BAA+B,SAAQ,wBAAwB;IAExE,OAAO,CAAC,YAAY;IADtB,YACU,YAAY,EAAE,MAAM,EAAE,EAC9B,QAAQ,EAAE,kBAAkB,EAC5B,YAAY,EAAE,MAAM,EAAE,EAGvB;IAEe,MAAM,CAAC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAQrG;IAEM,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAErC;CACF"}
@@ -1,9 +1,13 @@
1
+ import { ExportResultCode } from '@opentelemetry/core';
2
+ import { AZTEC_NODE_ROLE } from './attributes.js';
1
3
  export class OtelFilterMetricExporter {
2
4
  exporter;
3
- excludeMetricPrefixes;
4
- constructor(exporter, excludeMetricPrefixes){
5
+ metricPrefix;
6
+ filter;
7
+ constructor(exporter, metricPrefix, filter = 'deny'){
5
8
  this.exporter = exporter;
6
- this.excludeMetricPrefixes = excludeMetricPrefixes;
9
+ this.metricPrefix = metricPrefix;
10
+ this.filter = filter;
7
11
  if (exporter.selectAggregation) {
8
12
  this.selectAggregation = exporter.selectAggregation.bind(exporter);
9
13
  }
@@ -22,7 +26,15 @@ export class OtelFilterMetricExporter {
22
26
  this.exporter.export(filteredMetrics, resultCallback);
23
27
  }
24
28
  filterMetrics(metrics) {
25
- return metrics.filter((metric)=>!this.excludeMetricPrefixes.some((prefix)=>metric.descriptor.name.startsWith(prefix)));
29
+ return metrics.filter((metric)=>{
30
+ const matched = this.metricPrefix.some((prefix)=>metric.descriptor.name.startsWith(prefix));
31
+ if (this.filter === 'deny') {
32
+ return !matched;
33
+ }
34
+ if (this.filter === 'allow') {
35
+ return matched;
36
+ }
37
+ });
26
38
  }
27
39
  forceFlush() {
28
40
  return this.exporter.forceFlush();
@@ -30,4 +42,26 @@ export class OtelFilterMetricExporter {
30
42
  shutdown() {
31
43
  return this.exporter.shutdown();
32
44
  }
45
+ setMetricPrefixes(metrics) {
46
+ this.metricPrefix = metrics;
47
+ }
48
+ }
49
+ export class PublicOtelFilterMetricExporter extends OtelFilterMetricExporter {
50
+ allowedRoles;
51
+ constructor(allowedRoles, exporter, metricPrefix){
52
+ super(exporter, metricPrefix, 'allow'), this.allowedRoles = allowedRoles;
53
+ }
54
+ export(metrics, resultCallback) {
55
+ const role = String(metrics.resource.attributes[AZTEC_NODE_ROLE] ?? '');
56
+ if (!role || !this.allowedRoles.includes(role)) {
57
+ // noop
58
+ return resultCallback({
59
+ code: ExportResultCode.SUCCESS
60
+ });
61
+ }
62
+ super.export(metrics, resultCallback);
63
+ }
64
+ setAllowedRoles(roles) {
65
+ this.allowedRoles = roles;
66
+ }
33
67
  }
@@ -1,4 +1,4 @@
1
1
  import type { IResource } from '@opentelemetry/resources';
2
2
  import { LoggerProvider } from '@opentelemetry/sdk-logs';
3
3
  export declare function registerOtelLoggerProvider(resource: IResource, otelLogsUrl?: URL): LoggerProvider;
4
- //# sourceMappingURL=otel_logger_provider.d.ts.map
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbF9sb2dnZXJfcHJvdmlkZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vdGVsX2xvZ2dlcl9wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQTJCLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWxGLHdCQUFnQiwwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsa0JBd0JoRiJ9
@@ -1,3 +1,3 @@
1
1
  import type Koa from 'koa';
2
2
  export declare function getOtelJsonRpcPropagationMiddleware(scope?: string): (ctx: Koa.Context, next: () => Promise<void>) => Promise<void>;
3
- //# sourceMappingURL=otel_propagation.d.ts.map
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbF9wcm9wYWdhdGlvbi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL290ZWxfcHJvcGFnYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFVM0Isd0JBQWdCLG1DQUFtQyxDQUNqRCxLQUFLLFNBQWtCLEdBQ3RCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FvQ2hFIn0=
@@ -1,3 +1,3 @@
1
1
  import { type IResource } from '@opentelemetry/resources';
2
2
  export declare function getOtelResource(): IResource;
3
- //# sourceMappingURL=otel_resource.d.ts.map
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbF9yZXNvdXJjZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL290ZWxfcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLEtBQUssU0FBUyxFQU1mLE1BQU0sMEJBQTBCLENBQUM7QUFxQmxDLHdCQUFnQixlQUFlLElBQUksU0FBUyxDQWUzQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"otel_resource.d.ts","sourceRoot":"","sources":["../src/otel_resource.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAMf,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,eAAe,IAAI,SAAS,CAM3C"}
1
+ {"version":3,"file":"otel_resource.d.ts","sourceRoot":"","sources":["../src/otel_resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAMf,MAAM,0BAA0B,CAAC;AAqBlC,wBAAgB,eAAe,IAAI,SAAS,CAe3C"}