autotel 2.25.2 → 2.25.4

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 (135) hide show
  1. package/README.md +152 -1
  2. package/dist/attributes.d.cts +2 -2
  3. package/dist/attributes.d.ts +2 -2
  4. package/dist/auto.cjs +6 -6
  5. package/dist/auto.js +4 -4
  6. package/dist/{chunk-BGVKKL2N.cjs → chunk-7FIGORWI.cjs} +46 -2
  7. package/dist/chunk-7FIGORWI.cjs.map +1 -0
  8. package/dist/{chunk-4KGC5N3J.cjs → chunk-A5ZUL2RZ.cjs} +16 -16
  9. package/dist/{chunk-4KGC5N3J.cjs.map → chunk-A5ZUL2RZ.cjs.map} +1 -1
  10. package/dist/{chunk-SR35DG5A.js → chunk-BBBWDIYQ.js} +27 -13
  11. package/dist/chunk-BBBWDIYQ.js.map +1 -0
  12. package/dist/{chunk-QUW4I2OI.js → chunk-CMUM4JQI.js} +3 -3
  13. package/dist/{chunk-QUW4I2OI.js.map → chunk-CMUM4JQI.js.map} +1 -1
  14. package/dist/{chunk-MNMLCLHH.cjs → chunk-EEJGUBWV.cjs} +5 -5
  15. package/dist/{chunk-MNMLCLHH.cjs.map → chunk-EEJGUBWV.cjs.map} +1 -1
  16. package/dist/{chunk-W4EUTSB2.cjs → chunk-HZ3FYBJG.cjs} +27 -12
  17. package/dist/chunk-HZ3FYBJG.cjs.map +1 -0
  18. package/dist/{chunk-L627YSSP.cjs → chunk-I6JPSD4R.cjs} +9 -9
  19. package/dist/{chunk-L627YSSP.cjs.map → chunk-I6JPSD4R.cjs.map} +1 -1
  20. package/dist/{chunk-JVICEM6W.cjs → chunk-ITYASFHQ.cjs} +91 -19
  21. package/dist/chunk-ITYASFHQ.cjs.map +1 -0
  22. package/dist/{chunk-XRKAL7WJ.cjs → chunk-JSNUWSBH.cjs} +6 -6
  23. package/dist/chunk-JSNUWSBH.cjs.map +1 -0
  24. package/dist/{chunk-GVLK7YUU.cjs → chunk-KZEC4CHV.cjs} +6 -4
  25. package/dist/chunk-KZEC4CHV.cjs.map +1 -0
  26. package/dist/{chunk-UKUYBUFQ.cjs → chunk-MN6PZ4AN.cjs} +7 -7
  27. package/dist/{chunk-UKUYBUFQ.cjs.map → chunk-MN6PZ4AN.cjs.map} +1 -1
  28. package/dist/{chunk-VXLEJWLY.js → chunk-MNBAXRVG.js} +89 -17
  29. package/dist/chunk-MNBAXRVG.js.map +1 -0
  30. package/dist/{chunk-6YIDHH2S.cjs → chunk-OFPZULMQ.cjs} +32 -10
  31. package/dist/chunk-OFPZULMQ.cjs.map +1 -0
  32. package/dist/{chunk-IKRHEUS7.js → chunk-OPTGXEVN.js} +370 -351
  33. package/dist/chunk-OPTGXEVN.js.map +1 -0
  34. package/dist/{chunk-77PLEJ54.js → chunk-QDREXAD7.js} +4 -4
  35. package/dist/{chunk-77PLEJ54.js.map → chunk-QDREXAD7.js.map} +1 -1
  36. package/dist/{chunk-RWOVNF3V.cjs → chunk-QQLP4M6W.cjs} +400 -381
  37. package/dist/chunk-QQLP4M6W.cjs.map +1 -0
  38. package/dist/{chunk-YTGF4L2C.js → chunk-RUD7KS4R.js} +27 -5
  39. package/dist/chunk-RUD7KS4R.js.map +1 -0
  40. package/dist/{chunk-USSL3D6L.js → chunk-S4OFEXLA.js} +6 -6
  41. package/dist/chunk-S4OFEXLA.js.map +1 -0
  42. package/dist/{chunk-XND7WBVX.js → chunk-VYA6QDNA.js} +43 -3
  43. package/dist/chunk-VYA6QDNA.js.map +1 -0
  44. package/dist/{chunk-KUSYIHW7.js → chunk-WYP6OOCT.js} +3 -3
  45. package/dist/{chunk-KUSYIHW7.js.map → chunk-WYP6OOCT.js.map} +1 -1
  46. package/dist/{chunk-4SCBD22Z.js → chunk-XB2GITM5.js} +4 -4
  47. package/dist/{chunk-4SCBD22Z.js.map → chunk-XB2GITM5.js.map} +1 -1
  48. package/dist/{chunk-X4RMFFMR.js → chunk-XDKK53OL.js} +6 -4
  49. package/dist/chunk-XDKK53OL.js.map +1 -0
  50. package/dist/correlation-id.cjs +10 -9
  51. package/dist/correlation-id.d.cts +4 -1
  52. package/dist/correlation-id.d.ts +4 -1
  53. package/dist/correlation-id.js +2 -1
  54. package/dist/decorators.cjs +8 -8
  55. package/dist/decorators.js +7 -7
  56. package/dist/event.cjs +10 -9
  57. package/dist/event.js +7 -6
  58. package/dist/functional.cjs +14 -14
  59. package/dist/functional.js +7 -7
  60. package/dist/http.cjs +2 -2
  61. package/dist/http.js +1 -1
  62. package/dist/index.cjs +85 -65
  63. package/dist/index.d.cts +4 -4
  64. package/dist/index.d.ts +4 -4
  65. package/dist/index.js +16 -16
  66. package/dist/{init-Q4uIQKbq.d.cts → init-CIzpC5kZ.d.cts} +9 -2
  67. package/dist/{init-ls4xSZe5.d.ts → init-C_PiC_Su.d.ts} +9 -2
  68. package/dist/instrumentation.cjs +12 -12
  69. package/dist/instrumentation.cjs.map +1 -1
  70. package/dist/instrumentation.js +4 -4
  71. package/dist/instrumentation.js.map +1 -1
  72. package/dist/messaging-adapters.d.cts +1 -1
  73. package/dist/messaging-adapters.d.ts +1 -1
  74. package/dist/messaging.cjs +11 -11
  75. package/dist/messaging.d.cts +1 -1
  76. package/dist/messaging.d.ts +1 -1
  77. package/dist/messaging.js +8 -8
  78. package/dist/metric-helpers.d.cts +1 -1
  79. package/dist/metric-helpers.d.ts +1 -1
  80. package/dist/sampling.cjs +26 -10
  81. package/dist/sampling.d.cts +49 -1
  82. package/dist/sampling.d.ts +49 -1
  83. package/dist/sampling.js +1 -1
  84. package/dist/semantic-helpers.cjs +12 -12
  85. package/dist/semantic-helpers.js +8 -8
  86. package/dist/tail-sampling-processor.cjs +6 -2
  87. package/dist/tail-sampling-processor.d.cts +2 -2
  88. package/dist/tail-sampling-processor.d.ts +2 -2
  89. package/dist/tail-sampling-processor.js +5 -1
  90. package/dist/trace-helpers.d.cts +1 -1
  91. package/dist/trace-helpers.d.ts +1 -1
  92. package/dist/{utils-D1trOLNm.d.ts → utils-Buel3cj0.d.ts} +1 -1
  93. package/dist/{utils-DuNJfXSH.d.cts → utils-CbUkl8r1.d.cts} +1 -1
  94. package/dist/webhook.cjs +8 -8
  95. package/dist/webhook.js +7 -7
  96. package/dist/workflow-distributed.cjs +9 -9
  97. package/dist/workflow-distributed.js +7 -7
  98. package/dist/workflow.cjs +12 -12
  99. package/dist/workflow.js +8 -8
  100. package/dist/yaml-config.cjs +5 -5
  101. package/dist/yaml-config.d.cts +5 -4
  102. package/dist/yaml-config.d.ts +5 -4
  103. package/dist/yaml-config.js +2 -2
  104. package/package.json +1 -1
  105. package/src/correlation-id.ts +10 -5
  106. package/src/env-config.test.ts +77 -0
  107. package/src/env-config.ts +106 -0
  108. package/src/functional.ts +447 -421
  109. package/src/index.ts +6 -0
  110. package/src/init.customization.test.ts +61 -0
  111. package/src/init.integrations.test.ts +6 -1
  112. package/src/init.ts +23 -13
  113. package/src/instrumentation.ts +1 -1
  114. package/src/sampling.test.ts +96 -3
  115. package/src/sampling.ts +90 -0
  116. package/src/tail-sampling-processor.test.ts +26 -22
  117. package/src/tail-sampling-processor.ts +8 -4
  118. package/src/trace-context.test.ts +73 -0
  119. package/src/trace-context.ts +44 -12
  120. package/src/yaml-config.test.ts +71 -0
  121. package/src/yaml-config.ts +32 -2
  122. package/dist/chunk-6YIDHH2S.cjs.map +0 -1
  123. package/dist/chunk-BGVKKL2N.cjs.map +0 -1
  124. package/dist/chunk-GVLK7YUU.cjs.map +0 -1
  125. package/dist/chunk-IKRHEUS7.js.map +0 -1
  126. package/dist/chunk-JVICEM6W.cjs.map +0 -1
  127. package/dist/chunk-RWOVNF3V.cjs.map +0 -1
  128. package/dist/chunk-SR35DG5A.js.map +0 -1
  129. package/dist/chunk-USSL3D6L.js.map +0 -1
  130. package/dist/chunk-VXLEJWLY.js.map +0 -1
  131. package/dist/chunk-W4EUTSB2.cjs.map +0 -1
  132. package/dist/chunk-X4RMFFMR.js.map +0 -1
  133. package/dist/chunk-XND7WBVX.js.map +0 -1
  134. package/dist/chunk-XRKAL7WJ.cjs.map +0 -1
  135. package/dist/chunk-YTGF4L2C.js.map +0 -1
