@aztec-labs/telemetry-client 6.0.0-nightly.20260829
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 +143 -0
- package/dest/attributes.d.ts.map +1 -0
- package/dest/attributes.js +91 -0
- package/dest/bench.d.ts +34 -0
- package/dest/bench.d.ts.map +1 -0
- package/dest/bench.js +115 -0
- package/dest/config.d.ts +21 -0
- package/dest/config.d.ts.map +1 -0
- package/dest/config.js +85 -0
- package/dest/index.d.ts +12 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +11 -0
- package/dest/json_rpc_server_metrics.d.ts +27 -0
- package/dest/json_rpc_server_metrics.d.ts.map +1 -0
- package/dest/json_rpc_server_metrics.js +154 -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 +18 -0
- package/dest/lmdb_metrics.d.ts.map +1 -0
- package/dest/lmdb_metrics.js +34 -0
- 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 +338 -0
- package/dest/metrics.d.ts.map +1 -0
- package/dest/metrics.js +1702 -0
- package/dest/monitored_batch_span_processor.d.ts +33 -0
- package/dest/monitored_batch_span_processor.d.ts.map +1 -0
- package/dest/monitored_batch_span_processor.js +111 -0
- 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 +19 -0
- package/dest/noop.d.ts.map +1 -0
- package/dest/noop.js +104 -0
- package/dest/otel.d.ts +43 -0
- package/dest/otel.d.ts.map +1 -0
- package/dest/otel.js +537 -0
- package/dest/otel_filter_metric_exporter.d.ts +20 -0
- package/dest/otel_filter_metric_exporter.d.ts.map +1 -0
- package/dest/otel_filter_metric_exporter.js +67 -0
- package/dest/otel_logger_provider.d.ts +4 -0
- package/dest/otel_logger_provider.d.ts.map +1 -0
- package/dest/otel_logger_provider.js +25 -0
- package/dest/otel_propagation.d.ts +6 -0
- package/dest/otel_propagation.d.ts.map +1 -0
- package/dest/otel_propagation.js +102 -0
- package/dest/otel_resource.d.ts +3 -0
- package/dest/otel_resource.d.ts.map +1 -0
- package/dest/otel_resource.js +53 -0
- package/dest/prom_otel_adapter.d.ts +176 -0
- package/dest/prom_otel_adapter.d.ts.map +1 -0
- package/dest/prom_otel_adapter.js +292 -0
- package/dest/start.d.ts +7 -0
- package/dest/start.d.ts.map +1 -0
- package/dest/start.js +25 -0
- package/dest/telemetry.d.ts +149 -0
- package/dest/telemetry.d.ts.map +1 -0
- package/dest/telemetry.js +139 -0
- package/dest/vendor/attributes.d.ts +6 -0
- package/dest/vendor/attributes.d.ts.map +1 -0
- package/dest/vendor/attributes.js +6 -0
- package/dest/vendor/otel-pino-stream.d.ts +40 -0
- package/dest/vendor/otel-pino-stream.d.ts.map +1 -0
- package/dest/vendor/otel-pino-stream.js +229 -0
- package/dest/with_tracer.d.ts +33 -0
- package/dest/with_tracer.d.ts.map +1 -0
- package/dest/with_tracer.js +32 -0
- package/dest/wrappers/fetch.d.ts +16 -0
- package/dest/wrappers/fetch.d.ts.map +1 -0
- package/dest/wrappers/fetch.js +42 -0
- package/dest/wrappers/index.d.ts +3 -0
- package/dest/wrappers/index.d.ts.map +1 -0
- package/dest/wrappers/index.js +2 -0
- package/dest/wrappers/json_rpc_server.d.ts +4 -0
- package/dest/wrappers/json_rpc_server.d.ts.map +1 -0
- package/dest/wrappers/json_rpc_server.js +16 -0
- package/package.json +95 -0
- package/src/attributes.ts +174 -0
- package/src/bench.ts +168 -0
- package/src/config.ts +135 -0
- package/src/index.ts +11 -0
- package/src/json_rpc_server_metrics.ts +150 -0
- package/src/l1_metrics.ts +64 -0
- package/src/lmdb_metrics.ts +45 -0
- package/src/metric-utils.ts +75 -0
- package/src/metrics.ts +1802 -0
- package/src/monitored_batch_span_processor.ts +147 -0
- package/src/nodejs_metrics_monitor.ts +135 -0
- package/src/noop.ts +152 -0
- package/src/otel.ts +482 -0
- package/src/otel_filter_metric_exporter.ts +80 -0
- package/src/otel_logger_provider.ts +31 -0
- package/src/otel_propagation.ts +107 -0
- package/src/otel_resource.ts +71 -0
- package/src/prom_otel_adapter.ts +450 -0
- package/src/start.ts +42 -0
- package/src/telemetry.ts +348 -0
- package/src/vendor/attributes.ts +6 -0
- package/src/vendor/otel-pino-stream.ts +279 -0
- package/src/with_tracer.ts +35 -0
- package/src/wrappers/fetch.ts +50 -0
- package/src/wrappers/index.ts +2 -0
- package/src/wrappers/json_rpc_server.ts +26 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Timer } from '@aztec-labs/foundation/timer';
|
|
2
|
+
import { ROOT_CONTEXT, SpanKind, SpanStatusCode, propagation } from '@opentelemetry/api';
|
|
3
|
+
import { getJsonRpcServerMetrics, splitJsonRpcMethod } from './json_rpc_server_metrics.js';
|
|
4
|
+
import { getTelemetryClient } from './start.js';
|
|
5
|
+
import { ATTR_JSONRPC_ERROR_CODE, ATTR_JSONRPC_ERROR_MSG, ATTR_JSONRPC_METHOD, ATTR_JSONRPC_REQUEST_ID, ATTR_JSONRPC_SERVICE } from './vendor/attributes.js';
|
|
6
|
+
export function getOtelJsonRpcPropagationMiddleware(scope = 'JsonRpcServer') {
|
|
7
|
+
return function otelJsonRpcPropagation(ctx, next) {
|
|
8
|
+
const tracer = getTelemetryClient().getTracer(scope);
|
|
9
|
+
const context = propagation.extract(ROOT_CONTEXT, ctx.request.headers);
|
|
10
|
+
return tracer.startActiveSpan(`JsonRpcServer`, {
|
|
11
|
+
kind: SpanKind.SERVER
|
|
12
|
+
}, context, async (span)=>{
|
|
13
|
+
if (ctx.id) {
|
|
14
|
+
span.setAttribute(ATTR_JSONRPC_REQUEST_ID, ctx.id);
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
await next();
|
|
18
|
+
const requestBody = ctx.request.body;
|
|
19
|
+
if (requestBody && typeof requestBody === 'object' && !Array.isArray(requestBody) && 'method' in requestBody) {
|
|
20
|
+
const fullMethod = requestBody.method;
|
|
21
|
+
if (typeof fullMethod === 'string') {
|
|
22
|
+
const [service, method] = splitJsonRpcMethod(fullMethod);
|
|
23
|
+
span.updateName(`JsonRpcServer.${service ? `${service}.` : ''}${method}`);
|
|
24
|
+
span.setAttribute(ATTR_JSONRPC_METHOD, method);
|
|
25
|
+
if (service) {
|
|
26
|
+
span.setAttribute(ATTR_JSONRPC_SERVICE, service);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
} else if (Array.isArray(requestBody)) {
|
|
30
|
+
span.updateName(`JsonRpcServer.batch`);
|
|
31
|
+
}
|
|
32
|
+
const err = ctx.body.error?.message;
|
|
33
|
+
const code = ctx.body.error?.code;
|
|
34
|
+
if (err) {
|
|
35
|
+
span.setStatus({
|
|
36
|
+
code: SpanStatusCode.ERROR,
|
|
37
|
+
message: err
|
|
38
|
+
});
|
|
39
|
+
span.setAttribute(ATTR_JSONRPC_ERROR_CODE, code);
|
|
40
|
+
span.setAttribute(ATTR_JSONRPC_ERROR_MSG, err);
|
|
41
|
+
} else {
|
|
42
|
+
span.setStatus({
|
|
43
|
+
code: SpanStatusCode.OK
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
} catch (err) {
|
|
47
|
+
span.setStatus({
|
|
48
|
+
code: SpanStatusCode.ERROR,
|
|
49
|
+
message: String(err)
|
|
50
|
+
});
|
|
51
|
+
} finally{
|
|
52
|
+
span.end();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function getOtelJsonRpcDiagnosticsMiddleware(metricsProvider = getJsonRpcServerMetrics) {
|
|
58
|
+
return function otelJsonRpcDiagnostics(ctx, next) {
|
|
59
|
+
const [service, method] = splitJsonRpcMethod(ctx.method);
|
|
60
|
+
const scope = service ?? 'UnknownHandler';
|
|
61
|
+
const tracer = getTelemetryClient().getTracer(scope);
|
|
62
|
+
const attributes = {
|
|
63
|
+
...service === undefined ? {} : {
|
|
64
|
+
[ATTR_JSONRPC_SERVICE]: service
|
|
65
|
+
},
|
|
66
|
+
[ATTR_JSONRPC_METHOD]: method
|
|
67
|
+
};
|
|
68
|
+
return tracer.startActiveSpan(`${scope}.${method}`, {
|
|
69
|
+
kind: SpanKind.INTERNAL,
|
|
70
|
+
attributes
|
|
71
|
+
}, async (span)=>{
|
|
72
|
+
const timer = new Timer();
|
|
73
|
+
let ok = false;
|
|
74
|
+
if (ctx.id !== null) {
|
|
75
|
+
span.setAttribute(ATTR_JSONRPC_REQUEST_ID, ctx.id);
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
await next();
|
|
79
|
+
ok = true;
|
|
80
|
+
span.setStatus({
|
|
81
|
+
code: SpanStatusCode.OK
|
|
82
|
+
});
|
|
83
|
+
} catch (err) {
|
|
84
|
+
span.setStatus({
|
|
85
|
+
code: SpanStatusCode.ERROR,
|
|
86
|
+
message: err instanceof Error ? err.message : String(err)
|
|
87
|
+
});
|
|
88
|
+
if (typeof err === 'string' || err instanceof Error) {
|
|
89
|
+
span.recordException(err);
|
|
90
|
+
}
|
|
91
|
+
throw err;
|
|
92
|
+
} finally{
|
|
93
|
+
const metrics = metricsProvider();
|
|
94
|
+
metrics.recordRequest(ctx.method, timer.ms(), ok);
|
|
95
|
+
if (ctx.requestValidationDurationMs !== undefined && ctx.requestValidationSucceeded !== undefined) {
|
|
96
|
+
metrics.recordRequestValidation(ctx.method, ctx.requestValidationDurationMs, ctx.requestValidationSucceeded);
|
|
97
|
+
}
|
|
98
|
+
span.end();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type IResource } from '@opentelemetry/resources';
|
|
2
|
+
export declare function getOtelResource(): IResource;
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbF9yZXNvdXJjZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL290ZWxfcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLEtBQUssU0FBUyxFQU1mLE1BQU0sMEJBQTBCLENBQUM7QUFxQmxDLHdCQUFnQixlQUFlLElBQUksU0FBUyxDQWUzQyJ9
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Resource, detectResourcesSync, envDetectorSync, osDetectorSync, serviceInstanceIdDetectorSync } from '@opentelemetry/resources';
|
|
2
|
+
import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
import { dirname, resolve } from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { AZTEC_NODE_ROLE, AZTEC_REGISTRY_ADDRESS, AZTEC_ROLLUP_ADDRESS, AZTEC_ROLLUP_VERSION } from './attributes.js';
|
|
7
|
+
/** Reads the Aztec client version from the release manifest. */ function getAztecVersion() {
|
|
8
|
+
try {
|
|
9
|
+
const releasePleasePath = resolve(dirname(fileURLToPath(import.meta.url)), '../../../.release-please-manifest.json');
|
|
10
|
+
return JSON.parse(readFileSync(releasePleasePath, 'utf-8'))['.'];
|
|
11
|
+
} catch {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function getOtelResource() {
|
|
16
|
+
const resource = detectResourcesSync({
|
|
17
|
+
detectors: [
|
|
18
|
+
aztecNetworkDetectorSync,
|
|
19
|
+
osDetectorSync,
|
|
20
|
+
envDetectorSync,
|
|
21
|
+
// this detector is disabled because:
|
|
22
|
+
// 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)
|
|
23
|
+
// 2. it catures process.argv which could contain sensitive values in plain text (e.g. validator private keys)
|
|
24
|
+
// processDetectorSync,
|
|
25
|
+
serviceInstanceIdDetectorSync
|
|
26
|
+
]
|
|
27
|
+
});
|
|
28
|
+
return resource;
|
|
29
|
+
}
|
|
30
|
+
const aztecNetworkDetectorSync = {
|
|
31
|
+
detect () {
|
|
32
|
+
let role;
|
|
33
|
+
if (process.argv.includes('--sequencer')) {
|
|
34
|
+
role = 'sequencer';
|
|
35
|
+
} else if (process.argv.includes('--prover-node')) {
|
|
36
|
+
role = 'prover-node';
|
|
37
|
+
} else if (process.argv.includes('--node')) {
|
|
38
|
+
role = 'node';
|
|
39
|
+
} else if (process.argv.includes('--p2p-bootstrap')) {
|
|
40
|
+
role = 'bootnode';
|
|
41
|
+
}
|
|
42
|
+
const aztecAttributes = {
|
|
43
|
+
// this gets overwritten by OTEL_RESOURCE_ATTRIBUTES (if set)
|
|
44
|
+
[ATTR_SERVICE_NAME]: role ? `aztec-${role}` : undefined,
|
|
45
|
+
[ATTR_SERVICE_VERSION]: getAztecVersion(),
|
|
46
|
+
[AZTEC_NODE_ROLE]: role,
|
|
47
|
+
[AZTEC_ROLLUP_VERSION]: process.env.ROLLUP_VERSION ?? 'canonical',
|
|
48
|
+
[AZTEC_ROLLUP_ADDRESS]: process.env.ROLLUP_CONTRACT_ADDRESS,
|
|
49
|
+
[AZTEC_REGISTRY_ADDRESS]: process.env.REGISTRY_CONTRACT_ADDRESS
|
|
50
|
+
};
|
|
51
|
+
return new Resource(aztecAttributes);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { type Logger, type LoggerBindings } from '@aztec-labs/foundation/log';
|
|
2
|
+
import { Registry } from 'prom-client';
|
|
3
|
+
import type { Meter, TelemetryClient } from './telemetry.js';
|
|
4
|
+
/**
|
|
5
|
+
* Types matching the gossipsub and libp2p services
|
|
6
|
+
*/
|
|
7
|
+
type TopicStr = string;
|
|
8
|
+
export type TopicLabel = string;
|
|
9
|
+
export type TopicStrToLabel = Map<TopicStr, TopicLabel>;
|
|
10
|
+
export declare enum MessageSource {
|
|
11
|
+
forward = "forward",
|
|
12
|
+
publish = "publish"
|
|
13
|
+
}
|
|
14
|
+
type NoLabels = Record<string, never>;
|
|
15
|
+
type LabelsGeneric = Record<string, string | number>;
|
|
16
|
+
type LabelKeys<Labels extends LabelsGeneric> = Extract<keyof Labels, string>;
|
|
17
|
+
interface CollectFn<Labels extends LabelsGeneric> {
|
|
18
|
+
(metric: IGauge<Labels>): void;
|
|
19
|
+
}
|
|
20
|
+
interface IGauge<Labels extends LabelsGeneric = NoLabels> {
|
|
21
|
+
inc: NoLabels extends Labels ? (value?: number) => void : (labels: Labels, value?: number) => void;
|
|
22
|
+
set: NoLabels extends Labels ? (value: number) => void : (labels: Labels, value: number) => void;
|
|
23
|
+
collect?(): void;
|
|
24
|
+
addCollect(collectFn: CollectFn<Labels>): void;
|
|
25
|
+
}
|
|
26
|
+
interface IHistogram<Labels extends LabelsGeneric = NoLabels> {
|
|
27
|
+
startTimer(): () => void;
|
|
28
|
+
observe: NoLabels extends Labels ? (value: number) => void : (labels: Labels, value: number) => void;
|
|
29
|
+
reset(): void;
|
|
30
|
+
}
|
|
31
|
+
interface IAvgMinMax<Labels extends LabelsGeneric = NoLabels> {
|
|
32
|
+
set: NoLabels extends Labels ? (values: number[]) => void : (labels: Labels, values: number[]) => void;
|
|
33
|
+
}
|
|
34
|
+
export type GaugeConfig<Labels extends LabelsGeneric> = {
|
|
35
|
+
name: string;
|
|
36
|
+
help: string;
|
|
37
|
+
} & (NoLabels extends Labels ? {
|
|
38
|
+
labelNames?: never;
|
|
39
|
+
} : {
|
|
40
|
+
labelNames: [LabelKeys<Labels>, ...Array<LabelKeys<Labels>>];
|
|
41
|
+
});
|
|
42
|
+
export type HistogramConfig<Labels extends LabelsGeneric> = GaugeConfig<Labels> & {
|
|
43
|
+
buckets?: number[];
|
|
44
|
+
};
|
|
45
|
+
export type AvgMinMaxConfig<Labels extends LabelsGeneric> = GaugeConfig<Labels>;
|
|
46
|
+
export interface MetricsRegister {
|
|
47
|
+
gauge<Labels extends LabelsGeneric = NoLabels>(config: GaugeConfig<Labels>): IGauge<Labels>;
|
|
48
|
+
histogram<Labels extends LabelsGeneric = NoLabels>(config: HistogramConfig<Labels>): IHistogram<Labels>;
|
|
49
|
+
avgMinMax<Labels extends LabelsGeneric = NoLabels>(config: AvgMinMaxConfig<Labels>): IAvgMinMax<Labels>;
|
|
50
|
+
}
|
|
51
|
+
/**Otel MetricsType Adapters
|
|
52
|
+
*
|
|
53
|
+
* Some dependencies we use export metrics directly in a Prometheus format
|
|
54
|
+
* This adapter is used to convert those metrics to a format that we can use with OpenTelemetry
|
|
55
|
+
*
|
|
56
|
+
* Affected services include:
|
|
57
|
+
* - chainsafe/gossipsub
|
|
58
|
+
* - libp2p
|
|
59
|
+
*/
|
|
60
|
+
export declare class OtelGauge<Labels extends LabelsGeneric = NoLabels> implements IGauge<Labels> {
|
|
61
|
+
private logger;
|
|
62
|
+
private labelNames;
|
|
63
|
+
private gauge;
|
|
64
|
+
private currentValue;
|
|
65
|
+
private labeledValues;
|
|
66
|
+
private collectFns;
|
|
67
|
+
private _collect;
|
|
68
|
+
get collect(): () => void;
|
|
69
|
+
set collect(fn: () => void);
|
|
70
|
+
constructor(logger: Logger, meter: Meter, name: string, help: string, labelNames?: Array<keyof Labels>);
|
|
71
|
+
/**
|
|
72
|
+
* Add a collect callback
|
|
73
|
+
* @param collectFn - Callback function
|
|
74
|
+
*/
|
|
75
|
+
addCollect(collectFn: CollectFn<Labels>): void;
|
|
76
|
+
handleObservation(result: any): void;
|
|
77
|
+
/**
|
|
78
|
+
* Increments the gauge value
|
|
79
|
+
* @param labelsOrValue - Labels object or numeric value
|
|
80
|
+
* @param value - Value to increment by (defaults to 1)
|
|
81
|
+
*/
|
|
82
|
+
inc(value?: number): void;
|
|
83
|
+
inc(labels: Labels, value?: number): void;
|
|
84
|
+
/**
|
|
85
|
+
* Sets the gauge value
|
|
86
|
+
* @param labelsOrValue - Labels object or numeric value
|
|
87
|
+
* @param value - Value to set
|
|
88
|
+
*/
|
|
89
|
+
set(value: number): void;
|
|
90
|
+
set(labels: Labels, value: number): void;
|
|
91
|
+
/**
|
|
92
|
+
* Decrements the gauge value
|
|
93
|
+
* @param labels - Optional labels object
|
|
94
|
+
*/
|
|
95
|
+
dec(labels?: Labels): void;
|
|
96
|
+
/**
|
|
97
|
+
* Resets the gauge to initial state
|
|
98
|
+
*/
|
|
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;
|
|
142
|
+
/**
|
|
143
|
+
* Sets the values for calculating avg, min, max with labels
|
|
144
|
+
* @param labels - Labels object
|
|
145
|
+
* @param values - Array of values
|
|
146
|
+
*/
|
|
147
|
+
set(labels: Labels, values: number[]): void;
|
|
148
|
+
/**
|
|
149
|
+
* Resets all stored values
|
|
150
|
+
*/
|
|
151
|
+
reset(): void;
|
|
152
|
+
/**
|
|
153
|
+
* General function to observe an aggregation
|
|
154
|
+
* @param result - Observer result
|
|
155
|
+
* @param aggregateFn - Function that calculates the aggregation
|
|
156
|
+
*/
|
|
157
|
+
private observeAggregation;
|
|
158
|
+
private observeAvg;
|
|
159
|
+
private observeMin;
|
|
160
|
+
private observeMax;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Otel metrics Adapter
|
|
164
|
+
*
|
|
165
|
+
* Maps the PromClient based MetricsRegister from gossipsub and discv5 services to the Otel MetricsRegister
|
|
166
|
+
*/
|
|
167
|
+
export declare class OtelMetricsAdapter extends Registry implements MetricsRegister {
|
|
168
|
+
private readonly meter;
|
|
169
|
+
private logger;
|
|
170
|
+
constructor(telemetryClient: TelemetryClient, bindings?: LoggerBindings);
|
|
171
|
+
gauge<Labels extends LabelsGeneric = NoLabels>(configuration: GaugeConfig<Labels>): IGauge<Labels>;
|
|
172
|
+
histogram<Labels extends LabelsGeneric = NoLabels>(configuration: HistogramConfig<Labels>): IHistogram<Labels>;
|
|
173
|
+
avgMinMax<Labels extends LabelsGeneric = NoLabels>(configuration: AvgMinMaxConfig<Labels>): IAvgMinMax<Labels>;
|
|
174
|
+
}
|
|
175
|
+
export {};
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbV9vdGVsX2FkYXB0ZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm9tX290ZWxfYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQUUsS0FBSyxjQUFjLEVBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFFNUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUd2QyxPQUFPLEtBQUssRUFBYSxLQUFLLEVBQW1CLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpGOztHQUVHO0FBQ0gsS0FBSyxRQUFRLEdBQUcsTUFBTSxDQUFDO0FBQ3ZCLE1BQU0sTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDO0FBQ2hDLE1BQU0sTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUV4RCxvQkFBWSxhQUFhO0lBQ3ZCLE9BQU8sWUFBWTtJQUNuQixPQUFPLFlBQVk7Q0FDcEI7QUFFRCxLQUFLLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RDLEtBQUssYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQ3JELEtBQUssU0FBUyxDQUFDLE1BQU0sU0FBUyxhQUFhLElBQUksT0FBTyxDQUFDLE1BQU0sTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdFLFVBQVUsU0FBUyxDQUFDLE1BQU0sU0FBUyxhQUFhO0lBQzlDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7Q0FDaEM7QUFFRCxVQUFVLE1BQU0sQ0FBQyxNQUFNLFNBQVMsYUFBYSxHQUFHLFFBQVE7SUFDdEQsR0FBRyxFQUFFLFFBQVEsU0FBUyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLEtBQUssSUFBSSxH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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prom_otel_adapter.d.ts","sourceRoot":"","sources":["../src/prom_otel_adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { createLogger } from '@aztec-labs/foundation/log';
|
|
2
|
+
import { Timer } from '@aztec-labs/foundation/timer';
|
|
3
|
+
import { Registry } from 'prom-client';
|
|
4
|
+
export var MessageSource = /*#__PURE__*/ function(MessageSource) {
|
|
5
|
+
MessageSource["forward"] = "forward";
|
|
6
|
+
MessageSource["publish"] = "publish";
|
|
7
|
+
return MessageSource;
|
|
8
|
+
}({});
|
|
9
|
+
/**Otel MetricsType Adapters
|
|
10
|
+
*
|
|
11
|
+
* Some dependencies we use export metrics directly in a Prometheus format
|
|
12
|
+
* This adapter is used to convert those metrics to a format that we can use with OpenTelemetry
|
|
13
|
+
*
|
|
14
|
+
* Affected services include:
|
|
15
|
+
* - chainsafe/gossipsub
|
|
16
|
+
* - libp2p
|
|
17
|
+
*/ export class OtelGauge {
|
|
18
|
+
logger;
|
|
19
|
+
labelNames;
|
|
20
|
+
gauge;
|
|
21
|
+
currentValue;
|
|
22
|
+
labeledValues;
|
|
23
|
+
collectFns;
|
|
24
|
+
_collect;
|
|
25
|
+
get collect() {
|
|
26
|
+
return this._collect;
|
|
27
|
+
}
|
|
28
|
+
set collect(fn) {
|
|
29
|
+
this._collect = fn;
|
|
30
|
+
}
|
|
31
|
+
constructor(logger, meter, name, help, labelNames = []){
|
|
32
|
+
this.logger = logger;
|
|
33
|
+
this.labelNames = labelNames;
|
|
34
|
+
this.currentValue = 0;
|
|
35
|
+
this.labeledValues = new Map();
|
|
36
|
+
this.collectFns = [];
|
|
37
|
+
this._collect = ()=>{};
|
|
38
|
+
const metricDef = {
|
|
39
|
+
name,
|
|
40
|
+
description: help
|
|
41
|
+
};
|
|
42
|
+
this.gauge = meter.createObservableGauge(metricDef);
|
|
43
|
+
// Only observe in the callback when collect() is called
|
|
44
|
+
this.gauge.addCallback(this.handleObservation.bind(this));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Add a collect callback
|
|
48
|
+
* @param collectFn - Callback function
|
|
49
|
+
*/ addCollect(collectFn) {
|
|
50
|
+
this.collectFns.push(collectFn);
|
|
51
|
+
}
|
|
52
|
+
handleObservation(result) {
|
|
53
|
+
// Execute the main collect function if assigned
|
|
54
|
+
this._collect();
|
|
55
|
+
// Execute all the collect functions
|
|
56
|
+
for (const fn of this.collectFns){
|
|
57
|
+
fn(this);
|
|
58
|
+
}
|
|
59
|
+
// Report the current values
|
|
60
|
+
if (this.labelNames.length === 0) {
|
|
61
|
+
result.observe(this.currentValue);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
for (const [labelStr, value] of this.labeledValues.entries()){
|
|
65
|
+
const labels = parseLabelsSafely(labelStr, this.logger);
|
|
66
|
+
if (labels) {
|
|
67
|
+
result.observe(value, labels);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
inc(labelsOrValue, value) {
|
|
72
|
+
if (typeof labelsOrValue === 'number') {
|
|
73
|
+
this.currentValue += labelsOrValue;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (labelsOrValue) {
|
|
77
|
+
validateLabels(labelsOrValue, this.labelNames, 'Gauge');
|
|
78
|
+
const labelKey = JSON.stringify(labelsOrValue);
|
|
79
|
+
const currentValue = this.labeledValues.get(labelKey) ?? 0;
|
|
80
|
+
this.labeledValues.set(labelKey, currentValue + (value ?? 1));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this.currentValue += value ?? 1;
|
|
84
|
+
}
|
|
85
|
+
set(labelsOrValue, value) {
|
|
86
|
+
if (typeof labelsOrValue === 'number') {
|
|
87
|
+
this.currentValue = labelsOrValue;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
validateLabels(labelsOrValue, this.labelNames, 'Gauge');
|
|
91
|
+
const labelKey = JSON.stringify(labelsOrValue);
|
|
92
|
+
this.labeledValues.set(labelKey, value);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Decrements the gauge value
|
|
96
|
+
* @param labels - Optional labels object
|
|
97
|
+
*/ dec(labels) {
|
|
98
|
+
if (labels) {
|
|
99
|
+
validateLabels(labels, this.labelNames, 'Gauge');
|
|
100
|
+
const labelKey = JSON.stringify(labels);
|
|
101
|
+
const currentValue = this.labeledValues.get(labelKey) ?? 0;
|
|
102
|
+
this.labeledValues.set(labelKey, currentValue - 1);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.currentValue -= 1;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Resets the gauge to initial state
|
|
109
|
+
*/ reset() {
|
|
110
|
+
this.currentValue = 0;
|
|
111
|
+
this.labeledValues.clear();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Implementation of a Histogram collector
|
|
116
|
+
*/ export class OtelHistogram {
|
|
117
|
+
logger;
|
|
118
|
+
labelNames;
|
|
119
|
+
histogram;
|
|
120
|
+
constructor(logger, meter, name, help, buckets = [], labelNames = []){
|
|
121
|
+
this.logger = logger;
|
|
122
|
+
this.labelNames = labelNames;
|
|
123
|
+
const metricDef = {
|
|
124
|
+
name,
|
|
125
|
+
description: help
|
|
126
|
+
};
|
|
127
|
+
this.histogram = meter.createHistogram(metricDef, {
|
|
128
|
+
advice: buckets.length ? {
|
|
129
|
+
explicitBucketBoundaries: buckets
|
|
130
|
+
} : undefined
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Starts a timer and returns a function that when called will record the time elapsed
|
|
135
|
+
* @param labels - Optional labels for the observation
|
|
136
|
+
*/ startTimer(labels) {
|
|
137
|
+
if (labels) {
|
|
138
|
+
validateLabels(labels, this.labelNames, 'Histogram');
|
|
139
|
+
}
|
|
140
|
+
const timer = new Timer();
|
|
141
|
+
return ()=>{
|
|
142
|
+
// Use timer.s() here to get the duration in seconds since this is only currently used by gossipsub_heartbeat_duration_seconds
|
|
143
|
+
const duration = timer.s();
|
|
144
|
+
if (labels) {
|
|
145
|
+
this.observe(labels, duration);
|
|
146
|
+
} else {
|
|
147
|
+
this.observe(duration);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
observe(labelsOrValue, value) {
|
|
152
|
+
if (typeof labelsOrValue === 'number') {
|
|
153
|
+
this.histogram.record(labelsOrValue);
|
|
154
|
+
} else {
|
|
155
|
+
validateLabels(labelsOrValue, this.labelNames, 'Histogram');
|
|
156
|
+
this.histogram.record(value, labelsOrValue);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
reset() {
|
|
160
|
+
// OpenTelemetry histograms cannot be reset, but we implement the interface
|
|
161
|
+
this.logger.silent('OpenTelemetry histograms cannot be fully reset');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Implementation of an AvgMinMax collector
|
|
166
|
+
*/ export class OtelAvgMinMax {
|
|
167
|
+
logger;
|
|
168
|
+
labelNames;
|
|
169
|
+
gauges;
|
|
170
|
+
currentValues;
|
|
171
|
+
labeledValues;
|
|
172
|
+
constructor(logger, meter, name, help, labelNames = []){
|
|
173
|
+
this.logger = logger;
|
|
174
|
+
this.labelNames = labelNames;
|
|
175
|
+
this.currentValues = [];
|
|
176
|
+
this.labeledValues = new Map();
|
|
177
|
+
// Create three separate gauges for avg, min, and max
|
|
178
|
+
this.gauges = {
|
|
179
|
+
avg: meter.createObservableGauge({
|
|
180
|
+
name: `${name}_avg`,
|
|
181
|
+
description: `${help} (average)`
|
|
182
|
+
}),
|
|
183
|
+
min: meter.createObservableGauge({
|
|
184
|
+
name: `${name}_min`,
|
|
185
|
+
description: `${help} (minimum)`
|
|
186
|
+
}),
|
|
187
|
+
max: meter.createObservableGauge({
|
|
188
|
+
name: `${name}_max`,
|
|
189
|
+
description: `${help} (maximum)`
|
|
190
|
+
})
|
|
191
|
+
};
|
|
192
|
+
// Register callbacks for each gauge
|
|
193
|
+
this.gauges.avg.addCallback(this.observeAvg.bind(this));
|
|
194
|
+
this.gauges.min.addCallback(this.observeMin.bind(this));
|
|
195
|
+
this.gauges.max.addCallback(this.observeMax.bind(this));
|
|
196
|
+
}
|
|
197
|
+
set(labelsOrValues, values) {
|
|
198
|
+
if (Array.isArray(labelsOrValues)) {
|
|
199
|
+
this.currentValues = labelsOrValues;
|
|
200
|
+
return;
|
|
201
|
+
} else {
|
|
202
|
+
validateLabels(labelsOrValues, this.labelNames, 'AvgMinMax');
|
|
203
|
+
const labelKey = JSON.stringify(labelsOrValues);
|
|
204
|
+
this.labeledValues.set(labelKey, values || []);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Resets all stored values
|
|
209
|
+
*/ reset() {
|
|
210
|
+
this.currentValues = [];
|
|
211
|
+
this.labeledValues.clear();
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* General function to observe an aggregation
|
|
215
|
+
* @param result - Observer result
|
|
216
|
+
* @param aggregateFn - Function that calculates the aggregation
|
|
217
|
+
*/ observeAggregation(result, aggregateFn) {
|
|
218
|
+
// Observe unlabeled values
|
|
219
|
+
if (this.currentValues.length > 0) {
|
|
220
|
+
result.observe(aggregateFn(this.currentValues));
|
|
221
|
+
}
|
|
222
|
+
// Observe labeled values
|
|
223
|
+
for (const [labelStr, values] of this.labeledValues.entries()){
|
|
224
|
+
if (values.length > 0) {
|
|
225
|
+
const labels = parseLabelsSafely(labelStr, this.logger);
|
|
226
|
+
if (labels) {
|
|
227
|
+
result.observe(aggregateFn(values), labels);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
observeAvg(result) {
|
|
233
|
+
this.observeAggregation(result, (arr)=>arr.reduce((sum, val)=>sum + val, 0) / arr.length);
|
|
234
|
+
}
|
|
235
|
+
observeMin(result) {
|
|
236
|
+
this.observeAggregation(result, (arr)=>Math.min.apply(null, arr));
|
|
237
|
+
}
|
|
238
|
+
observeMax(result) {
|
|
239
|
+
this.observeAggregation(result, (arr)=>Math.max.apply(null, arr));
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Validates that provided labels match the expected schema
|
|
244
|
+
* @param labels - Labels object to validate
|
|
245
|
+
* @param labelNames - Array of allowed label names
|
|
246
|
+
* @param metricType - Type of metric for error message ('Gauge', 'Histogram', 'AvgMinMax')
|
|
247
|
+
* @throws Error if invalid labels are provided
|
|
248
|
+
*/ function validateLabels(labels, labelNames, metricType) {
|
|
249
|
+
if (labelNames.length === 0) {
|
|
250
|
+
throw new Error(`${metricType} was initialized without labels support`);
|
|
251
|
+
}
|
|
252
|
+
for (const key of Object.keys(labels)){
|
|
253
|
+
if (!labelNames.includes(key)) {
|
|
254
|
+
throw new Error(`Invalid label key: ${key}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Safely parses label string back to object
|
|
260
|
+
* @param labelStr - Stringified labels object
|
|
261
|
+
* @param logger - Logger instance for error reporting
|
|
262
|
+
* @returns Labels object or null if parsing fails
|
|
263
|
+
*/ function parseLabelsSafely(labelStr, logger) {
|
|
264
|
+
try {
|
|
265
|
+
return JSON.parse(labelStr);
|
|
266
|
+
} catch {
|
|
267
|
+
logger.error(`Failed to parse label string: ${labelStr}`);
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Otel metrics Adapter
|
|
273
|
+
*
|
|
274
|
+
* Maps the PromClient based MetricsRegister from gossipsub and discv5 services to the Otel MetricsRegister
|
|
275
|
+
*/ export class OtelMetricsAdapter extends Registry {
|
|
276
|
+
meter;
|
|
277
|
+
logger;
|
|
278
|
+
constructor(telemetryClient, bindings){
|
|
279
|
+
super();
|
|
280
|
+
this.logger = createLogger('telemetry:otel-metrics-adapter', bindings);
|
|
281
|
+
this.meter = telemetryClient.getMeter('metrics-adapter');
|
|
282
|
+
}
|
|
283
|
+
gauge(configuration) {
|
|
284
|
+
return new OtelGauge(this.logger, this.meter, configuration.name, configuration.help, configuration.labelNames);
|
|
285
|
+
}
|
|
286
|
+
histogram(configuration) {
|
|
287
|
+
return new OtelHistogram(this.logger, this.meter, configuration.name, configuration.help, configuration.buckets, configuration.labelNames);
|
|
288
|
+
}
|
|
289
|
+
avgMinMax(configuration) {
|
|
290
|
+
return new OtelAvgMinMax(this.logger, this.meter, configuration.name, configuration.help, configuration.labelNames);
|
|
291
|
+
}
|
|
292
|
+
}
|
package/dest/start.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type LoggerBindings } from '@aztec-labs/foundation/log';
|
|
2
|
+
import type { TelemetryClientConfig } from './config.js';
|
|
3
|
+
import type { TelemetryClient } from './telemetry.js';
|
|
4
|
+
export * from './config.js';
|
|
5
|
+
export declare function initTelemetryClient(config: TelemetryClientConfig, bindings?: LoggerBindings): Promise<TelemetryClient>;
|
|
6
|
+
export declare function getTelemetryClient(): TelemetryClient;
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxjQUFjLEVBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFFL0UsT0FBTyxLQUFLLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekQsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsY0FBYyxhQUFhLENBQUM7QUFLNUIsd0JBQXNCLG1CQUFtQixDQUN2QyxNQUFNLEVBQUUscUJBQXFCLEVBQzdCLFFBQVEsQ0FBQyxFQUFFLGNBQWMsR0FDeEIsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQXVCMUI7QUFFRCx3QkFBZ0Isa0JBQWtCLElBQUksZUFBZSxDQUVwRCJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAgB,MAAM,4BAA4B,CAAC;AAE/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,cAAc,aAAa,CAAC;AAK5B,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,eAAe,CAAC,CAuB1B;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAEpD"}
|