@equipe-tech/observability 0.2.0 → 0.3.5

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 (177) hide show
  1. package/README.md +11 -9
  2. package/dist/BrowserEvents.d.ts +89 -12
  3. package/dist/BrowserEvents.js +67 -13
  4. package/dist/Correlation.d.ts +51 -0
  5. package/dist/Correlation.js +95 -0
  6. package/dist/Metrics.d.ts +19 -3
  7. package/dist/Metrics.js +16 -0
  8. package/dist/MetricsRuntime.d.ts +45 -3
  9. package/dist/MetricsRuntime.js +478 -120
  10. package/dist/PolicyOtlpLogger.d.ts +18 -0
  11. package/dist/PolicyOtlpLogger.js +142 -0
  12. package/dist/RedactionPolicy.d.ts +2 -9
  13. package/dist/RedactionPolicy.js +2 -246
  14. package/dist/ResourceIdentity.d.ts +47 -0
  15. package/dist/ResourceIdentity.js +82 -0
  16. package/dist/Telemetry.d.ts +18 -3
  17. package/dist/Telemetry.js +43 -25
  18. package/dist/TelemetryConfig.d.ts +11 -4
  19. package/dist/TelemetryConfig.js +38 -10
  20. package/dist/audit/AuditCommitDocument.d.ts +41 -0
  21. package/dist/audit/AuditCommitDocument.js +58 -0
  22. package/dist/audit/AuditDigest.d.ts +11 -0
  23. package/dist/audit/AuditDigest.js +25 -0
  24. package/dist/audit/AuditOutbox.d.ts +75 -0
  25. package/dist/audit/AuditOutbox.js +104 -0
  26. package/dist/audit/AuditPublisher.d.ts +49 -0
  27. package/dist/audit/AuditPublisher.js +60 -0
  28. package/dist/audit/AuditRecord.d.ts +128 -0
  29. package/dist/audit/AuditRecord.js +172 -0
  30. package/dist/audit/CommittedAuditRecordInternal.d.ts +11 -0
  31. package/dist/audit/CommittedAuditRecordInternal.js +13 -0
  32. package/dist/audit/InvalidAuditRecord.d.ts +12 -0
  33. package/dist/audit/InvalidAuditRecord.js +16 -0
  34. package/dist/audit/index.d.ts +7 -0
  35. package/dist/audit/index.js +7 -0
  36. package/dist/browser/BrowserClient.d.ts +82 -3
  37. package/dist/browser/BrowserClient.js +322 -28
  38. package/dist/browser/BrowserEventLimits.d.ts +8 -0
  39. package/dist/browser/BrowserEventLimits.js +8 -0
  40. package/dist/browser/BrowserMetricRecorder.d.ts +17 -0
  41. package/dist/browser/BrowserMetricRecorder.js +35 -0
  42. package/dist/browser/BrowserTelemetry.d.ts +40 -0
  43. package/dist/browser/BrowserTelemetry.js +105 -0
  44. package/dist/browser/ClientPolicy.d.ts +3 -0
  45. package/dist/browser/ClientPolicy.js +52 -0
  46. package/dist/browser/client.d.ts +3 -2
  47. package/dist/browser/client.js +2 -1
  48. package/dist/browser/index.d.ts +4 -37
  49. package/dist/browser/index.js +3 -95
  50. package/dist/contract/ContractCompatibility.d.ts +31 -0
  51. package/dist/contract/ContractCompatibility.js +274 -0
  52. package/dist/contract/ContractIndex.d.ts +54 -0
  53. package/dist/contract/ContractIndex.js +178 -0
  54. package/dist/contract/ContractSurface.d.ts +111 -0
  55. package/dist/contract/ContractSurface.js +116 -0
  56. package/dist/contract/EventName.d.ts +6 -0
  57. package/dist/contract/EventName.js +55 -0
  58. package/dist/contract/EventProducer.d.ts +123 -0
  59. package/dist/contract/EventProducer.js +209 -0
  60. package/dist/contract/MetricContractError.d.ts +19 -0
  61. package/dist/contract/MetricContractError.js +19 -0
  62. package/dist/contract/MetricDefinition.d.ts +61 -0
  63. package/dist/contract/MetricDefinition.js +91 -0
  64. package/dist/contract/MetricProducer.d.ts +42 -0
  65. package/dist/contract/MetricProducer.js +123 -0
  66. package/dist/contract/OrganizationEvents.d.ts +165 -0
  67. package/dist/contract/OrganizationEvents.js +97 -0
  68. package/dist/contract/TelemetryContract.d.ts +95 -0
  69. package/dist/contract/TelemetryContract.js +451 -0
  70. package/dist/contract/TelemetryContractError.d.ts +44 -0
  71. package/dist/contract/TelemetryContractError.js +64 -0
  72. package/dist/contract/TelemetryEvent.d.ts +59 -0
  73. package/dist/contract/TelemetryEvent.js +54 -0
  74. package/dist/contract/index.d.ts +11 -0
  75. package/dist/contract/index.js +11 -0
  76. package/dist/effect/WideEvent.d.ts +3 -0
  77. package/dist/effect/WideEvent.js +20 -0
  78. package/dist/effect/WideEventSink.d.ts +3 -0
  79. package/dist/effect/WideEventSink.js +79 -0
  80. package/dist/effect/index.d.ts +2 -0
  81. package/dist/effect/index.js +2 -0
  82. package/dist/index.d.ts +17 -2
  83. package/dist/index.js +11 -2
  84. package/dist/metrics/InstrumentGrammar.d.ts +5 -0
  85. package/dist/metrics/InstrumentGrammar.js +12 -0
  86. package/dist/metrics/MetricScalar.d.ts +3 -0
  87. package/dist/metrics/MetricScalar.js +5 -0
  88. package/dist/node/AuditDigest.d.ts +3 -0
  89. package/dist/node/AuditDigest.js +6 -0
  90. package/dist/node/BrowserEventIngest.d.ts +7 -2
  91. package/dist/node/BrowserEventIngest.js +111 -19
  92. package/dist/node/LocalCollector.d.ts +20 -0
  93. package/dist/node/LocalCollector.js +188 -0
  94. package/dist/node/Observability.d.ts +49 -0
  95. package/dist/node/Observability.js +190 -0
  96. package/dist/node/Runtime.d.ts +4 -1
  97. package/dist/node/index.d.ts +4 -0
  98. package/dist/node/index.js +3 -0
  99. package/dist/policy/BrowserFieldPolicy.d.ts +7 -0
  100. package/dist/policy/BrowserFieldPolicy.js +298 -0
  101. package/dist/policy/DataPolicy.d.ts +19 -0
  102. package/dist/policy/DataPolicy.js +254 -0
  103. package/dist/policy/DataPolicyError.d.ts +22 -0
  104. package/dist/policy/DataPolicyError.js +25 -0
  105. package/dist/policy/Deduplication.d.ts +13 -0
  106. package/dist/policy/Deduplication.js +44 -0
  107. package/dist/policy/DefectEnvelope.d.ts +25 -0
  108. package/dist/policy/DefectEnvelope.js +52 -0
  109. package/dist/policy/MetricLabelPolicy.d.ts +5 -0
  110. package/dist/policy/MetricLabelPolicy.js +65 -0
  111. package/dist/policy/PolicyTransform.d.ts +16 -0
  112. package/dist/policy/PolicyTransform.js +136 -0
  113. package/dist/policy/PolicyVocabulary.d.ts +10 -0
  114. package/dist/policy/PolicyVocabulary.js +84 -0
  115. package/dist/policy/ResourceAttributePolicy.d.ts +9 -0
  116. package/dist/policy/ResourceAttributePolicy.js +33 -0
  117. package/dist/policy/entrypoint.d.ts +2 -0
  118. package/dist/policy/entrypoint.js +2 -0
  119. package/dist/policy/index.d.ts +17 -0
  120. package/dist/policy/index.js +9 -0
  121. package/dist/profile/DataPolicy.d.ts +2 -0
  122. package/dist/profile/DataPolicy.js +1 -0
  123. package/dist/profile/EnvironmentPolicy.d.ts +22 -0
  124. package/dist/profile/EnvironmentPolicy.js +41 -0
  125. package/dist/profile/LifecycleRegistry.d.ts +24 -0
  126. package/dist/profile/LifecycleRegistry.js +240 -0
  127. package/dist/profile/ObservabilityAdapter.d.ts +115 -0
  128. package/dist/profile/ObservabilityAdapter.js +50 -0
  129. package/dist/profile/ObservabilityConfig.d.ts +68 -0
  130. package/dist/profile/ObservabilityConfig.js +125 -0
  131. package/dist/profile/ObservabilityConfigError.d.ts +23 -0
  132. package/dist/profile/ObservabilityConfigError.js +39 -0
  133. package/dist/profile/ObservabilityProfile.d.ts +49 -0
  134. package/dist/profile/ObservabilityProfile.js +121 -0
  135. package/dist/profile/ReactWebProfile.d.ts +8 -0
  136. package/dist/profile/ReactWebProfile.js +7 -0
  137. package/dist/profile/index.d.ts +5 -0
  138. package/dist/profile/index.js +5 -0
  139. package/dist/testing/conformance/ConformanceAssertions.d.ts +5 -0
  140. package/dist/testing/conformance/ConformanceAssertions.js +31 -0
  141. package/dist/testing/conformance/ConformanceFailure.d.ts +35 -0
  142. package/dist/testing/conformance/ConformanceFailure.js +56 -0
  143. package/dist/testing/conformance/ConformanceModel.d.ts +97 -0
  144. package/dist/testing/conformance/ConformanceModel.js +8 -0
  145. package/dist/testing/conformance/ConformanceRegistry.d.ts +13 -0
  146. package/dist/testing/conformance/ConformanceRegistry.js +190 -0
  147. package/dist/testing/conformance/ConformanceRunner.d.ts +5 -0
  148. package/dist/testing/conformance/ConformanceRunner.js +198 -0
  149. package/dist/testing/conformance/TelemetryEvidence.d.ts +91 -0
  150. package/dist/testing/conformance/TelemetryEvidence.js +370 -0
  151. package/dist/testing/conformance/index.d.ts +10 -0
  152. package/dist/testing/conformance/index.js +6 -0
  153. package/dist/testing/contract.d.ts +81 -0
  154. package/dist/testing/contract.js +93 -0
  155. package/dist/testing/deployedCanary.d.ts +1 -0
  156. package/dist/testing/deployedCanary.js +1 -0
  157. package/dist/testing/index.d.ts +40 -3
  158. package/dist/testing/index.js +122 -5
  159. package/dist/trace/HttpServerOtlpTracer.d.ts +42 -0
  160. package/dist/trace/HttpServerOtlpTracer.js +301 -0
  161. package/package.json +16 -29
  162. package/dist/WideEvent.d.ts +0 -5
  163. package/dist/WideEvent.js +0 -6
  164. package/dist/nestjs/BrowserEventsController.d.ts +0 -21
  165. package/dist/nestjs/BrowserEventsController.js +0 -52
  166. package/dist/nestjs/HttpRoutePolicy.d.ts +0 -23
  167. package/dist/nestjs/HttpRoutePolicy.js +0 -179
  168. package/dist/nestjs/HttpServerOtlpTracer.d.ts +0 -15
  169. package/dist/nestjs/HttpServerOtlpTracer.js +0 -154
  170. package/dist/nestjs/RequestWideEventTraceCorrelation.d.ts +0 -15
  171. package/dist/nestjs/RequestWideEventTraceCorrelation.js +0 -13
  172. package/dist/nestjs/TelemetryInterceptor.d.ts +0 -31
  173. package/dist/nestjs/TelemetryInterceptor.js +0 -268
  174. package/dist/nestjs/TelemetryModule.d.ts +0 -53
  175. package/dist/nestjs/TelemetryModule.js +0 -428
  176. package/dist/nestjs/index.d.ts +0 -5
  177. package/dist/nestjs/index.js +0 -4