@@ -1,8 +1,15 @@
1
1
  import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import {
3
+ AlwaysOffSampler,
4
+ AlwaysOnSampler,
5
+ ParentBasedSampler,
6
+ TraceIdRatioBasedSampler,
7
+ } from '@opentelemetry/sdk-trace-base';
2
8
  import {
3
9
  resolveOtelEnv,
4
10
  parseResourceAttributes,
5
11
  parseOtlpHeaders,
12
+ createSamplerFromEnv,
6
13
  envToConfig,
7
14
  resolveConfigFromEnv,
8
15
  } from './env-config';
@@ -45,6 +52,16 @@ describe('env-config', () => {
45
52
  const env = resolveOtelEnv();
46
53
  expect(env.OTEL_EXPORTER_OTLP_PROTOCOL).toBe('grpc');
47
54
  });
55
+
56
+ it('should resolve trace sampler env vars', () => {
57
+ process.env.OTEL_TRACES_SAMPLER = 'traceidratio';
58
+ process.env.OTEL_TRACES_SAMPLER_ARG = '0.5';
59
+
60
+ const env = resolveOtelEnv();
61
+
62
+ expect(env.OTEL_TRACES_SAMPLER).toBe('traceidratio');
63
+ expect(env.OTEL_TRACES_SAMPLER_ARG).toBe('0.5');
64
+ });
48
65
  });
