@aztec/telemetry-client 0.0.0-test.1 → 0.0.1-commit.017a351

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dest/attributes.d.ts +45 -10
  2. package/dest/attributes.d.ts.map +1 -1
  3. package/dest/attributes.js +28 -9
  4. package/dest/bench.d.ts +6 -1
  5. package/dest/bench.d.ts.map +1 -1
  6. package/dest/bench.js +31 -14
  7. package/dest/config.d.ts +9 -2
  8. package/dest/config.d.ts.map +1 -1
  9. package/dest/config.js +44 -8
  10. package/dest/index.d.ts +2 -1
  11. package/dest/index.d.ts.map +1 -1
  12. package/dest/index.js +1 -0
  13. package/dest/l1_metrics.d.ts +17 -0
  14. package/dest/l1_metrics.d.ts.map +1 -0
  15. package/dest/l1_metrics.js +54 -0
  16. package/dest/lmdb_metrics.d.ts +5 -3
  17. package/dest/lmdb_metrics.d.ts.map +1 -1
  18. package/dest/lmdb_metrics.js +7 -15
  19. package/dest/metric-utils.d.ts +24 -0
  20. package/dest/metric-utils.d.ts.map +1 -0
  21. package/dest/metric-utils.js +59 -0
  22. package/dest/metrics.d.ts +312 -122
  23. package/dest/metrics.d.ts.map +1 -1
  24. package/dest/metrics.js +1595 -120
  25. package/dest/monitored_batch_span_processor.d.ts +29 -0
  26. package/dest/monitored_batch_span_processor.d.ts.map +1 -0
  27. package/dest/monitored_batch_span_processor.js +70 -0
  28. package/dest/nodejs_metrics_monitor.d.ts +19 -0
  29. package/dest/nodejs_metrics_monitor.d.ts.map +1 -0
  30. package/dest/nodejs_metrics_monitor.js +115 -0
  31. package/dest/noop.d.ts +9 -4
  32. package/dest/noop.d.ts.map +1 -1
  33. package/dest/noop.js +34 -1
  34. package/dest/otel.d.ts +13 -7
  35. package/dest/otel.d.ts.map +1 -1
  36. package/dest/otel.js +204 -24
  37. package/dest/otel_filter_metric_exporter.d.ts +12 -4
  38. package/dest/otel_filter_metric_exporter.d.ts.map +1 -1
  39. package/dest/otel_filter_metric_exporter.js +38 -4
  40. package/dest/otel_logger_provider.d.ts +1 -1
  41. package/dest/otel_propagation.d.ts +3 -1
  42. package/dest/otel_propagation.d.ts.map +1 -1
  43. package/dest/otel_propagation.js +49 -1
  44. package/dest/otel_resource.d.ts +1 -1
  45. package/dest/otel_resource.d.ts.map +1 -1
  46. package/dest/otel_resource.js +43 -2
  47. package/dest/prom_otel_adapter.d.ts +61 -12
  48. package/dest/prom_otel_adapter.d.ts.map +1 -1
  49. package/dest/prom_otel_adapter.js +157 -48
  50. package/dest/start.d.ts +3 -2
  51. package/dest/start.d.ts.map +1 -1
  52. package/dest/start.js +8 -7
  53. package/dest/telemetry.d.ts +63 -34
  54. package/dest/telemetry.d.ts.map +1 -1
  55. package/dest/telemetry.js +47 -24
  56. package/dest/vendor/attributes.d.ts +1 -1
  57. package/dest/vendor/otel-pino-stream.d.ts +1 -2
  58. package/dest/vendor/otel-pino-stream.d.ts.map +1 -1
  59. package/dest/vendor/otel-pino-stream.js +2 -2
  60. package/dest/with_tracer.d.ts +1 -1
  61. package/dest/with_tracer.d.ts.map +1 -1
  62. package/dest/wrappers/fetch.d.ts +3 -3
  63. package/dest/wrappers/fetch.d.ts.map +1 -1
  64. package/dest/wrappers/fetch.js +9 -6
  65. package/dest/wrappers/index.d.ts +1 -1
  66. package/dest/wrappers/json_rpc_server.d.ts +2 -2
  67. package/dest/wrappers/json_rpc_server.d.ts.map +1 -1
  68. package/dest/wrappers/l2_block_stream.d.ts +4 -3
  69. package/dest/wrappers/l2_block_stream.d.ts.map +1 -1
  70. package/dest/wrappers/l2_block_stream.js +385 -11
  71. package/package.json +21 -15
  72. package/src/attributes.ts +59 -12
  73. package/src/bench.ts +37 -15
  74. package/src/config.ts +76 -9
  75. package/src/index.ts +1 -0
  76. package/src/l1_metrics.ts +65 -0
  77. package/src/lmdb_metrics.ts +24 -24
  78. package/src/metric-utils.ts +75 -0
  79. package/src/metrics.ts +1679 -145
  80. package/src/monitored_batch_span_processor.ts +93 -0
  81. package/src/nodejs_metrics_monitor.ts +135 -0
  82. package/src/noop.ts +65 -4
  83. package/src/otel.ts +193 -28
  84. package/src/otel_filter_metric_exporter.ts +47 -5
  85. package/src/otel_propagation.ts +42 -1
  86. package/src/otel_resource.ts +57 -2
  87. package/src/prom_otel_adapter.ts +195 -70
  88. package/src/start.ts +17 -8
  89. package/src/telemetry.ts +152 -76
  90. package/src/vendor/otel-pino-stream.ts +1 -4
  91. package/src/wrappers/fetch.ts +32 -33
  92. package/src/wrappers/json_rpc_server.ts +1 -1
  93. package/src/wrappers/l2_block_stream.ts +3 -2
  94. package/dest/event_loop_monitor.d.ts +0 -18
  95. package/dest/event_loop_monitor.d.ts.map +0 -1
  96. package/dest/event_loop_monitor.js +0 -93
  97. package/src/event_loop_monitor.ts +0 -119
