autotel 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -2
- 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
|
@@ -1,399 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import type { NodeSDK } from '@opentelemetry/sdk-node';
|
|
3
|
-
import type { DeepMockProxy } from 'vitest-mock-extended';
|
|
4
|
-
import { mockDeep } from 'vitest-mock-extended';
|
|
5
|
-
import {
|
|
6
|
-
_setAutoInstrumentationsLoader,
|
|
7
|
-
_resetAutoInstrumentationsLoader,
|
|
8
|
-
type AutoInstrumentationsLoader,
|
|
9
|
-
} from './init';
|
|
10
|
-
|
|
11
|
-
type SdkRecord = {
|
|
12
|
-
options: Record<string, unknown>;
|
|
13
|
-
instance: DeepMockProxy<NodeSDK>;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const mockedModules = [
|
|
17
|
-
'@opentelemetry/sdk-node',
|
|
18
|
-
'@opentelemetry/exporter-trace-otlp-http',
|
|
19
|
-
'@opentelemetry/exporter-metrics-otlp-http',
|
|
20
|
-
'@opentelemetry/sdk-metrics',
|
|
21
|
-
];
|
|
22
|
-
|
|
23
|
-
// Mock instrumentation classes with exact names from OpenTelemetry.
|
|
24
|
-
// NodeSDK.start() calls lifecycle hooks on each instrumentation instance.
|
|
25
|
-
class MockInstrumentationBase {
|
|
26
|
-
constructor(public config?: Record<string, unknown>) {}
|
|
27
|
-
|
|
28
|
-
setConfig(_config: Record<string, unknown>) {}
|
|
29
|
-
setTracerProvider(_provider: unknown) {}
|
|
30
|
-
setMeterProvider(_provider: unknown) {}
|
|
31
|
-
setLoggerProvider(_provider: unknown) {}
|
|
32
|
-
enable() {}
|
|
33
|
-
disable() {}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
class MongoDBInstrumentation extends MockInstrumentationBase {}
|
|
37
|
-
|
|
38
|
-
class MongooseInstrumentation extends MockInstrumentationBase {}
|
|
39
|
-
|
|
40
|
-
class HttpInstrumentation extends MockInstrumentationBase {}
|
|
41
|
-
|
|
42
|
-
async function loadInitWithMocks() {
|
|
43
|
-
const sdkInstances: SdkRecord[] = [];
|
|
44
|
-
const traceExporterOptions: Record<string, unknown>[] = [];
|
|
45
|
-
const metricExporterOptions: Record<string, unknown>[] = [];
|
|
46
|
-
const autoInstrumentationsConfig: Record<string, { enabled?: boolean }>[] =
|
|
47
|
-
[];
|
|
48
|
-
const logMessages: {
|
|
49
|
-
level: string;
|
|
50
|
-
message: string;
|
|
51
|
-
}[] = [];
|
|
52
|
-
|
|
53
|
-
class MockNodeSDK {
|
|
54
|
-
constructor(options: Record<string, unknown>) {
|
|
55
|
-
const instance = mockDeep<NodeSDK>();
|
|
56
|
-
instance.start.mockImplementation(() => {});
|
|
57
|
-
instance.shutdown.mockResolvedValue();
|
|
58
|
-
sdkInstances.push({ options, instance });
|
|
59
|
-
return instance;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
class MockOTLPTraceExporter {
|
|
64
|
-
options: Record<string, unknown>;
|
|
65
|
-
|
|
66
|
-
constructor(options: Record<string, unknown>) {
|
|
67
|
-
this.options = options;
|
|
68
|
-
traceExporterOptions.push(options);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
class MockOTLPMetricExporter {
|
|
73
|
-
options: Record<string, unknown>;
|
|
74
|
-
|
|
75
|
-
constructor(options: Record<string, unknown>) {
|
|
76
|
-
this.options = options;
|
|
77
|
-
metricExporterOptions.push(options);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
class MockPeriodicExportingMetricReader {
|
|
82
|
-
constructor(public options: Record<string, unknown>) {}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Mock getNodeAutoInstrumentations function
|
|
86
|
-
const mockGetNodeAutoInstrumentations = vi.fn(
|
|
87
|
-
(config?: Record<string, { enabled?: boolean }>) => {
|
|
88
|
-
if (config) {
|
|
89
|
-
autoInstrumentationsConfig.push(config);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Simulate returning auto-instrumentations based on config
|
|
93
|
-
const instrumentations: unknown[] = [];
|
|
94
|
-
|
|
95
|
-
// If MongoDB is not explicitly disabled, add it
|
|
96
|
-
if (
|
|
97
|
-
!config ||
|
|
98
|
-
!config['@opentelemetry/instrumentation-mongodb'] ||
|
|
99
|
-
config['@opentelemetry/instrumentation-mongodb'].enabled !== false
|
|
100
|
-
) {
|
|
101
|
-
instrumentations.push(new MongoDBInstrumentation());
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// If Mongoose is not explicitly disabled, add it
|
|
105
|
-
if (
|
|
106
|
-
!config ||
|
|
107
|
-
!config['@opentelemetry/instrumentation-mongoose'] ||
|
|
108
|
-
config['@opentelemetry/instrumentation-mongoose'].enabled !== false
|
|
109
|
-
) {
|
|
110
|
-
instrumentations.push(new MongooseInstrumentation());
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// If HTTP is not explicitly disabled, add it
|
|
114
|
-
if (
|
|
115
|
-
!config ||
|
|
116
|
-
!config['@opentelemetry/instrumentation-http'] ||
|
|
117
|
-
config['@opentelemetry/instrumentation-http'].enabled !== false
|
|
118
|
-
) {
|
|
119
|
-
instrumentations.push(new HttpInstrumentation());
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
return instrumentations;
|
|
123
|
-
},
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
// Mock logger to capture log messages (Pino-compatible signature: extra, message)
|
|
127
|
-
const mockLogger = {
|
|
128
|
-
info: vi.fn((extra: Record<string, unknown>, msg?: string) => {
|
|
129
|
-
logMessages.push({ level: 'info', message: msg || '' });
|
|
130
|
-
}),
|
|
131
|
-
warn: vi.fn((extra: Record<string, unknown>, msg?: string) => {
|
|
132
|
-
logMessages.push({ level: 'warn', message: msg || '' });
|
|
133
|
-
}),
|
|
134
|
-
error: vi.fn((extra: Record<string, unknown>, msg?: string) => {
|
|
135
|
-
logMessages.push({ level: 'error', message: msg || '' });
|
|
136
|
-
}),
|
|
137
|
-
debug: vi.fn((extra: Record<string, unknown>, msg?: string) => {
|
|
138
|
-
logMessages.push({ level: 'debug', message: msg || '' });
|
|
139
|
-
}),
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
vi.doMock('@opentelemetry/sdk-node', () => ({
|
|
143
|
-
NodeSDK: MockNodeSDK,
|
|
144
|
-
}));
|
|
145
|
-
|
|
146
|
-
vi.doMock('@opentelemetry/exporter-trace-otlp-http', () => ({
|
|
147
|
-
OTLPTraceExporter: MockOTLPTraceExporter,
|
|
148
|
-
}));
|
|
149
|
-
|
|
150
|
-
vi.doMock('@opentelemetry/exporter-metrics-otlp-http', () => ({
|
|
151
|
-
OTLPMetricExporter: MockOTLPMetricExporter,
|
|
152
|
-
}));
|
|
153
|
-
|
|
154
|
-
vi.doMock('@opentelemetry/sdk-metrics', () => ({
|
|
155
|
-
PeriodicExportingMetricReader: MockPeriodicExportingMetricReader,
|
|
156
|
-
}));
|
|
157
|
-
|
|
158
|
-
const initModule = await import('./init');
|
|
159
|
-
|
|
160
|
-
// Inject the mock loader via the exported setter
|
|
161
|
-
initModule._setAutoInstrumentationsLoader(
|
|
162
|
-
() => mockGetNodeAutoInstrumentations as AutoInstrumentationsLoader,
|
|
163
|
-
);
|
|
164
|
-
|
|
165
|
-
return {
|
|
166
|
-
init: initModule.init,
|
|
167
|
-
getConfig: initModule.getConfig,
|
|
168
|
-
sdkInstances,
|
|
169
|
-
traceExporterOptions,
|
|
170
|
-
metricExporterOptions,
|
|
171
|
-
autoInstrumentationsConfig,
|
|
172
|
-
logMessages,
|
|
173
|
-
mockLogger,
|
|
174
|
-
mockGetNodeAutoInstrumentations,
|
|
175
|
-
initModule,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
describe('init() integrations vs instrumentations', () => {
|
|
180
|
-
beforeEach(() => {
|
|
181
|
-
vi.resetModules();
|
|
182
|
-
_resetAutoInstrumentationsLoader();
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
afterEach(async () => {
|
|
186
|
-
for (const mod of mockedModules) {
|
|
187
|
-
vi.doUnmock(mod);
|
|
188
|
-
}
|
|
189
|
-
vi.clearAllMocks();
|
|
190
|
-
_resetAutoInstrumentationsLoader();
|
|
191
|
-
delete process.env.AUTOTEL_METRICS;
|
|
192
|
-
// Reset global OTel state that can leak between forked test files
|
|
193
|
-
const { trace, context, propagation } = await import('@opentelemetry/api');
|
|
194
|
-
trace.disable();
|
|
195
|
-
context.disable();
|
|
196
|
-
propagation.disable();
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
it('excludes manual instrumentations from auto-instrumentations when autoInstrumentations: true', async () => {
|
|
200
|
-
const {
|
|
201
|
-
init,
|
|
202
|
-
sdkInstances,
|
|
203
|
-
autoInstrumentationsConfig,
|
|
204
|
-
mockLogger,
|
|
205
|
-
logMessages,
|
|
206
|
-
} = await loadInitWithMocks();
|
|
207
|
-
|
|
208
|
-
const manualMongoDBInstrumentation = new MongoDBInstrumentation({
|
|
209
|
-
requireParentSpan: false,
|
|
210
|
-
});
|
|
211
|
-
const manualMongooseInstrumentation = new MongooseInstrumentation({
|
|
212
|
-
requireParentSpan: false,
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
init({
|
|
216
|
-
service: 'test-app',
|
|
217
|
-
autoInstrumentations: true,
|
|
218
|
-
instrumentations: [
|
|
219
|
-
manualMongoDBInstrumentation,
|
|
220
|
-
manualMongooseInstrumentation,
|
|
221
|
-
],
|
|
222
|
-
logger: mockLogger,
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
// Check that auto-instrumentations were called with exclusion config
|
|
226
|
-
expect(autoInstrumentationsConfig).toHaveLength(1);
|
|
227
|
-
const config = autoInstrumentationsConfig[0];
|
|
228
|
-
expect(config['@opentelemetry/instrumentation-mongodb']).toEqual({
|
|
229
|
-
enabled: false,
|
|
230
|
-
});
|
|
231
|
-
expect(config['@opentelemetry/instrumentation-mongoose']).toEqual({
|
|
232
|
-
enabled: false,
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
// Check that manual instrumentations are in the final list
|
|
236
|
-
const options = sdkInstances.at(-1)?.options as Record<string, unknown>;
|
|
237
|
-
const instrumentations = options.instrumentations as unknown[];
|
|
238
|
-
expect(instrumentations).toContain(manualMongoDBInstrumentation);
|
|
239
|
-
expect(instrumentations).toContain(manualMongooseInstrumentation);
|
|
240
|
-
|
|
241
|
-
// Check that warning was logged about detected manual instrumentations
|
|
242
|
-
const manualInstrumentationWarnings = logMessages.filter(
|
|
243
|
-
(log) => log.level === 'info' && log.message.includes('Detected manual'),
|
|
244
|
-
);
|
|
245
|
-
expect(manualInstrumentationWarnings).toHaveLength(1);
|
|
246
|
-
expect(manualInstrumentationWarnings[0].message).toContain(
|
|
247
|
-
'Detected manual instrumentations',
|
|
248
|
-
);
|
|
249
|
-
expect(manualInstrumentationWarnings[0].message).toContain(
|
|
250
|
-
'MongoDBInstrumentation',
|
|
251
|
-
);
|
|
252
|
-
expect(manualInstrumentationWarnings[0].message).toContain(
|
|
253
|
-
'MongooseInstrumentation',
|
|
254
|
-
);
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
it('excludes manual instrumentations from specific autoInstrumentations list', async () => {
|
|
258
|
-
const {
|
|
259
|
-
init,
|
|
260
|
-
sdkInstances,
|
|
261
|
-
autoInstrumentationsConfig,
|
|
262
|
-
mockLogger,
|
|
263
|
-
logMessages,
|
|
264
|
-
} = await loadInitWithMocks();
|
|
265
|
-
|
|
266
|
-
const manualMongoDBInstrumentation = new MongoDBInstrumentation({
|
|
267
|
-
requireParentSpan: false,
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
init({
|
|
271
|
-
service: 'test-app',
|
|
272
|
-
autoInstrumentations: ['http', 'mongodb'],
|
|
273
|
-
instrumentations: [manualMongoDBInstrumentation],
|
|
274
|
-
logger: mockLogger,
|
|
275
|
-
});
|
|
276
|
-
|
|
277
|
-
// Check that auto-instrumentations were called with MongoDB disabled
|
|
278
|
-
expect(autoInstrumentationsConfig).toHaveLength(1);
|
|
279
|
-
const config = autoInstrumentationsConfig[0];
|
|
280
|
-
expect(config['@opentelemetry/instrumentation-mongodb']).toEqual({
|
|
281
|
-
enabled: false,
|
|
282
|
-
});
|
|
283
|
-
expect(config['@opentelemetry/instrumentation-http']).toEqual({
|
|
284
|
-
enabled: true,
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
// Check that manual MongoDB instrumentation is in the final list
|
|
288
|
-
const options = sdkInstances.at(-1)?.options as Record<string, unknown>;
|
|
289
|
-
const instrumentations = options.instrumentations as unknown[];
|
|
290
|
-
expect(instrumentations).toContain(manualMongoDBInstrumentation);
|
|
291
|
-
|
|
292
|
-
// Check that warning was logged about detected manual instrumentations
|
|
293
|
-
const manualInstrumentationWarnings = logMessages.filter(
|
|
294
|
-
(log) => log.level === 'info' && log.message.includes('Detected manual'),
|
|
295
|
-
);
|
|
296
|
-
expect(manualInstrumentationWarnings).toHaveLength(1);
|
|
297
|
-
expect(manualInstrumentationWarnings[0].message).toContain(
|
|
298
|
-
'MongoDBInstrumentation',
|
|
299
|
-
);
|
|
300
|
-
});
|
|
301
|
-
|
|
302
|
-
it('does not log warning when no manual instrumentations provided', async () => {
|
|
303
|
-
const { init, mockLogger, logMessages } = await loadInitWithMocks();
|
|
304
|
-
|
|
305
|
-
init({
|
|
306
|
-
service: 'test-app',
|
|
307
|
-
autoInstrumentations: true,
|
|
308
|
-
logger: mockLogger,
|
|
309
|
-
});
|
|
310
|
-
|
|
311
|
-
// Check that no warning was logged
|
|
312
|
-
const infoMessages = logMessages.filter(
|
|
313
|
-
(log) => log.level === 'info' && log.message.includes('Detected manual'),
|
|
314
|
-
);
|
|
315
|
-
expect(infoMessages).toHaveLength(0);
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
it('does not log warning when autoInstrumentations is false', async () => {
|
|
319
|
-
const { init, mockLogger, logMessages } = await loadInitWithMocks();
|
|
320
|
-
|
|
321
|
-
const manualMongoDBInstrumentation = new MongoDBInstrumentation({
|
|
322
|
-
requireParentSpan: false,
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
init({
|
|
326
|
-
service: 'test-app',
|
|
327
|
-
autoInstrumentations: false,
|
|
328
|
-
instrumentations: [manualMongoDBInstrumentation],
|
|
329
|
-
logger: mockLogger,
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
// Check that no warning was logged
|
|
333
|
-
const infoMessages = logMessages.filter(
|
|
334
|
-
(log) => log.level === 'info' && log.message.includes('Detected manual'),
|
|
335
|
-
);
|
|
336
|
-
expect(infoMessages).toHaveLength(0);
|
|
337
|
-
});
|
|
338
|
-
|
|
339
|
-
it('handles object-style autoInstrumentations config with manual instrumentations', async () => {
|
|
340
|
-
const { init, sdkInstances, autoInstrumentationsConfig, mockLogger } =
|
|
341
|
-
await loadInitWithMocks();
|
|
342
|
-
|
|
343
|
-
const manualMongoDBInstrumentation = new MongoDBInstrumentation({
|
|
344
|
-
requireParentSpan: false,
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
init({
|
|
348
|
-
service: 'test-app',
|
|
349
|
-
autoInstrumentations: {
|
|
350
|
-
http: { enabled: true },
|
|
351
|
-
mongodb: { enabled: true },
|
|
352
|
-
},
|
|
353
|
-
instrumentations: [manualMongoDBInstrumentation],
|
|
354
|
-
logger: mockLogger,
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
// Check that auto-instrumentations were called with MongoDB disabled
|
|
358
|
-
expect(autoInstrumentationsConfig).toHaveLength(1);
|
|
359
|
-
const config = autoInstrumentationsConfig[0];
|
|
360
|
-
expect(config['@opentelemetry/instrumentation-mongodb']).toEqual({
|
|
361
|
-
enabled: false,
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
// Check that manual MongoDB instrumentation is in the final list
|
|
365
|
-
const options = sdkInstances.at(-1)?.options as Record<string, unknown>;
|
|
366
|
-
const instrumentations = options.instrumentations as unknown[];
|
|
367
|
-
expect(instrumentations).toContain(manualMongoDBInstrumentation);
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
it('works correctly when no conflicts exist', async () => {
|
|
371
|
-
const { init, sdkInstances, mockLogger, logMessages } =
|
|
372
|
-
await loadInitWithMocks();
|
|
373
|
-
|
|
374
|
-
const manualHttpInstrumentation = new HttpInstrumentation({
|
|
375
|
-
requireParentSpan: false,
|
|
376
|
-
});
|
|
377
|
-
|
|
378
|
-
init({
|
|
379
|
-
service: 'test-app',
|
|
380
|
-
autoInstrumentations: ['mongodb', 'mongoose'],
|
|
381
|
-
instrumentations: [manualHttpInstrumentation],
|
|
382
|
-
logger: mockLogger,
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
// Check that manual instrumentation is in the final list
|
|
386
|
-
const options = sdkInstances.at(-1)?.options as Record<string, unknown>;
|
|
387
|
-
const instrumentations = options.instrumentations as unknown[];
|
|
388
|
-
expect(instrumentations).toContain(manualHttpInstrumentation);
|
|
389
|
-
|
|
390
|
-
// Check that warning was logged (because manual HTTP provided with auto-integrations)
|
|
391
|
-
const manualInstrumentationWarnings = logMessages.filter(
|
|
392
|
-
(log) => log.level === 'info' && log.message.includes('Detected manual'),
|
|
393
|
-
);
|
|
394
|
-
expect(manualInstrumentationWarnings).toHaveLength(1);
|
|
395
|
-
expect(manualInstrumentationWarnings[0].message).toContain(
|
|
396
|
-
'HttpInstrumentation',
|
|
397
|
-
);
|
|
398
|
-
});
|
|
399
|
-
});
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
|
|
3
|
-
type InitModule = typeof import('./init');
|
|
4
|
-
|
|
5
|
-
async function loadInitModule(): Promise<InitModule> {
|
|
6
|
-
vi.resetModules();
|
|
7
|
-
return import('./init');
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
function createSdkFactory() {
|
|
11
|
-
const calls: Array<Record<string, unknown>> = [];
|
|
12
|
-
const getTracerProvider = vi.fn(() => ({ id: 'mock-tracer-provider' }));
|
|
13
|
-
const start = vi.fn();
|
|
14
|
-
const shutdown = vi.fn(async () => {});
|
|
15
|
-
|
|
16
|
-
return {
|
|
17
|
-
calls,
|
|
18
|
-
getTracerProvider,
|
|
19
|
-
start,
|
|
20
|
-
shutdown,
|
|
21
|
-
sdkFactory: (options: Record<string, unknown>) => {
|
|
22
|
-
calls.push(options);
|
|
23
|
-
return {
|
|
24
|
-
start,
|
|
25
|
-
shutdown,
|
|
26
|
-
getTracerProvider,
|
|
27
|
-
} as never;
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
describe('init() OpenLLMetry integration', () => {
|
|
33
|
-
afterEach(() => {
|
|
34
|
-
vi.clearAllMocks();
|
|
35
|
-
delete process.env.AUTOTEL_METRICS;
|
|
36
|
-
delete process.env.NODE_ENV;
|
|
37
|
-
delete process.env.TRACELOOP_API_KEY;
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should not initialize OpenLLMetry when disabled', async () => {
|
|
41
|
-
const mod = await loadInitModule();
|
|
42
|
-
const sdk = createSdkFactory();
|
|
43
|
-
const traceloopInitializeCalls: Array<Record<string, unknown>> = [];
|
|
44
|
-
|
|
45
|
-
mod._setOptionalRequireForTesting(() => ({
|
|
46
|
-
initialize: (options?: Record<string, unknown>) =>
|
|
47
|
-
traceloopInitializeCalls.push(options ?? {}),
|
|
48
|
-
}));
|
|
49
|
-
|
|
50
|
-
mod.init({ service: 'test-app', sdkFactory: sdk.sdkFactory });
|
|
51
|
-
|
|
52
|
-
expect(traceloopInitializeCalls).toHaveLength(0);
|
|
53
|
-
mod._resetOptionalRequireForTesting();
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it('should initialize OpenLLMetry when enabled', async () => {
|
|
57
|
-
const mod = await loadInitModule();
|
|
58
|
-
const sdk = createSdkFactory();
|
|
59
|
-
const traceloopInitializeCalls: Array<Record<string, unknown>> = [];
|
|
60
|
-
|
|
61
|
-
mod._setOptionalRequireForTesting(() => ({
|
|
62
|
-
initialize: (options?: Record<string, unknown>) =>
|
|
63
|
-
traceloopInitializeCalls.push(options ?? {}),
|
|
64
|
-
}));
|
|
65
|
-
|
|
66
|
-
mod.init({
|
|
67
|
-
service: 'test-app',
|
|
68
|
-
openllmetry: { enabled: true },
|
|
69
|
-
sdkFactory: sdk.sdkFactory,
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
expect(traceloopInitializeCalls).toHaveLength(1);
|
|
73
|
-
expect(traceloopInitializeCalls[0]).toBeDefined();
|
|
74
|
-
mod._resetOptionalRequireForTesting();
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
it('should pass OpenLLMetry options to initialize', async () => {
|
|
78
|
-
const mod = await loadInitModule();
|
|
79
|
-
const sdk = createSdkFactory();
|
|
80
|
-
const traceloopInitializeCalls: Array<Record<string, unknown>> = [];
|
|
81
|
-
|
|
82
|
-
mod._setOptionalRequireForTesting(() => ({
|
|
83
|
-
initialize: (options?: Record<string, unknown>) =>
|
|
84
|
-
traceloopInitializeCalls.push(options ?? {}),
|
|
85
|
-
}));
|
|
86
|
-
|
|
87
|
-
mod.init({
|
|
88
|
-
service: 'test-app',
|
|
89
|
-
openllmetry: {
|
|
90
|
-
enabled: true,
|
|
91
|
-
options: {
|
|
92
|
-
disableBatch: true,
|
|
93
|
-
apiKey: 'test-key',
|
|
94
|
-
},
|
|
95
|
-
},
|
|
96
|
-
sdkFactory: sdk.sdkFactory,
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
expect(traceloopInitializeCalls).toHaveLength(1);
|
|
100
|
-
expect(traceloopInitializeCalls[0]).toMatchObject({
|
|
101
|
-
disableBatch: true,
|
|
102
|
-
apiKey: 'test-key',
|
|
103
|
-
});
|
|
104
|
-
mod._resetOptionalRequireForTesting();
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('should reuse autotel tracer provider when OpenLLMetry is enabled', async () => {
|
|
108
|
-
const mod = await loadInitModule();
|
|
109
|
-
const sdk = createSdkFactory();
|
|
110
|
-
const traceloopInitializeCalls: Array<Record<string, unknown>> = [];
|
|
111
|
-
|
|
112
|
-
mod._setOptionalRequireForTesting(() => ({
|
|
113
|
-
initialize: (options?: Record<string, unknown>) =>
|
|
114
|
-
traceloopInitializeCalls.push(options ?? {}),
|
|
115
|
-
}));
|
|
116
|
-
|
|
117
|
-
mod.init({
|
|
118
|
-
service: 'test-app',
|
|
119
|
-
openllmetry: { enabled: true },
|
|
120
|
-
sdkFactory: sdk.sdkFactory,
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
expect(traceloopInitializeCalls).toHaveLength(1);
|
|
124
|
-
const callOptions = traceloopInitializeCalls[0];
|
|
125
|
-
expect(callOptions).toBeDefined();
|
|
126
|
-
expect(sdk.getTracerProvider).toHaveBeenCalled();
|
|
127
|
-
mod._resetOptionalRequireForTesting();
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
it('should add OpenLLMetry instrumentations when selectiveInstrumentation is false', async () => {
|
|
131
|
-
const mod = await loadInitModule();
|
|
132
|
-
const sdk = createSdkFactory();
|
|
133
|
-
const mockTraceloop = {
|
|
134
|
-
initialize: vi.fn(),
|
|
135
|
-
instrumentations: [{ name: 'openai' }, { name: 'langchain' }],
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
mod._setOptionalRequireForTesting(() => mockTraceloop);
|
|
139
|
-
|
|
140
|
-
mod.init({
|
|
141
|
-
service: 'test-app',
|
|
142
|
-
openllmetry: { enabled: true },
|
|
143
|
-
autoInstrumentations: false,
|
|
144
|
-
sdkFactory: sdk.sdkFactory,
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
const options = sdk.calls.at(-1) as Record<string, unknown>;
|
|
148
|
-
const instrumentations = options.instrumentations as unknown[];
|
|
149
|
-
|
|
150
|
-
expect(instrumentations).toBeDefined();
|
|
151
|
-
expect(mockTraceloop.instrumentations).toBeDefined();
|
|
152
|
-
mod._resetOptionalRequireForTesting();
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it('should handle missing @traceloop/node-server-sdk gracefully', async () => {
|
|
156
|
-
const mod = await loadInitModule();
|
|
157
|
-
const sdk = createSdkFactory();
|
|
158
|
-
mod._setOptionalRequireForTesting(() => undefined);
|
|
159
|
-
|
|
160
|
-
expect(() => {
|
|
161
|
-
mod.init({
|
|
162
|
-
service: 'test-app',
|
|
163
|
-
openllmetry: { enabled: true },
|
|
164
|
-
sdkFactory: sdk.sdkFactory,
|
|
165
|
-
});
|
|
166
|
-
}).not.toThrow();
|
|
167
|
-
mod._resetOptionalRequireForTesting();
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it('should initialize OpenLLMetry after SDK start', async () => {
|
|
171
|
-
const mod = await loadInitModule();
|
|
172
|
-
const sdk = createSdkFactory();
|
|
173
|
-
const traceloopInitializeCalls: Array<Record<string, unknown>> = [];
|
|
174
|
-
|
|
175
|
-
mod._setOptionalRequireForTesting(() => ({
|
|
176
|
-
initialize: (options?: Record<string, unknown>) =>
|
|
177
|
-
traceloopInitializeCalls.push(options ?? {}),
|
|
178
|
-
}));
|
|
179
|
-
|
|
180
|
-
mod.init({
|
|
181
|
-
service: 'test-app',
|
|
182
|
-
openllmetry: { enabled: true },
|
|
183
|
-
sdkFactory: sdk.sdkFactory,
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
// Verify SDK started (synchronously in init)
|
|
187
|
-
expect(sdk.calls).toHaveLength(1);
|
|
188
|
-
expect(sdk.start).toHaveBeenCalled();
|
|
189
|
-
|
|
190
|
-
// Verify OpenLLMetry was initialized (synchronously via safeRequire)
|
|
191
|
-
expect(traceloopInitializeCalls).toHaveLength(1);
|
|
192
|
-
mod._resetOptionalRequireForTesting();
|
|
193
|
-
});
|
|
194
|
-
});
|