49
66
 
50
67
  describe('parseResourceAttributes', () => {
@@ -198,6 +215,58 @@ describe('env-config', () => {
198
215
  const config = envToConfig({});
199
216
  expect(config).toEqual({});
200
217
  });
218
+
219
+ it('should map OTEL_TRACES_SAMPLER to an SDK sampler', () => {
220
+ const config = envToConfig({
221
+ OTEL_TRACES_SAMPLER: 'always_on',
222
+ });
223
+
224
+ expect(config.otelSampler).toBeInstanceOf(AlwaysOnSampler);
225
+ });
226
+ });
227
+
228
+ describe('createSamplerFromEnv', () => {
229
+ it('supports always_on', () => {
230
+ const sampler = createSamplerFromEnv({
231
+ OTEL_TRACES_SAMPLER: 'always_on',
232
+ });
233
+
234
+ expect(sampler).toBeInstanceOf(AlwaysOnSampler);
235
+ });
236
+
237
+ it('supports always_off', () => {
238
+ const sampler = createSamplerFromEnv({
239
+ OTEL_TRACES_SAMPLER: 'always_off',
240
+ });
241
+
242
+ expect(sampler).toBeInstanceOf(AlwaysOffSampler);
243
+ });
244
+
245
+ it('supports traceidratio', () => {
246
+ const sampler = createSamplerFromEnv({
247
+ OTEL_TRACES_SAMPLER: 'traceidratio',
248
+ OTEL_TRACES_SAMPLER_ARG: '0.25',
249
+ });
250
+
251
+ expect(sampler).toBeInstanceOf(TraceIdRatioBasedSampler);
252
+ });
253
+
254
+ it('supports parentbased_traceidratio', () => {
255
+ const sampler = createSamplerFromEnv({
256
+ OTEL_TRACES_SAMPLER: 'parentbased_traceidratio',
257
+ OTEL_TRACES_SAMPLER_ARG: '0.25',
258
+ });
259
+
260
+ expect(sampler).toBeInstanceOf(ParentBasedSampler);
261
+ });
262
+
263
+ it('returns undefined for unsupported remote samplers', () => {
264
+ const sampler = createSamplerFromEnv({
265
+ OTEL_TRACES_SAMPLER: 'jaeger_remote',
266
+ });
267
+
268
+ expect(sampler).toBeUndefined();
269
+ });
201
270
  });