@@ -1,428 +0,0 @@
1
- import { Module } from "@nestjs/common";
2
- import { APP_INTERCEPTOR, HttpAdapterHost } from "@nestjs/core";
3
- import { Duration, Effect, Layer, ManagedRuntime, Option, Schema } from "effect";
4
- import { OtlpExporter as Otlp } from "effect/unstable/observability";
5
- import { layer } from "../Telemetry.js";
6
- import { OtlpEndpoint, TelemetryConfig } from "../TelemetryConfig.js";
7
- import { telemetryRoutePolicy } from "./HttpRoutePolicy.js";
8
- import { RequestWideEventTraceCorrelation } from "./RequestWideEventTraceCorrelation.js";
9
- import { TelemetryInterceptor, TelemetryRequestTracker } from "./TelemetryInterceptor.js";
10
- export class InvalidTelemetryModuleOptions extends Error {
11
- _tag = "InvalidTelemetryModuleOptions";
12
- code = "OBS_TELEMETRY_INVALID_MODULE_OPTIONS";
13
- cause;
14
- constructor(cause) {
15
- super("Telemetry module options are invalid. Provide valid service identity, HTTP OTLP endpoint, route templates, proxy policy, and shutdown timeout.", { cause });
16
- this.name = "InvalidTelemetryModuleOptions";
17
- this.cause = cause;
18
- }
19
- }
20
- export class TelemetryStartupError extends Error {
21
- _tag = "TelemetryStartupError";
22
- code = "OBS_TELEMETRY_STARTUP_FAILED";
23
- cause;
24
- constructor(cause) {
25
- super("Telemetry startup failed. Verify the OTLP transport and runtime configuration before restarting the application.", { cause });
26
- this.name = "TelemetryStartupError";
27
- this.cause = cause;
28
- }
29
- }
30
- export class TelemetryShutdownError extends Error {
31
- _tag = "TelemetryShutdownError";
32
- code = "OBS_TELEMETRY_SHUTDOWN_FAILED";
33
- cause;
34
- constructor(cause) {
35
- super("Telemetry shutdown failed. Telemetry resources were disposed, but the final drain or flush did not complete.", { cause });
36
- this.name = "TelemetryShutdownError";
37
- this.cause = cause;
38
- }
39
- }
40
- const Identity = Schema.NonEmptyString.check(Schema.makeFilter((value) => value.trim() === value, { expected: "a nonempty trimmed string" }));
41
- const ShutdownTimeout = Schema.Number.check(Schema.isInt(), Schema.makeFilter((value) => Number.isSafeInteger(value) && value > 0, {
42
- expected: "a positive safe integer",
43
- }));
44
- const EnabledOptions = Schema.Struct({
45
- enabled: Schema.Literal(true),
46
- serviceName: Identity,
47
- serviceVersion: Identity,
48
- environment: Identity,
49
- otlpEndpoint: OtlpEndpoint,
50
- healthRouteTemplates: Schema.Union([Schema.Array(Schema.String), Schema.Undefined]).pipe(Schema.optionalKey),
51
- proxyPolicy: Schema.Union([Schema.Literals(["direct", "framework"]), Schema.Undefined]).pipe(Schema.optionalKey),
52
- requestWideEventTraceCorrelation: Schema.Union([
53
- Schema.instanceOf(RequestWideEventTraceCorrelation),
54
- Schema.Undefined,
55
- ]).pipe(Schema.optionalKey),
56
- shutdownTimeoutMilliseconds: Schema.Union([ShutdownTimeout, Schema.Undefined]).pipe(Schema.optionalKey),
57
- });
58
- const DisabledOptions = Schema.Struct({ enabled: Schema.Literal(false) });
59
- const ModuleOptions = Schema.Union([DisabledOptions, EnabledOptions]);
60
- const decodeModuleOptions = Schema.decodeUnknownSync(ModuleOptions);
61
- const parseModuleOptions = (input) => {
62
- try {
63
- const options = decodeModuleOptions(input);
64
- if (!options.enabled) {
65
- return { enabled: false };
66
- }
67
- telemetryRoutePolicy({
68
- healthRouteTemplates: options.healthRouteTemplates,
69
- proxyPolicy: options.proxyPolicy,
70
- });
71
- return {
72
- enabled: true,
73
- config: new TelemetryConfig({
74
- serviceName: options.serviceName,
75
- serviceVersion: options.serviceVersion,
76
- environment: options.environment,
77
- otlpEndpoint: options.otlpEndpoint,
78
- }),
79
- healthRouteTemplates: options.healthRouteTemplates,
80
- proxyPolicy: options.proxyPolicy ?? "direct",
81
- requestWideEventTraceCorrelation: options.requestWideEventTraceCorrelation,
82
- shutdownTimeoutMilliseconds: options.shutdownTimeoutMilliseconds ?? 5_000,
83
- };
84
- }
85
- catch (cause) {
86
- throw new InvalidTelemetryModuleOptions(cause);
87
- }
88
- };
89
- class DisabledTelemetryInterceptor {
90
- intercept(_context, next) {
91
- return next.handle();
92
- }
93
- }
94
- class DisabledTelemetryIntegration {
95
- interceptor = new DisabledTelemetryInterceptor();
96
- beforeApplicationShutdown() { }
97
- onApplicationShutdown() { }
98
- }
99
- class EnabledTelemetryIntegration {
100
- interceptor;
101
- #runtime;
102
- #flusher;
103
- #requestTracker;
104
- #shutdownTimeoutMilliseconds;
105
- #releaseRuntime;
106
- #beforeRequestDrain;
107
- #shutdownPromise;
108
- #disposePromise;
109
- #shutdownError;
110
- constructor(runtime, flusher, options, releaseRuntime, beforeRequestDrain) {
111
- this.#runtime = runtime;
112
- this.#flusher = flusher;
113
- this.#releaseRuntime = releaseRuntime;
114
- this.#beforeRequestDrain = beforeRequestDrain;
115
- this.#requestTracker = new TelemetryRequestTracker();
116
- this.#shutdownTimeoutMilliseconds = options.shutdownTimeoutMilliseconds;
117
- this.interceptor = new TelemetryInterceptor(runtime, {
118
- healthRouteTemplates: options.healthRouteTemplates,
119
- proxyPolicy: options.proxyPolicy,
120
- requestTracker: this.#requestTracker,
121
- requestWideEventTraceCorrelation: options.requestWideEventTraceCorrelation,
122
- });
123
- }
124
- beforeApplicationShutdown() {
125
- this.#shutdownPromise ??= this.#shutdown();
126
- return this.#shutdownPromise;
127
- }
128
- async onApplicationShutdown() {
129
- try {
130
- await this.beforeApplicationShutdown();
131
- }
132
- catch (cause) {
133
- this.#recordShutdownError(cause);
134
- }
135
- finally {
136
- this.#disposePromise ??= this.#releaseRuntime();
137
- try {
138
- await this.#disposePromise;
139
- }
140
- catch (cause) {
141
- this.#recordShutdownError(cause);
142
- }
143
- }
144
- if (this.#shutdownError !== undefined) {
145
- throw this.#shutdownError;
146
- }
147
- }
148
- async #shutdown() {
149
- const deadline = Date.now() + this.#shutdownTimeoutMilliseconds;
150
- try {
151
- this.#requestTracker.closeAdmission();
152
- await this.#beforeRequestDrain();
153
- const idle = await this.#withinDeadline(this.#requestTracker.waitForIdle(), deadline);
154
- if (!idle) {
155
- this.#requestTracker.interruptActive();
156
- const interrupted = await this.#withinDeadline(this.#requestTracker.waitForIdle(), deadline);
157
- if (!interrupted) {
158
- this.#recordShutdownError(new Error("The telemetry request interruption exhausted the shutdown deadline."));
159
- }
160
- }
161
- }
162
- catch (cause) {
163
- this.#recordShutdownError(cause);
164
- }
165
- const remaining = Math.max(0, deadline - Date.now());
166
- if (remaining === 0) {
167
- this.#recordShutdownError(new Error("The telemetry request drain exhausted the shutdown deadline."));
168
- return;
169
- }
170
- try {
171
- const flushed = await this.#runtime.runPromise(this.#flusher.flush.pipe(Effect.timeoutOption(Duration.millis(remaining))));
172
- if (Option.isNone(flushed)) {
173
- this.#recordShutdownError(new Error("The telemetry flush exceeded the shutdown deadline."));
174
- }
175
- }
176
- catch (cause) {
177
- this.#recordShutdownError(cause);
178
- }
179
- }
180
- #recordShutdownError(cause) {
181
- if (this.#shutdownError === undefined) {
182
- this.#shutdownError =
183
- cause instanceof TelemetryShutdownError ? cause : new TelemetryShutdownError(cause);
184
- return;
185
- }
186
- this.#shutdownError = new TelemetryShutdownError(new AggregateError([this.#shutdownError.cause, cause]));
187
- }
188
- async #withinDeadline(operation, deadline) {
189
- const remaining = Math.max(0, deadline - Date.now());
190
- if (remaining === 0) {
191
- return false;
192
- }
193
- let timer;
194
- const timeout = new Promise((resolve) => {
195
- timer = setTimeout(() => resolve(false), remaining);
196
- });
197
- const completed = operation.then(() => true);
198
- try {
199
- return await Promise.race([completed, timeout]);
200
- }
201
- finally {
202
- if (timer !== undefined) {
203
- clearTimeout(timer);
204
- }
205
- }
206
- }
207
- }
208
- class DeferredTelemetryInterceptor {
209
- #target;
210
- setTarget(target) {
211
- this.#target = target;
212
- }
213
- intercept(context, next) {
214
- return this.#target?.intercept(context, next) ?? next.handle();
215
- }
216
- }
217
- class PendingTelemetryIntegration {
218
- interceptor = new DeferredTelemetryInterceptor();
219
- #application;
220
- #options;
221
- #state;
222
- #overrides;
223
- #integration;
224
- constructor(application, options, state, overrides) {
225
- this.#application = application;
226
- this.#options = options;
227
- this.#state = state;
228
- this.#overrides = overrides;
229
- }
230
- async onModuleInit() {
231
- const lease = await acquireApplicationRuntime(this.#application, this.#state, this.#options, this.#overrides);
232
- this.#integration = new EnabledTelemetryIntegration(lease.runtime, lease.flusher, this.#options, lease.release, this.#overrides.beforeRequestDrain ?? (() => undefined));
233
- this.interceptor.setTarget(this.#integration.interceptor);
234
- }
235
- beforeApplicationShutdown() {
236
- return this.#integration?.beforeApplicationShutdown();
237
- }
238
- onApplicationShutdown() {
239
- return this.#integration?.onApplicationShutdown();
240
- }
241
- }
242
- const ASYNC_OPTIONS = Symbol("TelemetryModuleAsyncOptions");
243
- const NORMALIZED_OPTIONS = Symbol("TelemetryModuleNormalizedOptions");
244
- const TELEMETRY_INTEGRATION = Symbol("TelemetryModuleIntegration");
245
- const runtimePool = new Map();
246
- const applicationRuntimes = new WeakMap();
247
- const runtimeKey = (options) => JSON.stringify([
248
- options.config.otlpEndpoint.toString(),
249
- options.config.serviceName,
250
- options.config.serviceVersion,
251
- options.config.environment,
252
- options.shutdownTimeoutMilliseconds,
253
- ]);
254
- const createSharedRuntime = async (options, overrides) => {
255
- let runtime;
256
- try {
257
- let runtimeLayer = layer(options.config, {
258
- shutdownTimeout: Duration.millis(options.shutdownTimeoutMilliseconds),
259
- });
260
- if (overrides.scopedResource !== undefined) {
261
- const resource = overrides.scopedResource;
262
- const resourceLayer = Layer.effectDiscard(Effect.acquireRelease(Effect.promise(() => Promise.resolve(resource.acquire())), () => Effect.promise(() => Promise.resolve(resource.release()))));
263
- runtimeLayer = Layer.merge(runtimeLayer, resourceLayer);
264
- }
265
- runtime = ManagedRuntime.make(runtimeLayer);
266
- await runtime.context();
267
- await (overrides.startupProbe ?? (() => undefined))();
268
- const flusher = await runtime.runPromise(Otlp.Flusher);
269
- return { runtime, flusher };
270
- }
271
- catch (cause) {
272
- if (runtime !== undefined) {
273
- try {
274
- await runtime.dispose();
275
- overrides.onRuntimeDisposed?.();
276
- }
277
- catch (disposeCause) {
278
- throw new TelemetryStartupError(new AggregateError([cause, disposeCause]));
279
- }
280
- }
281
- throw new TelemetryStartupError(cause);
282
- }
283
- };
284
- const acquireRuntime = async (options, overrides) => {
285
- const key = runtimeKey(options);
286
- let entry = runtimePool.get(key);
287
- if (entry?.closing !== undefined) {
288
- try {
289
- await entry.closing;
290
- }
291
- catch (cause) {
292
- throw new TelemetryStartupError(cause);
293
- }
294
- entry = runtimePool.get(key);
295
- }
296
- if (entry === undefined) {
297
- const shared = createSharedRuntime(options, overrides);
298
- entry = { shared, references: 0, closing: undefined };
299
- runtimePool.set(key, entry);
300
- try {
301
- await shared;
302
- }
303
- catch (cause) {
304
- if (runtimePool.get(key) === entry) {
305
- runtimePool.delete(key);
306
- }
307
- throw cause;
308
- }
309
- }
310
- const shared = await entry.shared;
311
- entry.references++;
312
- let releasePromise;
313
- const release = () => {
314
- if (releasePromise !== undefined) {
315
- return releasePromise;
316
- }
317
- entry.references--;
318
- if (entry.references > 0) {
319
- releasePromise = Promise.resolve();
320
- return releasePromise;
321
- }
322
- entry.closing = (async () => {
323
- let failure;
324
- try {
325
- await overrides.beforeRuntimeDispose?.();
326
- }
327
- catch (cause) {
328
- failure = new Error("Telemetry runtime disposal preparation failed.", { cause });
329
- }
330
- try {
331
- await shared.runtime.dispose();
332
- overrides.onRuntimeDisposed?.();
333
- }
334
- catch (cause) {
335
- failure =
336
- failure === undefined
337
- ? new Error("Telemetry runtime disposal failed.", { cause })
338
- : new AggregateError([failure, cause]);
339
- }
340
- if (failure !== undefined) {
341
- throw failure;
342
- }
343
- })().finally(() => {
344
- if (runtimePool.get(key) === entry) {
345
- runtimePool.delete(key);
346
- }
347
- });
348
- releasePromise = entry.closing;
349
- return releasePromise;
350
- };
351
- return { runtime: shared.runtime, flusher: shared.flusher, release };
352
- };
353
- const registerApplicationRuntime = (application, options) => {
354
- const key = runtimeKey(options);
355
- const state = applicationRuntimes.get(application);
356
- if (state === undefined) {
357
- const registered = {
358
- key,
359
- requestWideEventTraceCorrelation: options.requestWideEventTraceCorrelation,
360
- releases: new Set(),
361
- failed: false,
362
- };
363
- applicationRuntimes.set(application, registered);
364
- return registered;
365
- }
366
- if (state.key !== key ||
367
- state.requestWideEventTraceCorrelation !== options.requestWideEventTraceCorrelation) {
368
- state.failed = true;
369
- }
370
- return state;
371
- };
372
- const acquireApplicationRuntime = async (application, state, options, overrides) => {
373
- if (state.failed) {
374
- applicationRuntimes.delete(application);
375
- throw new InvalidTelemetryModuleOptions(new Error("TelemetryModule imports in one application must use one telemetry configuration."));
376
- }
377
- const lease = await acquireRuntime(options, overrides);
378
- const release = () => {
379
- state.releases.delete(release);
380
- if (state.releases.size === 0) {
381
- applicationRuntimes.delete(application);
382
- }
383
- return lease.release();
384
- };
385
- state.releases.add(release);
386
- return { runtime: lease.runtime, flusher: lease.flusher, release };
387
- };
388
- const makeIntegration = (options, application, overrides) => {
389
- if (!options.enabled) {
390
- return new DisabledTelemetryIntegration();
391
- }
392
- return new PendingTelemetryIntegration(application, options, registerApplicationRuntime(application, options), overrides);
393
- };
394
- const makeTelemetryModule = (options, overrides = {}) => {
395
- const providers = [
396
- {
397
- provide: ASYNC_OPTIONS,
398
- inject: options.inject ?? [],
399
- useFactory: options.useFactory,
400
- },
401
- {
402
- provide: NORMALIZED_OPTIONS,
403
- inject: [ASYNC_OPTIONS],
404
- useFactory: parseModuleOptions,
405
- },
406
- {
407
- provide: TELEMETRY_INTEGRATION,
408
- inject: [NORMALIZED_OPTIONS, HttpAdapterHost],
409
- useFactory: (normalized, application) => makeIntegration(normalized, application, overrides),
410
- },
411
- {
412
- provide: APP_INTERCEPTOR,
413
- inject: [TELEMETRY_INTEGRATION],
414
- useFactory: (integration) => integration.interceptor,
415
- },
416
- ];
417
- if (options.imports === undefined) {
418
- return { module: TelemetryModule, providers };
419
- }
420
- return { module: TelemetryModule, imports: options.imports, providers };
421
- };
422
- export const telemetryModuleForTesting = (options, overrides) => makeTelemetryModule(options, overrides);
423
- export class TelemetryModule {
424
- static forRootAsync(options) {
425
- return makeTelemetryModule(options);
426
- }
427
- }
428
- Module({})(TelemetryModule);
@@ -1,5 +0,0 @@
1
- export { BrowserEventsRejection, createBrowserEventsController, defaultBrowserEventsPath, type BrowserEventsControllerOptions, } from "./BrowserEventsController.js";
2
- export { requestSpan, TelemetryInterceptor, TelemetryRequestTracker, withRequestSpan, type TelemetryInterceptorOptions, } from "./TelemetryInterceptor.js";
3
- export { createRequestWideEventTraceCorrelation, RequestWideEventTraceCorrelation, type RequestReference, type RequestWideEventLogger, type RequestWideEventLoggerResolver, type ServerSpanCorrelation, } from "./RequestWideEventTraceCorrelation.js";
4
- export type { ProxyPolicy, TelemetryRoutePolicyOptions } from "./HttpRoutePolicy.js";
5
- export { InvalidTelemetryModuleOptions, TelemetryModule, TelemetryShutdownError, TelemetryStartupError, type TelemetryModuleAsyncOptions, type TelemetryModuleOptions, } from "./TelemetryModule.js";
@@ -1,4 +0,0 @@
1
- export { BrowserEventsRejection, createBrowserEventsController, defaultBrowserEventsPath, } from "./BrowserEventsController.js";
2
- export { requestSpan, TelemetryInterceptor, TelemetryRequestTracker, withRequestSpan, } from "./TelemetryInterceptor.js";
3
- export { createRequestWideEventTraceCorrelation, RequestWideEventTraceCorrelation, } from "./RequestWideEventTraceCorrelation.js";
4
- export { InvalidTelemetryModuleOptions, TelemetryModule, TelemetryShutdownError, TelemetryStartupError, } from "./TelemetryModule.js";