@@ -0,0 +1,29 @@
1
+ import type { Logger } from '@aztec/foundation/log';
2
+ import { type Context } from '@opentelemetry/api';
3
+ import type { SpanExporter } from '@opentelemetry/sdk-trace-base';
4
+ import { BatchSpanProcessor, type BufferConfig, type ReadableSpan, type Span } from '@opentelemetry/sdk-trace-node';
5
+ export type MonitoredBatchSpanProcessorConfig = BufferConfig & {
6
+ minTraceDurationMs?: number;
7
+ };
8
+ /**
9
+ * Wraps BatchSpanProcessor to emit warnings when spans are dropped due to a full queue.
10
+ * The standard BatchSpanProcessor silently discards spans when its internal queue reaches
11
+ * maxQueueSize, making telemetry data loss invisible to operators.
12
+ */
13
+ export declare class MonitoredBatchSpanProcessor extends BatchSpanProcessor {
14
+ private readonly maxQueueSize;
15
+ private readonly minTraceDurationMs;
16
+ private readonly log;
17
+ private approxQueueSize;
18
+ private droppedSinceLastWarning;
19
+ private totalDropped;
20
+ private lastWarningTime;
21
+ constructor(exporter: SpanExporter, log: Logger, config?: MonitoredBatchSpanProcessorConfig);
22
+ onStart(span: Span, parentContext: Context): void;
23
+ onEnd(span: ReadableSpan): void;
24
+ forceFlush(): Promise<void>;
25
+ shutdown(): Promise<void>;
26
+ private shouldDropShortSpan;
27
+ private maybeLogDropWarning;
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmVkX2JhdGNoX3NwYW5fcHJvY2Vzc29yLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbW9uaXRvcmVkX2JhdGNoX3NwYW5fcHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXBELE9BQU8sRUFBRSxLQUFLLE9BQU8sRUFBa0IsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxZQUFZLEVBQUUsS0FBSyxZQUFZLEVBQUUsS0FBSyxJQUFJLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQU9wSCxNQUFNLE1BQU0saUNBQWlDLEdBQUcsWUFBWSxHQUFHO0lBQzdELGtCQUFrQixDQUFDLEVBQUUsTUFBTSxDQUFDO0NBQzdCLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gscUJBQWEsMkJBQTRCLFNBQVEsa0JBQWtCO0lBQ2pFLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFTO0lBQ3RDLE9BQU8sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQVM7SUFDNUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQVM7SUFFN0IsT0FBTyxDQUFDLGVBQWUsQ0FBSztJQUM1QixPQUFPLENBQUMsdUJBQXVCLENBQUs7SUFDcEMsT0FBTyxDQUFDLFlBQVksQ0FBSztJQUN6QixPQUFPLENBQUMsZUFBZSxDQUFLO0lBRTVCLFlBQVksUUFBUSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLGlDQUFpQyxFQU0xRjtJQUVRLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxPQUFPLEdBQUcsSUFBSSxDQUV6RDtJQUVRLEtBQUssQ0FBQyxJQUFJLEVBQUUsWUFBWSxHQUFHLElBQUksQ0FhdkM7SUFFYyxVQUFVLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUd6QztJQUVjLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBT3ZDO0lBRUQsT0FBTyxDQUFDLG1CQUFtQjtJQVEzQixPQUFPLENBQUMsbUJBQW1CO0NBWTVCIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitored_batch_span_processor.d.ts","sourceRoot":"","sources":["../src/monitored_batch_span_processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,KAAK,OAAO,EAAkB,MAAM,oBAAoB,CAAC;AAElE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAOpH,MAAM,MAAM,iCAAiC,GAAG,YAAY,GAAG;IAC7D,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;;GAIG;AACH,qBAAa,2BAA4B,SAAQ,kBAAkB;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,eAAe,CAAK;IAE5B,YAAY,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iCAAiC,EAM1F;IAEQ,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI,CAEzD;IAEQ,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAavC;IAEc,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAGzC;IAEc,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAOvC;IAED,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,mBAAmB;CAY5B"}
@@ -0,0 +1,70 @@
1
+ import { SpanStatusCode } from '@opentelemetry/api';
2
+ import { hrTimeToMilliseconds } from '@opentelemetry/core';
3
+ import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-node';
4
+ /** Minimum interval between drop warnings to avoid log spam. */ const DROP_WARNING_INTERVAL_MS = 30_000;
5
+ const DEFAULT_MIN_TRACE_DURATION_MS = 10;
6
+ /**
7
+ * Wraps BatchSpanProcessor to emit warnings when spans are dropped due to a full queue.
8
+ * The standard BatchSpanProcessor silently discards spans when its internal queue reaches
9
+ * maxQueueSize, making telemetry data loss invisible to operators.
10
+ */ export class MonitoredBatchSpanProcessor extends BatchSpanProcessor {
11
+ maxQueueSize;
12
+ minTraceDurationMs;
13
+ log;
14
+ approxQueueSize = 0;
15
+ droppedSinceLastWarning = 0;
16
+ totalDropped = 0;
17
+ lastWarningTime = 0;
18
+ constructor(exporter, log, config){
19
+ const maxQueueSize = config?.maxQueueSize ?? 2048;
20
+ super(exporter, {
21
+ ...config,
22
+ maxQueueSize
23
+ });
24
+ this.maxQueueSize = maxQueueSize;
25
+ this.minTraceDurationMs = Math.max(0, config?.minTraceDurationMs ?? DEFAULT_MIN_TRACE_DURATION_MS);
26
+ this.log = log;
27
+ }
28
+ onStart(span, parentContext) {
29
+ super.onStart(span, parentContext);
30
+ }
31
+ onEnd(span) {
32
+ if (this.shouldDropShortSpan(span)) {
33
+ return;
34
+ }
35
+ if (this.approxQueueSize >= this.maxQueueSize) {
36
+ this.droppedSinceLastWarning++;
37
+ this.totalDropped++;
38
+ this.maybeLogDropWarning();
39
+ } else {
40
+ this.approxQueueSize++;
41
+ }
42
+ super.onEnd(span);
43
+ }
44
+ async forceFlush() {
45
+ await super.forceFlush();
46
+ this.approxQueueSize = 0;
47
+ }
48
+ async shutdown() {
49
+ if (this.totalDropped > 0) {
50
+ this.log.warn(`BatchSpanProcessor shutting down with ${this.totalDropped} total spans dropped`, {
51
+ totalDropped: this.totalDropped
52
+ });
53
+ }
54
+ await super.shutdown();
55
+ }
56
+ shouldDropShortSpan(span) {
57
+ return this.minTraceDurationMs > 0 && span.status.code !== SpanStatusCode.ERROR && hrTimeToMilliseconds(span.duration) < this.minTraceDurationMs;
58
+ }
59
+ maybeLogDropWarning() {
60
+ const now = Date.now();
61
+ if (now - this.lastWarningTime >= DROP_WARNING_INTERVAL_MS) {
62
+ this.log.warn(`BatchSpanProcessor dropping spans: queue full (maxQueueSize=${this.maxQueueSize}). ` + `${this.droppedSinceLastWarning} dropped since last warning, ${this.totalDropped} total.`, {
63
+ droppedSinceLastWarning: this.droppedSinceLastWarning,
64
+ totalDropped: this.totalDropped
65
+ });
66
+ this.droppedSinceLastWarning = 0;
67
+ this.lastWarningTime = now;
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,19 @@
1
+ import type { Meter } from './telemetry.js';
2
+ /** Monitors Node.js runtime metrics */
3
+ export declare class NodejsMetricsMonitor {
4
+ private meter;
5
+ private eventLoopDelayGauges;
6
+ private memoryGauges;
7
+ private eventLoopUilization;
8
+ private eventLoopTime;
9
+ private started;
10
+ private lastELU;
11
+ private eventLoopDelay;
12
+ constructor(meter: Meter);
13
+ start(): void;
14
+ stop(): void;
15
+ private measure;
16
+ private measureMemoryUsage;
17
+ private measureEventLoopDelay;
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZWpzX21ldHJpY3NfbW9uaXRvci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25vZGVqc19tZXRyaWNzX21vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsT0FBTyxLQUFLLEVBQXlCLEtBQUssRUFBa0MsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRyx1Q0FBdUM7QUFDdkMscUJBQWEsb0JBQW9CO0lBdUJuQixPQUFPLENBQUMsS0FBSztJQXRCekIsT0FBTyxDQUFDLG9CQUFvQixDQVExQjtJQUlGLE9BQU8sQ0FBQyxZQUFZLENBQW9FO0lBRXhGLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBa0I7SUFDN0MsT0FBTyxDQUFDLGFBQWEsQ0FBZ0I7SUFFckMsT0FBTyxDQUFDLE9BQU8sQ0FBUztJQUV4QixPQUFPLENBQUMsT0FBTyxDQUFtQztJQUNsRCxPQUFPLENBQUMsY0FBYyxDQUFvQjtJQUUxQyxZQUFvQixLQUFLLEVBQUUsS0FBSyxFQXVCL0I7SUFFRCxLQUFLLElBQUksSUFBSSxDQVlaO0lBRUQsSUFBSSxJQUFJLElBQUksQ0FZWDtJQUVELE9BQU8sQ0FBQyxPQUFPLENBR2I7SUFFRixPQUFPLENBQUMsa0JBQWtCLENBT3hCO0lBRUYsT0FBTyxDQUFDLHFCQUFxQixDQXlCM0I7Q0FDSCJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodejs_metrics_monitor.d.ts","sourceRoot":"","sources":["../src/nodejs_metrics_monitor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAyB,KAAK,EAAkC,MAAM,gBAAgB,CAAC;AAEnG,uCAAuC;AACvC,qBAAa,oBAAoB;IAuBnB,OAAO,CAAC,KAAK;IAtBzB,OAAO,CAAC,oBAAoB,CAQ1B;IAIF,OAAO,CAAC,YAAY,CAAoE;IAExF,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,aAAa,CAAgB;IAErC,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,cAAc,CAAoB;IAE1C,YAAoB,KAAK,EAAE,KAAK,EAuB/B;IAED,KAAK,IAAI,IAAI,CAYZ;IAED,IAAI,IAAI,IAAI,CAYX;IAED,OAAO,CAAC,OAAO,CAGb;IAEF,OAAO,CAAC,kBAAkB,CAOxB;IAEF,OAAO,CAAC,qBAAqB,CAyB3B;CACH"}
@@ -0,0 +1,115 @@
1
+ import { monitorEventLoopDelay, performance } from 'node:perf_hooks';
2
+ import * as Attributes from './attributes.js';
3
+ import { createUpDownCounterWithDefault } from './metric-utils.js';
4
+ import * as Metrics from './metrics.js';
5
+ /** Monitors Node.js runtime metrics */ export class NodejsMetricsMonitor {
6
+ meter;
7
+ eventLoopDelayGauges;
8
+ // skip `rss` because that's already tracked by @opentelemetry/host-metrics
9
+ // description of each field here https://nodejs.org/api/process.html#processmemoryusage
10
+ memoryGauges;
11
+ eventLoopUilization;
12
+ eventLoopTime;
13
+ started;
14
+ lastELU;
15
+ eventLoopDelay;
16
+ constructor(meter){
17
+ this.meter = meter;
18
+ this.started = false;
19
+ this.measure = (obs)=>{
20
+ this.measureMemoryUsage(obs);
21
+ this.measureEventLoopDelay(obs);
22
+ };
23
+ this.measureMemoryUsage = (observer)=>{
24
+ const mem = process.memoryUsage();
25
+ observer.observe(this.memoryGauges.heapUsed, mem.heapUsed);
26
+ observer.observe(this.memoryGauges.heapTotal, mem.heapTotal);
27
+ observer.observe(this.memoryGauges.arrayBuffers, mem.arrayBuffers);
28
+ observer.observe(this.memoryGauges.external, mem.external);
29
+ };
30
+ this.measureEventLoopDelay = (obs)=>{
31
+ const newELU = performance.eventLoopUtilization();
32
+ const delta = performance.eventLoopUtilization(newELU, this.lastELU);
33
+ this.lastELU = newELU;
34
+ // `utilization` [0,1] represents how much the event loop is busy vs waiting for new events to come in
35
+ // This should be corelated with CPU usage to gauge the performance characteristics of services
36
+ // 100% utilization leads to high latency because the event loop is _always_ busy, there's no breathing room for events to be processed quickly.
37
+ // Docs and examples:
38
+ // - https://nodesource.com/blog/event-loop-utilization-nodejs
39
+ // - https://youtu.be/WetXnEPraYM
40
+ obs.observe(this.eventLoopUilization, delta.utilization);
41
+ this.eventLoopTime.add(Math.trunc(delta.idle), {
42
+ [Attributes.NODEJS_EVENT_LOOP_STATE]: 'idle'
43
+ });
44
+ this.eventLoopTime.add(Math.trunc(delta.active), {
45
+ [Attributes.NODEJS_EVENT_LOOP_STATE]: 'active'
46
+ });
47
+ safeObserveInt(obs, this.eventLoopDelayGauges.min, this.eventLoopDelay.min);
48
+ safeObserveInt(obs, this.eventLoopDelayGauges.mean, this.eventLoopDelay.mean);
49
+ safeObserveInt(obs, this.eventLoopDelayGauges.max, this.eventLoopDelay.max);
50
+ safeObserveInt(obs, this.eventLoopDelayGauges.stddev, this.eventLoopDelay.stddev);
51
+ safeObserveInt(obs, this.eventLoopDelayGauges.p50, this.eventLoopDelay.percentile(50));
52
+ safeObserveInt(obs, this.eventLoopDelayGauges.p90, this.eventLoopDelay.percentile(90));
53
+ safeObserveInt(obs, this.eventLoopDelayGauges.p99, this.eventLoopDelay.percentile(99));
54
+ this.eventLoopDelay.reset();
55
+ };
56
+ this.eventLoopDelayGauges = {
57
+ min: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_MIN),
58
+ mean: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_MEAN),
59
+ max: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_MAX),
60
+ stddev: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_STDDEV),
61
+ p50: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_P50),
62
+ p90: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_P90),
63
+ p99: meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_DELAY_P99)
64
+ };
65
+ this.eventLoopUilization = meter.createObservableGauge(Metrics.NODEJS_EVENT_LOOP_UTILIZATION);
66
+ this.eventLoopTime = createUpDownCounterWithDefault(meter, Metrics.NODEJS_EVENT_LOOP_TIME, {
67
+ [Attributes.NODEJS_EVENT_LOOP_STATE]: [
68
+ 'idle',
69
+ 'active'
70
+ ]
71
+ });
72
+ this.eventLoopDelay = monitorEventLoopDelay();
73
+ this.memoryGauges = {
74
+ heapUsed: meter.createObservableGauge(Metrics.NODEJS_MEMORY_HEAP_USAGE),
75
+ heapTotal: meter.createObservableGauge(Metrics.NODEJS_MEMORY_HEAP_TOTAL),
76
+ arrayBuffers: meter.createObservableGauge(Metrics.NODEJS_MEMORY_BUFFER_USAGE),
77
+ external: meter.createObservableGauge(Metrics.NODEJS_MEMORY_NATIVE_USAGE)
78
+ };
79
+ }
80
+ start() {
81
+ if (this.started) {
82
+ return;
83
+ }
84
+ this.lastELU = performance.eventLoopUtilization();
85
+ this.eventLoopDelay.enable();
86
+ this.meter.addBatchObservableCallback(this.measure, [
87
+ this.eventLoopUilization,
88
+ ...Object.values(this.eventLoopDelayGauges),
89
+ ...Object.values(this.memoryGauges)
90
+ ]);
91
+ }
92
+ stop() {
93
+ if (!this.started) {
94
+ return;
95
+ }
96
+ this.meter.removeBatchObservableCallback(this.measure, [
97
+ this.eventLoopUilization,
98
+ ...Object.values(this.eventLoopDelayGauges),
99
+ ...Object.values(this.memoryGauges)
100
+ ]);
101
+ this.eventLoopDelay.disable();
102
+ this.eventLoopDelay.reset();
103
+ this.lastELU = undefined;
104
+ }
105
+ measure;
106
+ measureMemoryUsage;
107
+ measureEventLoopDelay;
108
+ }
109
+ function safeObserveInt(observer, metric, value, attrs) {
110
+ // discard NaN, Infinity, -Infinity
111
+ if (!Number.isFinite(value)) {
112
+ return;
113
+ }
114
+ observer.observe(metric, Math.trunc(value), attrs);
115
+ }
package/dest/noop.d.ts CHANGED
@@ -1,14 +1,19 @@
1
- import { type Meter, type Span, type Tracer } from '@opentelemetry/api';
2
- import type { TelemetryClient } from './telemetry.js';
1
+ import { type Context, type Span, type Tracer } from '@opentelemetry/api';
2
+ import type { Meter, TelemetryClient } from './telemetry.js';
3
3
  export declare class NoopTelemetryClient implements TelemetryClient {
4
+ private meter;
5
+ setExportedPublicTelemetry(_prefixes: string[]): void;
6
+ setPublicTelemetryCollectFrom(_roles: string[]): void;
4
7
  getMeter(): Meter;
5
8
  getTracer(): Tracer;
6
9
  stop(): Promise<void>;
7
10
  flush(): Promise<void>;
8
11
  isEnabled(): boolean;
12
+ getTraceContext(): string | undefined;
13
+ extractPropagatedContext(_traceContext: string): Context | undefined;
9
14
  }