202
271
 
203
272
  describe('resolveConfigFromEnv', () => {
@@ -242,5 +311,13 @@ describe('env-config', () => {
242
311
  },
243
312
  });
244
313
  });
314
+
315
+ it('should include otelSampler when OTEL_TRACES_SAMPLER is set', () => {
316
+ process.env.OTEL_TRACES_SAMPLER = 'parentbased_always_off';
317
+
318
+ const config = resolveConfigFromEnv();
319
+
320
+ expect(config.otelSampler).toBeInstanceOf(ParentBasedSampler);
321
+ });
245
322
  });
246
323
  });
package/src/env-config.ts CHANGED
@@ -1,12 +1,22 @@
1
1
  /**
2
2
  * Standard OpenTelemetry environment variables
3
3
  */
4
+ import type { Sampler as OtelSampler } from '@opentelemetry/sdk-trace-base';
5
+ import {
6
+ AlwaysOffSampler,
7
+ AlwaysOnSampler,
8
+ ParentBasedSampler,
9
+ TraceIdRatioBasedSampler,
10
+ } from '@opentelemetry/sdk-trace-base';
11
+
4
12
  export interface OtelEnvVars {
5
13
  OTEL_SERVICE_NAME?: string;
6
14
  OTEL_EXPORTER_OTLP_ENDPOINT?: string;
7
15
  OTEL_EXPORTER_OTLP_HEADERS?: string;
8
16
  OTEL_RESOURCE_ATTRIBUTES?: string;
9
17
  OTEL_EXPORTER_OTLP_PROTOCOL?: 'http' | 'grpc';
18
+ OTEL_TRACES_SAMPLER?: string;
19
+ OTEL_TRACES_SAMPLER_ARG?: string;
10
20
  }
11
21
 
