@trigger.dev/core 0.0.0-prerelease-20240219135254 → 0.0.0-prerelease-20240408121557

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.
@@ -1,32 +1,37 @@
1
- import { TracerProvider } from '@opentelemetry/api';
1
+ import { TracerProvider, Span } from '@opentelemetry/api';
2
2
  import { InstrumentationOption } from '@opentelemetry/instrumentation';
3
3
  import { IResource, DetectorSync, ResourceDetectionConfig, Resource, ResourceAttributes } from '@opentelemetry/resources';
4
4
  import { LoggerProvider } from '@opentelemetry/sdk-logs';
5
- export { HttpInstrumentation } from '@opentelemetry/instrumentation-http';
6
- export { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch';
7
5
 
8
6
  declare class AsyncResourceDetector implements DetectorSync {
9
7
  private _promise;
10
8
  private _resolver?;
9
+ private _resolved;
11
10
  constructor();
12
11
  detect(_config?: ResourceDetectionConfig): Resource;
13
12
  resolveWithAttributes(attributes: ResourceAttributes): void;
14
13
  }
14
+ type TracingDiagnosticLogLevel = "none" | "error" | "warn" | "info" | "debug" | "verbose" | "all";
15
15
  type TracingSDKConfig = {
16
16
  url: string;
17
17
  forceFlushTimeoutMillis?: number;
18
18
  resource?: IResource;
19
19
  instrumentations?: InstrumentationOption[];
20
+ diagLogLevel?: TracingDiagnosticLogLevel;
20
21
  };
21
22
  declare class TracingSDK {
22
23
  private readonly config;
23
24
  readonly asyncResourceDetector: AsyncResourceDetector;
24
25
  private readonly _logProvider;
25
- private readonly _traceExporter;
26
+ private readonly _spanExporter;
27
+ private readonly _traceProvider;
26
28
  readonly getLogger: LoggerProvider["getLogger"];
27
29
  readonly getTracer: TracerProvider["getTracer"];
28
30
  constructor(config: TracingSDKConfig);
29
- flushOtel(): Promise<void>;
31
+ flush(): Promise<void>;
32
+ shutdown(): Promise<void>;
30
33
  }
31
34
 
32
- export { TracingSDK, type TracingSDKConfig };
35
+ declare function recordSpanException(span: Span, error: unknown): void;
36
+
37
+ export { type TracingDiagnosticLogLevel, TracingSDK, type TracingSDKConfig, recordSpanException };
@@ -1,32 +1,37 @@
1
- import { TracerProvider } from '@opentelemetry/api';
1
+ import { TracerProvider, Span } from '@opentelemetry/api';
2
2
  import { InstrumentationOption } from '@opentelemetry/instrumentation';
3
3
  import { IResource, DetectorSync, ResourceDetectionConfig, Resource, ResourceAttributes } from '@opentelemetry/resources';
4
4
  import { LoggerProvider } from '@opentelemetry/sdk-logs';
5
- export { HttpInstrumentation } from '@opentelemetry/instrumentation-http';
6
- export { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch';
7
5
 
8
6
  declare class AsyncResourceDetector implements DetectorSync {
9
7
  private _promise;
10
8
  private _resolver?;
9
+ private _resolved;
11
10
  constructor();
12
11
  detect(_config?: ResourceDetectionConfig): Resource;
13
12
  resolveWithAttributes(attributes: ResourceAttributes): void;
14
13
  }
14
+ type TracingDiagnosticLogLevel = "none" | "error" | "warn" | "info" | "debug" | "verbose" | "all";
15
15
  type TracingSDKConfig = {
16
16
  url: string;
17
17
  forceFlushTimeoutMillis?: number;
18
18
  resource?: IResource;
19
19
  instrumentations?: InstrumentationOption[];
20
+ diagLogLevel?: TracingDiagnosticLogLevel;
20
21
  };
21
22
  declare class TracingSDK {
22
23
  private readonly config;
23
24
  readonly asyncResourceDetector: AsyncResourceDetector;
24
25
  private readonly _logProvider;
25
- private readonly _traceExporter;
26
+ private readonly _spanExporter;
27
+ private readonly _traceProvider;
26
28
  readonly getLogger: LoggerProvider["getLogger"];
27
29
  readonly getTracer: TracerProvider["getTracer"];
28
30
  constructor(config: TracingSDKConfig);
29
- flushOtel(): Promise<void>;
31
+ flush(): Promise<void>;
32
+ shutdown(): Promise<void>;
30
33
  }
31
34
 
32
- export { TracingSDK, type TracingSDKConfig };
35
+ declare function recordSpanException(span: Span, error: unknown): void;
36
+
37
+ export { type TracingDiagnosticLogLevel, TracingSDK, type TracingSDKConfig, recordSpanException };
@@ -1,51 +1,284 @@
1
1
  'use strict';
2
2
 
3
+ var api = require('@opentelemetry/api');
4
+ var apiLogs = require('@opentelemetry/api-logs');
3
5
  var exporterLogsOtlpHttp = require('@opentelemetry/exporter-logs-otlp-http');
4
6
  var exporterTraceOtlpHttp = require('@opentelemetry/exporter-trace-otlp-http');
5
7
  var instrumentation = require('@opentelemetry/instrumentation');
6
8
  var resources = require('@opentelemetry/resources');
7
9
  var sdkLogs = require('@opentelemetry/sdk-logs');
8
10
  var sdkTraceNode = require('@opentelemetry/sdk-trace-node');
9
- var apiLogs = require('@opentelemetry/api-logs');
10
11
  var semanticConventions = require('@opentelemetry/semantic-conventions');
11
- var instrumentationHttp = require('@opentelemetry/instrumentation-http');
12
- var instrumentationFetch = require('@opentelemetry/instrumentation-fetch');
12
+ var async_hooks = require('async_hooks');
13
13
 
14
14
  var __defProp = Object.defineProperty;
15
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
16
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
17
+ var __publicField = (obj, key, value) => {
18
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
19
+ return value;
20
+ };
21
+ var __accessCheck = (obj, member, msg) => {
22
+ if (!member.has(obj))
23
+ throw TypeError("Cannot " + msg);
24
+ };
25
+ var __privateAdd = (obj, member, value) => {
26
+ if (member.has(obj))
27
+ throw TypeError("Cannot add the same private member more than once");
28
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
29
+ };
30
+ var __privateMethod = (obj, member, method) => {
31
+ __accessCheck(obj, member, "access private method");
32
+ return method;
33
+ };
34
+
35
+ // src/v3/limits.ts
36
+ var OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT = 256;
37
+ var OTEL_LOG_ATTRIBUTE_COUNT_LIMIT = 256;
38
+ var OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT = 1028;
39
+ var OTEL_LOG_ATTRIBUTE_VALUE_LENGTH_LIMIT = 1028;
40
+ var OTEL_SPAN_EVENT_COUNT_LIMIT = 10;
41
+ var OTEL_LINK_COUNT_LIMIT = 2;
42
+ var OTEL_ATTRIBUTE_PER_LINK_COUNT_LIMIT = 10;
43
+ var OTEL_ATTRIBUTE_PER_EVENT_COUNT_LIMIT = 10;
16
44
 
17
45
  // src/v3/semanticInternalAttributes.ts
18
46
  var SemanticInternalAttributes = {
19
47
  ENVIRONMENT_ID: "ctx.environment.id",
20
48
  ENVIRONMENT_TYPE: "ctx.environment.type",
21
49
  ORGANIZATION_ID: "ctx.organization.id",
50
+ ORGANIZATION_SLUG: "ctx.organization.slug",
51
+ ORGANIZATION_NAME: "ctx.organization.name",
22
52
  PROJECT_ID: "ctx.project.id",
23
53
  PROJECT_REF: "ctx.project.ref",
54
+ PROJECT_NAME: "ctx.project.title",
55
+ PROJECT_DIR: "project.dir",
24
56
  ATTEMPT_ID: "ctx.attempt.id",
25
- ATTEMP_NUMBER: "ctx.attempt.number",
57
+ ATTEMPT_NUMBER: "ctx.attempt.number",
26
58
  RUN_ID: "ctx.run.id",
59
+ RUN_IS_TEST: "ctx.run.isTest",
60
+ BATCH_ID: "ctx.batch.id",
27
61
  TASK_SLUG: "ctx.task.id",
28
62
  TASK_PATH: "ctx.task.filePath",
29
63
  TASK_EXPORT_NAME: "ctx.task.exportName",
64
+ QUEUE_NAME: "ctx.queue.name",
65
+ QUEUE_ID: "ctx.queue.id",
30
66
  SPAN_PARTIAL: "$span.partial",
31
67
  SPAN_ID: "$span.span_id",
32
68
  OUTPUT: "$output",
69
+ OUTPUT_TYPE: "$mime_type_output",
33
70
  STYLE: "$style",
34
71
  STYLE_ICON: "$style.icon",
72
+ STYLE_VARIANT: "$style.variant",
73
+ STYLE_ACCESSORY: "$style.accessory",
35
74
  METADATA: "$metadata",
36
75
  TRIGGER: "$trigger",
37
76
  PAYLOAD: "$payload",
77
+ PAYLOAD_TYPE: "$mime_type_payload",
78
+ SHOW: "$show",
79
+ SHOW_ACTIONS: "$show.actions",
38
80
  WORKER_ID: "worker.id",
39
81
  WORKER_VERSION: "worker.version",
40
82
  CLI_VERSION: "cli.version",
41
83
  SDK_VERSION: "sdk.version",
42
- SDK_LANGUAGE: "sdk.language"
84
+ SDK_LANGUAGE: "sdk.language",
85
+ RETRY_AT: "retry.at",
86
+ RETRY_DELAY: "retry.delay",
87
+ RETRY_COUNT: "retry.count"
43
88
  };
44
89
 
90
+ // src/v3/utils/flattenAttributes.ts
91
+ function flattenAttributes(obj, prefix) {
92
+ const result = {};
93
+ if (!obj) {
94
+ return result;
95
+ }
96
+ if (typeof obj === "string") {
97
+ result[prefix || ""] = obj;
98
+ return result;
99
+ }
100
+ if (typeof obj === "number") {
101
+ result[prefix || ""] = obj;
102
+ return result;
103
+ }
104
+ if (typeof obj === "boolean") {
105
+ result[prefix || ""] = obj;
106
+ return result;
107
+ }
108
+ for (const [key, value] of Object.entries(obj)) {
109
+ const newPrefix = `${prefix ? `${prefix}.` : ""}${key}`;
110
+ if (Array.isArray(value)) {
111
+ for (let i = 0; i < value.length; i++) {
112
+ if (typeof value[i] === "object" && value[i] !== null) {
113
+ Object.assign(result, flattenAttributes(value[i], `${newPrefix}.[${i}]`));
114
+ } else {
115
+ result[`${newPrefix}.[${i}]`] = value[i];
116
+ }
117
+ }
118
+ } else if (isRecord(value)) {
119
+ Object.assign(result, flattenAttributes(value, newPrefix));
120
+ } else {
121
+ if (typeof value === "number" || typeof value === "string" || typeof value === "boolean") {
122
+ result[newPrefix] = value;
123
+ }
124
+ }
125
+ }
126
+ return result;
127
+ }
128
+ __name(flattenAttributes, "flattenAttributes");
129
+ function isRecord(value) {
130
+ return value !== null && typeof value === "object" && !Array.isArray(value);
131
+ }
132
+ __name(isRecord, "isRecord");
133
+ var _SafeAsyncLocalStorage = class _SafeAsyncLocalStorage {
134
+ constructor() {
135
+ this.storage = new async_hooks.AsyncLocalStorage();
136
+ }
137
+ runWith(context, fn) {
138
+ return this.storage.run(context, fn);
139
+ }
140
+ getStore() {
141
+ return this.storage.getStore();
142
+ }
143
+ };
144
+ __name(_SafeAsyncLocalStorage, "SafeAsyncLocalStorage");
145
+ var SafeAsyncLocalStorage = _SafeAsyncLocalStorage;
146
+
147
+ // src/v3/tasks/taskContextManager.ts
148
+ var _getStore, getStore_fn;
149
+ var _TaskContextManager = class _TaskContextManager {
150
+ constructor() {
151
+ __privateAdd(this, _getStore);
152
+ __publicField(this, "_storage", new SafeAsyncLocalStorage());
153
+ }
154
+ get isInsideTask() {
155
+ return __privateMethod(this, _getStore, getStore_fn).call(this) !== void 0;
156
+ }
157
+ get ctx() {
158
+ const store = __privateMethod(this, _getStore, getStore_fn).call(this);
159
+ return store?.ctx;
160
+ }
161
+ get worker() {
162
+ const store = __privateMethod(this, _getStore, getStore_fn).call(this);
163
+ return store?.worker;
164
+ }
165
+ get attributes() {
166
+ if (this.ctx) {
167
+ return {
168
+ ...this.contextAttributes,
169
+ ...this.workerAttributes
170
+ };
171
+ }
172
+ return {};
173
+ }
174
+ get workerAttributes() {
175
+ if (this.worker) {
176
+ return {
177
+ [SemanticInternalAttributes.WORKER_ID]: this.worker.id,
178
+ [SemanticInternalAttributes.WORKER_VERSION]: this.worker.version
179
+ };
180
+ }
181
+ return {};
182
+ }
183
+ get contextAttributes() {
184
+ if (this.ctx) {
185
+ return {
186
+ [SemanticInternalAttributes.ATTEMPT_ID]: this.ctx.attempt.id,
187
+ [SemanticInternalAttributes.ATTEMPT_NUMBER]: this.ctx.attempt.number,
188
+ [SemanticInternalAttributes.TASK_SLUG]: this.ctx.task.id,
189
+ [SemanticInternalAttributes.TASK_PATH]: this.ctx.task.filePath,
190
+ [SemanticInternalAttributes.TASK_EXPORT_NAME]: this.ctx.task.exportName,
191
+ [SemanticInternalAttributes.QUEUE_NAME]: this.ctx.queue.name,
192
+ [SemanticInternalAttributes.QUEUE_ID]: this.ctx.queue.id,
193
+ [SemanticInternalAttributes.ENVIRONMENT_ID]: this.ctx.environment.id,
194
+ [SemanticInternalAttributes.ENVIRONMENT_TYPE]: this.ctx.environment.type,
195
+ [SemanticInternalAttributes.ORGANIZATION_ID]: this.ctx.organization.id,
196
+ [SemanticInternalAttributes.PROJECT_ID]: this.ctx.project.id,
197
+ [SemanticInternalAttributes.PROJECT_REF]: this.ctx.project.ref,
198
+ [SemanticInternalAttributes.PROJECT_NAME]: this.ctx.project.name,
199
+ [SemanticInternalAttributes.RUN_ID]: this.ctx.run.id,
200
+ [SemanticInternalAttributes.RUN_IS_TEST]: this.ctx.run.isTest,
201
+ [SemanticInternalAttributes.ORGANIZATION_SLUG]: this.ctx.organization.slug,
202
+ [SemanticInternalAttributes.ORGANIZATION_NAME]: this.ctx.organization.name,
203
+ [SemanticInternalAttributes.BATCH_ID]: this.ctx.batch?.id
204
+ };
205
+ }
206
+ return {};
207
+ }
208
+ runWith(context, fn) {
209
+ return this._storage.runWith(context, fn);
210
+ }
211
+ };
212
+ _getStore = new WeakSet();
213
+ getStore_fn = /* @__PURE__ */ __name(function() {
214
+ return this._storage.getStore();
215
+ }, "#getStore");
216
+ __name(_TaskContextManager, "TaskContextManager");
217
+ var TaskContextManager = _TaskContextManager;
218
+ var taskContextManager = new TaskContextManager();
219
+ var _TaskContextSpanProcessor = class _TaskContextSpanProcessor {
220
+ constructor(innerProcessor) {
221
+ this._innerProcessor = innerProcessor;
222
+ }
223
+ // Called when a span starts
224
+ onStart(span, parentContext) {
225
+ if (taskContextManager.ctx) {
226
+ span.setAttributes(flattenAttributes({
227
+ [SemanticInternalAttributes.ATTEMPT_ID]: taskContextManager.ctx.attempt.id,
228
+ [SemanticInternalAttributes.ATTEMPT_NUMBER]: taskContextManager.ctx.attempt.number
229
+ }, SemanticInternalAttributes.METADATA));
230
+ }
231
+ this._innerProcessor.onStart(span, parentContext);
232
+ }
233
+ // Delegate the rest of the methods to the wrapped processor
234
+ onEnd(span) {
235
+ this._innerProcessor.onEnd(span);
236
+ }
237
+ shutdown() {
238
+ return this._innerProcessor.shutdown();
239
+ }
240
+ forceFlush() {
241
+ return this._innerProcessor.forceFlush();
242
+ }
243
+ };
244
+ __name(_TaskContextSpanProcessor, "TaskContextSpanProcessor");
245
+ var TaskContextSpanProcessor = _TaskContextSpanProcessor;
246
+ var _TaskContextLogProcessor = class _TaskContextLogProcessor {
247
+ constructor(innerProcessor) {
248
+ this._innerProcessor = innerProcessor;
249
+ }
250
+ forceFlush() {
251
+ return this._innerProcessor.forceFlush();
252
+ }
253
+ onEmit(logRecord, context) {
254
+ if (taskContextManager.ctx) {
255
+ logRecord.setAttributes(flattenAttributes({
256
+ [SemanticInternalAttributes.ATTEMPT_ID]: taskContextManager.ctx.attempt.id,
257
+ [SemanticInternalAttributes.ATTEMPT_NUMBER]: taskContextManager.ctx.attempt.number
258
+ }, SemanticInternalAttributes.METADATA));
259
+ }
260
+ this._innerProcessor.onEmit(logRecord, context);
261
+ }
262
+ shutdown() {
263
+ return this._innerProcessor.shutdown();
264
+ }
265
+ };
266
+ __name(_TaskContextLogProcessor, "TaskContextLogProcessor");
267
+ var TaskContextLogProcessor = _TaskContextLogProcessor;
268
+
269
+ // src/v3/utils/getEnv.ts
270
+ function getEnvVar(name) {
271
+ if (typeof process !== "undefined" && typeof process.env === "object" && process.env !== null) {
272
+ return process.env[name];
273
+ }
274
+ }
275
+ __name(getEnvVar, "getEnvVar");
276
+
45
277
  // src/v3/otel/tracingSDK.ts
46
278
  var _a;
47
279
  var AsyncResourceDetector = (_a = class {
48
280
  constructor() {
281
+ __publicField(this, "_resolved", false);
49
282
  this._promise = new Promise((resolver) => {
50
283
  this._resolver = resolver;
51
284
  });
@@ -57,6 +290,10 @@ var AsyncResourceDetector = (_a = class {
57
290
  if (!this._resolver) {
58
291
  throw new Error("Resolver not available");
59
292
  }
293
+ if (this._resolved) {
294
+ return;
295
+ }
296
+ this._resolved = true;
60
297
  this._resolver(attributes);
61
298
  }
62
299
  }, __name(_a, "AsyncResourceDetector"), _a);
@@ -64,56 +301,126 @@ var _TracingSDK = class _TracingSDK {
64
301
  constructor(config) {
65
302
  this.config = config;
66
303
  this.asyncResourceDetector = new AsyncResourceDetector();
304
+ setLogLevel(config.diagLogLevel ?? "none");
305
+ const envResourceAttributesSerialized = getEnvVar("OTEL_RESOURCE_ATTRIBUTES");
306
+ const envResourceAttributes = envResourceAttributesSerialized ? JSON.parse(envResourceAttributesSerialized) : {};
67
307
  const commonResources = resources.detectResourcesSync({
68
308
  detectors: [
69
- this.asyncResourceDetector
309
+ this.asyncResourceDetector,
310
+ resources.processDetectorSync
70
311
  ]
71
312
  }).merge(new resources.Resource({
72
313
  [semanticConventions.SemanticResourceAttributes.CLOUD_PROVIDER]: "trigger.dev",
73
314
  [SemanticInternalAttributes.TRIGGER]: true
74
- })).merge(config.resource ?? new resources.Resource({}));
75
- const provider = new sdkTraceNode.NodeTracerProvider({
315
+ })).merge(config.resource ?? new resources.Resource({})).merge(new resources.Resource(envResourceAttributes));
316
+ const traceProvider = new sdkTraceNode.NodeTracerProvider({
76
317
  forceFlushTimeoutMillis: config.forceFlushTimeoutMillis ?? 500,
77
- resource: commonResources
318
+ resource: commonResources,
319
+ spanLimits: {
320
+ attributeCountLimit: OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT,
321
+ attributeValueLengthLimit: OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT,
322
+ eventCountLimit: OTEL_SPAN_EVENT_COUNT_LIMIT,
323
+ attributePerEventCountLimit: OTEL_ATTRIBUTE_PER_EVENT_COUNT_LIMIT,
324
+ linkCountLimit: OTEL_LINK_COUNT_LIMIT,
325
+ attributePerLinkCountLimit: OTEL_ATTRIBUTE_PER_LINK_COUNT_LIMIT
326
+ }
78
327
  });
79
- const exporter = new exporterTraceOtlpHttp.OTLPTraceExporter({
328
+ const spanExporter = new exporterTraceOtlpHttp.OTLPTraceExporter({
80
329
  url: `${config.url}/v1/traces`,
81
330
  timeoutMillis: config.forceFlushTimeoutMillis ?? 1e3
82
331
  });
83
- provider.addSpanProcessor(new sdkTraceNode.SimpleSpanProcessor(exporter));
84
- provider.register();
332
+ traceProvider.addSpanProcessor(new TaskContextSpanProcessor(getEnvVar("OTEL_BATCH_PROCESSING_ENABLED") === "1" ? new sdkTraceNode.BatchSpanProcessor(spanExporter, {
333
+ maxExportBatchSize: parseInt(getEnvVar("OTEL_SPAN_MAX_EXPORT_BATCH_SIZE") ?? "64"),
334
+ scheduledDelayMillis: parseInt(getEnvVar("OTEL_SPAN_SCHEDULED_DELAY_MILLIS") ?? "200"),
335
+ exportTimeoutMillis: parseInt(getEnvVar("OTEL_SPAN_EXPORT_TIMEOUT_MILLIS") ?? "30000"),
336
+ maxQueueSize: parseInt(getEnvVar("OTEL_SPAN_MAX_QUEUE_SIZE") ?? "512")
337
+ }) : new sdkTraceNode.SimpleSpanProcessor(spanExporter)));
338
+ traceProvider.register();
85
339
  instrumentation.registerInstrumentations({
86
- instrumentations: config.instrumentations ?? []
340
+ instrumentations: config.instrumentations ?? [],
341
+ tracerProvider: traceProvider
87
342
  });
88
343
  const logExporter = new exporterLogsOtlpHttp.OTLPLogExporter({
89
344
  url: `${config.url}/v1/logs`
90
345
  });
91
346
  const loggerProvider = new sdkLogs.LoggerProvider({
92
- resource: commonResources
347
+ resource: commonResources,
348
+ logRecordLimits: {
349
+ attributeCountLimit: OTEL_LOG_ATTRIBUTE_COUNT_LIMIT,
350
+ attributeValueLengthLimit: OTEL_LOG_ATTRIBUTE_VALUE_LENGTH_LIMIT
351
+ }
93
352
  });
94
- loggerProvider.addLogRecordProcessor(new sdkLogs.SimpleLogRecordProcessor(logExporter));
353
+ loggerProvider.addLogRecordProcessor(new TaskContextLogProcessor(getEnvVar("OTEL_BATCH_PROCESSING_ENABLED") === "1" ? new sdkLogs.BatchLogRecordProcessor(logExporter, {
354
+ maxExportBatchSize: parseInt(getEnvVar("OTEL_LOG_MAX_EXPORT_BATCH_SIZE") ?? "64"),
355
+ scheduledDelayMillis: parseInt(getEnvVar("OTEL_LOG_SCHEDULED_DELAY_MILLIS") ?? "200"),
356
+ exportTimeoutMillis: parseInt(getEnvVar("OTEL_LOG_EXPORT_TIMEOUT_MILLIS") ?? "30000"),
357
+ maxQueueSize: parseInt(getEnvVar("OTEL_LOG_MAX_QUEUE_SIZE") ?? "512")
358
+ }) : new sdkLogs.SimpleLogRecordProcessor(logExporter)));
95
359
  this._logProvider = loggerProvider;
96
- this._traceExporter = exporter;
360
+ this._spanExporter = spanExporter;
361
+ this._traceProvider = traceProvider;
97
362
  apiLogs.logs.setGlobalLoggerProvider(loggerProvider);
98
363
  this.getLogger = loggerProvider.getLogger.bind(loggerProvider);
99
- this.getTracer = provider.getTracer.bind(provider);
364
+ this.getTracer = traceProvider.getTracer.bind(traceProvider);
100
365
  }
101
- async flushOtel() {
102
- await this._traceExporter.forceFlush();
366
+ async flush() {
367
+ await this._traceProvider.forceFlush();
103
368
  await this._logProvider.forceFlush();
104
369
  }
370
+ async shutdown() {
371
+ await this._traceProvider.shutdown();
372
+ await this._logProvider.shutdown();
373
+ }
105
374
  };
106
375
  __name(_TracingSDK, "TracingSDK");
107
376
  var TracingSDK = _TracingSDK;
377
+ function setLogLevel(level) {
378
+ let diagLogLevel;
379
+ switch (level) {
380
+ case "none":
381
+ diagLogLevel = api.DiagLogLevel.NONE;
382
+ break;
383
+ case "error":
384
+ diagLogLevel = api.DiagLogLevel.ERROR;
385
+ break;
386
+ case "warn":
387
+ diagLogLevel = api.DiagLogLevel.WARN;
388
+ break;
389
+ case "info":
390
+ diagLogLevel = api.DiagLogLevel.INFO;
391
+ break;
392
+ case "debug":
393
+ diagLogLevel = api.DiagLogLevel.DEBUG;
394
+ break;
395
+ case "verbose":
396
+ diagLogLevel = api.DiagLogLevel.VERBOSE;
397
+ break;
398
+ case "all":
399
+ diagLogLevel = api.DiagLogLevel.ALL;
400
+ break;
401
+ default:
402
+ diagLogLevel = api.DiagLogLevel.NONE;
403
+ }
404
+ api.diag.setLogger(new api.DiagConsoleLogger(), diagLogLevel);
405
+ }
406
+ __name(setLogLevel, "setLogLevel");
407
+
408
+ // src/v3/otel/index.ts
409
+ function recordSpanException(span, error) {
410
+ if (error instanceof Error) {
411
+ span.recordException(error);
412
+ } else if (typeof error === "string") {
413
+ span.recordException(new Error(error));
414
+ } else {
415
+ span.recordException(new Error(JSON.stringify(error)));
416
+ }
417
+ span.setStatus({
418
+ code: api.SpanStatusCode.ERROR
419
+ });
420
+ }
421
+ __name(recordSpanException, "recordSpanException");
108
422
 
109
- Object.defineProperty(exports, 'HttpInstrumentation', {
110
- enumerable: true,
111
- get: function () { return instrumentationHttp.HttpInstrumentation; }
112
- });
113
- Object.defineProperty(exports, 'FetchInstrumentation', {
114
- enumerable: true,
115
- get: function () { return instrumentationFetch.FetchInstrumentation; }
116
- });
117
423
  exports.TracingSDK = TracingSDK;
424
+ exports.recordSpanException = recordSpanException;
118
425
  //# sourceMappingURL=out.js.map
119
426
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/v3/otel/tracingSDK.ts","../../../src/v3/semanticInternalAttributes.ts","../../../src/v3/otel/instrumentations.ts"],"names":["OTLPLogExporter","OTLPTraceExporter","registerInstrumentations","Resource","detectResourcesSync","LoggerProvider","SimpleLogRecordProcessor","NodeTracerProvider","SimpleSpanProcessor","logs","SemanticResourceAttributes","SemanticInternalAttributes","ENVIRONMENT_ID","ENVIRONMENT_TYPE","ORGANIZATION_ID","PROJECT_ID","PROJECT_REF","ATTEMPT_ID","ATTEMP_NUMBER","RUN_ID","TASK_SLUG","TASK_PATH","TASK_EXPORT_NAME","SPAN_PARTIAL","SPAN_ID","OUTPUT","STYLE","STYLE_ICON","METADATA","TRIGGER","PAYLOAD","WORKER_ID","WORKER_VERSION","CLI_VERSION","SDK_VERSION","SDK_LANGUAGE","AsyncResourceDetector","constructor","_promise","Promise","resolver","_resolver","detect","_config","resolveWithAttributes","attributes","Error","TracingSDK","config","asyncResourceDetector","commonResources","detectors","merge","CLOUD_PROVIDER","resource","provider","forceFlushTimeoutMillis","exporter","url","timeoutMillis","addSpanProcessor","register","instrumentations","logExporter","loggerProvider","addLogRecordProcessor","_logProvider","_traceExporter","setGlobalLoggerProvider","getLogger","bind","getTracer","flushOtel","forceFlush","HttpInstrumentation","FetchInstrumentation"],"mappings":";;;;AACA,SAASA,uBAAuB;AAChC,SAASC,yBAAyB;AAClC,SACEC,gCAEK;AACP,SAEEC,UAEAC,2BACK;AACP,SAASC,gBAAgBC,gCAAgC;AACzD,SAASC,oBAAoBC,2BAA2B;AACxD,SAASC,YAAY;AAErB,SAASC,kCAAkC;;;ACjBpC,IAAMC,6BAA6B;EACxCC,gBAAgB;EAChBC,kBAAkB;EAClBC,iBAAiB;EACjBC,YAAY;EACZC,aAAa;EACbC,YAAY;EACZC,eAAe;EACfC,QAAQ;EACRC,WAAW;EACXC,WAAW;EACXC,kBAAkB;EAClBC,cAAc;EACdC,SAAS;EACTC,QAAQ;EACRC,OAAO;EACPC,YAAY;EACZC,UAAU;EACVC,SAAS;EACTC,SAAS;EACTC,WAAW;EACXC,gBAAgB;EAChBC,aAAa;EACbC,aAAa;EACbC,cAAc;AAChB;;;ADxBA;AAmBA,IAAMC,yBAAN,WAAMA;EAIJC,cAAc;AACZ,SAAKC,WAAW,IAAIC,QAAQ,CAACC,aAAa;AACxC,WAAKC,YAAYD;IACnB,CAAA;EACF;EAEAE,OAAOC,SAA6C;AAClD,WAAO,IAAIxC,SAAS,CAAC,GAAG,KAAKmC,QAAQ;EACvC;EAEAM,sBAAsBC,YAAgC;AACpD,QAAI,CAAC,KAAKJ,WAAW;AACnB,YAAM,IAAIK,MAAM,wBAAA;IAClB;AAEA,SAAKL,UAAUI,UAAAA;EACjB;AACF,GArBMT,qCAAN;AA8BO,IAAMW,cAAN,MAAMA,YAAAA;EAQXV,YAA6BW,QAA0B;kBAA1BA;SAPbC,wBAAwB,IAAIb,sBAAAA;AAQ1C,UAAMc,kBAAkB9C,oBAAoB;MAC1C+C,WAAW;QAAC,KAAKF;;IACnB,CAAA,EACGG,MACC,IAAIjD,SAAS;MACX,CAACO,2BAA2B2C,cAAc,GAAG;MAC7C,CAAC1C,2BAA2BkB,OAAO,GAAG;IACxC,CAAA,CAAA,EAEDuB,MAAMJ,OAAOM,YAAY,IAAInD,SAAS,CAAC,CAAA,CAAA;AAE1C,UAAMoD,WAAW,IAAIhD,mBAAmB;MACtCiD,yBAAyBR,OAAOQ,2BAA2B;MAC3DF,UAAUJ;IACZ,CAAA;AAEA,UAAMO,WAAW,IAAIxD,kBAAkB;MACrCyD,KAAK,GAAGV,OAAOU,GAAG;MAClBC,eAAeX,OAAOQ,2BAA2B;IACnD,CAAA;AAEAD,aAASK,iBAAiB,IAAIpD,oBAAoBiD,QAAAA,CAAAA;AAClDF,aAASM,SAAQ;AAEjB3D,6BAAyB;MACvB4D,kBAAkBd,OAAOc,oBAAoB,CAAA;IAC/C,CAAA;AAEA,UAAMC,cAAc,IAAI/D,gBAAgB;MACtC0D,KAAK,GAAGV,OAAOU,GAAG;IACpB,CAAA;AAGA,UAAMM,iBAAiB,IAAI3D,eAAe;MACxCiD,UAAUJ;IACZ,CAAA;AAEAc,mBAAeC,sBAAsB,IAAI3D,yBAAyByD,WAAAA,CAAAA;AAElE,SAAKG,eAAeF;AACpB,SAAKG,iBAAiBV;AAEtBhD,SAAK2D,wBAAwBJ,cAAAA;AAE7B,SAAKK,YAAYL,eAAeK,UAAUC,KAAKN,cAAAA;AAC/C,SAAKO,YAAYhB,SAASgB,UAAUD,KAAKf,QAAAA;EAC3C;EAEA,MAAaiB,YAAY;AACvB,UAAM,KAAKL,eAAeM,WAAU;AACpC,UAAM,KAAKP,aAAaO,WAAU;EACpC;AACF;AA7Da1B;AAAN,IAAMA,aAAN;;;AElDP,SAAS2B,2BAA2B;AACpC,SAASC,4BAA4B","sourcesContent":["import { TracerProvider } from \"@opentelemetry/api\";\nimport { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport {\n registerInstrumentations,\n type InstrumentationOption,\n} from \"@opentelemetry/instrumentation\";\nimport {\n IResource,\n Resource,\n ResourceAttributes,\n detectResourcesSync,\n} from \"@opentelemetry/resources\";\nimport { LoggerProvider, SimpleLogRecordProcessor } from \"@opentelemetry/sdk-logs\";\nimport { NodeTracerProvider, SimpleSpanProcessor } from \"@opentelemetry/sdk-trace-node\";\nimport { logs } from \"@opentelemetry/api-logs\";\nimport { DetectorSync, ResourceDetectionConfig } from \"@opentelemetry/resources\";\nimport { SemanticResourceAttributes } from \"@opentelemetry/semantic-conventions\";\nimport { SemanticInternalAttributes } from \"../semanticInternalAttributes\";\n\nclass AsyncResourceDetector implements DetectorSync {\n private _promise: Promise<ResourceAttributes>;\n private _resolver?: (value: ResourceAttributes) => void;\n\n constructor() {\n this._promise = new Promise((resolver) => {\n this._resolver = resolver;\n });\n }\n\n detect(_config?: ResourceDetectionConfig): Resource {\n return new Resource({}, this._promise);\n }\n\n resolveWithAttributes(attributes: ResourceAttributes) {\n if (!this._resolver) {\n throw new Error(\"Resolver not available\");\n }\n\n this._resolver(attributes);\n }\n}\n\nexport type TracingSDKConfig = {\n url: string;\n forceFlushTimeoutMillis?: number;\n resource?: IResource;\n instrumentations?: InstrumentationOption[];\n};\n\nexport class TracingSDK {\n public readonly asyncResourceDetector = new AsyncResourceDetector();\n private readonly _logProvider: LoggerProvider;\n private readonly _traceExporter: OTLPTraceExporter;\n\n public readonly getLogger: LoggerProvider[\"getLogger\"];\n public readonly getTracer: TracerProvider[\"getTracer\"];\n\n constructor(private readonly config: TracingSDKConfig) {\n const commonResources = detectResourcesSync({\n detectors: [this.asyncResourceDetector],\n })\n .merge(\n new Resource({\n [SemanticResourceAttributes.CLOUD_PROVIDER]: \"trigger.dev\",\n [SemanticInternalAttributes.TRIGGER]: true,\n })\n )\n .merge(config.resource ?? new Resource({}));\n\n const provider = new NodeTracerProvider({\n forceFlushTimeoutMillis: config.forceFlushTimeoutMillis ?? 500,\n resource: commonResources,\n });\n\n const exporter = new OTLPTraceExporter({\n url: `${config.url}/v1/traces`,\n timeoutMillis: config.forceFlushTimeoutMillis ?? 1000,\n });\n\n provider.addSpanProcessor(new SimpleSpanProcessor(exporter));\n provider.register();\n\n registerInstrumentations({\n instrumentations: config.instrumentations ?? [],\n });\n\n const logExporter = new OTLPLogExporter({\n url: `${config.url}/v1/logs`,\n });\n\n // To start a logger, you first need to initialize the Logger provider.\n const loggerProvider = new LoggerProvider({\n resource: commonResources,\n });\n\n loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(logExporter));\n\n this._logProvider = loggerProvider;\n this._traceExporter = exporter;\n\n logs.setGlobalLoggerProvider(loggerProvider);\n\n this.getLogger = loggerProvider.getLogger.bind(loggerProvider);\n this.getTracer = provider.getTracer.bind(provider);\n }\n\n public async flushOtel() {\n await this._traceExporter.forceFlush();\n await this._logProvider.forceFlush();\n }\n}\n","export const SemanticInternalAttributes = {\n ENVIRONMENT_ID: \"ctx.environment.id\",\n ENVIRONMENT_TYPE: \"ctx.environment.type\",\n ORGANIZATION_ID: \"ctx.organization.id\",\n PROJECT_ID: \"ctx.project.id\",\n PROJECT_REF: \"ctx.project.ref\",\n ATTEMPT_ID: \"ctx.attempt.id\",\n ATTEMP_NUMBER: \"ctx.attempt.number\",\n RUN_ID: \"ctx.run.id\",\n TASK_SLUG: \"ctx.task.id\",\n TASK_PATH: \"ctx.task.filePath\",\n TASK_EXPORT_NAME: \"ctx.task.exportName\",\n SPAN_PARTIAL: \"$span.partial\",\n SPAN_ID: \"$span.span_id\",\n OUTPUT: \"$output\",\n STYLE: \"$style\",\n STYLE_ICON: \"$style.icon\",\n METADATA: \"$metadata\",\n TRIGGER: \"$trigger\",\n PAYLOAD: \"$payload\",\n WORKER_ID: \"worker.id\",\n WORKER_VERSION: \"worker.version\",\n CLI_VERSION: \"cli.version\",\n SDK_VERSION: \"sdk.version\",\n SDK_LANGUAGE: \"sdk.language\",\n};\n","export { HttpInstrumentation } from \"@opentelemetry/instrumentation-http\";\nexport { FetchInstrumentation } from \"@opentelemetry/instrumentation-fetch\";\n"]}
1
+ {"version":3,"sources":["../../../src/v3/otel/index.ts","../../../src/v3/otel/tracingSDK.ts","../../../src/v3/limits.ts","../../../src/v3/semanticInternalAttributes.ts","../../../src/v3/utils/flattenAttributes.ts","../../../src/v3/utils/safeAsyncLocalStorage.ts","../../../src/v3/tasks/taskContextManager.ts","../../../src/v3/utils/getEnv.ts"],"names":["SpanStatusCode","DiagConsoleLogger","DiagLogLevel","diag","logs","OTLPLogExporter","OTLPTraceExporter","registerInstrumentations","Resource","detectResourcesSync","processDetectorSync","BatchLogRecordProcessor","LoggerProvider","SimpleLogRecordProcessor","BatchSpanProcessor","NodeTracerProvider","SimpleSpanProcessor","SemanticResourceAttributes","OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT","OTEL_LOG_ATTRIBUTE_COUNT_LIMIT","OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_LOG_ATTRIBUTE_VALUE_LENGTH_LIMIT","OTEL_SPAN_EVENT_COUNT_LIMIT","OTEL_LINK_COUNT_LIMIT","OTEL_ATTRIBUTE_PER_LINK_COUNT_LIMIT","OTEL_ATTRIBUTE_PER_EVENT_COUNT_LIMIT","OFFLOAD_IO_PACKET_LENGTH_LIMIT","SemanticInternalAttributes","ENVIRONMENT_ID","ENVIRONMENT_TYPE","ORGANIZATION_ID","ORGANIZATION_SLUG","ORGANIZATION_NAME","PROJECT_ID","PROJECT_REF","PROJECT_NAME","PROJECT_DIR","ATTEMPT_ID","ATTEMPT_NUMBER","RUN_ID","RUN_IS_TEST","BATCH_ID","TASK_SLUG","TASK_PATH","TASK_EXPORT_NAME","QUEUE_NAME","QUEUE_ID","SPAN_PARTIAL","SPAN_ID","OUTPUT","OUTPUT_TYPE","STYLE","STYLE_ICON","STYLE_VARIANT","STYLE_ACCESSORY","METADATA","TRIGGER","PAYLOAD","PAYLOAD_TYPE","SHOW","SHOW_ACTIONS","WORKER_ID","WORKER_VERSION","CLI_VERSION","SDK_VERSION","SDK_LANGUAGE","RETRY_AT","RETRY_DELAY","RETRY_COUNT","flattenAttributes","obj","prefix","result","key","value","Object","entries","newPrefix","Array","isArray","i","length","assign","isRecord","AsyncLocalStorage","SafeAsyncLocalStorage","constructor","storage","runWith","context","fn","run","getStore","TaskContextManager","_storage","isInsideTask","undefined","ctx","store","worker","attributes","contextAttributes","workerAttributes","id","version","attempt","number","task","filePath","exportName","queue","name","environment","type","organization","project","ref","isTest","slug","batch","taskContextManager","TaskContextSpanProcessor","innerProcessor","_innerProcessor","onStart","span","parentContext","setAttributes","onEnd","shutdown","forceFlush","TaskContextLogProcessor","onEmit","logRecord","getEnvVar","process","env","AsyncResourceDetector","_resolved","_promise","Promise","resolver","_resolver","detect","_config","resolveWithAttributes","Error","TracingSDK","config","asyncResourceDetector","setLogLevel","diagLogLevel","envResourceAttributesSerialized","envResourceAttributes","JSON","parse","commonResources","detectors","merge","CLOUD_PROVIDER","resource","traceProvider","forceFlushTimeoutMillis","spanLimits","attributeCountLimit","attributeValueLengthLimit","eventCountLimit","attributePerEventCountLimit","linkCountLimit","attributePerLinkCountLimit","spanExporter","url","timeoutMillis","addSpanProcessor","maxExportBatchSize","parseInt","scheduledDelayMillis","exportTimeoutMillis","maxQueueSize","register","instrumentations","tracerProvider","logExporter","loggerProvider","logRecordLimits","addLogRecordProcessor","_logProvider","_spanExporter","_traceProvider","setGlobalLoggerProvider","getLogger","bind","getTracer","flush","level","NONE","ERROR","WARN","INFO","DEBUG","VERBOSE","ALL","setLogger","recordSpanException","error","recordException","stringify","setStatus","code"],"mappings":"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","sourcesContent":["import { Span, SpanStatusCode } from \"@opentelemetry/api\";\n\nexport { TracingSDK, type TracingSDKConfig, type TracingDiagnosticLogLevel } from \"./tracingSDK\";\n\nexport function recordSpanException(span: Span, error: unknown) {\n if (error instanceof Error) {\n span.recordException(error);\n } else if (typeof error === \"string\") {\n span.recordException(new Error(error));\n } else {\n span.recordException(new Error(JSON.stringify(error)));\n }\n\n span.setStatus({ code: SpanStatusCode.ERROR });\n}\n","import { DiagConsoleLogger, DiagLogLevel, TracerProvider, diag } from \"@opentelemetry/api\";\nimport { logs } from \"@opentelemetry/api-logs\";\nimport { OTLPLogExporter } from \"@opentelemetry/exporter-logs-otlp-http\";\nimport { OTLPTraceExporter } from \"@opentelemetry/exporter-trace-otlp-http\";\nimport {\n registerInstrumentations,\n type InstrumentationOption,\n} from \"@opentelemetry/instrumentation\";\nimport {\n DetectorSync,\n IResource,\n Resource,\n ResourceAttributes,\n ResourceDetectionConfig,\n detectResourcesSync,\n processDetectorSync,\n} from \"@opentelemetry/resources\";\nimport {\n BatchLogRecordProcessor,\n LoggerProvider,\n SimpleLogRecordProcessor,\n} from \"@opentelemetry/sdk-logs\";\nimport {\n BatchSpanProcessor,\n NodeTracerProvider,\n SimpleSpanProcessor,\n SpanExporter,\n} from \"@opentelemetry/sdk-trace-node\";\nimport { SemanticResourceAttributes } from \"@opentelemetry/semantic-conventions\";\nimport {\n OTEL_ATTRIBUTE_PER_EVENT_COUNT_LIMIT,\n OTEL_ATTRIBUTE_PER_LINK_COUNT_LIMIT,\n OTEL_LINK_COUNT_LIMIT,\n OTEL_LOG_ATTRIBUTE_COUNT_LIMIT,\n OTEL_LOG_ATTRIBUTE_VALUE_LENGTH_LIMIT,\n OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT,\n OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT,\n OTEL_SPAN_EVENT_COUNT_LIMIT,\n} from \"../limits\";\nimport { SemanticInternalAttributes } from \"../semanticInternalAttributes\";\nimport { TaskContextLogProcessor, TaskContextSpanProcessor } from \"../tasks/taskContextManager\";\nimport { getEnvVar } from \"../utils/getEnv\";\n\nclass AsyncResourceDetector implements DetectorSync {\n private _promise: Promise<ResourceAttributes>;\n private _resolver?: (value: ResourceAttributes) => void;\n private _resolved: boolean = false;\n\n constructor() {\n this._promise = new Promise((resolver) => {\n this._resolver = resolver;\n });\n }\n\n detect(_config?: ResourceDetectionConfig): Resource {\n return new Resource({}, this._promise);\n }\n\n resolveWithAttributes(attributes: ResourceAttributes) {\n if (!this._resolver) {\n throw new Error(\"Resolver not available\");\n }\n\n if (this._resolved) {\n return;\n }\n\n this._resolved = true;\n this._resolver(attributes);\n }\n}\n\nexport type TracingDiagnosticLogLevel =\n | \"none\"\n | \"error\"\n | \"warn\"\n | \"info\"\n | \"debug\"\n | \"verbose\"\n | \"all\";\n\nexport type TracingSDKConfig = {\n url: string;\n forceFlushTimeoutMillis?: number;\n resource?: IResource;\n instrumentations?: InstrumentationOption[];\n diagLogLevel?: TracingDiagnosticLogLevel;\n};\n\nexport class TracingSDK {\n public readonly asyncResourceDetector = new AsyncResourceDetector();\n private readonly _logProvider: LoggerProvider;\n private readonly _spanExporter: SpanExporter;\n private readonly _traceProvider: NodeTracerProvider;\n\n public readonly getLogger: LoggerProvider[\"getLogger\"];\n public readonly getTracer: TracerProvider[\"getTracer\"];\n\n constructor(private readonly config: TracingSDKConfig) {\n setLogLevel(config.diagLogLevel ?? \"none\");\n\n const envResourceAttributesSerialized = getEnvVar(\"OTEL_RESOURCE_ATTRIBUTES\");\n const envResourceAttributes = envResourceAttributesSerialized\n ? JSON.parse(envResourceAttributesSerialized)\n : {};\n\n const commonResources = detectResourcesSync({\n detectors: [this.asyncResourceDetector, processDetectorSync],\n })\n .merge(\n new Resource({\n [SemanticResourceAttributes.CLOUD_PROVIDER]: \"trigger.dev\",\n [SemanticInternalAttributes.TRIGGER]: true,\n })\n )\n .merge(config.resource ?? new Resource({}))\n .merge(new Resource(envResourceAttributes));\n\n const traceProvider = new NodeTracerProvider({\n forceFlushTimeoutMillis: config.forceFlushTimeoutMillis ?? 500,\n resource: commonResources,\n spanLimits: {\n attributeCountLimit: OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT,\n attributeValueLengthLimit: OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT,\n eventCountLimit: OTEL_SPAN_EVENT_COUNT_LIMIT,\n attributePerEventCountLimit: OTEL_ATTRIBUTE_PER_EVENT_COUNT_LIMIT,\n linkCountLimit: OTEL_LINK_COUNT_LIMIT,\n attributePerLinkCountLimit: OTEL_ATTRIBUTE_PER_LINK_COUNT_LIMIT,\n },\n });\n\n const spanExporter = new OTLPTraceExporter({\n url: `${config.url}/v1/traces`,\n timeoutMillis: config.forceFlushTimeoutMillis ?? 1000,\n });\n\n traceProvider.addSpanProcessor(\n new TaskContextSpanProcessor(\n getEnvVar(\"OTEL_BATCH_PROCESSING_ENABLED\") === \"1\"\n ? new BatchSpanProcessor(spanExporter, {\n maxExportBatchSize: parseInt(getEnvVar(\"OTEL_SPAN_MAX_EXPORT_BATCH_SIZE\") ?? \"64\"),\n scheduledDelayMillis: parseInt(\n getEnvVar(\"OTEL_SPAN_SCHEDULED_DELAY_MILLIS\") ?? \"200\"\n ),\n exportTimeoutMillis: parseInt(\n getEnvVar(\"OTEL_SPAN_EXPORT_TIMEOUT_MILLIS\") ?? \"30000\"\n ),\n maxQueueSize: parseInt(getEnvVar(\"OTEL_SPAN_MAX_QUEUE_SIZE\") ?? \"512\"),\n })\n : new SimpleSpanProcessor(spanExporter)\n )\n );\n\n traceProvider.register();\n\n registerInstrumentations({\n instrumentations: config.instrumentations ?? [],\n tracerProvider: traceProvider,\n });\n\n const logExporter = new OTLPLogExporter({\n url: `${config.url}/v1/logs`,\n });\n\n // To start a logger, you first need to initialize the Logger provider.\n const loggerProvider = new LoggerProvider({\n resource: commonResources,\n logRecordLimits: {\n attributeCountLimit: OTEL_LOG_ATTRIBUTE_COUNT_LIMIT,\n attributeValueLengthLimit: OTEL_LOG_ATTRIBUTE_VALUE_LENGTH_LIMIT,\n },\n });\n\n loggerProvider.addLogRecordProcessor(\n new TaskContextLogProcessor(\n getEnvVar(\"OTEL_BATCH_PROCESSING_ENABLED\") === \"1\"\n ? new BatchLogRecordProcessor(logExporter, {\n maxExportBatchSize: parseInt(getEnvVar(\"OTEL_LOG_MAX_EXPORT_BATCH_SIZE\") ?? \"64\"),\n scheduledDelayMillis: parseInt(getEnvVar(\"OTEL_LOG_SCHEDULED_DELAY_MILLIS\") ?? \"200\"),\n exportTimeoutMillis: parseInt(getEnvVar(\"OTEL_LOG_EXPORT_TIMEOUT_MILLIS\") ?? \"30000\"),\n maxQueueSize: parseInt(getEnvVar(\"OTEL_LOG_MAX_QUEUE_SIZE\") ?? \"512\"),\n })\n : new SimpleLogRecordProcessor(logExporter)\n )\n );\n\n this._logProvider = loggerProvider;\n this._spanExporter = spanExporter;\n this._traceProvider = traceProvider;\n\n logs.setGlobalLoggerProvider(loggerProvider);\n\n this.getLogger = loggerProvider.getLogger.bind(loggerProvider);\n this.getTracer = traceProvider.getTracer.bind(traceProvider);\n }\n\n public async flush() {\n await this._traceProvider.forceFlush();\n await this._logProvider.forceFlush();\n }\n\n public async shutdown() {\n await this._traceProvider.shutdown();\n await this._logProvider.shutdown();\n }\n}\n\nfunction setLogLevel(level: TracingDiagnosticLogLevel) {\n let diagLogLevel: DiagLogLevel;\n\n switch (level) {\n case \"none\":\n diagLogLevel = DiagLogLevel.NONE;\n break;\n case \"error\":\n diagLogLevel = DiagLogLevel.ERROR;\n break;\n case \"warn\":\n diagLogLevel = DiagLogLevel.WARN;\n break;\n case \"info\":\n diagLogLevel = DiagLogLevel.INFO;\n break;\n case \"debug\":\n diagLogLevel = DiagLogLevel.DEBUG;\n break;\n case \"verbose\":\n diagLogLevel = DiagLogLevel.VERBOSE;\n break;\n case \"all\":\n diagLogLevel = DiagLogLevel.ALL;\n break;\n default:\n diagLogLevel = DiagLogLevel.NONE;\n }\n\n diag.setLogger(new DiagConsoleLogger(), diagLogLevel);\n}\n","import { AttributeValue, Attributes } from \"@opentelemetry/api\";\n\nexport const OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT = 256;\nexport const OTEL_LOG_ATTRIBUTE_COUNT_LIMIT = 256;\nexport const OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT = 1028;\nexport const OTEL_LOG_ATTRIBUTE_VALUE_LENGTH_LIMIT = 1028;\nexport const OTEL_SPAN_EVENT_COUNT_LIMIT = 10;\nexport const OTEL_LINK_COUNT_LIMIT = 2;\nexport const OTEL_ATTRIBUTE_PER_LINK_COUNT_LIMIT = 10;\nexport const OTEL_ATTRIBUTE_PER_EVENT_COUNT_LIMIT = 10;\nexport const OFFLOAD_IO_PACKET_LENGTH_LIMIT = 128 * 1024;\n\nexport function imposeAttributeLimits(attributes: Attributes): Attributes {\n const newAttributes: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (calculateAttributeValueLength(value) > OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT) {\n continue;\n }\n\n if (Object.keys(newAttributes).length >= OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT) {\n break;\n }\n\n newAttributes[key] = value;\n }\n\n return newAttributes;\n}\n\nfunction calculateAttributeValueLength(value: AttributeValue | undefined | null): number {\n if (value === undefined || value === null) {\n return 0;\n }\n\n if (typeof value === \"string\") {\n return value.length;\n }\n\n if (typeof value === \"number\") {\n return 8;\n }\n\n if (typeof value === \"boolean\") {\n return 4;\n }\n\n if (Array.isArray(value)) {\n return value.reduce((acc: number, v) => acc + calculateAttributeValueLength(v), 0);\n }\n\n return 0;\n}\n","export const SemanticInternalAttributes = {\n ENVIRONMENT_ID: \"ctx.environment.id\",\n ENVIRONMENT_TYPE: \"ctx.environment.type\",\n ORGANIZATION_ID: \"ctx.organization.id\",\n ORGANIZATION_SLUG: \"ctx.organization.slug\",\n ORGANIZATION_NAME: \"ctx.organization.name\",\n PROJECT_ID: \"ctx.project.id\",\n PROJECT_REF: \"ctx.project.ref\",\n PROJECT_NAME: \"ctx.project.title\",\n PROJECT_DIR: \"project.dir\",\n ATTEMPT_ID: \"ctx.attempt.id\",\n ATTEMPT_NUMBER: \"ctx.attempt.number\",\n RUN_ID: \"ctx.run.id\",\n RUN_IS_TEST: \"ctx.run.isTest\",\n BATCH_ID: \"ctx.batch.id\",\n TASK_SLUG: \"ctx.task.id\",\n TASK_PATH: \"ctx.task.filePath\",\n TASK_EXPORT_NAME: \"ctx.task.exportName\",\n QUEUE_NAME: \"ctx.queue.name\",\n QUEUE_ID: \"ctx.queue.id\",\n SPAN_PARTIAL: \"$span.partial\",\n SPAN_ID: \"$span.span_id\",\n OUTPUT: \"$output\",\n OUTPUT_TYPE: \"$mime_type_output\",\n STYLE: \"$style\",\n STYLE_ICON: \"$style.icon\",\n STYLE_VARIANT: \"$style.variant\",\n STYLE_ACCESSORY: \"$style.accessory\",\n METADATA: \"$metadata\",\n TRIGGER: \"$trigger\",\n PAYLOAD: \"$payload\",\n PAYLOAD_TYPE: \"$mime_type_payload\",\n SHOW: \"$show\",\n SHOW_ACTIONS: \"$show.actions\",\n WORKER_ID: \"worker.id\",\n WORKER_VERSION: \"worker.version\",\n CLI_VERSION: \"cli.version\",\n SDK_VERSION: \"sdk.version\",\n SDK_LANGUAGE: \"sdk.language\",\n RETRY_AT: \"retry.at\",\n RETRY_DELAY: \"retry.delay\",\n RETRY_COUNT: \"retry.count\",\n};\n","import { Attributes } from \"@opentelemetry/api\";\n\nexport function flattenAttributes(\n obj: Record<string, unknown> | Array<unknown> | string | boolean | number | null | undefined,\n prefix?: string\n): Attributes {\n const result: Attributes = {};\n\n // Check if obj is null or undefined\n if (!obj) {\n return result;\n }\n\n if (typeof obj === \"string\") {\n result[prefix || \"\"] = obj;\n return result;\n }\n\n if (typeof obj === \"number\") {\n result[prefix || \"\"] = obj;\n return result;\n }\n\n if (typeof obj === \"boolean\") {\n result[prefix || \"\"] = obj;\n return result;\n }\n\n for (const [key, value] of Object.entries(obj)) {\n const newPrefix = `${prefix ? `${prefix}.` : \"\"}${key}`;\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n if (typeof value[i] === \"object\" && value[i] !== null) {\n // update null check here as well\n Object.assign(result, flattenAttributes(value[i], `${newPrefix}.[${i}]`));\n } else {\n result[`${newPrefix}.[${i}]`] = value[i];\n }\n }\n } else if (isRecord(value)) {\n // update null check here\n Object.assign(result, flattenAttributes(value, newPrefix));\n } else {\n if (typeof value === \"number\" || typeof value === \"string\" || typeof value === \"boolean\") {\n result[newPrefix] = value;\n }\n }\n }\n\n return result;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function unflattenAttributes(obj: Attributes): Record<string, unknown> {\n if (typeof obj !== \"object\" || obj === null || Array.isArray(obj)) {\n return obj;\n }\n\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const parts = key.split(\".\").reduce((acc, part) => {\n // Splitting array indices as separate parts\n if (detectIsArrayIndex(part)) {\n acc.push(part);\n } else {\n acc.push(...part.split(/\\.\\[(.*?)\\]/).filter(Boolean));\n }\n return acc;\n }, [] as string[]);\n\n let current: Record<string, unknown> = result;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n const isArray = detectIsArrayIndex(part);\n const cleanPart = isArray ? part.substring(1, part.length - 1) : part;\n const nextIsArray = detectIsArrayIndex(parts[i + 1]);\n if (!current[cleanPart]) {\n current[cleanPart] = nextIsArray ? [] : {};\n }\n current = current[cleanPart] as Record<string, unknown>;\n }\n const lastPart = parts[parts.length - 1];\n const cleanLastPart = detectIsArrayIndex(lastPart)\n ? parseInt(lastPart.substring(1, lastPart.length - 1), 10)\n : lastPart;\n current[cleanLastPart] = value;\n }\n\n return result;\n}\n\nfunction detectIsArrayIndex(key: string): boolean {\n const match = key.match(/^\\[(\\d+)\\]$/);\n\n if (match) {\n return true;\n }\n\n return false;\n}\n\nexport function primitiveValueOrflattenedAttributes(\n obj: Record<string, unknown> | Array<unknown> | string | boolean | number | undefined,\n prefix: string | undefined\n): Attributes | string | number | boolean | undefined {\n if (\n typeof obj === \"string\" ||\n typeof obj === \"number\" ||\n typeof obj === \"boolean\" ||\n obj === null ||\n obj === undefined\n ) {\n return obj;\n }\n\n const attributes = flattenAttributes(obj, prefix);\n\n if (\n prefix !== undefined &&\n typeof attributes[prefix] !== \"undefined\" &&\n attributes[prefix] !== null\n ) {\n return attributes[prefix] as unknown as Attributes;\n }\n\n return attributes;\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\n\nexport class SafeAsyncLocalStorage<T> {\n private storage: AsyncLocalStorage<T>;\n\n constructor() {\n this.storage = new AsyncLocalStorage<T>();\n }\n\n runWith<R extends (...args: any[]) => Promise<any>>(context: T, fn: R): Promise<ReturnType<R>> {\n return this.storage.run(context, fn);\n }\n\n getStore(): T | undefined {\n return this.storage.getStore();\n }\n}\n","import { Attributes, Context } from \"@opentelemetry/api\";\nimport { TaskRunContext, type BackgroundWorkerProperties } from \"../schemas\";\nimport { flattenAttributes } from \"../utils/flattenAttributes\";\nimport { SafeAsyncLocalStorage } from \"../utils/safeAsyncLocalStorage\";\n\ntype TaskContext = {\n ctx: TaskRunContext;\n worker: BackgroundWorkerProperties;\n};\n\nexport class TaskContextManager {\n private _storage: SafeAsyncLocalStorage<TaskContext> = new SafeAsyncLocalStorage<TaskContext>();\n\n get isInsideTask(): boolean {\n return this.#getStore() !== undefined;\n }\n\n get ctx(): TaskRunContext | undefined {\n const store = this.#getStore();\n return store?.ctx;\n }\n\n get worker(): BackgroundWorkerProperties | undefined {\n const store = this.#getStore();\n return store?.worker;\n }\n\n get attributes(): Attributes {\n if (this.ctx) {\n return {\n ...this.contextAttributes,\n ...this.workerAttributes,\n };\n }\n\n return {};\n }\n\n get workerAttributes(): Attributes {\n if (this.worker) {\n return {\n [SemanticInternalAttributes.WORKER_ID]: this.worker.id,\n [SemanticInternalAttributes.WORKER_VERSION]: this.worker.version,\n };\n }\n\n return {};\n }\n\n get contextAttributes(): Attributes {\n if (this.ctx) {\n return {\n [SemanticInternalAttributes.ATTEMPT_ID]: this.ctx.attempt.id,\n [SemanticInternalAttributes.ATTEMPT_NUMBER]: this.ctx.attempt.number,\n [SemanticInternalAttributes.TASK_SLUG]: this.ctx.task.id,\n [SemanticInternalAttributes.TASK_PATH]: this.ctx.task.filePath,\n [SemanticInternalAttributes.TASK_EXPORT_NAME]: this.ctx.task.exportName,\n [SemanticInternalAttributes.QUEUE_NAME]: this.ctx.queue.name,\n [SemanticInternalAttributes.QUEUE_ID]: this.ctx.queue.id,\n [SemanticInternalAttributes.ENVIRONMENT_ID]: this.ctx.environment.id,\n [SemanticInternalAttributes.ENVIRONMENT_TYPE]: this.ctx.environment.type,\n [SemanticInternalAttributes.ORGANIZATION_ID]: this.ctx.organization.id,\n [SemanticInternalAttributes.PROJECT_ID]: this.ctx.project.id,\n [SemanticInternalAttributes.PROJECT_REF]: this.ctx.project.ref,\n [SemanticInternalAttributes.PROJECT_NAME]: this.ctx.project.name,\n [SemanticInternalAttributes.RUN_ID]: this.ctx.run.id,\n [SemanticInternalAttributes.RUN_IS_TEST]: this.ctx.run.isTest,\n [SemanticInternalAttributes.ORGANIZATION_SLUG]: this.ctx.organization.slug,\n [SemanticInternalAttributes.ORGANIZATION_NAME]: this.ctx.organization.name,\n [SemanticInternalAttributes.BATCH_ID]: this.ctx.batch?.id,\n };\n }\n\n return {};\n }\n\n runWith<R extends (...args: any[]) => Promise<any>>(\n context: TaskContext,\n fn: R\n ): Promise<ReturnType<R>> {\n return this._storage.runWith(context, fn);\n }\n\n #getStore(): TaskContext | undefined {\n return this._storage.getStore();\n }\n}\n\nexport const taskContextManager = new TaskContextManager();\n\nimport { LogRecord, LogRecordProcessor } from \"@opentelemetry/sdk-logs\";\nimport { Span, SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport { SemanticInternalAttributes } from \"../semanticInternalAttributes\";\n\nexport class TaskContextSpanProcessor implements SpanProcessor {\n private _innerProcessor: SpanProcessor;\n\n constructor(innerProcessor: SpanProcessor) {\n this._innerProcessor = innerProcessor;\n }\n\n // Called when a span starts\n onStart(span: Span, parentContext: Context): void {\n if (taskContextManager.ctx) {\n span.setAttributes(\n flattenAttributes(\n {\n [SemanticInternalAttributes.ATTEMPT_ID]: taskContextManager.ctx.attempt.id,\n [SemanticInternalAttributes.ATTEMPT_NUMBER]: taskContextManager.ctx.attempt.number,\n },\n SemanticInternalAttributes.METADATA\n )\n );\n }\n\n this._innerProcessor.onStart(span, parentContext);\n }\n\n // Delegate the rest of the methods to the wrapped processor\n\n onEnd(span: Span): void {\n this._innerProcessor.onEnd(span);\n }\n\n shutdown(): Promise<void> {\n return this._innerProcessor.shutdown();\n }\n\n forceFlush(): Promise<void> {\n return this._innerProcessor.forceFlush();\n }\n}\n\nexport class TaskContextLogProcessor implements LogRecordProcessor {\n private _innerProcessor: LogRecordProcessor;\n\n constructor(innerProcessor: LogRecordProcessor) {\n this._innerProcessor = innerProcessor;\n }\n forceFlush(): Promise<void> {\n return this._innerProcessor.forceFlush();\n }\n onEmit(logRecord: LogRecord, context?: Context | undefined): void {\n // Adds in the context attributes to the log record\n if (taskContextManager.ctx) {\n logRecord.setAttributes(\n flattenAttributes(\n {\n [SemanticInternalAttributes.ATTEMPT_ID]: taskContextManager.ctx.attempt.id,\n [SemanticInternalAttributes.ATTEMPT_NUMBER]: taskContextManager.ctx.attempt.number,\n },\n SemanticInternalAttributes.METADATA\n )\n );\n }\n\n this._innerProcessor.onEmit(logRecord, context);\n }\n shutdown(): Promise<void> {\n return this._innerProcessor.shutdown();\n }\n}\n","export function getEnvVar(name: string): string | undefined {\n // This could run in a non-Node.js environment (Bun, Deno, CF Worker, etc.), so don't just assume process.env is a thing\n if (typeof process !== \"undefined\" && typeof process.env === \"object\" && process.env !== null) {\n return process.env[name];\n }\n}\n"]}