10
15
  export declare class NoopTracer implements Tracer {
11
16
  startSpan(): Span;
12
- startActiveSpan<F extends (...args: any[]) => any>(_name: string, ...args: (unknown | F)[]): ReturnType<F>;
17
+ startActiveSpan<F extends (...args: any[]) => any>(_name: string, ...args: unknown[]): ReturnType<F>;
13
18
  }
14
- //# sourceMappingURL=noop.d.ts.map
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25vb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFvQixLQUFLLE1BQU0sRUFBbUIsTUFBTSxvQkFBb0IsQ0FBQztBQUc3RyxPQUFPLEtBQUssRUFHVixLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGdCQUFnQixDQUFDO0FBeUN4QixxQkFBYSxtQkFBb0IsWUFBVyxlQUFlO0lBQ3pELE9BQU8sQ0FBQyxLQUFLLENBQW1CO0lBRWhDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUc7SUFDeEQsNkJBQTZCLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBRztJQUV4RCxRQUFRLElBQUksS0FBSyxDQUVoQjtJQUVELFNBQVMsSUFBSSxNQUFNLENBRWxCO0lBRUQsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFcEI7SUFFRCxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUVyQjtJQUVELFNBQVMsWUFFUjtJQUVELGVBQWUsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUVwQztJQUVELHdCQUF3QixDQUFDLGFBQWEsRUFBRSxNQUFNLEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FFbkU7Q0FDRjtBQUtELHFCQUFhLFVBQVcsWUFBVyxNQUFNO0lBQ3ZDLFNBQVMsSUFBSSxJQUFJLENBRWhCO0lBRUQsZUFBZSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FJbkc7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,IAAI,EAAoB,KAAK,MAAM,EAAmB,MAAM,oBAAoB,CAAC;AAE3G,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,qBAAa,mBAAoB,YAAW,eAAe;IACzD,QAAQ,IAAI,KAAK;IAIjB,SAAS,IAAI,MAAM;IAInB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,SAAS;CAGV;AAKD,qBAAa,UAAW,YAAW,MAAM;IACvC,SAAS,IAAI,IAAI;IAIjB,eAAe,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;CAK3G"}
1
+ {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../src/noop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAoB,KAAK,MAAM,EAAmB,MAAM,oBAAoB,CAAC;AAG7G,OAAO,KAAK,EAGV,KAAK,EAGL,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AAyCxB,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,KAAK,CAAmB;IAEhC,0BAA0B,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAG;IACxD,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAG;IAExD,QAAQ,IAAI,KAAK,CAEhB;IAED,SAAS,IAAI,MAAM,CAElB;IAED,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpB;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAErB;IAED,SAAS,YAER;IAED,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpC;IAED,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEnE;CACF;AAKD,qBAAa,UAAW,YAAW,MAAM;IACvC,SAAS,IAAI,IAAI,CAEhB;IAED,eAAe,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAInG;CACF"}
package/dest/noop.js CHANGED
@@ -1,7 +1,34 @@
1
1
  import { createNoopMeter } from '@opentelemetry/api';
2
+ /** A no-op meter that implements our custom Meter interface */ class NoopMeter {
3
+ otelMeter = createNoopMeter();
4
+ createGauge(_metric) {
5
+ return this.otelMeter.createGauge('');
6
+ }
7
+ createObservableGauge(_metric) {
8
+ return this.otelMeter.createObservableGauge('');
9
+ }
10
+ createHistogram(_metric, _extraOptions) {
11
+ return this.otelMeter.createHistogram('');
12
+ }
13
+ createUpDownCounter(_metric) {
14
+ return this.otelMeter.createUpDownCounter('');
15
+ }
16
+ createObservableUpDownCounter(_metric) {
17
+ return this.otelMeter.createObservableUpDownCounter('');
18
+ }
19
+ addBatchObservableCallback(callback, observables) {
20
+ this.otelMeter.addBatchObservableCallback(callback, observables);
21
+ }
22
+ removeBatchObservableCallback(callback, observables) {
23
+ this.otelMeter.removeBatchObservableCallback(callback, observables);
24
+ }
25
+ }
2
26
  export class NoopTelemetryClient {
27
+ meter = new NoopMeter();
28
+ setExportedPublicTelemetry(_prefixes) {}
29
+ setPublicTelemetryCollectFrom(_roles) {}
3
30
  getMeter() {
4
- return createNoopMeter();
31
+ return this.meter;
5
32
  }
6
33
  getTracer() {
7
34
  return new NoopTracer();
@@ -15,6 +42,12 @@ export class NoopTelemetryClient {
15
42
  isEnabled() {
16
43
  return false;
17
44
  }
45
+ getTraceContext() {
46
+ return undefined;
47
+ }
48
+ extractPropagatedContext(_traceContext) {
49
+ return undefined;
50
+ }
18
51
  }
19
52
  // @opentelemetry/api internally uses NoopTracer and NoopSpan but they're not exported
20
53
  // make our own versions
package/dest/otel.d.ts CHANGED
@@ -1,32 +1,38 @@
1
1
  import { type Logger } from '@aztec/foundation/log';
2
- import { type Meter, type Tracer, type TracerProvider } from '@opentelemetry/api';
2
+ import { type Context, type Tracer, type TracerProvider } from '@opentelemetry/api';
3
3
  import { HostMetrics } from '@opentelemetry/host-metrics';
4
4
  import type { IResource } from '@opentelemetry/resources';
5
5
  import type { LoggerProvider } from '@opentelemetry/sdk-logs';
6
6
  import { MeterProvider, type PeriodicExportingMetricReaderOptions } from '@opentelemetry/sdk-metrics';
7
7
  import type { TelemetryClientConfig } from './config.js';
8
- import { EventLoopMonitor } from './event_loop_monitor.js';
9
- import type { TelemetryClient } from './telemetry.js';
8
+ import { NodejsMetricsMonitor } from './nodejs_metrics_monitor.js';
9
+ import { PublicOtelFilterMetricExporter } from './otel_filter_metric_exporter.js';
10
+ import type { Meter, TelemetryClient } from './telemetry.js';
10
11
  export type OpenTelemetryClientFactory = (resource: IResource, log: Logger) => OpenTelemetryClient;
11
12
  export declare class OpenTelemetryClient implements TelemetryClient {
12
13
  private resource;
13
14
  private meterProvider;
14
15
  private traceProvider;
15
16
  private loggerProvider;
17
+ private publicMetricExporter;
16
18
  private log;
17
19
  hostMetrics: HostMetrics | undefined;
18
- eventLoopMonitor: EventLoopMonitor | undefined;
20
+ nodejsMetricsMonitor: NodejsMetricsMonitor | undefined;
19
21
  private meters;
20
22
  private tracers;
21
- protected constructor(resource: IResource, meterProvider: MeterProvider, traceProvider: TracerProvider, loggerProvider: LoggerProvider | undefined, log: Logger);
23
+ protected constructor(resource: IResource, meterProvider: MeterProvider, traceProvider: TracerProvider, loggerProvider: LoggerProvider | undefined, publicMetricExporter: PublicOtelFilterMetricExporter | undefined, log: Logger);
24
+ setExportedPublicTelemetry(metrics: string[]): void;
25
+ setPublicTelemetryCollectFrom(roles: string[]): void;
22
26
  getMeter(name: string): Meter;
23
27
  getTracer(name: string): Tracer;
24
28
  start(): void;
25
29
  isEnabled(): boolean;
26
30
  flush(): Promise<void>;
27
31
  stop(): Promise<void>;
28
- static createMeterProvider(resource: IResource, options: Partial<PeriodicExportingMetricReaderOptions>): MeterProvider;
32
+ getTraceContext(): string | undefined;
33
+ extractPropagatedContext(traceContext: string): Context;
34
+ static createMeterProvider(resource: IResource, exporters: Array<PeriodicExportingMetricReaderOptions>): MeterProvider;
29
35
  private static getCustomClientFactory;
30
36
  static createAndStart(config: TelemetryClientConfig, log: Logger): OpenTelemetryClient;
31
37
  }
32
- //# sourceMappingURL=otel.d.ts.map
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RlbC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL290ZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixLQUFLLE1BQU0sRUFBcUIsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRixPQUFPLEVBQ0wsS0FBSyxPQUFPLEVBS1osS0FBSyxNQUFNLEVBQ1gsS0FBSyxjQUFjLEVBTXBCLE1BQU0sb0JBQW9CLENBQUM7QUFJNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFHTCxhQUFhLEVBRWIsS0FBSyxvQ0FBb0MsRUFFMUMsTUFBTSw0QkFBNEIsQ0FBQztBQUlwQyxPQUFPLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUl6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRSxPQUFPLEVBQTRCLDhCQUE4QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHNUcsT0FBTyxLQUFLLEVBR1YsS0FBSyxFQUdMLGVBQWUsRUFFaEIsTUFBTSxnQkFBZ0IsQ0FBQztBQXlDeEIsTUFBTSxNQUFNLDBCQUEwQixHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxLQUFLLG1CQUFtQixDQUFDO0FBRW5HLHFCQUFhLG1CQUFvQixZQUFXLGVBQWU7SUFPdkQsT0FBTyxDQUFDLFFBQVE7SUFDaEIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLGFBQWE7SUFDckIsT0FBTyxDQUFDLGNBQWM7SUFDdEIsT0FBTyxDQUFDLG9CQUFvQjtJQUM1QixPQUFPLENBQUMsR0FBRztJQVhiLFdBQVcsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQ3JDLG9CQUFvQixFQUFFLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztJQUN2RCxPQUFPLENBQUMsTUFBTSxDQUE4RDtJQUM1RSxPQUFPLENBQUMsT0FBTyxDQUFrRDtJQUVqRSxTQUFTLGFBQ0MsUUFBUSxFQUFFLFNBQVMsRUFDbkIsYUFBYSxFQUFFLGFBQWEsRUFDNUIsYUFBYSxFQUFFLGNBQWMsRUFDN0IsY0FBYyxFQUFFLGNBQWMsR0FBRyxTQUFTLEVBQzFDLG9CQUFvQixFQUFFLDhCQUE4QixHQUFHLFNBQVMsRUFDaEUsR0FBRyxFQUFFLE1BQU0sRUFDakI7SUFFSiwwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUVsRDtJQUVELDZCQUE2QixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBRW5EO0lBRUQsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLEdBQUcsS0FBSyxDQVE1QjtJQUVELFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FPOUI7SUFFTSxLQUFLLFNBOEJYO0lBRU0sU0FBUyxZQUVmO0lBRVksS0FBSyxrQkFNakI7SUFFWSxJQUFJLGtCQWdCaEI7SUFFTSxlQUFlLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FJM0M7SUFFTSx3QkFBd0IsQ0FBQyxZQUFZLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FLN0Q7SUFFRCxPQUFjLG1CQUFtQixDQUMvQixRQUFRLEVBQUUsU0FBUyxFQUNuQixTQUFTLEVBQUUsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLEdBQ3JELGFBQWEsQ0E2SmY7SUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLHNCQUFzQjtJQXNFckMsT0FBYyxjQUFjLENBQUMsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxNQUFNLEdBQUcsbUJBQW1CLENBUTVGO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAqB,MAAM,uBAAuB,CAAC;AAErF,OAAO,EAGL,KAAK,KAAK,EACV,KAAK,MAAM,EACX,KAAK,cAAc,EAKpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAGL,aAAa,EAEb,KAAK,oCAAoC,EAE1C,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAI3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,MAAM,0BAA0B,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,mBAAmB,CAAC;AAEnG,qBAAa,mBAAoB,YAAW,eAAe;IAOvD,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,GAAG;IAVb,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC/C,OAAO,CAAC,MAAM,CAAgD;IAC9D,OAAO,CAAC,OAAO,CAAkD;IAEjE,SAAS,aACC,QAAQ,EAAE,SAAS,EACnB,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,cAAc,EAC7B,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,GAAG,EAAE,MAAM;IAGrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;IAS7B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IASxB,KAAK;IA+BL,SAAS;IAIH,KAAK;IAQL,IAAI;WAkBH,mBAAmB,CAC/B,QAAQ,EAAE,SAAS,EACnB,OAAO,EAAE,OAAO,CAAC,oCAAoC,CAAC,GACrD,aAAa;IAkHhB,OAAO,CAAC,MAAM,CAAC,sBAAsB;WA4BvB,cAAc,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,EAAE,MAAM,GAAG,mBAAmB;CAS9F"}
1
+ {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAqB,MAAM,uBAAuB,CAAC;AAErF,OAAO,EACL,KAAK,OAAO,EAKZ,KAAK,MAAM,EACX,KAAK,cAAc,EAMpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAGL,aAAa,EAEb,KAAK,oCAAoC,EAE1C,MAAM,4BAA4B,CAAC;AAIpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAIzD,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,CA6Jf;IAED,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAsErC,OAAc,cAAc,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAQ5F;CACF"}