langwatch 1.19.0 → 2.0.0

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 (91) hide show
  1. package/README.md +27 -13
  2. package/dist/agent/index.d.mts +122 -79
  3. package/dist/agent/index.d.ts +122 -79
  4. package/dist/agent/index.js +541 -301
  5. package/dist/agent/index.js.map +1 -1
  6. package/dist/agent/index.mjs +540 -302
  7. package/dist/agent/index.mjs.map +1 -1
  8. package/dist/{chunk-NPEK4RSD.mjs → chunk-2GKEMCKT.mjs} +7757 -2409
  9. package/dist/chunk-2GKEMCKT.mjs.map +1 -0
  10. package/dist/chunk-5VYEG3RS.js +117 -0
  11. package/dist/chunk-5VYEG3RS.js.map +1 -0
  12. package/dist/chunk-AYPQNLCC.mjs +852 -0
  13. package/dist/chunk-AYPQNLCC.mjs.map +1 -0
  14. package/dist/chunk-BL3GHEKF.js +59 -0
  15. package/dist/chunk-BL3GHEKF.js.map +1 -0
  16. package/dist/chunk-C7IWJ2GJ.mjs +59 -0
  17. package/dist/chunk-C7IWJ2GJ.mjs.map +1 -0
  18. package/dist/chunk-DLZCOUXC.js +852 -0
  19. package/dist/chunk-DLZCOUXC.js.map +1 -0
  20. package/dist/{chunk-O4J3ZPZY.js → chunk-F7BVJW3S.js} +7912 -2564
  21. package/dist/chunk-F7BVJW3S.js.map +1 -0
  22. package/dist/{chunk-SY5HSL5G.mjs → chunk-M3DSPR5S.mjs} +124 -112
  23. package/dist/chunk-M3DSPR5S.mjs.map +1 -0
  24. package/dist/{chunk-CSV7B7B5.js → chunk-MAO3SIBB.js} +141 -129
  25. package/dist/chunk-MAO3SIBB.js.map +1 -0
  26. package/dist/{chunk-LCG5Y2EG.js → chunk-N76BG37W.js} +15 -101
  27. package/dist/chunk-N76BG37W.js.map +1 -0
  28. package/dist/chunk-SERULD4Z.mjs +117 -0
  29. package/dist/chunk-SERULD4Z.mjs.map +1 -0
  30. package/dist/{chunk-73QOHSHU.js → chunk-WDUUAIG3.js} +2 -2
  31. package/dist/chunk-WDUUAIG3.js.map +1 -0
  32. package/dist/{chunk-WMDQVWA6.mjs → chunk-WSGVZ3J2.mjs} +22 -108
  33. package/dist/chunk-WSGVZ3J2.mjs.map +1 -0
  34. package/dist/{chunk-57L2K66L.mjs → chunk-XQ4CP2JK.mjs} +2 -2
  35. package/dist/chunk-XQ4CP2JK.mjs.map +1 -0
  36. package/dist/cli/bundle.js +853 -552
  37. package/dist/implementation-BXVPzwOt.d.mts +261 -0
  38. package/dist/implementation-DJ-JveZl.d.ts +261 -0
  39. package/dist/index.d.mts +479 -1130
  40. package/dist/index.d.ts +479 -1130
  41. package/dist/index.js +7908 -3525
  42. package/dist/index.js.map +1 -1
  43. package/dist/index.mjs +7883 -3500
  44. package/dist/index.mjs.map +1 -1
  45. package/dist/observability-sdk/index.d.mts +16 -76
  46. package/dist/observability-sdk/index.d.ts +16 -76
  47. package/dist/observability-sdk/index.js +8 -5
  48. package/dist/observability-sdk/index.js.map +1 -1
  49. package/dist/observability-sdk/index.mjs +13 -10
  50. package/dist/observability-sdk/instrumentation/langchain/index.d.mts +3 -5
  51. package/dist/observability-sdk/instrumentation/langchain/index.d.ts +3 -5
  52. package/dist/observability-sdk/instrumentation/langchain/index.js +160 -112
  53. package/dist/observability-sdk/instrumentation/langchain/index.js.map +1 -1
  54. package/dist/observability-sdk/instrumentation/langchain/index.mjs +148 -100
  55. package/dist/observability-sdk/instrumentation/langchain/index.mjs.map +1 -1
  56. package/dist/observability-sdk/semconv/index.d.mts +37 -0
  57. package/dist/observability-sdk/semconv/index.d.ts +37 -0
  58. package/dist/observability-sdk/semconv/index.js +121 -0
  59. package/dist/observability-sdk/semconv/index.js.map +1 -0
  60. package/dist/observability-sdk/semconv/index.mjs +121 -0
  61. package/dist/observability-sdk/semconv/index.mjs.map +1 -0
  62. package/dist/observability-sdk/setup/node/index.d.mts +73 -313
  63. package/dist/observability-sdk/setup/node/index.d.ts +73 -313
  64. package/dist/observability-sdk/setup/node/index.js +6 -4
  65. package/dist/observability-sdk/setup/node/index.js.map +1 -1
  66. package/dist/observability-sdk/setup/node/index.mjs +5 -3
  67. package/dist/types--ExXvd26.d.mts +16583 -0
  68. package/dist/{types-VOZv9LYO.d.ts → types-CoS5PmeU.d.mts} +22 -59
  69. package/dist/{types-VOZv9LYO.d.mts → types-CoS5PmeU.d.ts} +22 -59
  70. package/dist/types-CpT3iEIj.d.ts +16583 -0
  71. package/dist/{types-DLfhJb38.d.mts → types-RkiBQZ9j.d.mts} +1 -6
  72. package/dist/{types-DLfhJb38.d.ts → types-RkiBQZ9j.d.ts} +1 -6
  73. package/dist/values-1yj9l0Sa.d.mts +112 -0
  74. package/dist/values-1yj9l0Sa.d.ts +112 -0
  75. package/package.json +94 -64
  76. package/dist/chunk-57L2K66L.mjs.map +0 -1
  77. package/dist/chunk-73QOHSHU.js.map +0 -1
  78. package/dist/chunk-CSV7B7B5.js.map +0 -1
  79. package/dist/chunk-LCG5Y2EG.js.map +0 -1
  80. package/dist/chunk-NPEK4RSD.mjs.map +0 -1
  81. package/dist/chunk-O4J3ZPZY.js.map +0 -1
  82. package/dist/chunk-PIYOJF6V.mjs +0 -566
  83. package/dist/chunk-PIYOJF6V.mjs.map +0 -1
  84. package/dist/chunk-SY5HSL5G.mjs.map +0 -1
  85. package/dist/chunk-WGLVIV4J.js +0 -566
  86. package/dist/chunk-WGLVIV4J.js.map +0 -1
  87. package/dist/chunk-WMDQVWA6.mjs.map +0 -1
  88. package/dist/implementation-CeTvnq6e.d.mts +0 -716
  89. package/dist/implementation-CsQrexpY.d.ts +0 -716
  90. package/dist/types-ofe1fAYQ.d.mts +0 -38143
  91. package/dist/types-wuYJPoFb.d.ts +0 -38143
