autotel 4.1.0 → 4.2.1
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/dist/auto.cjs +5 -3
- package/dist/auto.cjs.map +1 -1
- package/dist/auto.js +3 -3
- package/dist/auto.js.map +1 -1
- package/dist/chunk-C_NdSu1c.cjs +34 -0
- package/dist/correlation-id.cjs +1 -1
- package/dist/correlation-id.d.cts.map +1 -1
- package/dist/correlation-id.d.ts.map +1 -1
- package/dist/correlation-id.js +1 -1
- package/dist/decorators.cjs +1 -1
- package/dist/decorators.js +1 -1
- package/dist/{event-ByBTV9M2.js → event-531asIM6.js} +4 -4
- package/dist/{event-ByBTV9M2.js.map → event-531asIM6.js.map} +1 -1
- package/dist/{event-BhHREDJk.cjs → event-CcZYwp50.cjs} +4 -4
- package/dist/{event-BhHREDJk.cjs.map → event-CcZYwp50.cjs.map} +1 -1
- package/dist/event.cjs +1 -1
- package/dist/event.js +1 -1
- package/dist/{functional-zpzNLhky.cjs → functional-C8B0Qa7o.cjs} +10 -7
- package/dist/functional-C8B0Qa7o.cjs.map +1 -0
- package/dist/{functional-DtI0u4vx.js → functional-r-AUIRy_.js} +9 -9
- package/dist/functional-r-AUIRy_.js.map +1 -0
- package/dist/functional.cjs +1 -1
- package/dist/functional.js +1 -1
- package/dist/http.cjs +1 -1
- package/dist/http.js +1 -1
- package/dist/index.cjs +15 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -14
- package/dist/index.js.map +1 -1
- package/dist/{init-D-jnNMix.js → init-BS2JVkrL.js} +2 -2
- package/dist/{init-D-jnNMix.js.map → init-BS2JVkrL.js.map} +1 -1
- package/dist/{init-BX7AmFRl.cjs → init-BXiuPK6j.cjs} +3 -3
- package/dist/{init-BX7AmFRl.cjs.map → init-BXiuPK6j.cjs.map} +1 -1
- package/dist/instrumentation.cjs +2 -2
- package/dist/instrumentation.js +2 -2
- package/dist/logger.cjs +236 -8
- package/dist/logger.cjs.map +1 -0
- package/dist/messaging.cjs +1 -1
- package/dist/messaging.js +1 -1
- package/dist/{node-require-DF5QBX6z.cjs → node-require-CZ_PU448.cjs} +6 -4
- package/dist/node-require-CZ_PU448.cjs.map +1 -0
- package/dist/{node-require-Db1oDpLj.js → node-require-vROmTeJ8.js} +5 -5
- package/dist/node-require-vROmTeJ8.js.map +1 -0
- package/dist/{operation-context-C-2hmmtP.js → operation-context-CKBoA4Qy.js} +3 -3
- package/dist/operation-context-CKBoA4Qy.js.map +1 -0
- package/dist/{operation-context-n4_obUwq.cjs → operation-context-D6LDf4W_.cjs} +3 -1
- package/dist/operation-context-D6LDf4W_.cjs.map +1 -0
- package/dist/register.cjs +3 -1
- package/dist/register.cjs.map +1 -1
- package/dist/register.js +2 -2
- package/dist/register.js.map +1 -1
- package/dist/semantic-helpers.cjs +1 -1
- package/dist/semantic-helpers.js +1 -1
- package/dist/{stable-hash-Cg5cT34Q.js → stable-hash-ChFBIhNt.js} +3 -3
- package/dist/stable-hash-ChFBIhNt.js.map +1 -0
- package/dist/{stable-hash-BNTMrmdB.cjs → stable-hash-brKISGf1.cjs} +4 -2
- package/dist/stable-hash-brKISGf1.cjs.map +1 -0
- package/dist/trace-context-Cijqoi6e.d.cts.map +1 -1
- package/dist/trace-context-Cijqoi6e.d.ts.map +1 -1
- package/dist/trace-helpers.cjs +1 -1
- package/dist/trace-helpers.js +1 -1
- package/dist/{track-wc0HafS_.js → track-COUuU48p.js} +5 -5
- package/dist/track-COUuU48p.js.map +1 -0
- package/dist/{track-D59FfpL0.cjs → track-Cb3Q4QmS.cjs} +4 -2
- package/dist/track-Cb3Q4QmS.cjs.map +1 -0
- package/dist/validate.cjs +1 -1
- package/dist/validate.js +1 -1
- package/dist/webhook.cjs +1 -1
- package/dist/webhook.js +1 -1
- package/dist/workflow-distributed.cjs +1 -1
- package/dist/workflow-distributed.js +1 -1
- package/dist/workflow.cjs +3 -1
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts.map +1 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +3 -3
- package/dist/workflow.js.map +1 -1
- package/dist/yaml-config.cjs +233 -4
- package/dist/yaml-config.cjs.map +1 -0
- package/dist/yaml-config.d.cts.map +1 -1
- package/dist/yaml-config.d.ts.map +1 -1
- package/dist/yaml-config.js +8 -7
- package/dist/yaml-config.js.map +1 -1
- package/package.json +1 -2
- package/dist/functional-DtI0u4vx.js.map +0 -1
- package/dist/functional-zpzNLhky.cjs.map +0 -1
- package/dist/logger-thMPLpOG.cjs +0 -487
- package/dist/logger-thMPLpOG.cjs.map +0 -1
- package/dist/node-require-DF5QBX6z.cjs.map +0 -1
- package/dist/node-require-Db1oDpLj.js.map +0 -1
- package/dist/operation-context-C-2hmmtP.js.map +0 -1
- package/dist/operation-context-n4_obUwq.cjs.map +0 -1
- package/dist/stable-hash-BNTMrmdB.cjs.map +0 -1
- package/dist/stable-hash-Cg5cT34Q.js.map +0 -1
- package/dist/track-D59FfpL0.cjs.map +0 -1
- package/dist/track-wc0HafS_.js.map +0 -1
- package/dist/yaml-config-Ck2uB0Dp.cjs +0 -273
- package/dist/yaml-config-Ck2uB0Dp.cjs.map +0 -1
- package/src/attribute-redacting-processor.test.ts +0 -763
- package/src/attribute-redacting-processor.ts +0 -621
- package/src/attributes/attachers.ts +0 -161
- package/src/attributes/builders.ts +0 -529
- package/src/attributes/domains.ts +0 -42
- package/src/attributes/index.ts +0 -81
- package/src/attributes/registry.ts +0 -323
- package/src/attributes/types.ts +0 -211
- package/src/attributes/utils.ts +0 -64
- package/src/attributes/validators.ts +0 -266
- package/src/attributes.test.ts +0 -292
- package/src/auto.ts +0 -67
- package/src/autotel-logger.test.ts +0 -548
- package/src/autotel-logger.ts +0 -364
- package/src/baggage-span-processor.test.ts +0 -202
- package/src/baggage-span-processor.ts +0 -100
- package/src/business-baggage.test.ts +0 -500
- package/src/business-baggage.ts +0 -669
- package/src/circuit-breaker.test.ts +0 -341
- package/src/circuit-breaker.ts +0 -184
- package/src/config.test.ts +0 -94
- package/src/config.ts +0 -172
- package/src/correlated-events.test.ts +0 -151
- package/src/correlated-events.ts +0 -47
- package/src/correlation-id.test.ts +0 -163
- package/src/correlation-id.ts +0 -206
- package/src/db.test.ts +0 -252
- package/src/db.ts +0 -447
- package/src/decorators.test.ts +0 -153
- package/src/decorators.ts +0 -188
- package/src/define-event.test.ts +0 -41
- package/src/define-event.ts +0 -58
- package/src/devtools.ts +0 -60
- package/src/drain-pipeline.test.ts +0 -68
- package/src/drain-pipeline.ts +0 -199
- package/src/drain-toolkit.test.ts +0 -113
- package/src/drain-toolkit.ts +0 -129
- package/src/enricher-toolkit.test.ts +0 -67
- package/src/enricher-toolkit.ts +0 -79
- package/src/enrichers.test.ts +0 -150
- package/src/enrichers.ts +0 -145
- package/src/env-config.test.ts +0 -323
- package/src/env-config.ts +0 -309
- package/src/error-catalog.test.ts +0 -133
- package/src/error-catalog.ts +0 -262
- package/src/event-queue.test.ts +0 -864
- package/src/event-queue.ts +0 -699
- package/src/event-subscriber.ts +0 -262
- package/src/event-testing.ts +0 -197
- package/src/event.test.ts +0 -1104
- package/src/event.ts +0 -988
- package/src/events-config.ts +0 -235
- package/src/exporters.ts +0 -165
- package/src/filtering-span-processor.test.ts +0 -281
- package/src/filtering-span-processor.ts +0 -111
- package/src/flatten-attributes.test.ts +0 -76
- package/src/flatten-attributes.ts +0 -80
- package/src/functional.strict-types.typecheck.ts +0 -53
- package/src/functional.test.ts +0 -1464
- package/src/functional.ts +0 -2539
- package/src/functional.types.test.ts +0 -135
- package/src/hook.mjs +0 -15
- package/src/http.test.ts +0 -485
- package/src/http.ts +0 -424
- package/src/index.ts +0 -433
- package/src/init-auto-redactor.test.ts +0 -53
- package/src/init-redactor.test.ts +0 -8
- package/src/init.customization.test.ts +0 -665
- package/src/init.integrations.test.ts +0 -399
- package/src/init.openllmetry.test.ts +0 -194
- package/src/init.protocol.test.ts +0 -215
- package/src/init.ts +0 -2439
- package/src/instrumentation.test.ts +0 -108
- package/src/instrumentation.ts +0 -319
- package/src/logger.test.ts +0 -125
- package/src/logger.ts +0 -341
- package/src/messaging-adapters.test.ts +0 -595
- package/src/messaging-adapters.ts +0 -583
- package/src/messaging-testing.test.ts +0 -573
- package/src/messaging-testing.ts +0 -935
- package/src/messaging.test.ts +0 -1646
- package/src/messaging.ts +0 -2245
- package/src/metric-helpers.ts +0 -47
- package/src/metric-testing.ts +0 -197
- package/src/metric.ts +0 -446
- package/src/metrics.test.ts +0 -241
- package/src/node-require.ts +0 -123
- package/src/operation-context.ts +0 -93
- package/src/parse-error.test.ts +0 -73
- package/src/parse-error.ts +0 -112
- package/src/posthog-logs.test.ts +0 -115
- package/src/posthog-logs.ts +0 -77
- package/src/pretty-console-exporter.test.ts +0 -545
- package/src/pretty-console-exporter.ts +0 -413
- package/src/pretty-log-formatter.test.ts +0 -123
- package/src/pretty-log-formatter.ts +0 -210
- package/src/processors/canonical-log-line-processor.test.ts +0 -523
- package/src/processors/canonical-log-line-processor.ts +0 -396
- package/src/processors.ts +0 -152
- package/src/rate-limiter.test.ts +0 -199
- package/src/rate-limiter.ts +0 -98
- package/src/redact-values.test.ts +0 -90
- package/src/redact-values.ts +0 -34
- package/src/register.ts +0 -37
- package/src/request-logger.test.ts +0 -545
- package/src/request-logger.ts +0 -342
- package/src/sampling.test.ts +0 -1060
- package/src/sampling.ts +0 -737
- package/src/security-schema.test.ts +0 -45
- package/src/security-schema.ts +0 -107
- package/src/semantic-conventions.ts +0 -15
- package/src/semantic-helpers.test.ts +0 -226
- package/src/semantic-helpers.ts +0 -438
- package/src/shutdown.test.ts +0 -364
- package/src/shutdown.ts +0 -246
- package/src/span-name-normalizer.test.ts +0 -377
- package/src/span-name-normalizer.ts +0 -213
- package/src/stable-hash.ts +0 -27
- package/src/structured-error.test.ts +0 -191
- package/src/structured-error.ts +0 -157
- package/src/stub.integration.test.ts +0 -361
- package/src/tail-sampling-processor.test.ts +0 -230
- package/src/tail-sampling-processor.ts +0 -55
- package/src/test-span-collector.test.ts +0 -234
- package/src/test-span-collector.ts +0 -150
- package/src/testing.ts +0 -705
- package/src/trace-context.test.ts +0 -73
- package/src/trace-context.ts +0 -567
- package/src/trace-helpers.new.test.ts +0 -278
- package/src/trace-helpers.test.ts +0 -290
- package/src/trace-helpers.ts +0 -710
- package/src/trace-hybrid.test.ts +0 -42
- package/src/trace-hybrid.ts +0 -37
- package/src/tracer-provider.test.ts +0 -183
- package/src/tracer-provider.ts +0 -266
- package/src/track.test.ts +0 -154
- package/src/track.ts +0 -216
- package/src/validate.test.ts +0 -287
- package/src/validate.ts +0 -307
- package/src/validation-attributes.ts +0 -43
- package/src/validation.test.ts +0 -330
- package/src/validation.ts +0 -246
- package/src/variable-name-inference.test.ts +0 -178
- package/src/variable-name-inference.ts +0 -242
- package/src/webhook.test.ts +0 -649
- package/src/webhook.ts +0 -637
- package/src/workflow-distributed.test.ts +0 -786
- package/src/workflow-distributed.ts +0 -916
- package/src/workflow.async-safety.integration.test.ts +0 -345
- package/src/workflow.test.ts +0 -647
- package/src/workflow.ts +0 -810
- package/src/yaml-config.test.ts +0 -373
- package/src/yaml-config.ts +0 -351
package/src/yaml-config.test.ts
DELETED
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
loadYamlConfigFromFile,
|
|
4
|
-
loadYamlConfig,
|
|
5
|
-
hasYamlConfig,
|
|
6
|
-
} from './yaml-config';
|
|
7
|
-
import { writeFileSync, mkdirSync, rmSync } from 'node:fs';
|
|
8
|
-
import path from 'node:path';
|
|
9
|
-
import { tmpdir } from 'node:os';
|
|
10
|
-
import { AdaptiveSampler } from './sampling';
|
|
11
|
-
|
|
12
|
-
describe('yaml-config', () => {
|
|
13
|
-
const testDir = path.join(tmpdir(), `autotel-yaml-test-${Date.now()}`);
|
|
14
|
-
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
mkdirSync(testDir, { recursive: true });
|
|
17
|
-
// Reset environment variables
|
|
18
|
-
delete process.env.AUTOTEL_CONFIG_FILE;
|
|
19
|
-
delete process.env.TEST_SERVICE_NAME;
|
|
20
|
-
delete process.env.TEST_ENDPOINT;
|
|
21
|
-
delete process.env.UNDEFINED_VAR;
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
afterEach(() => {
|
|
25
|
-
// Cleanup test directory
|
|
26
|
-
try {
|
|
27
|
-
rmSync(testDir, { recursive: true, force: true });
|
|
28
|
-
} catch {
|
|
29
|
-
// Ignore cleanup errors
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
describe('loadYamlConfigFromFile', () => {
|
|
34
|
-
it('should parse basic YAML config', () => {
|
|
35
|
-
const yaml = `
|
|
36
|
-
service:
|
|
37
|
-
name: test-service
|
|
38
|
-
version: 1.0.0
|
|
39
|
-
environment: production
|
|
40
|
-
debug: true
|
|
41
|
-
`;
|
|
42
|
-
const filePath = path.join(testDir, 'test.yaml');
|
|
43
|
-
writeFileSync(filePath, yaml);
|
|
44
|
-
|
|
45
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
46
|
-
expect(config.service).toBe('test-service');
|
|
47
|
-
expect(config.version).toBe('1.0.0');
|
|
48
|
-
expect(config.environment).toBe('production');
|
|
49
|
-
expect(config.debug).toBe(true);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('should parse exporter configuration', () => {
|
|
53
|
-
const yaml = `
|
|
54
|
-
exporter:
|
|
55
|
-
endpoint: http://localhost:4318
|
|
56
|
-
protocol: grpc
|
|
57
|
-
headers:
|
|
58
|
-
x-api-key: secret-key
|
|
59
|
-
x-custom: value
|
|
60
|
-
`;
|
|
61
|
-
const filePath = path.join(testDir, 'exporter.yaml');
|
|
62
|
-
writeFileSync(filePath, yaml);
|
|
63
|
-
|
|
64
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
65
|
-
expect(config.endpoint).toBe('http://localhost:4318');
|
|
66
|
-
expect(config.protocol).toBe('grpc');
|
|
67
|
-
expect(config.headers).toEqual({
|
|
68
|
-
'x-api-key': 'secret-key',
|
|
69
|
-
'x-custom': 'value',
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('should parse exporter destinations configuration', () => {
|
|
74
|
-
const yaml = `
|
|
75
|
-
exporter:
|
|
76
|
-
destinations:
|
|
77
|
-
- endpoint: https://otlp-gateway.grafana.net/otlp
|
|
78
|
-
headers:
|
|
79
|
-
Authorization: Basic grafana
|
|
80
|
-
- endpoint: https://api.honeycomb.io
|
|
81
|
-
protocol: grpc
|
|
82
|
-
headers:
|
|
83
|
-
x-honeycomb-team: secret-key
|
|
84
|
-
signals:
|
|
85
|
-
- traces
|
|
86
|
-
`;
|
|
87
|
-
const filePath = path.join(testDir, 'exporter-destinations.yaml');
|
|
88
|
-
writeFileSync(filePath, yaml);
|
|
89
|
-
|
|
90
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
91
|
-
expect(config.destinations).toEqual([
|
|
92
|
-
{
|
|
93
|
-
endpoint: 'https://otlp-gateway.grafana.net/otlp',
|
|
94
|
-
headers: {
|
|
95
|
-
Authorization: 'Basic grafana',
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
endpoint: 'https://api.honeycomb.io',
|
|
100
|
-
protocol: 'grpc',
|
|
101
|
-
headers: {
|
|
102
|
-
'x-honeycomb-team': 'secret-key',
|
|
103
|
-
},
|
|
104
|
-
signals: ['traces'],
|
|
105
|
-
},
|
|
106
|
-
]);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it('should parse resource attributes', () => {
|
|
110
|
-
const yaml = `
|
|
111
|
-
resource:
|
|
112
|
-
deployment.environment: production
|
|
113
|
-
team: backend
|
|
114
|
-
version: 2.0.0
|
|
115
|
-
`;
|
|
116
|
-
const filePath = path.join(testDir, 'resource.yaml');
|
|
117
|
-
writeFileSync(filePath, yaml);
|
|
118
|
-
|
|
119
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
120
|
-
expect(config.resourceAttributes).toEqual({
|
|
121
|
-
'deployment.environment': 'production',
|
|
122
|
-
team: 'backend',
|
|
123
|
-
version: '2.0.0',
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
it('should parse autoInstrumentations as array', () => {
|
|
128
|
-
const yaml = `
|
|
129
|
-
autoInstrumentations:
|
|
130
|
-
- express
|
|
131
|
-
- http
|
|
132
|
-
- pino
|
|
133
|
-
`;
|
|
134
|
-
const filePath = path.join(testDir, 'autoInstrumentations.yaml');
|
|
135
|
-
writeFileSync(filePath, yaml);
|
|
136
|
-
|
|
137
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
138
|
-
expect(config.autoInstrumentations).toEqual(['express', 'http', 'pino']);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('should parse autoInstrumentations as object', () => {
|
|
142
|
-
const yaml = `
|
|
143
|
-
autoInstrumentations:
|
|
144
|
-
express:
|
|
145
|
-
enabled: true
|
|
146
|
-
http:
|
|
147
|
-
enabled: false
|
|
148
|
-
`;
|
|
149
|
-
const filePath = path.join(testDir, 'autoInstrumentations-obj.yaml');
|
|
150
|
-
writeFileSync(filePath, yaml);
|
|
151
|
-
|
|
152
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
153
|
-
expect(config.autoInstrumentations).toEqual({
|
|
154
|
-
express: { enabled: true },
|
|
155
|
-
http: { enabled: false },
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
it('should substitute environment variables', () => {
|
|
160
|
-
process.env.TEST_SERVICE_NAME = 'from-env';
|
|
161
|
-
process.env.TEST_ENDPOINT = 'http://env-endpoint:4318';
|
|
162
|
-
|
|
163
|
-
const yaml = `
|
|
164
|
-
service:
|
|
165
|
-
name: \${env:TEST_SERVICE_NAME}
|
|
166
|
-
exporter:
|
|
167
|
-
endpoint: \${env:TEST_ENDPOINT}
|
|
168
|
-
`;
|
|
169
|
-
const filePath = path.join(testDir, 'env-test.yaml');
|
|
170
|
-
writeFileSync(filePath, yaml);
|
|
171
|
-
|
|
172
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
173
|
-
expect(config.service).toBe('from-env');
|
|
174
|
-
expect(config.endpoint).toBe('http://env-endpoint:4318');
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it('should use default value when env var not set', () => {
|
|
178
|
-
const yaml = `
|
|
179
|
-
service:
|
|
180
|
-
name: \${env:UNDEFINED_VAR:-default-service}
|
|
181
|
-
environment: \${env:NODE_ENV:-development}
|
|
182
|
-
`;
|
|
183
|
-
const filePath = path.join(testDir, 'default-test.yaml');
|
|
184
|
-
writeFileSync(filePath, yaml);
|
|
185
|
-
|
|
186
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
187
|
-
expect(config.service).toBe('default-service');
|
|
188
|
-
// NODE_ENV might be set in test environment, so just check it's a string
|
|
189
|
-
expect(typeof config.environment).toBe('string');
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
it('should handle nested env var substitution', () => {
|
|
193
|
-
process.env.TEST_SERVICE_NAME = 'nested-service';
|
|
194
|
-
|
|
195
|
-
const yaml = `
|
|
196
|
-
service:
|
|
197
|
-
name: \${env:TEST_SERVICE_NAME}
|
|
198
|
-
exporter:
|
|
199
|
-
headers:
|
|
200
|
-
x-api-key: \${env:TEST_API_KEY:-fallback-key}
|
|
201
|
-
`;
|
|
202
|
-
const filePath = path.join(testDir, 'nested-env.yaml');
|
|
203
|
-
writeFileSync(filePath, yaml);
|
|
204
|
-
|
|
205
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
206
|
-
expect(config.service).toBe('nested-service');
|
|
207
|
-
expect(config.headers).toEqual({
|
|
208
|
-
'x-api-key': 'fallback-key',
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
it('should warn on missing env var without default', () => {
|
|
213
|
-
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
214
|
-
|
|
215
|
-
const yaml = `
|
|
216
|
-
service:
|
|
217
|
-
name: \${env:DEFINITELY_NOT_SET}
|
|
218
|
-
`;
|
|
219
|
-
const filePath = path.join(testDir, 'missing-env.yaml');
|
|
220
|
-
writeFileSync(filePath, yaml);
|
|
221
|
-
|
|
222
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
223
|
-
// Empty string from missing env var results in undefined (filtered out as falsy)
|
|
224
|
-
expect(config.service).toBeUndefined();
|
|
225
|
-
expect(warnSpy).toHaveBeenCalledWith(
|
|
226
|
-
expect.stringContaining('DEFINITELY_NOT_SET'),
|
|
227
|
-
);
|
|
228
|
-
|
|
229
|
-
warnSpy.mockRestore();
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
it('should throw on invalid YAML', () => {
|
|
233
|
-
const yaml = `
|
|
234
|
-
service:
|
|
235
|
-
name: test
|
|
236
|
-
invalid yaml: [unclosed
|
|
237
|
-
`;
|
|
238
|
-
const filePath = path.join(testDir, 'invalid.yaml');
|
|
239
|
-
writeFileSync(filePath, yaml);
|
|
240
|
-
|
|
241
|
-
expect(() => loadYamlConfigFromFile(filePath)).toThrow();
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
it('should throw on non-existent file', () => {
|
|
245
|
-
expect(() => loadYamlConfigFromFile('/non/existent/path.yaml')).toThrow();
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
it('should map sampling preset to config.sampling shorthand', () => {
|
|
249
|
-
const yaml = `
|
|
250
|
-
sampling:
|
|
251
|
-
preset: production
|
|
252
|
-
`;
|
|
253
|
-
const filePath = path.join(testDir, 'sampling-preset.yaml');
|
|
254
|
-
writeFileSync(filePath, yaml);
|
|
255
|
-
|
|
256
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
257
|
-
expect(config.sampling).toBe('production');
|
|
258
|
-
expect(config.sampler).toBeUndefined();
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
it('should prefer sampling preset over typed sampler config', () => {
|
|
262
|
-
const yaml = `
|
|
263
|
-
sampling:
|
|
264
|
-
preset: off
|
|
265
|
-
type: adaptive
|
|
266
|
-
baseline_rate: 0.5
|
|
267
|
-
`;
|
|
268
|
-
const filePath = path.join(testDir, 'sampling-preset-precedence.yaml');
|
|
269
|
-
writeFileSync(filePath, yaml);
|
|
270
|
-
|
|
271
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
272
|
-
expect(config.sampling).toBe('off');
|
|
273
|
-
expect(config.sampler).toBeUndefined();
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
it('should warn when preset is combined with ignored override fields', () => {
|
|
277
|
-
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
278
|
-
const yaml = `
|
|
279
|
-
sampling:
|
|
280
|
-
preset: production
|
|
281
|
-
type: adaptive
|
|
282
|
-
baseline_rate: 0.5
|
|
283
|
-
slow_threshold_ms: 250
|
|
284
|
-
`;
|
|
285
|
-
const filePath = path.join(testDir, 'sampling-preset-warning.yaml');
|
|
286
|
-
writeFileSync(filePath, yaml);
|
|
287
|
-
|
|
288
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
289
|
-
|
|
290
|
-
expect(config.sampling).toBe('production');
|
|
291
|
-
expect(config.sampler).toBeUndefined();
|
|
292
|
-
expect(warnSpy).toHaveBeenCalledWith(
|
|
293
|
-
expect.stringContaining(
|
|
294
|
-
'sampling.preset="production" ignores these YAML fields',
|
|
295
|
-
),
|
|
296
|
-
);
|
|
297
|
-
expect(warnSpy).toHaveBeenCalledWith(
|
|
298
|
-
expect.stringContaining('type, baseline_rate, slow_threshold_ms'),
|
|
299
|
-
);
|
|
300
|
-
|
|
301
|
-
warnSpy.mockRestore();
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
it('should still build sampler from typed YAML config without preset', () => {
|
|
305
|
-
const yaml = `
|
|
306
|
-
sampling:
|
|
307
|
-
type: adaptive
|
|
308
|
-
baseline_rate: 0.25
|
|
309
|
-
`;
|
|
310
|
-
const filePath = path.join(testDir, 'sampling-adaptive.yaml');
|
|
311
|
-
writeFileSync(filePath, yaml);
|
|
312
|
-
|
|
313
|
-
const config = loadYamlConfigFromFile(filePath);
|
|
314
|
-
expect(config.sampler).toBeInstanceOf(AdaptiveSampler);
|
|
315
|
-
expect(config.sampling).toBeUndefined();
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
describe('loadYamlConfig', () => {
|
|
320
|
-
it('should return null when no config file exists', () => {
|
|
321
|
-
// No AUTOTEL_CONFIG_FILE set and no autotel.yaml in cwd
|
|
322
|
-
const result = loadYamlConfig();
|
|
323
|
-
// Result depends on whether autotel.yaml exists in cwd
|
|
324
|
-
// This test just verifies the function doesn't throw
|
|
325
|
-
expect(result === null || typeof result === 'object').toBe(true);
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
it('should load from AUTOTEL_CONFIG_FILE env var', () => {
|
|
329
|
-
const yaml = `
|
|
330
|
-
service:
|
|
331
|
-
name: from-env-path
|
|
332
|
-
`;
|
|
333
|
-
const filePath = path.join(testDir, 'env-config.yaml');
|
|
334
|
-
writeFileSync(filePath, yaml);
|
|
335
|
-
process.env.AUTOTEL_CONFIG_FILE = filePath;
|
|
336
|
-
|
|
337
|
-
const config = loadYamlConfig();
|
|
338
|
-
expect(config).not.toBeNull();
|
|
339
|
-
expect(config?.service).toBe('from-env-path');
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
it('should warn when AUTOTEL_CONFIG_FILE points to non-existent file', () => {
|
|
343
|
-
const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
344
|
-
process.env.AUTOTEL_CONFIG_FILE = '/non/existent/file.yaml';
|
|
345
|
-
|
|
346
|
-
const config = loadYamlConfig();
|
|
347
|
-
expect(config).toBeNull();
|
|
348
|
-
expect(warnSpy).toHaveBeenCalledWith(
|
|
349
|
-
expect.stringContaining('Config file not found'),
|
|
350
|
-
);
|
|
351
|
-
|
|
352
|
-
warnSpy.mockRestore();
|
|
353
|
-
});
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
describe('hasYamlConfig', () => {
|
|
357
|
-
it('should return false when no config exists', () => {
|
|
358
|
-
// Delete any AUTOTEL_CONFIG_FILE
|
|
359
|
-
delete process.env.AUTOTEL_CONFIG_FILE;
|
|
360
|
-
// This test depends on cwd not having autotel.yaml
|
|
361
|
-
// Just verify it returns a boolean
|
|
362
|
-
expect(typeof hasYamlConfig()).toBe('boolean');
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
it('should return true when AUTOTEL_CONFIG_FILE exists', () => {
|
|
366
|
-
const filePath = path.join(testDir, 'has-config.yaml');
|
|
367
|
-
writeFileSync(filePath, 'service:\n name: test\n');
|
|
368
|
-
process.env.AUTOTEL_CONFIG_FILE = filePath;
|
|
369
|
-
|
|
370
|
-
expect(hasYamlConfig()).toBe(true);
|
|
371
|
-
});
|
|
372
|
-
});
|
|
373
|
-
});
|