@aztec/telemetry-client 0.0.0-test.0 → 0.0.1-commit.03f7ef2
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 +32 -9
- package/dest/attributes.d.ts.map +1 -1
- package/dest/attributes.js +21 -8
- package/dest/bench.d.ts +4 -1
- package/dest/bench.d.ts.map +1 -1
- package/dest/bench.js +7 -0
- 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 +70 -0
- package/dest/lmdb_metrics.d.ts +4 -2
- package/dest/lmdb_metrics.d.ts.map +1 -1
- package/dest/lmdb_metrics.js +8 -0
- package/dest/metrics.d.ts +115 -13
- package/dest/metrics.d.ts.map +1 -1
- package/dest/metrics.js +116 -13
- package/dest/nodejs_metrics_monitor.d.ts +21 -0
- package/dest/nodejs_metrics_monitor.d.ts.map +1 -0
- package/dest/{event_loop_monitor.js → nodejs_metrics_monitor.js} +55 -12
- package/dest/noop.d.ts +4 -2
- package/dest/noop.d.ts.map +1 -1
- package/dest/noop.js +2 -0
- package/dest/otel.d.ts +9 -5
- package/dest/otel.d.ts.map +1 -1
- package/dest/otel.js +93 -19
- 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 +31 -2
- package/dest/prom_otel_adapter.d.ts +58 -9
- package/dest/prom_otel_adapter.d.ts.map +1 -1
- package/dest/prom_otel_adapter.js +143 -43
- package/dest/start.d.ts +2 -2
- package/dest/start.d.ts.map +1 -1
- package/dest/start.js +7 -6
- package/dest/telemetry.d.ts +29 -12
- package/dest/telemetry.d.ts.map +1 -1
- package/dest/telemetry.js +1 -1
- 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/package.json +21 -15
- package/src/attributes.ts +40 -11
- package/src/bench.ts +15 -5
- package/src/config.ts +54 -2
- package/src/index.ts +1 -0
- package/src/l1_metrics.ts +80 -0
- package/src/lmdb_metrics.ts +24 -3
- package/src/metrics.ts +140 -12
- package/src/{event_loop_monitor.ts → nodejs_metrics_monitor.ts} +59 -10
- package/src/noop.ts +4 -1
- package/src/otel.ts +80 -21
- package/src/otel_filter_metric_exporter.ts +47 -5
- package/src/otel_resource.ts +40 -2
- package/src/prom_otel_adapter.ts +191 -59
- package/src/start.ts +7 -6
- package/src/telemetry.ts +50 -12
- 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 +3 -2
- package/dest/event_loop_monitor.d.ts +0 -18
- package/dest/event_loop_monitor.d.ts.map +0 -1
|
@@ -4,9 +4,12 @@ import * as Metrics from './metrics.js';
|
|
|
4
4
|
import { ValueType } from './telemetry.js';
|
|
5
5
|
/**
|
|
6
6
|
* Detector for custom Aztec attributes
|
|
7
|
-
*/ export class
|
|
7
|
+
*/ export class NodejsMetricsMonitor {
|
|
8
8
|
meter;
|
|
9
9
|
eventLoopDelayGauges;
|
|
10
|
+
// skip `rss` because that's already tracked by @opentelemetry/host-metrics
|
|
11
|
+
// description of each field here https://nodejs.org/api/process.html#processmemoryusage
|
|
12
|
+
memoryGauges;
|
|
10
13
|
eventLoopUilization;
|
|
11
14
|
eventLoopTime;
|
|
12
15
|
started;
|
|
@@ -16,6 +19,17 @@ import { ValueType } from './telemetry.js';
|
|
|
16
19
|
this.meter = meter;
|
|
17
20
|
this.started = false;
|
|
18
21
|
this.measure = (obs)=>{
|
|
22
|
+
this.measureMemoryUsage(obs);
|
|
23
|
+
this.measureEventLoopDelay(obs);
|
|
24
|
+
};
|
|
25
|
+
this.measureMemoryUsage = (observer)=>{
|
|
26
|
+
const mem = process.memoryUsage();
|
|
27
|
+
observer.observe(this.memoryGauges.heapUsed, mem.heapUsed);
|
|
28
|
+
observer.observe(this.memoryGauges.heapTotal, mem.heapTotal);
|
|
29
|
+
observer.observe(this.memoryGauges.arrayBuffers, mem.arrayBuffers);
|
|
30
|
+
observer.observe(this.memoryGauges.external, mem.external);
|
|
31
|
+
};
|
|
32
|
+
this.measureEventLoopDelay = (obs)=>{
|
|
19
33
|
const newELU = performance.eventLoopUtilization();
|
|
20
34
|
const delta = performance.eventLoopUtilization(newELU, this.lastELU);
|
|
21
35
|
this.lastELU = newELU;
|
|
@@ -26,19 +40,19 @@ import { ValueType } from './telemetry.js';
|
|
|
26
40
|
// - https://nodesource.com/blog/event-loop-utilization-nodejs
|
|
27
41
|
// - https://youtu.be/WetXnEPraYM
|
|
28
42
|
obs.observe(this.eventLoopUilization, delta.utilization);
|
|
29
|
-
this.eventLoopTime.add(Math.
|
|
43
|
+
this.eventLoopTime.add(Math.trunc(delta.idle), {
|
|
30
44
|
[Attributes.NODEJS_EVENT_LOOP_STATE]: 'idle'
|
|
31
45
|
});
|
|
32
|
-
this.eventLoopTime.add(Math.
|
|
46
|
+
this.eventLoopTime.add(Math.trunc(delta.active), {
|
|
33
47
|
[Attributes.NODEJS_EVENT_LOOP_STATE]: 'active'
|
|
34
48
|
});
|
|
35
|
-
obs
|
|
36
|
-
obs
|
|
37
|
-
obs
|
|
38
|
-
obs
|
|
39
|
-
obs
|
|
40
|
-
obs
|
|
41
|
-
obs
|
|
49
|
+
safeObserveInt(obs, this.eventLoopDelayGauges.min, this.eventLoopDelay.min);
|
|
50
|
+
safeObserveInt(obs, this.eventLoopDelayGauges.mean, this.eventLoopDelay.mean);
|
|
51
|
+
safeObserveInt(obs, this.eventLoopDelayGauges.max, this.eventLoopDelay.max);
|
|
52
|
+
safeObserveInt(obs, this.eventLoopDelayGauges.stddev, this.eventLoopDelay.stddev);
|
|
53
|
+
safeObserveInt(obs, this.eventLoopDelayGauges.p50, this.eventLoopDelay.percentile(50));
|
|
54
|
+
safeObserveInt(obs, this.eventLoopDelayGauges.p90, this.eventLoopDelay.percentile(90));
|
|
55
|
+
safeObserveInt(obs, this.eventLoopDelayGauges.p99, this.eventLoopDelay.percentile(99));
|
|
42
56
|
this.eventLoopDelay.reset();
|
|
43
57
|
};
|
|
44
58
|
const nsObsGauge = (name, description)=>meter.createObservableGauge(name, {
|
|
@@ -65,6 +79,24 @@ import { ValueType } from './telemetry.js';
|
|
|
65
79
|
description: 'How much time the event loop has spent in a given state'
|
|
66
80
|
});
|
|
67
81
|
this.eventLoopDelay = monitorEventLoopDelay();
|
|
82
|
+
this.memoryGauges = {
|
|
83
|
+
heapUsed: meter.createObservableGauge(Metrics.NODEJS_MEMORY_HEAP_USAGE, {
|
|
84
|
+
unit: 'By',
|
|
85
|
+
description: 'Memory used by the V8 heap'
|
|
86
|
+
}),
|
|
87
|
+
heapTotal: meter.createObservableGauge(Metrics.NODEJS_MEMORY_HEAP_TOTAL, {
|
|
88
|
+
unit: 'By',
|
|
89
|
+
description: 'The max size the V8 heap can grow to'
|
|
90
|
+
}),
|
|
91
|
+
arrayBuffers: meter.createObservableGauge(Metrics.NODEJS_MEMORY_BUFFER_USAGE, {
|
|
92
|
+
unit: 'By',
|
|
93
|
+
description: 'Memory allocated for buffers (includes native memory used)'
|
|
94
|
+
}),
|
|
95
|
+
external: meter.createObservableGauge(Metrics.NODEJS_MEMORY_NATIVE_USAGE, {
|
|
96
|
+
unit: 'By',
|
|
97
|
+
description: 'Memory allocated for native C++ objects'
|
|
98
|
+
})
|
|
99
|
+
};
|
|
68
100
|
}
|
|
69
101
|
start() {
|
|
70
102
|
if (this.started) {
|
|
@@ -74,7 +106,8 @@ import { ValueType } from './telemetry.js';
|
|
|
74
106
|
this.eventLoopDelay.enable();
|
|
75
107
|
this.meter.addBatchObservableCallback(this.measure, [
|
|
76
108
|
this.eventLoopUilization,
|
|
77
|
-
...Object.values(this.eventLoopDelayGauges)
|
|
109
|
+
...Object.values(this.eventLoopDelayGauges),
|
|
110
|
+
...Object.values(this.memoryGauges)
|
|
78
111
|
]);
|
|
79
112
|
}
|
|
80
113
|
stop() {
|
|
@@ -83,11 +116,21 @@ import { ValueType } from './telemetry.js';
|
|
|
83
116
|
}
|
|
84
117
|
this.meter.removeBatchObservableCallback(this.measure, [
|
|
85
118
|
this.eventLoopUilization,
|
|
86
|
-
...Object.values(this.eventLoopDelayGauges)
|
|
119
|
+
...Object.values(this.eventLoopDelayGauges),
|
|
120
|
+
...Object.values(this.memoryGauges)
|
|
87
121
|
]);
|
|
88
122
|
this.eventLoopDelay.disable();
|
|
89
123
|
this.eventLoopDelay.reset();
|
|
90
124
|
this.lastELU = undefined;
|
|
91
125
|
}
|
|
92
126
|
measure;
|
|
127
|
+
measureMemoryUsage;
|
|
128
|
+
measureEventLoopDelay;
|
|
129
|
+
}
|
|
130
|
+
function safeObserveInt(observer, metric, value, attrs) {
|
|
131
|
+
// discard NaN, Infinity, -Infinity
|
|
132
|
+
if (!Number.isFinite(value)) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
observer.observe(metric, Math.trunc(value), attrs);
|
|
93
136
|
}
|
package/dest/noop.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type Meter, type Span, type Tracer } from '@opentelemetry/api';
|
|
2
2
|
import type { TelemetryClient } from './telemetry.js';
|
|
3
3
|
export declare class NoopTelemetryClient implements TelemetryClient {
|
|
4
|
+
setExportedPublicTelemetry(_prefixes: string[]): void;
|
|
5
|
+
setPublicTelemetryCollectFrom(_roles: string[]): void;
|
|
4
6
|
getMeter(): Meter;
|
|
5
7
|
getTracer(): Tracer;
|
|
6
8
|
stop(): Promise<void>;
|
|
@@ -9,6 +11,6 @@ export declare class NoopTelemetryClient implements TelemetryClient {
|
|
|
9
11
|
}
|
|
10
12
|
export declare class NoopTracer implements Tracer {
|
|
11
13
|
startSpan(): Span;
|
|
12
|
-
startActiveSpan<F extends (...args: any[]) => any>(_name: string, ...args:
|
|
14
|
+
startActiveSpan<F extends (...args: any[]) => any>(_name: string, ...args: unknown[]): ReturnType<F>;
|
|
13
15
|
}
|
|
14
|
-
//# sourceMappingURL=
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25vb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssS0FBSyxFQUFFLEtBQUssSUFBSSxFQUFvQixLQUFLLE1BQU0sRUFBbUIsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRyxPQUFPLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxxQkFBYSxtQkFBb0IsWUFBVyxlQUFlO0lBQ3pELDBCQUEwQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUc7SUFDeEQsNkJBQTZCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBRztJQUV4RCxRQUFRLElBQUksS0FBSyxDQUVoQjtJQUVELFNBQVMsSUFBSSxNQUFNLENBRWxCO0lBRUQsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFcEI7SUFFRCxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUVyQjtJQUVELFNBQVMsWUFFUjtDQUNGO0FBS0QscUJBQWEsVUFBVyxZQUFXLE1BQU07SUFDdkMsU0FBUyxJQUFJLElBQUksQ0FFaEI7SUFFRCxlQUFlLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUluRztDQUNGIn0=
|
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,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;
|
|
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,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;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
package/dest/otel.d.ts
CHANGED
|
@@ -5,7 +5,8 @@ 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 {
|
|
8
|
+
import { NodejsMetricsMonitor } from './nodejs_metrics_monitor.js';
|
|
9
|
+
import { PublicOtelFilterMetricExporter } from './otel_filter_metric_exporter.js';
|
|
9
10
|
import type { TelemetryClient } from './telemetry.js';
|
|
10
11
|
export type OpenTelemetryClientFactory = (resource: IResource, log: Logger) => OpenTelemetryClient;
|
|
11
12
|
export declare class OpenTelemetryClient implements TelemetryClient {
|
|
@@ -13,20 +14,23 @@ export declare class OpenTelemetryClient implements TelemetryClient {
|
|
|
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
|
-
static createMeterProvider(resource: IResource,
|
|
32
|
+
static createMeterProvider(resource: IResource, exporters: Array<PeriodicExportingMetricReaderOptions>): MeterProvider;
|
|
29
33
|
private static getCustomClientFactory;
|
|
30
34
|
static createAndStart(config: TelemetryClientConfig, log: Logger): OpenTelemetryClient;
|
|
31
35
|
}
|
|
32
|
-
//# sourceMappingURL=
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL290ZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixLQUFLLE1BQU0sRUFBcUIsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRixPQUFPLEVBR0wsS0FBSyxLQUFLLEVBQ1YsS0FBSyxNQUFNLEVBQ1gsS0FBSyxjQUFjLEVBS3BCLE1BQU0sb0JBQW9CLENBQUM7QUFHNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFHTCxhQUFhLEVBRWIsS0FBSyxvQ0FBb0MsRUFFMUMsTUFBTSw0QkFBNEIsQ0FBQztBQUlwQyxPQUFPLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQTRCLDhCQUE4QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHNUcsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsTUFBTSxNQUFNLDBCQUEwQixHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxLQUFLLG1CQUFtQixDQUFDO0FBRW5HLHFCQUFhLG1CQUFvQixZQUFXLGVBQWU7SUFPdkQsT0FBTyxDQUFDLFFBQVE7SUFDaEIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLGNBQWM7SUFDdEIsT0FBTyxDQUFDLG9CQUFvQjtJQUM1QixPQUFPLENBQUMsR0FBRztJQVhiLFdBQVcsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQ3JDLG9CQUFvQixFQUFFLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztJQUN2RCxPQUFPLENBQUMsTUFBTSxDQUFnRDtJQUM5RCxPQUFPLENBQUMsT0FBTyxDQUFrRDtJQUVqRSxTQUFTLGFBQ0MsUUFBUSxFQUFFLFNBQVMsRUFDbkIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsYUFBYSxFQUFFLGNBQWMsRUFDN0IsY0FBYyxFQUFFLGNBQWMsR0FBRyxTQUFTLEVBQzFDLG9CQUFvQixFQUFFLDhCQUE4QixHQUFHLFNBQVMsRUFDaEUsR0FBRyxFQUFFLE1BQU0sRUFDakI7SUFFSiwwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUVsRDtJQUVELDZCQUE2QixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBRW5EO0lBRUQsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsS0FBSyxDQU81QjtJQUVELFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FPOUI7SUFFTSxLQUFLLFNBNkJYO0lBRU0sU0FBUyxZQUVmO0lBRVksS0FBSyxrQkFNakI7SUFFWSxJQUFJLGtCQWdCaEI7SUFFRCxPQUFjLG1CQUFtQixDQUMvQixRQUFRLEVBQUUsU0FBUyxFQUNuQixTQUFTLEVBQUUsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLEdBQ3JELGFBQWEsQ0ErSGY7SUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtJQStEckMsT0FBYyxjQUFjLENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxNQUFNLEdBQUcsbUJBQW1CLENBUTVGO0NBQ0YifQ==
|
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,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,
|
|
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,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAA4B,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAG5G,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,oBAAoB;IAC5B,OAAO,CAAC,GAAG;IAXb,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,oBAAoB,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACvD,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,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,CAO5B;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO9B;IAEM,KAAK,SA6BX;IAEM,SAAS,YAEf;IAEY,KAAK,kBAMjB;IAEY,IAAI,kBAgBhB;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;IA+DrC,OAAc,cAAc,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAQ5F;CACF"}
|
package/dest/otel.js
CHANGED
|
@@ -6,8 +6,8 @@ import { HostMetrics } from '@opentelemetry/host-metrics';
|
|
|
6
6
|
import { ExplicitBucketHistogramAggregation, InstrumentType, MeterProvider, PeriodicExportingMetricReader, View } from '@opentelemetry/sdk-metrics';
|
|
7
7
|
import { BatchSpanProcessor, NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
|
|
8
8
|
import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
|
|
9
|
-
import {
|
|
10
|
-
import { OtelFilterMetricExporter } from './otel_filter_metric_exporter.js';
|
|
9
|
+
import { NodejsMetricsMonitor } from './nodejs_metrics_monitor.js';
|
|
10
|
+
import { OtelFilterMetricExporter, PublicOtelFilterMetricExporter } from './otel_filter_metric_exporter.js';
|
|
11
11
|
import { registerOtelLoggerProvider } from './otel_logger_provider.js';
|
|
12
12
|
import { getOtelResource } from './otel_resource.js';
|
|
13
13
|
export class OpenTelemetryClient {
|
|
@@ -15,20 +15,28 @@ export class OpenTelemetryClient {
|
|
|
15
15
|
meterProvider;
|
|
16
16
|
traceProvider;
|
|
17
17
|
loggerProvider;
|
|
18
|
+
publicMetricExporter;
|
|
18
19
|
log;
|
|
19
20
|
hostMetrics;
|
|
20
|
-
|
|
21
|
+
nodejsMetricsMonitor;
|
|
21
22
|
meters;
|
|
22
23
|
tracers;
|
|
23
|
-
constructor(resource, meterProvider, traceProvider, loggerProvider, log){
|
|
24
|
+
constructor(resource, meterProvider, traceProvider, loggerProvider, publicMetricExporter, log){
|
|
24
25
|
this.resource = resource;
|
|
25
26
|
this.meterProvider = meterProvider;
|
|
26
27
|
this.traceProvider = traceProvider;
|
|
27
28
|
this.loggerProvider = loggerProvider;
|
|
29
|
+
this.publicMetricExporter = publicMetricExporter;
|
|
28
30
|
this.log = log;
|
|
29
31
|
this.meters = new Map();
|
|
30
32
|
this.tracers = new Map();
|
|
31
33
|
}
|
|
34
|
+
setExportedPublicTelemetry(metrics) {
|
|
35
|
+
this.publicMetricExporter?.setMetricPrefixes(metrics);
|
|
36
|
+
}
|
|
37
|
+
setPublicTelemetryCollectFrom(roles) {
|
|
38
|
+
this.publicMetricExporter?.setAllowedRoles(roles);
|
|
39
|
+
}
|
|
32
40
|
getMeter(name) {
|
|
33
41
|
let meter = this.meters.get(name);
|
|
34
42
|
if (!meter) {
|
|
@@ -63,9 +71,9 @@ export class OpenTelemetryClient {
|
|
|
63
71
|
name: this.resource.attributes[ATTR_SERVICE_NAME],
|
|
64
72
|
meterProvider: this.meterProvider
|
|
65
73
|
});
|
|
66
|
-
this.
|
|
74
|
+
this.nodejsMetricsMonitor = new NodejsMetricsMonitor(this.meterProvider.getMeter(this.resource.attributes[ATTR_SERVICE_NAME]));
|
|
67
75
|
this.hostMetrics.start();
|
|
68
|
-
this.
|
|
76
|
+
this.nodejsMetricsMonitor.start();
|
|
69
77
|
}
|
|
70
78
|
isEnabled() {
|
|
71
79
|
return true;
|
|
@@ -78,7 +86,7 @@ export class OpenTelemetryClient {
|
|
|
78
86
|
]);
|
|
79
87
|
}
|
|
80
88
|
async stop() {
|
|
81
|
-
this.
|
|
89
|
+
this.nodejsMetricsMonitor?.stop();
|
|
82
90
|
const flushAndShutdown = async (provider)=>{
|
|
83
91
|
if (!provider) {
|
|
84
92
|
return;
|
|
@@ -92,14 +100,47 @@ export class OpenTelemetryClient {
|
|
|
92
100
|
this.traceProvider instanceof NodeTracerProvider ? flushAndShutdown(this.traceProvider) : Promise.resolve()
|
|
93
101
|
]);
|
|
94
102
|
}
|
|
95
|
-
static createMeterProvider(resource,
|
|
103
|
+
static createMeterProvider(resource, exporters) {
|
|
96
104
|
return new MeterProvider({
|
|
97
105
|
resource,
|
|
98
|
-
readers: options
|
|
99
|
-
new PeriodicExportingMetricReader(options)
|
|
100
|
-
] : [],
|
|
106
|
+
readers: exporters.map((options)=>new PeriodicExportingMetricReader(options)),
|
|
101
107
|
views: [
|
|
102
108
|
// Every histogram matching the selector (type + unit) gets these custom buckets assigned
|
|
109
|
+
new View({
|
|
110
|
+
instrumentType: InstrumentType.HISTOGRAM,
|
|
111
|
+
instrumentUnit: 'Mmana',
|
|
112
|
+
aggregation: new ExplicitBucketHistogramAggregation([
|
|
113
|
+
0.1,
|
|
114
|
+
0.5,
|
|
115
|
+
1,
|
|
116
|
+
2,
|
|
117
|
+
4,
|
|
118
|
+
8,
|
|
119
|
+
10,
|
|
120
|
+
25,
|
|
121
|
+
50,
|
|
122
|
+
100,
|
|
123
|
+
500,
|
|
124
|
+
1000,
|
|
125
|
+
5000,
|
|
126
|
+
10000
|
|
127
|
+
], true)
|
|
128
|
+
}),
|
|
129
|
+
new View({
|
|
130
|
+
instrumentType: InstrumentType.HISTOGRAM,
|
|
131
|
+
instrumentUnit: 'tx',
|
|
132
|
+
aggregation: new ExplicitBucketHistogramAggregation(// TPS
|
|
133
|
+
[
|
|
134
|
+
0.1 * 36,
|
|
135
|
+
0.2 * 36,
|
|
136
|
+
0.5 * 36,
|
|
137
|
+
1 * 36,
|
|
138
|
+
2 * 36,
|
|
139
|
+
5 * 36,
|
|
140
|
+
10 * 36,
|
|
141
|
+
15 * 36
|
|
142
|
+
].map(Math.ceil), true)
|
|
143
|
+
}),
|
|
103
144
|
new View({
|
|
104
145
|
instrumentType: InstrumentType.HISTOGRAM,
|
|
105
146
|
instrumentUnit: 's',
|
|
@@ -298,15 +339,48 @@ export class OpenTelemetryClient {
|
|
|
298
339
|
] : []
|
|
299
340
|
});
|
|
300
341
|
tracerProvider.register();
|
|
301
|
-
const
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
342
|
+
const exporters = [];
|
|
343
|
+
if (config.metricsCollectorUrl) {
|
|
344
|
+
// Default to a blacklist that is empty (allow all metrics)
|
|
345
|
+
let filter = [];
|
|
346
|
+
let mode = 'deny';
|
|
347
|
+
if (config.otelExcludeMetrics.length > 0) {
|
|
348
|
+
// Implement a blacklist as specified in config
|
|
349
|
+
log.info(`Excluding metrics from export: ${config.otelExcludeMetrics}`);
|
|
350
|
+
filter = config.otelExcludeMetrics;
|
|
351
|
+
mode = 'deny';
|
|
352
|
+
} else if (config.otelIncludeMetrics.length > 0) {
|
|
353
|
+
// Implement a whitelist as specified in config
|
|
354
|
+
log.info(`Including only specified metrics for export: ${config.otelIncludeMetrics}`);
|
|
355
|
+
filter = config.otelIncludeMetrics;
|
|
356
|
+
mode = 'allow';
|
|
357
|
+
}
|
|
358
|
+
exporters.push({
|
|
359
|
+
exporter: new OtelFilterMetricExporter(new OTLPMetricExporter({
|
|
360
|
+
url: config.metricsCollectorUrl.href
|
|
361
|
+
}), filter, mode),
|
|
362
|
+
exportTimeoutMillis: config.otelExportTimeoutMs,
|
|
363
|
+
exportIntervalMillis: config.otelCollectIntervalMs
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
let publicExporter;
|
|
367
|
+
if (config.publicMetricsCollectorUrl && !config.publicMetricsOptOut) {
|
|
368
|
+
log.info(`Exporting public metrics: ${config.publicIncludeMetrics}`, {
|
|
369
|
+
publicMetrics: config.publicIncludeMetrics,
|
|
370
|
+
collectorUrl: config.publicMetricsCollectorUrl
|
|
371
|
+
});
|
|
372
|
+
publicExporter = new PublicOtelFilterMetricExporter(config.publicMetricsCollectFrom, new OTLPMetricExporter({
|
|
373
|
+
url: config.publicMetricsCollectorUrl.href
|
|
374
|
+
}), config.publicIncludeMetrics);
|
|
375
|
+
exporters.push({
|
|
376
|
+
exporter: publicExporter,
|
|
377
|
+
exportTimeoutMillis: config.otelExportTimeoutMs,
|
|
378
|
+
exportIntervalMillis: config.otelCollectIntervalMs
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
const meterProvider = OpenTelemetryClient.createMeterProvider(resource, exporters);
|
|
308
382
|
const loggerProvider = registerOtelLoggerProvider(resource, config.logsCollectorUrl);
|
|
309
|
-
return new OpenTelemetryClient(resource, meterProvider, tracerProvider, loggerProvider, log);
|
|
383
|
+
return new OpenTelemetryClient(resource, meterProvider, tracerProvider, loggerProvider, publicExporter, log);
|
|
310
384
|
};
|
|
311
385
|
}
|
|
312
386
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbF9yZXNvdXJjZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL290ZWxfcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLEtBQUssU0FBUyxFQU1mLE1BQU0sMEJBQTBCLENBQUM7QUFLbEMsd0JBQWdCLGVBQWUsSUFBSSxTQUFTLENBZTNDIn0=
|
|
@@ -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;AAKlC,wBAAgB,eAAe,IAAI,SAAS,CAe3C"}
|
package/dest/otel_resource.js
CHANGED
|
@@ -1,12 +1,41 @@
|
|
|
1
|
-
import { detectResourcesSync, envDetectorSync, osDetectorSync,
|
|
1
|
+
import { Resource, detectResourcesSync, envDetectorSync, osDetectorSync, serviceInstanceIdDetectorSync } from '@opentelemetry/resources';
|
|
2
|
+
import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
|
|
3
|
+
import { AZTEC_NODE_ROLE, AZTEC_REGISTRY_ADDRESS, AZTEC_ROLLUP_ADDRESS, AZTEC_ROLLUP_VERSION } from './attributes.js';
|
|
2
4
|
export function getOtelResource() {
|
|
3
5
|
const resource = detectResourcesSync({
|
|
4
6
|
detectors: [
|
|
7
|
+
aztecNetworkDetectorSync,
|
|
5
8
|
osDetectorSync,
|
|
6
9
|
envDetectorSync,
|
|
7
|
-
|
|
10
|
+
// this detector is disabled because:
|
|
11
|
+
// 1. our software runs in a docker container, a lot of the attributes detected would be identical across different machines (e.g. all run node v22, executing the same script, running PID 1, etc)
|
|
12
|
+
// 2. it catures process.argv which could contain sensitive values in plain text (e.g. validator private keys)
|
|
13
|
+
// processDetectorSync,
|
|
8
14
|
serviceInstanceIdDetectorSync
|
|
9
15
|
]
|
|
10
16
|
});
|
|
11
17
|
return resource;
|
|
12
18
|
}
|
|
19
|
+
const aztecNetworkDetectorSync = {
|
|
20
|
+
detect () {
|
|
21
|
+
let role;
|
|
22
|
+
if (process.argv.includes('--sequencer')) {
|
|
23
|
+
role = 'sequencer';
|
|
24
|
+
} else if (process.argv.includes('--prover-node')) {
|
|
25
|
+
role = 'prover-node';
|
|
26
|
+
} else if (process.argv.includes('--node')) {
|
|
27
|
+
role = 'node';
|
|
28
|
+
} else if (process.argv.includes('--p2p-bootstrap')) {
|
|
29
|
+
role = 'bootnode';
|
|
30
|
+
}
|
|
31
|
+
const aztecAttributes = {
|
|
32
|
+
// this gets overwritten by OTEL_RESOURCE_ATTRIBUTES (if set)
|
|
33
|
+
[SEMRESATTRS_SERVICE_NAME]: role ? `aztec-${role}` : undefined,
|
|
34
|
+
[AZTEC_NODE_ROLE]: role,
|
|
35
|
+
[AZTEC_ROLLUP_VERSION]: process.env.ROLLUP_VERSION ?? 'canonical',
|
|
36
|
+
[AZTEC_ROLLUP_ADDRESS]: process.env.ROLLUP_CONTRACT_ADDRESS,
|
|
37
|
+
[AZTEC_REGISTRY_ADDRESS]: process.env.REGISTRY_CONTRACT_ADDRESS
|
|
38
|
+
};
|
|
39
|
+
return new Resource(aztecAttributes);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
@@ -97,18 +97,67 @@ export declare class OtelGauge<Labels extends LabelsGeneric = NoLabels> implemen
|
|
|
97
97
|
* Resets the gauge to initial state
|
|
98
98
|
*/
|
|
99
99
|
reset(): void;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Implementation of a Histogram collector
|
|
103
|
+
*/
|
|
104
|
+
export declare class OtelHistogram<Labels extends LabelsGeneric = NoLabels> implements IHistogram<Labels> {
|
|
105
|
+
private logger;
|
|
106
|
+
private labelNames;
|
|
107
|
+
private histogram;
|
|
108
|
+
constructor(logger: Logger, meter: Meter, name: string, help: string, buckets?: number[], labelNames?: Array<keyof Labels>);
|
|
109
|
+
/**
|
|
110
|
+
* Starts a timer and returns a function that when called will record the time elapsed
|
|
111
|
+
* @param labels - Optional labels for the observation
|
|
112
|
+
*/
|
|
113
|
+
startTimer(labels?: Labels): () => void;
|
|
114
|
+
/**
|
|
115
|
+
* Observes a value
|
|
116
|
+
* @param value - Value to observe
|
|
117
|
+
*/
|
|
118
|
+
observe(value: number): void;
|
|
119
|
+
/**
|
|
120
|
+
* Observes a value with labels
|
|
121
|
+
* @param labels - Labels object
|
|
122
|
+
* @param value - Value to observe
|
|
123
|
+
*/
|
|
124
|
+
observe(labels: Labels, value: number): void;
|
|
125
|
+
reset(): void;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Implementation of an AvgMinMax collector
|
|
129
|
+
*/
|
|
130
|
+
export declare class OtelAvgMinMax<Labels extends LabelsGeneric = NoLabels> implements IAvgMinMax<Labels> {
|
|
131
|
+
private logger;
|
|
132
|
+
private labelNames;
|
|
133
|
+
private gauges;
|
|
134
|
+
private currentValues;
|
|
135
|
+
private labeledValues;
|
|
136
|
+
constructor(logger: Logger, meter: Meter, name: string, help: string, labelNames?: Array<keyof Labels>);
|
|
137
|
+
/**
|
|
138
|
+
* Sets the values for calculating avg, min, max
|
|
139
|
+
* @param values - Array of values
|
|
140
|
+
*/
|
|
141
|
+
set(values: number[]): void;
|
|
100
142
|
/**
|
|
101
|
-
*
|
|
102
|
-
* @param labels - Labels object
|
|
103
|
-
* @
|
|
143
|
+
* Sets the values for calculating avg, min, max with labels
|
|
144
|
+
* @param labels - Labels object
|
|
145
|
+
* @param values - Array of values
|
|
104
146
|
*/
|
|
105
|
-
|
|
147
|
+
set(labels: Labels, values: number[]): void;
|
|
148
|
+
/**
|
|
149
|
+
* Resets all stored values
|
|
150
|
+
*/
|
|
151
|
+
reset(): void;
|
|
106
152
|
/**
|
|
107
|
-
*
|
|
108
|
-
* @param
|
|
109
|
-
* @
|
|
153
|
+
* General function to observe an aggregation
|
|
154
|
+
* @param result - Observer result
|
|
155
|
+
* @param aggregateFn - Function that calculates the aggregation
|
|
110
156
|
*/
|
|
111
|
-
private
|
|
157
|
+
private observeAggregation;
|
|
158
|
+
private observeAvg;
|
|
159
|
+
private observeMin;
|
|
160
|
+
private observeMax;
|
|
112
161
|
}
|
|
113
162
|
/**
|
|
114
163
|
* Otel metrics Adapter
|
|
@@ -124,4 +173,4 @@ export declare class OtelMetricsAdapter extends Registry implements MetricsRegis
|
|
|
124
173
|
avgMinMax<Labels extends LabelsGeneric = NoLabels>(configuration: AvgMinMaxConfig<Labels>): IAvgMinMax<Labels>;
|
|
125
174
|
}
|
|
126
175
|
export {};
|
|
127
|
-
//# sourceMappingURL=
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbV9vdGVsX2FkYXB0ZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm9tX290ZWxfYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQWdCLE1BQU0sdUJBQXVCLENBQUM7QUFHbEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV2QyxPQUFPLEtBQUssRUFBYSxLQUFLLEVBQWdDLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRHOztHQUVHO0FBQ0gsS0FBSyxRQUFRLEdBQUcsTUFBTSxDQUFDO0FBQ3ZCLE1BQU0sTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDO0FBQ2hDLE1BQU0sTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUV4RCxvQkFBWSxhQUFhO0lBQ3ZCLE9BQU8sWUFBWTtJQUNuQixPQUFPLFlBQVk7Q0FDcEI7QUFFRCxLQUFLLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RDLEtBQUssYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3JELEtBQUssU0FBUyxDQUFDLE1BQU0sU0FBUyxhQUFhLElBQUksT0FBTyxDQUFDLE1BQU0sTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdFLFVBQVUsU0FBUyxDQUFDLE1BQU0sU0FBUyxhQUFhO0lBQzlDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7Q0FDaEM7QUFFRCxVQUFVLE1BQU0sQ0FBQyxNQUFNLFNBQVMsYUFBYSxHQUFHLFFBQVE7SUFDdEQsR0FBRyxFQUFFLFFBQVEsU0FBUyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxF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
|