@@ -0,0 +1,852 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+ var _chunkMAO3SIBBjs = require('./chunk-MAO3SIBB.js');
11
+
12
+
13
+
14
+
15
+ var _chunk5VYEG3RSjs = require('./chunk-5VYEG3RS.js');
16
+
17
+
18
+
19
+
20
+
21
+ var _chunkN76BG37Wjs = require('./chunk-N76BG37W.js');
22
+
23
+ // src/observability-sdk/setup/node/setup.ts
24
+ var _api = require('@opentelemetry/api');
25
+
26
+
27
+
28
+
29
+
30
+ var _sdklogs = require('@opentelemetry/sdk-logs');
31
+
32
+
33
+
34
+
35
+ var _sdktracebase = require('@opentelemetry/sdk-trace-base');
36
+
37
+ // src/internal/endpoint.ts
38
+ var isSet = (value) => typeof value === "string" && value.trim() !== "";
39
+ var normalizeEndpoint = (endpoint) => {
40
+ const trimmed = endpoint.trim();
41
+ let end = trimmed.length;
42
+ while (end > 0 && trimmed[end - 1] === "/") end--;
43
+ return trimmed.slice(0, end);
44
+ };
45
+ var resolveEndpoint = (endpoint) => {
46
+ for (const candidate of [endpoint, process.env.LANGWATCH_ENDPOINT]) {
47
+ if (!isSet(candidate)) continue;
48
+ const normalized = normalizeEndpoint(candidate);
49
+ if (normalized !== "") return normalized;
50
+ }
51
+ return normalizeEndpoint(_chunkMAO3SIBBjs.DEFAULT_ENDPOINT);
52
+ };
53
+
54
+ // src/observability-sdk/setup/utils.ts
55
+ var _resources = require('@opentelemetry/resources');
56
+ function createMergedResource(attributes, serviceName, givenResource) {
57
+ const langwatchResource = _resources.resourceFromAttributes.call(void 0, {
58
+ [_chunkN76BG37Wjs.ATTR_LANGWATCH_SDK_NAME]: _chunkMAO3SIBBjs.LANGWATCH_SDK_NAME_OBSERVABILITY,
59
+ [_chunkN76BG37Wjs.ATTR_LANGWATCH_SDK_LANGUAGE]: _chunkMAO3SIBBjs.LANGWATCH_SDK_LANGUAGE,
60
+ [_chunkN76BG37Wjs.ATTR_LANGWATCH_SDK_VERSION]: _chunkMAO3SIBBjs.LANGWATCH_SDK_VERSION
61
+ });
62
+ const userResource = _resources.resourceFromAttributes.call(void 0, _chunkN76BG37Wjs.__spreadValues.call(void 0, {
63
+ [_chunk5VYEG3RSjs.ATTR_SERVICE_NAME]: serviceName != null ? serviceName : _chunkMAO3SIBBjs.DEFAULT_SERVICE_NAME
64
+ }, attributes));
65
+ return (givenResource != null ? givenResource : _resources.defaultResource.call(void 0, )).merge(langwatchResource).merge(userResource);
66
+ }
67
+ function readMember(value, key) {
68
+ if (value === null || value === void 0) return void 0;
69
+ return Reflect.get(Object(value), key);
70
+ }
71
+ function callMember(target, key, args) {
72
+ const member = readMember(target, key);
73
+ if (typeof member !== "function") throw new TypeError(`${key} is not a function`);
74
+ return Reflect.apply(member, target, args);
75
+ }
76
+ function listProcessorRegistryCandidates(provider) {
77
+ return [
78
+ readMember(readMember(provider, "_activeSpanProcessor"), "_spanProcessors"),
79
+ readMember(readMember(provider, "activeSpanProcessor"), "_spanProcessors"),
80
+ readMember(provider, "_registeredSpanProcessors")
81
+ ];
82
+ }
83
+ function hasAttachableProcessorRegistry(obj) {
84
+ if (!obj || typeof obj !== "object") return false;
85
+ return listProcessorRegistryCandidates(obj).some(Array.isArray);
86
+ }
87
+ function isConcreteProviderName(name) {
88
+ return typeof name === "string" && ["NodeTracerProvider", "BasicTracerProvider"].includes(name);
89
+ }
90
+ function getConcreteProvider(provider) {
91
+ if (!provider || typeof provider !== "object") return void 0;
92
+ const constructorName = readMember(provider.constructor, "name");
93
+ if (isConcreteProviderName(constructorName)) {
94
+ return provider;
95
+ }
96
+ if (typeof readMember(provider, "addSpanProcessor") === "function") {
97
+ return provider;
98
+ }
99
+ if (hasAttachableProcessorRegistry(provider)) {
100
+ return provider;
101
+ }
102
+ let delegate;
103
+ if (typeof readMember(provider, "getDelegate") === "function") {
104
+ delegate = callMember(provider, "getDelegate", []);
105
+ } else if (readMember(provider, "delegate")) {
106
+ delegate = readMember(provider, "delegate");
107
+ } else if (readMember(provider, "_delegate")) {
108
+ delegate = readMember(provider, "_delegate");
109
+ }
110
+ if (!delegate || typeof delegate !== "object") return void 0;
111
+ const delegateConstructorName = readMember(delegate.constructor, "name");
112
+ if (isConcreteProviderName(delegateConstructorName)) {
113
+ return delegate;
114
+ }
115
+ if (typeof readMember(delegate, "addSpanProcessor") === "function") {
116
+ return delegate;
117
+ }
118
+ if (hasAttachableProcessorRegistry(delegate)) {
119
+ return delegate;
120
+ }
121
+ return void 0;
122
+ }
123
+ function isConcreteProvider(provider) {
124
+ return !!getConcreteProvider(provider);
125
+ }
126
+
127
+ // src/observability-sdk/setup/node/node-sdk.ts
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+ var _apilogs = require('@opentelemetry/api-logs');
137
+ var _contextasynchooks = require('@opentelemetry/context-async-hooks');
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+ var _core = require('@opentelemetry/core');
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+ var _sdktracenode = require('@opentelemetry/sdk-trace-node');
160
+
161
+ // src/observability-sdk/setup/node/optional-peers.ts
162
+ var _module = require('module');
163
+ function requireOptionalPeer({
164
+ packageName,
165
+ neededFor
166
+ }) {
167
+ try {
168
+ const base = typeof __filename === "string" ? __filename : void 0;
169
+ return _module.createRequire.call(void 0, base)(packageName);
170
+ } catch (cause) {
171
+ throw new Error(
172
+ `${neededFor} needs ${packageName}, which is not installed. Install it next to langwatch: npm install ${packageName}`,
173
+ { cause }
174
+ );
175
+ }
176
+ }
177
+ function loadInstrumentation() {
178
+ return requireOptionalPeer({
179
+ packageName: "@opentelemetry/instrumentation",
180
+ neededFor: "Passing instrumentations"
181
+ });
182
+ }
183
+ function loadSdkMetrics() {
184
+ return requireOptionalPeer({
185
+ packageName: "@opentelemetry/sdk-metrics",
186
+ neededFor: "Passing a metricReader"
187
+ });
188
+ }
189
+
190
+ // src/observability-sdk/setup/node/node-sdk.ts
191
+ var BUILT_IN_PROPAGATORS = {
192
+ tracecontext: () => new (0, _core.W3CTraceContextPropagator)(),
193
+ baggage: () => new (0, _core.W3CBaggagePropagator)()
194
+ };
195
+ var SEPARATELY_PACKAGED_PROPAGATORS = {
196
+ b3: "@opentelemetry/propagator-b3",
197
+ b3multi: "@opentelemetry/propagator-b3",
198
+ jaeger: "@opentelemetry/propagator-jaeger"
199
+ };
200
+ var RESOURCE_DETECTORS_BY_ENV_NAME = {
201
+ host: _resources.hostDetector,
202
+ os: _resources.osDetector,
203
+ serviceinstance: _resources.serviceInstanceIdDetector,
204
+ process: _resources.processDetector,
205
+ env: _resources.envDetector
206
+ };
207
+ function setupContextManager(contextManager) {
208
+ if (contextManager === null) return;
209
+ if (contextManager === void 0) {
210
+ const defaultContextManager = new (0, _contextasynchooks.AsyncLocalStorageContextManager)();
211
+ defaultContextManager.enable();
212
+ _api.context.setGlobalContextManager(defaultContextManager);
213
+ return;
214
+ }
215
+ contextManager.enable();
216
+ _api.context.setGlobalContextManager(contextManager);
217
+ }
218
+ function setupPropagator(propagator) {
219
+ if (propagator === null) return;
220
+ if (propagator === void 0) {
221
+ _api.propagation.setGlobalPropagator(
222
+ new (0, _core.CompositePropagator)({
223
+ propagators: [new (0, _core.W3CTraceContextPropagator)(), new (0, _core.W3CBaggagePropagator)()]
224
+ })
225
+ );
226
+ return;
227
+ }
228
+ _api.propagation.setGlobalPropagator(propagator);
229
+ }
230
+ function getPropagatorFromEnv(logger) {
231
+ var _a;
232
+ const requested = _core.getStringListFromEnv.call(void 0, "OTEL_PROPAGATORS");
233
+ if (requested == null) return void 0;
234
+ if (requested.includes("none")) return null;
235
+ const built = [];
236
+ const uniqueNames = Array.from(new Set(requested));
237
+ for (const name of uniqueNames) {
238
+ const propagator = (_a = BUILT_IN_PROPAGATORS[name]) == null ? void 0 : _a.call(BUILT_IN_PROPAGATORS);
239
+ if (propagator) {
240
+ built.push(propagator);
241
+ continue;
242
+ }
243
+ const separatePackage = SEPARATELY_PACKAGED_PROPAGATORS[name];
244
+ logger.warn(
245
+ separatePackage ? `OTEL_PROPAGATORS asks for "${name}", which lives in ${separatePackage}. LangWatch does not build it; construct it yourself and pass it as textMapPropagator, or trace context will not travel as "${name}".` : `Propagator "${name}" requested through the environment variable OTEL_PROPAGATORS is unavailable.`
246
+ );
247
+ }
248
+ if (built.length === 0) return null;
249
+ if (built.length === 1) return built[0];
250
+ return new (0, _core.CompositePropagator)({ propagators: built });
251
+ }
252
+ function getResourceDetectorsFromEnv(logger) {
253
+ var _a;
254
+ const requested = (_a = _core.getStringListFromEnv.call(void 0, "OTEL_NODE_RESOURCE_DETECTORS")) != null ? _a : ["all"];
255
+ if (requested.includes("all")) return Object.values(RESOURCE_DETECTORS_BY_ENV_NAME);
256
+ if (requested.includes("none")) return [];
257
+ return requested.flatMap((name) => {
258
+ const detector = RESOURCE_DETECTORS_BY_ENV_NAME[name];
259
+ if (!detector) {
260
+ logger.warn(
261
+ `Invalid resource detector "${name}" specified in the environment variable OTEL_NODE_RESOURCE_DETECTORS`
262
+ );
263
+ return [];
264
+ }
265
+ return [detector];
266
+ });
267
+ }
268
+ function getLogRecordLimitsFromEnv() {
269
+ var _a, _b;
270
+ return {
271
+ attributeCountLimit: (_a = _core.getNumberFromEnv.call(void 0, "OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT")) != null ? _a : _core.getNumberFromEnv.call(void 0, "OTEL_ATTRIBUTE_COUNT_LIMIT"),
272
+ attributeValueLengthLimit: (_b = _core.getNumberFromEnv.call(void 0, "OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT")) != null ? _b : _core.getNumberFromEnv.call(void 0, "OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT")
273
+ };
274
+ }
275
+ var NodeSdk = class {
276
+ constructor(configuration) {
277
+ var _a, _b;
278
+ this.disabled = _core.getBooleanFromEnv.call(void 0, "OTEL_SDK_DISABLED");
279
+ const logLevel = _core.getStringFromEnv.call(void 0, "OTEL_LOG_LEVEL");
280
+ if (logLevel != null) {
281
+ _api.diag.setLogger(new (0, _api.DiagConsoleLogger)(), { logLevel: _core.diagLogLevelFromString.call(void 0, logLevel) });
282
+ }
283
+ this.configuration = configuration;
284
+ this.instrumentations = (_b = (_a = configuration.instrumentations) == null ? void 0 : _a.flat()) != null ? _b : [];
285
+ }
286
+ /** Registers instrumentations, context manager, propagator and providers, in that order. */
287
+ start() {
288
+ var _a;
289
+ if (this.disabled) return;
290
+ if (this.instrumentations.length > 0) {
291
+ loadInstrumentation().registerInstrumentations({ instrumentations: this.instrumentations });
292
+ }
293
+ setupContextManager(this.configuration.contextManager);
294
+ setupPropagator(
295
+ (_a = this.configuration.textMapPropagator) != null ? _a : getPropagatorFromEnv(this.configuration.logger)
296
+ );
297
+ const resource = this.resolveResource();
298
+ this.startMeterProvider(resource);
299
+ this.startTracerProvider(resource);
300
+ this.startLoggerProvider(resource);
301
+ }
302
+ /** Flushes and closes every provider this instance registered. */
303
+ async shutdown() {
304
+ const shutdowns = [];
305
+ if (this.tracerProvider) shutdowns.push(this.tracerProvider.shutdown());
306
+ if (this.loggerProvider) shutdowns.push(this.loggerProvider.shutdown());
307
+ if (this.meterProvider) shutdowns.push(this.meterProvider.shutdown());
308
+ await Promise.all(shutdowns);
309
+ }
310
+ startMeterProvider(resource) {
311
+ var _a;
312
+ const reader = this.configuration.metricReader;
313
+ if (!reader) return;
314
+ const { MeterProvider: MeterProviderClass } = loadSdkMetrics();
315
+ this.meterProvider = new MeterProviderClass({
316
+ resource,
317
+ views: (_a = this.configuration.views) != null ? _a : [],
318
+ readers: [reader]
319
+ });
320
+ _api.metrics.setGlobalMeterProvider(this.meterProvider);
321
+ for (const instrumentation of this.instrumentations) {
322
+ instrumentation.setMeterProvider(_api.metrics.getMeterProvider());
323
+ }
324
+ }
325
+ startTracerProvider(resource) {
326
+ var _a;
327
+ const spanProcessors = (_a = this.configuration.spanProcessors) != null ? _a : [];
328
+ if (spanProcessors.length === 0) return;
329
+ this.tracerProvider = new (0, _sdktracenode.NodeTracerProvider)({
330
+ sampler: this.configuration.sampler,
331
+ spanLimits: this.configuration.spanLimits,
332
+ resource,
333
+ idGenerator: this.configuration.idGenerator,
334
+ spanProcessors
335
+ });
336
+ _api.trace.setGlobalTracerProvider(this.tracerProvider);
337
+ }
338
+ startLoggerProvider(resource) {
339
+ const processors = this.configuration.logRecordProcessors;
340
+ if (!processors) return;
341
+ this.loggerProvider = new (0, _sdklogs.LoggerProvider)({
342
+ logRecordLimits: getLogRecordLimitsFromEnv(),
343
+ resource,
344
+ processors
345
+ });
346
+ _apilogs.logs.setGlobalLoggerProvider(this.loggerProvider);
347
+ }
348
+ resolveResource() {
349
+ var _a, _b;
350
+ let resource = (_a = this.configuration.resource) != null ? _a : _resources.defaultResource.call(void 0, );
351
+ if ((_b = this.configuration.autoDetectResources) != null ? _b : true) {
352
+ resource = resource.merge(_resources.detectResources.call(void 0, { detectors: this.resolveResourceDetectors() }));
353
+ }
354
+ return this.configuration.serviceName === void 0 ? resource : resource.merge(
355
+ _resources.resourceFromAttributes.call(void 0, { [_chunk5VYEG3RSjs.ATTR_SERVICE_NAME]: this.configuration.serviceName })
356
+ );
357
+ }
358
+ resolveResourceDetectors() {
359
+ if (this.configuration.resourceDetectors != null) return this.configuration.resourceDetectors;
360
+ if (_core.getStringFromEnv.call(void 0, "OTEL_NODE_RESOURCE_DETECTORS")) {
361
+ return getResourceDetectorsFromEnv(this.configuration.logger);
362
+ }
363
+ return [_resources.envDetector, _resources.processDetector, _resources.hostDetector];
364
+ }
365
+ };
366
+
367
+ // src/observability-sdk/setup/node/setup.ts
368
+ var createNoOpHandle = (logger) => ({
369
+ shutdown: async () => {
370
+ logger.debug("Shutdown called for LangWatch no-op. Nothing will be shutdown");
371
+ }
372
+ });
373
+ var getLangWatchConfig = (options) => {
374
+ var _a, _b;
375
+ const isDisabled = options.langwatch === "disabled";
376
+ const config = typeof options.langwatch === "object" ? options.langwatch : {};
377
+ return {
378
+ disabled: isDisabled,
379
+ apiKey: isDisabled ? void 0 : (_a = config.apiKey) != null ? _a : process.env.LANGWATCH_API_KEY,
380
+ endpoint: isDisabled ? void 0 : resolveEndpoint(config.endpoint),
381
+ processorType: (_b = config.processorType) != null ? _b : "batch"
382
+ };
383
+ };
384
+ var checkForEarlyExit = (options, logger) => {
385
+ var _a, _b;
386
+ const globalProvider = _api.trace.getTracerProvider();
387
+ const alreadySetup = isConcreteProvider(globalProvider);
388
+ if (alreadySetup && !((_a = options.advanced) == null ? void 0 : _a.UNSAFE_forceOpenTelemetryReinitialization)) {
389
+ if ((_b = options.advanced) == null ? void 0 : _b.attachToExistingProvider) {
390
+ return null;
391
+ }
392
+ logger.error(
393
+ `OpenTelemetry is already set up in this process.
394
+ Spans will NOT be sent to LangWatch unless you add the LangWatch span processor or exporter to your existing OpenTelemetry setup.
395
+ You must either:
396
+ 1. Remove your existing OpenTelemetry setup and only use LangWatch,
397
+ 2. Add the LangWatch span processor to your existing setup, or replace the existing exporter with the LangWatch exporter.
398
+ 3. Use advanced.attachToExistingProvider to let LangWatch attach its processors to the existing provider.
399
+
400
+ For step-by-step instructions, see the LangWatch docs and check out the integration guide for your framework:
401
+ https://docs.langwatch.ai/integration/typescript/guide
402
+
403
+ See also: https://github.com/open-telemetry/opentelemetry-js/issues/5299`
404
+ );
405
+ return createNoOpHandle(logger);
406
+ }
407
+ if (alreadySetup) {
408
+ logger.warn(
409
+ "OpenTelemetry is already set up, but UNSAFE_forceOpenTelemetryReinitialization=true. Proceeding with reinitialization. This may cause conflicts."
410
+ );
411
+ }
412
+ return null;
413
+ };
414
+ var warnIfMisconfigured = (options, langwatch, logger) => {
415
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
416
+ if (langwatch.disabled) {
417
+ const hasAlternativeExport = (_h = (_g = (_e = (_c = (_a = options.spanProcessors) == null ? void 0 : _a.length) != null ? _c : (_b = options.logRecordProcessors) == null ? void 0 : _b.length) != null ? _e : (_d = options.debug) == null ? void 0 : _d.consoleTracing) != null ? _g : (_f = options.debug) == null ? void 0 : _f.consoleLogging) != null ? _h : options.traceExporter;
418
+ if (!hasAlternativeExport) {
419
+ const errorMessage = "LangWatch integration is disabled but no custom span processors, trace exporters, or console tracing is configured. OpenTelemetry will be set up but traces will not be exported anywhere. Either:\n 1. Enable LangWatch integration (remove langwatch: 'disabled')\n 2. Provide custom spanProcessors, logRecordProcessors, or traceExporter\n 3. Enable debug.consoleTracing or debug.consoleLogging for development\n 4. Use advanced.disabled to completely disable observability\n 5. Use advanced.skipOpenTelemetrySetup to handle OpenTelemetry setup yourself";
420
+ if ((_i = options.advanced) == null ? void 0 : _i.throwOnSetupError) {
421
+ throw new Error(errorMessage);
422
+ } else {
423
+ logger.error(errorMessage);
424
+ }
425
+ }
426
+ }
427
+ };
428
+ var GRPC_TRACE_EXPORTER_PACKAGE = "@opentelemetry/exporter-trace-otlp-grpc";
429
+ var refuseUnservedGrpc = (options) => {
430
+ var _a, _b;
431
+ if (options.otlpProtocol !== "grpc") return;
432
+ if ((_b = options.traceExporter) != null ? _b : (_a = options.spanProcessors) == null ? void 0 : _a.length) return;
433
+ throw new Error(
434
+ `otlpProtocol is set to "grpc" but nothing was given to export over gRPC with. Install ${GRPC_TRACE_EXPORTER_PACKAGE} and pass its OTLPTraceExporter as traceExporter (or wrap it in a span processor and pass it in spanProcessors). LangWatch's own exporter speaks HTTP and is never used for gRPC export.`
435
+ );
436
+ };
437
+ var settleAfterSignalFlush = ({
438
+ signal,
439
+ logger,
440
+ exitProcessAfterShutdown
441
+ }) => {
442
+ if (exitProcessAfterShutdown) {
443
+ logger.debug(
444
+ `${signal}: flush complete, exiting because UNSAFE_exitProcessAfterAutoShutdown is set`
445
+ );
446
+ process.exit(0);
447
+ return;
448
+ }
449
+ const otherListenerCount = process.listenerCount(signal);
450
+ if (otherListenerCount > 0) {
451
+ logger.debug(
452
+ `${signal}: flush complete, leaving the process to the ${otherListenerCount} other listener(s)`
453
+ );
454
+ return;
455
+ }
456
+ logger.debug(`${signal}: flush complete and nothing else is listening, re-raising`);
457
+ process.kill(process.pid, signal);
458
+ };
459
+ var registerAutoShutdownHandlers = ({
460
+ sdk,
461
+ logger,
462
+ exitProcessAfterShutdown
463
+ }) => {
464
+ let isShuttingDown = false;
465
+ const registrations = [];
466
+ const register = (event, handler) => {
467
+ registrations.push({ event, handler });
468
+ process.on(event, handler);
469
+ };
470
+ const unregisterAll = () => {
471
+ for (const { event, handler } of registrations) {
472
+ process.removeListener(event, handler);
473
+ }
474
+ registrations.length = 0;
475
+ };
476
+ const flush = async (reason) => {
477
+ logger.debug(`${reason}: shutting down OpenTelemetry...`);
478
+ try {
479
+ await sdk.shutdown();
480
+ logger.debug("OpenTelemetry shutdown complete");
481
+ } catch (err) {
482
+ logger.error("Error shutting down OpenTelemetry", err);
483
+ }
484
+ };
485
+ const beginShutdown = () => {
486
+ if (isShuttingDown) return false;
487
+ isShuttingDown = true;
488
+ unregisterAll();
489
+ return true;
490
+ };
491
+ register("beforeExit", () => {
492
+ if (!beginShutdown()) return;
493
+ void flush("beforeExit");
494
+ });
495
+ for (const signal of ["SIGINT", "SIGTERM"]) {
496
+ register(signal, () => {
497
+ if (!beginShutdown()) return;
498
+ void flush(signal).then(
499
+ () => settleAfterSignalFlush({ signal, logger, exitProcessAfterShutdown })
500
+ );
501
+ });
502
+ }
503
+ };
504
+ function setupObservability(options = {}) {
505
+ var _a, _b, _c, _d, _e, _f, _g, _h;
506
+ const logger = (_d = (_a = options.debug) == null ? void 0 : _a.logger) != null ? _d : new (0, _chunk5VYEG3RSjs.ConsoleLogger)({
507
+ level: (_c = (_b = options.debug) == null ? void 0 : _b.logLevel) != null ? _c : "warn",
508
+ prefix: "LangWatch Observability SDK"
509
+ });
510
+ _chunk5VYEG3RSjs.initializeObservabilitySdkConfig.call(void 0, {
511
+ logger,
512
+ dataCapture: options.dataCapture
513
+ });
514
+ if ((_e = options.advanced) == null ? void 0 : _e.disabled) {
515
+ logger.debug("Observability disabled via advanced.disabled");
516
+ return createNoOpHandle(logger);
517
+ }
518
+ if ((_f = options.advanced) == null ? void 0 : _f.skipOpenTelemetrySetup) {
519
+ logger.debug("Skipping OpenTelemetry setup");
520
+ return createNoOpHandle(logger);
521
+ }
522
+ if (options.tracerProvider) {
523
+ return setupDedicatedProviderOrNoOp(options.tracerProvider, options, logger);
524
+ }
525
+ const earlyExit = checkForEarlyExit(options, logger);
526
+ if (earlyExit) return earlyExit;
527
+ try {
528
+ const globalProvider = _api.trace.getTracerProvider();
529
+ const existingProvider = getConcreteProvider(globalProvider);
530
+ if (((_g = options.advanced) == null ? void 0 : _g.attachToExistingProvider) && existingProvider) {
531
+ return attachToExistingProviderOrNoOp(existingProvider, options, logger);
532
+ }
533
+ const sdk = createAndStartNodeSdk(
534
+ options,
535
+ logger,
536
+ createMergedResource(options.attributes, options.serviceName, options.resource)
537
+ );
538
+ logger.info("LangWatch Observability SDK setup completed successfully");
539
+ return {
540
+ shutdown: async () => {
541
+ logger.debug("Shutting down NodeSDK");
542
+ await (sdk == null ? void 0 : sdk.shutdown());
543
+ logger.info("NodeSDK shutdown complete");
544
+ }
545
+ };
546
+ } catch (err) {
547
+ const errorMessage = err instanceof Error ? err.message : String(err);
548
+ logger.error(`Failed to initialize NodeSDK: ${errorMessage}`);
549
+ if (err instanceof Error && err.stack) {
550
+ logger.debug(`Stack trace: ${err.stack}`);
551
+ }
552
+ if ((_h = options.advanced) == null ? void 0 : _h.throwOnSetupError) throw err;
553
+ return createNoOpHandle(logger);
554
+ }
555
+ }
556
+ function setupDedicatedProviderOrNoOp(provider, options, logger) {
557
+ var _a;
558
+ try {
559
+ return setupDedicatedProvider(provider, options, logger);
560
+ } catch (err) {
561
+ const errorMessage = err instanceof Error ? err.message : String(err);
562
+ logger.error(`Failed to set up dedicated provider: ${errorMessage}`);
563
+ if ((_a = options.advanced) == null ? void 0 : _a.throwOnSetupError) throw err;
564
+ return createNoOpHandle(logger);
565
+ }
566
+ }
567
+ function attachToExistingProviderOrNoOp(provider, options, logger) {
568
+ var _a;
569
+ const handle = attachToExistingProvider(provider, options, logger);
570
+ if (handle) return handle;
571
+ const errorMsg = "attachToExistingProvider is enabled but the existing provider does not support adding span processors. This may be due to an incompatible OpenTelemetry version. No spans will be exported to LangWatch.";
572
+ if ((_a = options.advanced) == null ? void 0 : _a.throwOnSetupError) throw new Error(errorMsg);
573
+ logger.error(errorMsg);
574
+ return createNoOpHandle(logger);
575
+ }
576
+ function detachProcessors(provider, addedProcessors) {
577
+ for (const arr of listProcessorRegistryCandidates(provider)) {
578
+ if (!Array.isArray(arr)) continue;
579
+ for (const p of addedProcessors) {
580
+ const idx = arr.indexOf(p);
581
+ if (idx !== -1) arr.splice(idx, 1);
582
+ }
583
+ }
584
+ }
585
+ function setupDedicatedProvider(provider, options, logger) {
586
+ var _a, _b, _c;
587
+ const langwatch = getLangWatchConfig(options);
588
+ const addedProcessors = [];
589
+ const internalArray = readMember(readMember(provider, "_activeSpanProcessor"), "_spanProcessors");
590
+ const hasPublicApi = typeof readMember(provider, "addSpanProcessor") === "function";
591
+ if (!Array.isArray(internalArray) && !hasPublicApi) {
592
+ const msg = "Dedicated tracerProvider does not support adding span processors.";
593
+ if ((_a = options.advanced) == null ? void 0 : _a.throwOnSetupError) throw new Error(msg);
594
+ logger.error(msg);
595
+ return createNoOpHandle(logger);
596
+ }
597
+ const addProcessor = (processor) => {
598
+ if (hasPublicApi) {
599
+ callMember(provider, "addSpanProcessor", [processor]);
600
+ } else if (Array.isArray(internalArray)) {
601
+ internalArray.push(processor);
602
+ }
603
+ };
604
+ if (!langwatch.disabled) {
605
+ const traceExporter = new (0, _chunkMAO3SIBBjs.LangWatchTraceExporter)({
606
+ apiKey: langwatch.apiKey,
607
+ endpoint: langwatch.endpoint
608
+ });
609
+ const processor = langwatch.processorType === "batch" ? new (0, _sdktracebase.BatchSpanProcessor)(traceExporter) : new (0, _sdktracebase.SimpleSpanProcessor)(traceExporter);
610
+ addedProcessors.push(processor);
611
+ addProcessor(processor);
612
+ logger.info("Attached LangWatch span processor to dedicated provider");
613
+ }
614
+ if (options.traceExporter) {
615
+ const p = new (0, _sdktracebase.SimpleSpanProcessor)(options.traceExporter);
616
+ addedProcessors.push(p);
617
+ addProcessor(p);
618
+ }
619
+ if ((_b = options.spanProcessors) == null ? void 0 : _b.length) {
620
+ for (const p of options.spanProcessors) {
621
+ addedProcessors.push(p);
622
+ addProcessor(p);
623
+ }
624
+ }
625
+ let unregisterInstrumentations;
626
+ if ((_c = options.instrumentations) == null ? void 0 : _c.length) {
627
+ unregisterInstrumentations = loadInstrumentation().registerInstrumentations({
628
+ tracerProvider: provider,
629
+ instrumentations: options.instrumentations
630
+ });
631
+ logger.info(
632
+ `Registered ${options.instrumentations.length} instrumentations against dedicated provider`
633
+ );
634
+ }
635
+ logger.info(
636
+ "LangWatch Observability SDK setup completed with dedicated provider (trace-only, global provider untouched)"
637
+ );
638
+ return {
639
+ shutdown: async () => {
640
+ logger.debug("Shutting down dedicated LangWatch processors");
641
+ try {
642
+ await Promise.all(addedProcessors.map((p) => p.shutdown()));
643
+ } finally {
644
+ detachProcessors(provider, addedProcessors);
645
+ unregisterInstrumentations == null ? void 0 : unregisterInstrumentations();
646
+ }
647
+ logger.info("LangWatch processor shutdown complete");
648
+ }
649
+ };
650
+ }
651
+ function attachToExistingProvider(provider, options, logger) {
652
+ var _a;
653
+ const internalArray = readMember(readMember(provider, "_activeSpanProcessor"), "_spanProcessors");
654
+ const hasPublicApi = typeof readMember(provider, "addSpanProcessor") === "function";
655
+ if (!Array.isArray(internalArray) && !hasPublicApi) {
656
+ return null;
657
+ }
658
+ const addProcessor = (processor) => {
659
+ if (hasPublicApi) {
660
+ callMember(provider, "addSpanProcessor", [processor]);
661
+ } else if (Array.isArray(internalArray)) {
662
+ internalArray.push(processor);
663
+ }
664
+ };
665
+ const langwatch = getLangWatchConfig(options);
666
+ const addedProcessors = [];
667
+ if (!langwatch.disabled) {
668
+ const traceExporter = new (0, _chunkMAO3SIBBjs.LangWatchTraceExporter)({
669
+ apiKey: langwatch.apiKey,
670
+ endpoint: langwatch.endpoint
671
+ });
672
+ const processor = langwatch.processorType === "batch" ? new (0, _sdktracebase.BatchSpanProcessor)(traceExporter) : new (0, _sdktracebase.SimpleSpanProcessor)(traceExporter);
673
+ addedProcessors.push(processor);
674
+ addProcessor(processor);
675
+ logger.info("Attached LangWatch span processor to existing global provider");
676
+ }
677
+ if (options.traceExporter) {
678
+ const traceExporterProcessor = new (0, _sdktracebase.SimpleSpanProcessor)(options.traceExporter);
679
+ addedProcessors.push(traceExporterProcessor);
680
+ addProcessor(traceExporterProcessor);
681
+ logger.debug("Attached user-provided traceExporter to existing provider");
682
+ }
683
+ if ((_a = options.spanProcessors) == null ? void 0 : _a.length) {
684
+ for (const processor of options.spanProcessors) {
685
+ addedProcessors.push(processor);
686
+ addProcessor(processor);
687
+ }
688
+ logger.debug(
689
+ `Attached ${options.spanProcessors.length} user-provided span processors to existing provider`
690
+ );
691
+ }
692
+ return {
693
+ shutdown: async () => {
694
+ logger.debug("Shutting down attached LangWatch processors");
695
+ try {
696
+ await Promise.all(addedProcessors.map((p) => p.shutdown()));
697
+ } finally {
698
+ detachProcessors(provider, addedProcessors);
699
+ }
700
+ logger.info("LangWatch processor shutdown complete");
701
+ }
702
+ };
703
+ }
704
+ function applyNextJsProviderWorkaround(logger) {
705
+ if (process.env.NEXT_RUNTIME === "nodejs") {
706
+ setImmediate(() => {
707
+ const globalProvider = _api.trace.getTracerProvider();
708
+ if (globalProvider.constructor.name === "ProxyTracerProvider") {
709
+ logger.warn(
710
+ "Global provider is still ProxyTracerProvider after SDK start - applying Next.js 15 workaround"
711
+ );
712
+ const realProvider = Reflect.get(globalProvider, "_delegate");
713
+ if (isNodeTracerProvider(realProvider)) {
714
+ _api.trace.setGlobalTracerProvider(realProvider);
715
+ logger.info("Successfully registered NodeTracerProvider globally for Next.js 15");
716
+ } else {
717
+ logger.error(
718
+ "Could not find NodeTracerProvider in proxy delegate - spans may not be exported"
719
+ );
720
+ }
721
+ } else {
722
+ logger.debug(`Provider registered correctly: ${globalProvider.constructor.name}`);
723
+ }
724
+ });
725
+ }
726
+ }
727
+ function createAndStartNodeSdk(options, logger, resource) {
728
+ var _a, _b, _c, _d, _e, _f, _g;
729
+ refuseUnservedGrpc(options);
730
+ const langwatch = getLangWatchConfig(options);
731
+ if (langwatch.disabled) {
732
+ logger.warn(
733
+ "LangWatch integration disabled, using user-provided SpanProcessors and LogRecordProcessors"
734
+ );
735
+ } else {
736
+ logger.info(`Using LangWatch ${langwatch.processorType} processors for tracing and logging`);
737
+ }
738
+ const spanProcessors = [];
739
+ const logProcessors = [];
740
+ if ((_a = options.debug) == null ? void 0 : _a.consoleTracing) {
741
+ spanProcessors.push(new (0, _sdktracebase.SimpleSpanProcessor)(new (0, _sdktracebase.ConsoleSpanExporter)()));
742
+ logger.debug("Console tracing enabled; adding console span exporter");
743
+ }
744
+ if ((_b = options.debug) == null ? void 0 : _b.consoleLogging) {
745
+ logProcessors.push(new (0, _sdklogs.SimpleLogRecordProcessor)({ exporter: new (0, _sdklogs.ConsoleLogRecordExporter)() }));
746
+ logger.debug("Console recording of logs enabled; adding console log record processor");
747
+ }
748
+ if (!langwatch.disabled) {
749
+ const traceExporter = new (0, _chunkMAO3SIBBjs.LangWatchTraceExporter)({
750
+ apiKey: langwatch.apiKey,
751
+ endpoint: langwatch.endpoint
752
+ });
753
+ const logExporter = new (0, _chunkMAO3SIBBjs.LangWatchLogsExporter)({
754
+ apiKey: langwatch.apiKey,
755
+ endpoint: langwatch.endpoint
756
+ });
757
+ if (langwatch.processorType === "batch") {
758
+ spanProcessors.push(new (0, _sdktracebase.BatchSpanProcessor)(traceExporter));
759
+ logProcessors.push(new (0, _sdklogs.BatchLogRecordProcessor)({ exporter: logExporter }));
760
+ logger.debug(
761
+ `Added LangWatch ${langwatch.processorType} SpanProcessor and LogRecordProcessor to SDK`
762
+ );
763
+ } else {
764
+ spanProcessors.push(new (0, _sdktracebase.SimpleSpanProcessor)(traceExporter));
765
+ logProcessors.push(new (0, _sdklogs.SimpleLogRecordProcessor)({ exporter: logExporter }));
766
+ logger.debug(
767
+ `Added LangWatch ${langwatch.processorType} SpanProcessor and LogRecordProcessor to SDK`
768
+ );
769
+ }
770
+ }
771
+ if (options.traceExporter) {
772
+ spanProcessors.push(new (0, _sdktracebase.SimpleSpanProcessor)(options.traceExporter));
773
+ logger.debug(`Added user-provided SpanProcessor to SDK`);
774
+ }
775
+ if ((_c = options.spanProcessors) == null ? void 0 : _c.length) {
776
+ spanProcessors.push(...options.spanProcessors);
777
+ logger.debug(`Added user-provided ${options.spanProcessors.length} SpanProcessors to SDK`);
778
+ }
779
+ if ((_d = options.logRecordProcessors) == null ? void 0 : _d.length) {
780
+ logProcessors.push(...options.logRecordProcessors);
781
+ logger.debug(
782
+ `Added user-provided ${options.logRecordProcessors.length} LogRecordProcessors to SDK`
783
+ );
784
+ }
785
+ warnIfMisconfigured(options, langwatch, logger);
786
+ const loggerProvider = logProcessors.length ? new (0, _sdklogs.LoggerProvider)({
787
+ resource,
788
+ processors: logProcessors
789
+ }) : void 0;
790
+ if (loggerProvider) {
791
+ logger.debug("Created LangWatch logger provider");
792
+ }
793
+ const sdk = new NodeSdk({
794
+ logger,
795
+ resource,
796
+ serviceName: options.serviceName,
797
+ autoDetectResources: options.autoDetectResources,
798
+ contextManager: options.contextManager,
799
+ textMapPropagator: options.textMapPropagator,
800
+ metricReader: options.metricReader,
801
+ views: options.views,
802
+ resourceDetectors: options.resourceDetectors,
803
+ sampler: options.sampler,
804
+ spanProcessors,
805
+ logRecordProcessors: logProcessors,
806
+ spanLimits: options.spanLimits,
807
+ idGenerator: options.idGenerator,
808
+ instrumentations: options.instrumentations
809
+ });
810
+ sdk.start();
811
+ logger.info("NodeSDK started successfully");
812
+ applyNextJsProviderWorkaround(logger);
813
+ if (loggerProvider) {
814
+ _chunkMAO3SIBBjs.setLangWatchLoggerProvider.call(void 0, loggerProvider);
815
+ logger.debug("Set LangWatch logger provider");
816
+ }
817
+ if (!((_e = options.advanced) == null ? void 0 : _e.disableAutoShutdown)) {
818
+ registerAutoShutdownHandlers({
819
+ sdk,
820
+ logger,
821
+ exitProcessAfterShutdown: (_g = (_f = options.advanced) == null ? void 0 : _f.UNSAFE_exitProcessAfterAutoShutdown) != null ? _g : false
822
+ });
823
+ }
824
+ return sdk;
825
+ }
826
+ var ensureSetup = () => {
827
+ const globalProvider = _api.trace.getTracerProvider();
828
+ const alreadySetup = isConcreteProvider(globalProvider);
829
+ if (alreadySetup) {
830
+ return {
831
+ shutdown: async () => {
832
+ }
833
+ };
834
+ }
835
+ if (!process.env.LANGWATCH_API_KEY) {
836
+ return {
837
+ shutdown: async () => {
838
+ }
839
+ };
840
+ }
841
+ return setupObservability();
842
+ };
843
+ function isNodeTracerProvider(value) {
844
+ return typeof value === "object" && value !== null && value.constructor.name === "NodeTracerProvider";
845
+ }
846
+
847
+
848
+
849
+
850
+
851
+ exports.resolveEndpoint = resolveEndpoint; exports.setupObservability = setupObservability; exports.ensureSetup = ensureSetup;
852
+ //# sourceMappingURL=chunk-DLZCOUXC.js.map