12
22
  /**
@@ -33,6 +43,7 @@ export interface EnvConfig {
33
43
  protocol?: 'http' | 'grpc';
34
44
  headers?: Record<string, string>;
35
45
  resourceAttributes?: Record<string, string>;
46
+ otelSampler?: OtelSampler;
36
47
  }
37
48
 
38
49
  /**
@@ -93,9 +104,99 @@ export function resolveOtelEnv(): OtelEnvVars {
93
104
  }
94
105
  }
95
106
 
107
+ if (process.env.OTEL_TRACES_SAMPLER) {
108
+ const value = process.env.OTEL_TRACES_SAMPLER.trim();
109
+ if (value) {
110
+ env.OTEL_TRACES_SAMPLER = value;
111
+ }
112
+ }
113
+
114
+ if (process.env.OTEL_TRACES_SAMPLER_ARG) {
115
+ const value = process.env.OTEL_TRACES_SAMPLER_ARG.trim();
116
+ if (value) {
117
+ env.OTEL_TRACES_SAMPLER_ARG = value;
118
+ }
119
+ }
120
+
96
121
  return env;
97
122
  }
98
123
 
124
+ function parseRatioSamplerArg(
125
+ samplerName: string,
126
+ samplerArg: string | undefined,
127
+ ): number {
128
+ if (samplerArg === undefined) {
129
+ return 1.0;
130
+ }
131
+
132
+ const ratio = Number(samplerArg);
133
+ if (!Number.isFinite(ratio) || ratio < 0 || ratio > 1) {
134
+ console.error(
135
+ `[autotel] Invalid OTEL_TRACES_SAMPLER_ARG="${samplerArg}" for ${samplerName}. Expected a number in [0..1]. Falling back to 1.0.`,
136
+ );
137
+ return 1.0;
138
+ }
139
+
140
+ return ratio;
141
+ }
142
+
143
+ function warnOnUnusedSamplerArg(
144
+ samplerName: string,
145
+ samplerArg: string | undefined,
146
+ ): void {
147
+ if (samplerArg !== undefined) {
148
+ console.error(
149
+ `[autotel] OTEL_TRACES_SAMPLER_ARG is not used by OTEL_TRACES_SAMPLER="${samplerName}". Ignoring value "${samplerArg}".`,
150
+ );
151
+ }
152
+ }
153
+
154
+ export function createSamplerFromEnv(
155
+ env: Pick<OtelEnvVars, 'OTEL_TRACES_SAMPLER' | 'OTEL_TRACES_SAMPLER_ARG'>,
156
+ ): OtelSampler | undefined {
157
+ const samplerName = env.OTEL_TRACES_SAMPLER;
158
+ if (!samplerName) {
159
+ return undefined;
160
+ }
161
+
162
+ switch (samplerName) {
163
+ case 'always_on':
164
+ warnOnUnusedSamplerArg(samplerName, env.OTEL_TRACES_SAMPLER_ARG);
165
+ return new AlwaysOnSampler();
166
+ case 'always_off':
167
+ warnOnUnusedSamplerArg(samplerName, env.OTEL_TRACES_SAMPLER_ARG);
168
+ return new AlwaysOffSampler();
169
+ case 'traceidratio':
170
+ return new TraceIdRatioBasedSampler(
171
+ parseRatioSamplerArg(samplerName, env.OTEL_TRACES_SAMPLER_ARG),
172
+ );
173
+ case 'parentbased_always_on':
174
+ warnOnUnusedSamplerArg(samplerName, env.OTEL_TRACES_SAMPLER_ARG);
175
+ return new ParentBasedSampler({ root: new AlwaysOnSampler() });
176
+ case 'parentbased_always_off':
177
+ warnOnUnusedSamplerArg(samplerName, env.OTEL_TRACES_SAMPLER_ARG);
178
+ return new ParentBasedSampler({ root: new AlwaysOffSampler() });
179
+ case 'parentbased_traceidratio':
180
+ return new ParentBasedSampler({
181
+ root: new TraceIdRatioBasedSampler(
182
+ parseRatioSamplerArg(samplerName, env.OTEL_TRACES_SAMPLER_ARG),
183
+ ),
184
+ });
185
+ case 'jaeger_remote':
186
+ case 'parentbased_jaeger_remote':
187
+ case 'xray':
188
+ console.error(
189
+ `[autotel] OTEL_TRACES_SAMPLER="${samplerName}" is not supported yet by autotel. Falling back to the next sampler source.`,
190
+ );
191
+ return undefined;
192
+ default:
193
+ console.error(
194
+ `[autotel] Unknown OTEL_TRACES_SAMPLER="${samplerName}". Falling back to the next sampler source.`,
195
+ );
196
+ return undefined;
197
+ }
198
+ }
199
+
99
200
  /**
100
201
  * Parse OTEL_RESOURCE_ATTRIBUTES from comma-separated key=value pairs
101
202
  * Example: "service.version=1.0.0,deployment.environment=production"
@@ -191,6 +292,11 @@ export function envToConfig(env: OtelEnvVars): EnvConfig {
191
292
  config.resourceAttributes = resourceAttrs;
192
293
  }
193
294
 
295
+ const sampler = createSamplerFromEnv(env);
296
+ if (sampler) {
297
+ config.otelSampler = sampler;
298
+ }
299
+
194
300
  return config;
195
301
  }
196
302