@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.
- package/dest/attributes.d.ts +33 -9
- package/dest/attributes.d.ts.map +1 -1
- package/dest/attributes.js +22 -8
- package/dest/bench.d.ts +6 -1
- package/dest/bench.d.ts.map +1 -1
- package/dest/bench.js +31 -14
- package/dest/config.d.ts +7 -2
- package/dest/config.d.ts.map +1 -1
- package/dest/config.js +29 -1
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/l1_metrics.d.ts +17 -0
- package/dest/l1_metrics.d.ts.map +1 -0
- package/dest/l1_metrics.js +54 -0
- package/dest/lmdb_metrics.d.ts +5 -3
- package/dest/lmdb_metrics.d.ts.map +1 -1
- package/dest/lmdb_metrics.js +7 -15
- package/dest/metric-utils.d.ts +24 -0
- package/dest/metric-utils.d.ts.map +1 -0
- package/dest/metric-utils.js +59 -0
- package/dest/metrics.d.ts +247 -122
- package/dest/metrics.d.ts.map +1 -1
- package/dest/metrics.js +1239 -120
- package/dest/nodejs_metrics_monitor.d.ts +19 -0
- package/dest/nodejs_metrics_monitor.d.ts.map +1 -0
- package/dest/nodejs_metrics_monitor.js +115 -0
- package/dest/noop.d.ts +9 -4
- package/dest/noop.d.ts.map +1 -1
- package/dest/noop.js +34 -1
- package/dest/otel.d.ts +13 -7
- package/dest/otel.d.ts.map +1 -1
- package/dest/otel.js +142 -21
- package/dest/otel_filter_metric_exporter.d.ts +12 -4
- package/dest/otel_filter_metric_exporter.d.ts.map +1 -1
- package/dest/otel_filter_metric_exporter.js +38 -4
- package/dest/otel_logger_provider.d.ts +1 -1
- package/dest/otel_propagation.d.ts +1 -1
- package/dest/otel_resource.d.ts +1 -1
- package/dest/otel_resource.d.ts.map +1 -1
- package/dest/otel_resource.js +43 -2
- package/dest/prom_otel_adapter.d.ts +61 -12
- package/dest/prom_otel_adapter.d.ts.map +1 -1
- package/dest/prom_otel_adapter.js +157 -48
- package/dest/start.d.ts +3 -2
- package/dest/start.d.ts.map +1 -1
- package/dest/start.js +8 -7
- package/dest/telemetry.d.ts +63 -34
- package/dest/telemetry.d.ts.map +1 -1
- package/dest/telemetry.js +47 -24
- package/dest/vendor/attributes.d.ts +1 -1
- package/dest/vendor/otel-pino-stream.d.ts +1 -2
- package/dest/vendor/otel-pino-stream.d.ts.map +1 -1
- package/dest/vendor/otel-pino-stream.js +2 -2
- package/dest/with_tracer.d.ts +1 -1
- package/dest/with_tracer.d.ts.map +1 -1
- package/dest/wrappers/fetch.d.ts +2 -2
- package/dest/wrappers/fetch.d.ts.map +1 -1
- package/dest/wrappers/fetch.js +7 -5
- package/dest/wrappers/index.d.ts +1 -1
- package/dest/wrappers/json_rpc_server.d.ts +2 -2
- package/dest/wrappers/json_rpc_server.d.ts.map +1 -1
- package/dest/wrappers/l2_block_stream.d.ts +4 -3
- package/dest/wrappers/l2_block_stream.d.ts.map +1 -1
- package/dest/wrappers/l2_block_stream.js +385 -11
- package/package.json +21 -15
- package/src/attributes.ts +42 -11
- package/src/bench.ts +37 -15
- package/src/config.ts +54 -2
- package/src/index.ts +1 -0
- package/src/l1_metrics.ts +65 -0
- package/src/lmdb_metrics.ts +24 -24
- package/src/metric-utils.ts +75 -0
- package/src/metrics.ts +1313 -145
- package/src/nodejs_metrics_monitor.ts +135 -0
- package/src/noop.ts +65 -4
- package/src/otel.ts +155 -26
- package/src/otel_filter_metric_exporter.ts +47 -5
- package/src/otel_resource.ts +57 -2
- package/src/prom_otel_adapter.ts +195 -70
- package/src/start.ts +12 -8
- package/src/telemetry.ts +153 -76
- package/src/vendor/otel-pino-stream.ts +1 -4
- package/src/wrappers/fetch.ts +24 -31
- package/src/wrappers/json_rpc_server.ts +1 -1
- package/src/wrappers/l2_block_stream.ts +6 -2
- package/dest/event_loop_monitor.d.ts +0 -18
- package/dest/event_loop_monitor.d.ts.map +0 -1
- package/dest/event_loop_monitor.js +0 -93
- 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
|
|
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:
|
|
17
|
+
startActiveSpan<F extends (...args: any[]) => any>(_name: string, ...args: unknown[]): ReturnType<F>;
|
|
13
18
|
}
|
|
14
|
-
//# sourceMappingURL=
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25vb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFvQixLQUFLLE1BQU0sRUFBbUIsTUFBTSxvQkFBb0IsQ0FBQztBQUc3RyxPQUFPLEtBQUssRUFHVixLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGdCQUFnQixDQUFDO0FBeUN4QixxQkFBYSxtQkFBb0IsWUFBVyxlQUFlO0lBQ3pELE9BQU8sQ0FBQyxLQUFLLENBQW1CO0lBRWhDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUc7SUFDeEQsNkJBQTZCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBRztJQUV4RCxRQUFRLElBQUksS0FBSyxDQUVoQjtJQUVELFNBQVMsSUFBSSxNQUFNLENBRWxCO0lBRUQsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFcEI7SUFFRCxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUVyQjtJQUVELFNBQVMsWUFFUjtJQUVELGVBQWUsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUVwQztJQUVELHdCQUF3QixDQUFDLGFBQWEsRUFBRSxNQUFNLEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FFbkU7Q0FDRjtBQUtELHFCQUFhLFVBQVcsWUFBVyxNQUFNO0lBQ3ZDLFNBQVMsSUFBSSxJQUFJLENBRWhCO0lBRUQsZUFBZSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FJbkc7Q0FDRiJ9
|
package/dest/noop.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
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
|
|
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
|
|
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 {
|
|
9
|
-
import
|
|
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
|
-
|
|
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
|
-
|
|
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=
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL290ZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixLQUFLLE1BQU0sRUFBcUIsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRixPQUFPLEVBQ0wsS0FBSyxPQUFPLEVBS1osS0FBSyxNQUFNLEVBQ1gsS0FBSyxjQUFjLEVBTXBCLE1BQU0sb0JBQW9CLENBQUM7QUFJNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFHTCxhQUFhLEVBRWIsS0FBSyxvQ0FBb0MsRUFFMUMsTUFBTSw0QkFBNEIsQ0FBQztBQUlwQyxPQUFPLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQTRCLDhCQUE4QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHNUcsT0FBTyxLQUFLLEVBR1YsS0FBSyxFQUdMLGVBQWUsRUFFaEIsTUFBTSxnQkFBZ0IsQ0FBQztBQXlDeEIsTUFBTSxNQUFNLDBCQUEwQixHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxLQUFLLG1CQUFtQixDQUFDO0FBRW5HLHFCQUFhLG1CQUFvQixZQUFXLGVBQWU7SUFPdkQsT0FBTyxDQUFDLFFBQVE7SUFDaEIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLGNBQWM7SUFDdEIsT0FBTyxDQUFDLG9CQUFvQjtJQUM1QixPQUFPLENBQUMsR0FBRztJQVhiLFdBQVcsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQ3JDLG9CQUFvQixFQUFFLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztJQUN2RCxPQUFPLENBQUMsTUFBTSxDQUE4RDtJQUM1RSxPQUFPLENBQUMsT0FBTyxDQUFrRDtJQUVqRSxTQUFTLGFBQ0MsUUFBUSxFQUFFLFNBQVMsRUFDbkIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsYUFBYSxFQUFFLGNBQWMsRUFDN0IsY0FBYyxFQUFFLGNBQWMsR0FBRyxTQUFTLEVBQzFDLG9CQUFvQixFQUFFLDhCQUE4QixHQUFHLFNBQVMsRUFDaEUsR0FBRyxFQUFFLE1BQU0sRUFDakI7SUFFSiwwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUVsRDtJQUVELDZCQUE2QixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBRW5EO0lBRUQsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsS0FBSyxDQVE1QjtJQUVELFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FPOUI7SUFFTSxLQUFLLFNBOEJYO0lBRU0sU0FBUyxZQUVmO0lBRVksS0FBSyxrQkFNakI7SUFFWSxJQUFJLGtCQWdCaEI7SUFFTSxlQUFlLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FJM0M7SUFFTSx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FLN0Q7SUFFRCxPQUFjLG1CQUFtQixDQUMvQixRQUFRLEVBQUUsU0FBUyxFQUNuQixTQUFTLEVBQUUsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLEdBQ3JELGFBQWEsQ0ErSGY7SUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtJQWlFckMsT0FBYyxjQUFjLENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxNQUFNLEdBQUcsbUJBQW1CLENBUTVGO0NBQ0YifQ==
|
package/dest/otel.d.ts.map
CHANGED
|
@@ -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,
|
|
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 {
|
|
10
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
6
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
4
|
-
|
|
5
|
+
metricPrefix;
|
|
6
|
+
filter;
|
|
7
|
+
constructor(exporter, metricPrefix, filter = 'deny'){
|
|
5
8
|
this.exporter = exporter;
|
|
6
|
-
this.
|
|
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)
|
|
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=
|
|
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=
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbF9wcm9wYWdhdGlvbi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL290ZWxfcHJvcGFnYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFVM0Isd0JBQWdCLG1DQUFtQyxDQUNqRCxLQUFLLFNBQWtCLEdBQ3RCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FvQ2hFIn0=
|
package/dest/otel_resource.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { type IResource } from '@opentelemetry/resources';
|
|
2
2
|
export declare function getOtelResource(): IResource;
|
|
3
|
-
//# sourceMappingURL=
|
|
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,
|
|
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"}
|