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.
- package/README.md +152 -1
- package/dist/attributes.d.cts +2 -2
- package/dist/attributes.d.ts +2 -2
- package/dist/auto.cjs +6 -6
- package/dist/auto.js +4 -4
- package/dist/{chunk-BGVKKL2N.cjs → chunk-7FIGORWI.cjs} +46 -2
- package/dist/chunk-7FIGORWI.cjs.map +1 -0
- package/dist/{chunk-4KGC5N3J.cjs → chunk-A5ZUL2RZ.cjs} +16 -16
- package/dist/{chunk-4KGC5N3J.cjs.map → chunk-A5ZUL2RZ.cjs.map} +1 -1
- package/dist/{chunk-SR35DG5A.js → chunk-BBBWDIYQ.js} +27 -13
- package/dist/chunk-BBBWDIYQ.js.map +1 -0
- package/dist/{chunk-QUW4I2OI.js → chunk-CMUM4JQI.js} +3 -3
- package/dist/{chunk-QUW4I2OI.js.map → chunk-CMUM4JQI.js.map} +1 -1
- package/dist/{chunk-MNMLCLHH.cjs → chunk-EEJGUBWV.cjs} +5 -5
- package/dist/{chunk-MNMLCLHH.cjs.map → chunk-EEJGUBWV.cjs.map} +1 -1
- package/dist/{chunk-W4EUTSB2.cjs → chunk-HZ3FYBJG.cjs} +27 -12
- package/dist/chunk-HZ3FYBJG.cjs.map +1 -0
- package/dist/{chunk-L627YSSP.cjs → chunk-I6JPSD4R.cjs} +9 -9
- package/dist/{chunk-L627YSSP.cjs.map → chunk-I6JPSD4R.cjs.map} +1 -1
- package/dist/{chunk-JVICEM6W.cjs → chunk-ITYASFHQ.cjs} +91 -19
- package/dist/chunk-ITYASFHQ.cjs.map +1 -0
- package/dist/{chunk-XRKAL7WJ.cjs → chunk-JSNUWSBH.cjs} +6 -6
- package/dist/chunk-JSNUWSBH.cjs.map +1 -0
- package/dist/{chunk-GVLK7YUU.cjs → chunk-KZEC4CHV.cjs} +6 -4
- package/dist/chunk-KZEC4CHV.cjs.map +1 -0
- package/dist/{chunk-UKUYBUFQ.cjs → chunk-MN6PZ4AN.cjs} +7 -7
- package/dist/{chunk-UKUYBUFQ.cjs.map → chunk-MN6PZ4AN.cjs.map} +1 -1
- package/dist/{chunk-VXLEJWLY.js → chunk-MNBAXRVG.js} +89 -17
- package/dist/chunk-MNBAXRVG.js.map +1 -0
- package/dist/{chunk-6YIDHH2S.cjs → chunk-OFPZULMQ.cjs} +32 -10
- package/dist/chunk-OFPZULMQ.cjs.map +1 -0
- package/dist/{chunk-IKRHEUS7.js → chunk-OPTGXEVN.js} +370 -351
- package/dist/chunk-OPTGXEVN.js.map +1 -0
- package/dist/{chunk-77PLEJ54.js → chunk-QDREXAD7.js} +4 -4
- package/dist/{chunk-77PLEJ54.js.map → chunk-QDREXAD7.js.map} +1 -1
- package/dist/{chunk-RWOVNF3V.cjs → chunk-QQLP4M6W.cjs} +400 -381
- package/dist/chunk-QQLP4M6W.cjs.map +1 -0
- package/dist/{chunk-YTGF4L2C.js → chunk-RUD7KS4R.js} +27 -5
- package/dist/chunk-RUD7KS4R.js.map +1 -0
- package/dist/{chunk-USSL3D6L.js → chunk-S4OFEXLA.js} +6 -6
- package/dist/chunk-S4OFEXLA.js.map +1 -0
- package/dist/{chunk-XND7WBVX.js → chunk-VYA6QDNA.js} +43 -3
- package/dist/chunk-VYA6QDNA.js.map +1 -0
- package/dist/{chunk-KUSYIHW7.js → chunk-WYP6OOCT.js} +3 -3
- package/dist/{chunk-KUSYIHW7.js.map → chunk-WYP6OOCT.js.map} +1 -1
- package/dist/{chunk-4SCBD22Z.js → chunk-XB2GITM5.js} +4 -4
- package/dist/{chunk-4SCBD22Z.js.map → chunk-XB2GITM5.js.map} +1 -1
- package/dist/{chunk-X4RMFFMR.js → chunk-XDKK53OL.js} +6 -4
- package/dist/chunk-XDKK53OL.js.map +1 -0
- package/dist/correlation-id.cjs +10 -9
- package/dist/correlation-id.d.cts +4 -1
- package/dist/correlation-id.d.ts +4 -1
- package/dist/correlation-id.js +2 -1
- package/dist/decorators.cjs +8 -8
- package/dist/decorators.js +7 -7
- package/dist/event.cjs +10 -9
- package/dist/event.js +7 -6
- package/dist/functional.cjs +14 -14
- package/dist/functional.js +7 -7
- package/dist/http.cjs +2 -2
- package/dist/http.js +1 -1
- package/dist/index.cjs +85 -65
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +16 -16
- package/dist/{init-Q4uIQKbq.d.cts → init-CIzpC5kZ.d.cts} +9 -2
- package/dist/{init-ls4xSZe5.d.ts → init-C_PiC_Su.d.ts} +9 -2
- package/dist/instrumentation.cjs +12 -12
- package/dist/instrumentation.cjs.map +1 -1
- package/dist/instrumentation.js +4 -4
- package/dist/instrumentation.js.map +1 -1
- package/dist/messaging-adapters.d.cts +1 -1
- package/dist/messaging-adapters.d.ts +1 -1
- package/dist/messaging.cjs +11 -11
- package/dist/messaging.d.cts +1 -1
- package/dist/messaging.d.ts +1 -1
- package/dist/messaging.js +8 -8
- package/dist/metric-helpers.d.cts +1 -1
- package/dist/metric-helpers.d.ts +1 -1
- package/dist/sampling.cjs +26 -10
- package/dist/sampling.d.cts +49 -1
- package/dist/sampling.d.ts +49 -1
- package/dist/sampling.js +1 -1
- package/dist/semantic-helpers.cjs +12 -12
- package/dist/semantic-helpers.js +8 -8
- package/dist/tail-sampling-processor.cjs +6 -2
- package/dist/tail-sampling-processor.d.cts +2 -2
- package/dist/tail-sampling-processor.d.ts +2 -2
- package/dist/tail-sampling-processor.js +5 -1
- package/dist/trace-helpers.d.cts +1 -1
- package/dist/trace-helpers.d.ts +1 -1
- package/dist/{utils-D1trOLNm.d.ts → utils-Buel3cj0.d.ts} +1 -1
- package/dist/{utils-DuNJfXSH.d.cts → utils-CbUkl8r1.d.cts} +1 -1
- package/dist/webhook.cjs +8 -8
- package/dist/webhook.js +7 -7
- package/dist/workflow-distributed.cjs +9 -9
- package/dist/workflow-distributed.js +7 -7
- package/dist/workflow.cjs +12 -12
- package/dist/workflow.js +8 -8
- package/dist/yaml-config.cjs +5 -5
- package/dist/yaml-config.d.cts +5 -4
- package/dist/yaml-config.d.ts +5 -4
- package/dist/yaml-config.js +2 -2
- package/package.json +1 -1
- package/src/correlation-id.ts +10 -5
- package/src/env-config.test.ts +77 -0
- package/src/env-config.ts +106 -0
- package/src/functional.ts +447 -421
- package/src/index.ts +6 -0
- package/src/init.customization.test.ts +61 -0
- package/src/init.integrations.test.ts +6 -1
- package/src/init.ts +23 -13
- package/src/instrumentation.ts +1 -1
- package/src/sampling.test.ts +96 -3
- package/src/sampling.ts +90 -0
- package/src/tail-sampling-processor.test.ts +26 -22
- package/src/tail-sampling-processor.ts +8 -4
- package/src/trace-context.test.ts +73 -0
- package/src/trace-context.ts +44 -12
- package/src/yaml-config.test.ts +71 -0
- package/src/yaml-config.ts +32 -2
- package/dist/chunk-6YIDHH2S.cjs.map +0 -1
- package/dist/chunk-BGVKKL2N.cjs.map +0 -1
- package/dist/chunk-GVLK7YUU.cjs.map +0 -1
- package/dist/chunk-IKRHEUS7.js.map +0 -1
- package/dist/chunk-JVICEM6W.cjs.map +0 -1
- package/dist/chunk-RWOVNF3V.cjs.map +0 -1
- package/dist/chunk-SR35DG5A.js.map +0 -1
- package/dist/chunk-USSL3D6L.js.map +0 -1
- package/dist/chunk-VXLEJWLY.js.map +0 -1
- package/dist/chunk-W4EUTSB2.cjs.map +0 -1
- package/dist/chunk-X4RMFFMR.js.map +0 -1
- package/dist/chunk-XND7WBVX.js.map +0 -1
- package/dist/chunk-XRKAL7WJ.cjs.map +0 -1
- package/dist/chunk-YTGF4L2C.js.map +0 -1
package/src/env-config.test.ts
CHANGED
|
@@ -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
|
|