autotel 4.0.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/README.md +26 -1
- package/dist/auto.cjs +2 -2
- package/dist/auto.js +1 -1
- package/dist/correlation-id.cjs +1 -1
- package/dist/correlation-id.js +1 -1
- package/dist/decorators.cjs +1 -1
- package/dist/decorators.js +1 -1
- package/dist/{event-Dlqr4ZNL.cjs → event-BhHREDJk.cjs} +3 -3
- package/dist/{event-Dlqr4ZNL.cjs.map → event-BhHREDJk.cjs.map} +1 -1
- package/dist/{event-_58ryBjh.js → event-ByBTV9M2.js} +3 -3
- package/dist/{event-_58ryBjh.js.map → event-ByBTV9M2.js.map} +1 -1
- package/dist/event.cjs +1 -1
- package/dist/event.js +1 -1
- package/dist/{functional-BGkT8J-h.js → functional-DtI0u4vx.js} +19 -19
- package/dist/functional-DtI0u4vx.js.map +1 -0
- package/dist/{functional-C4CzoVrX.cjs → functional-zpzNLhky.cjs} +4 -4
- package/dist/{functional-C4CzoVrX.cjs.map → functional-zpzNLhky.cjs.map} +1 -1
- 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 +5 -5
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +5 -5
- package/dist/{init-DJQOdVlN.d.ts → init-B7u-DjxM.d.ts} +57 -2
- package/dist/init-B7u-DjxM.d.ts.map +1 -0
- package/dist/{init-DvapOXCc.cjs → init-BX7AmFRl.cjs} +40 -21
- package/dist/init-BX7AmFRl.cjs.map +1 -0
- package/dist/{init-Ch6t7MNI.js → init-D-jnNMix.js} +39 -20
- package/dist/init-D-jnNMix.js.map +1 -0
- package/dist/{init-CNp-ee80.d.cts → init-DSrRmVnz.d.cts} +57 -2
- package/dist/init-DSrRmVnz.d.cts.map +1 -0
- package/dist/instrumentation.cjs +1 -1
- package/dist/instrumentation.js +1 -1
- package/dist/logger-D3Ej3DII.js +446 -0
- package/dist/logger-D3Ej3DII.js.map +1 -0
- package/dist/logger-thMPLpOG.cjs +487 -0
- package/dist/logger-thMPLpOG.cjs.map +1 -0
- package/dist/logger.cjs +8 -236
- package/dist/logger.js +2 -204
- package/dist/messaging.cjs +1 -1
- package/dist/messaging.js +1 -1
- package/dist/semantic-helpers.cjs +1 -1
- package/dist/semantic-helpers.js +1 -1
- package/dist/{track-3HY4NGV-.cjs → track-D59FfpL0.cjs} +2 -2
- package/dist/{track-3HY4NGV-.cjs.map → track-D59FfpL0.cjs.map} +1 -1
- package/dist/{track-nsKVy-pj.js → track-wc0HafS_.js} +6 -6
- package/dist/track-wc0HafS_.js.map +1 -0
- 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 +1 -1
- package/dist/workflow.js +1 -1
- package/dist/{yaml-config-B3dQ82GR.cjs → yaml-config-Ck2uB0Dp.cjs} +2 -1
- package/dist/yaml-config-Ck2uB0Dp.cjs.map +1 -0
- package/dist/yaml-config.cjs +1 -1
- package/dist/yaml-config.d.cts +7 -1
- package/dist/yaml-config.d.cts.map +1 -1
- package/dist/yaml-config.d.ts +7 -1
- package/dist/yaml-config.d.ts.map +1 -1
- package/dist/yaml-config.js +1 -0
- package/dist/yaml-config.js.map +1 -1
- package/package.json +1 -2
- package/skills/autotel-core/SKILL.md +2 -0
- package/skills/autotel-instrumentation/SKILL.md +25 -0
- package/skills/debug-missing-spans/SKILL.md +3 -1
- package/skills/migrate-to-autotel/SKILL.md +24 -23
- package/skills/review-otel-patterns/SKILL.md +5 -4
- package/dist/functional-BGkT8J-h.js.map +0 -1
- package/dist/init-CNp-ee80.d.cts.map +0 -1
- package/dist/init-Ch6t7MNI.js.map +0 -1
- package/dist/init-DJQOdVlN.d.ts.map +0 -1
- package/dist/init-DvapOXCc.cjs.map +0 -1
- package/dist/logger.cjs.map +0 -1
- package/dist/logger.js.map +0 -1
- package/dist/track-nsKVy-pj.js.map +0 -1
- package/dist/yaml-config-B3dQ82GR.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 -594
- 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 -2312
- 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 -337
- package/src/yaml-config.ts +0 -342
|
@@ -1,545 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import {
|
|
3
|
-
PrettyConsoleExporter,
|
|
4
|
-
formatDuration,
|
|
5
|
-
getDurationColor,
|
|
6
|
-
hrTimeToMs,
|
|
7
|
-
type PrettyConsoleExporterOptions,
|
|
8
|
-
} from './pretty-console-exporter';
|
|
9
|
-
import { SpanStatusCode } from '@opentelemetry/api';
|
|
10
|
-
import type { ReadableSpan } from '@opentelemetry/sdk-trace-base';
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Create a mock span for testing
|
|
14
|
-
*/
|
|
15
|
-
function createMockSpan(
|
|
16
|
-
overrides: Partial<{
|
|
17
|
-
name: string;
|
|
18
|
-
traceId: string;
|
|
19
|
-
spanId: string;
|
|
20
|
-
parentSpanId: string | undefined;
|
|
21
|
-
startTime: [number, number];
|
|
22
|
-
duration: [number, number];
|
|
23
|
-
status: { code: number; message?: string };
|
|
24
|
-
attributes: Record<string, unknown>;
|
|
25
|
-
instrumentationScope: { name: string; version?: string };
|
|
26
|
-
}> = {},
|
|
27
|
-
): ReadableSpan {
|
|
28
|
-
const defaults = {
|
|
29
|
-
name: 'test-span',
|
|
30
|
-
traceId: '0af7651916cd43dd8448eb211c80319c',
|
|
31
|
-
spanId: 'b7ad6b7169203331',
|
|
32
|
-
parentSpanId: undefined as string | undefined,
|
|
33
|
-
startTime: [1000, 0] as [number, number],
|
|
34
|
-
duration: [0, 50_000_000] as [number, number], // 50ms
|
|
35
|
-
status: { code: SpanStatusCode.OK },
|
|
36
|
-
attributes: {},
|
|
37
|
-
instrumentationScope: { name: 'test', version: '1.0.0' },
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const config = { ...defaults, ...overrides };
|
|
41
|
-
|
|
42
|
-
// Build parentSpanContext if parentSpanId is provided
|
|
43
|
-
const parentSpanContext = config.parentSpanId
|
|
44
|
-
? { traceId: config.traceId, spanId: config.parentSpanId, traceFlags: 1 }
|
|
45
|
-
: undefined;
|
|
46
|
-
|
|
47
|
-
return {
|
|
48
|
-
name: config.name,
|
|
49
|
-
spanContext: () => ({
|
|
50
|
-
traceId: config.traceId,
|
|
51
|
-
spanId: config.spanId,
|
|
52
|
-
traceFlags: 1,
|
|
53
|
-
isRemote: false,
|
|
54
|
-
}),
|
|
55
|
-
parentSpanContext,
|
|
56
|
-
startTime: config.startTime,
|
|
57
|
-
duration: config.duration,
|
|
58
|
-
status: config.status,
|
|
59
|
-
attributes: config.attributes,
|
|
60
|
-
instrumentationScope: config.instrumentationScope,
|
|
61
|
-
kind: 0,
|
|
62
|
-
links: [],
|
|
63
|
-
events: [],
|
|
64
|
-
resource: { attributes: {} },
|
|
65
|
-
ended: true,
|
|
66
|
-
endTime: [config.startTime[0], config.startTime[1] + config.duration[1]],
|
|
67
|
-
droppedAttributesCount: 0,
|
|
68
|
-
droppedEventsCount: 0,
|
|
69
|
-
droppedLinksCount: 0,
|
|
70
|
-
} as unknown as ReadableSpan;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
describe('PrettyConsoleExporter', () => {
|
|
74
|
-
describe('utility functions', () => {
|
|
75
|
-
describe('hrTimeToMs', () => {
|
|
76
|
-
it('converts [seconds, nanoseconds] to milliseconds', () => {
|
|
77
|
-
expect(hrTimeToMs([0, 0])).toBe(0);
|
|
78
|
-
expect(hrTimeToMs([0, 1_000_000])).toBe(1); // 1ms
|
|
79
|
-
expect(hrTimeToMs([0, 500_000])).toBe(0.5); // 0.5ms
|
|
80
|
-
expect(hrTimeToMs([1, 0])).toBe(1000); // 1s
|
|
81
|
-
expect(hrTimeToMs([1, 500_000_000])).toBe(1500); // 1.5s
|
|
82
|
-
expect(hrTimeToMs([2, 250_000_000])).toBe(2250); // 2.25s
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
describe('formatDuration', () => {
|
|
87
|
-
it('formats sub-millisecond durations as microseconds', () => {
|
|
88
|
-
expect(formatDuration(0.5)).toBe('500µs');
|
|
89
|
-
expect(formatDuration(0.001)).toBe('1µs');
|
|
90
|
-
expect(formatDuration(0.999)).toBe('999µs');
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it('formats millisecond durations', () => {
|
|
94
|
-
expect(formatDuration(1)).toBe('1ms');
|
|
95
|
-
expect(formatDuration(50)).toBe('50ms');
|
|
96
|
-
expect(formatDuration(999)).toBe('999ms');
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
it('formats second durations', () => {
|
|
100
|
-
expect(formatDuration(1000)).toBe('1.00s');
|
|
101
|
-
expect(formatDuration(1500)).toBe('1.50s');
|
|
102
|
-
expect(formatDuration(2250)).toBe('2.25s');
|
|
103
|
-
expect(formatDuration(60_000)).toBe('60.00s');
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
describe('getDurationColor', () => {
|
|
108
|
-
it('returns green for fast operations (<100ms)', () => {
|
|
109
|
-
expect(getDurationColor(0)).toBe('green');
|
|
110
|
-
expect(getDurationColor(50)).toBe('green');
|
|
111
|
-
expect(getDurationColor(99)).toBe('green');
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('returns yellow for medium operations (100-500ms)', () => {
|
|
115
|
-
expect(getDurationColor(100)).toBe('yellow');
|
|
116
|
-
expect(getDurationColor(250)).toBe('yellow');
|
|
117
|
-
expect(getDurationColor(499)).toBe('yellow');
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it('returns red for slow operations (>=500ms)', () => {
|
|
121
|
-
expect(getDurationColor(500)).toBe('red');
|
|
122
|
-
expect(getDurationColor(1000)).toBe('red');
|
|
123
|
-
expect(getDurationColor(5000)).toBe('red');
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
describe('constructor options', () => {
|
|
129
|
-
it('uses default options when none provided', () => {
|
|
130
|
-
const exporter = new PrettyConsoleExporter();
|
|
131
|
-
// Can't directly access private options, but we can verify behavior
|
|
132
|
-
expect(exporter).toBeDefined();
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it('accepts custom options', () => {
|
|
136
|
-
const options: PrettyConsoleExporterOptions = {
|
|
137
|
-
colors: false,
|
|
138
|
-
showAttributes: false,
|
|
139
|
-
maxValueLength: 100,
|
|
140
|
-
showScope: false,
|
|
141
|
-
hideAttributes: ['secret'],
|
|
142
|
-
showTraceId: true,
|
|
143
|
-
};
|
|
144
|
-
const exporter = new PrettyConsoleExporter(options);
|
|
145
|
-
expect(exporter).toBeDefined();
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
describe('export', () => {
|
|
150
|
-
let consoleLogs: string[];
|
|
151
|
-
let originalConsoleLog: typeof console.log;
|
|
152
|
-
|
|
153
|
-
beforeEach(() => {
|
|
154
|
-
consoleLogs = [];
|
|
155
|
-
originalConsoleLog = console.log;
|
|
156
|
-
console.log = (...args: unknown[]) => {
|
|
157
|
-
consoleLogs.push(args.map(String).join(' '));
|
|
158
|
-
};
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
afterEach(() => {
|
|
162
|
-
console.log = originalConsoleLog;
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('calls resultCallback with SUCCESS for empty spans', () => {
|
|
166
|
-
const exporter = new PrettyConsoleExporter({ colors: false });
|
|
167
|
-
let result: { code: number } | undefined;
|
|
168
|
-
|
|
169
|
-
exporter.export([], (r) => {
|
|
170
|
-
result = r;
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
expect(result?.code).toBe(0); // ExportResultCode.SUCCESS
|
|
174
|
-
expect(consoleLogs).toHaveLength(0);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it('prints spans with success status', () => {
|
|
178
|
-
const exporter = new PrettyConsoleExporter({ colors: false });
|
|
179
|
-
const span = createMockSpan({ name: 'GET /api/users' });
|
|
180
|
-
|
|
181
|
-
exporter.export([span], () => {});
|
|
182
|
-
|
|
183
|
-
expect(consoleLogs.some((log) => log.includes('✓'))).toBe(true);
|
|
184
|
-
expect(consoleLogs.some((log) => log.includes('GET /api/users'))).toBe(
|
|
185
|
-
true,
|
|
186
|
-
);
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
it('prints spans with error status', () => {
|
|
190
|
-
const exporter = new PrettyConsoleExporter({ colors: false });
|
|
191
|
-
const span = createMockSpan({
|
|
192
|
-
name: 'POST /api/orders',
|
|
193
|
-
status: { code: SpanStatusCode.ERROR, message: 'Payment failed' },
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
exporter.export([span], () => {});
|
|
197
|
-
|
|
198
|
-
expect(consoleLogs.some((log) => log.includes('✗'))).toBe(true);
|
|
199
|
-
expect(consoleLogs.some((log) => log.includes('POST /api/orders'))).toBe(
|
|
200
|
-
true,
|
|
201
|
-
);
|
|
202
|
-
expect(
|
|
203
|
-
consoleLogs.some((log) => log.includes('Error: Payment failed')),
|
|
204
|
-
).toBe(true);
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
it('shows duration in output', () => {
|
|
208
|
-
const exporter = new PrettyConsoleExporter({ colors: false });
|
|
209
|
-
const span = createMockSpan({
|
|
210
|
-
name: 'db.query',
|
|
211
|
-
duration: [0, 123_000_000], // 123ms
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
exporter.export([span], () => {});
|
|
215
|
-
|
|
216
|
-
expect(consoleLogs.some((log) => log.includes('123ms'))).toBe(true);
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
it('shows instrumentation scope name', () => {
|
|
220
|
-
const exporter = new PrettyConsoleExporter({
|
|
221
|
-
colors: false,
|
|
222
|
-
showScope: true,
|
|
223
|
-
});
|
|
224
|
-
const span = createMockSpan({
|
|
225
|
-
name: 'query',
|
|
226
|
-
instrumentationScope: { name: '@opentelemetry/instrumentation-pg' },
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
exporter.export([span], () => {});
|
|
230
|
-
|
|
231
|
-
expect(consoleLogs.some((log) => log.includes('[pg]'))).toBe(true);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
it('hides scope name when showScope is false', () => {
|
|
235
|
-
const exporter = new PrettyConsoleExporter({
|
|
236
|
-
colors: false,
|
|
237
|
-
showScope: false,
|
|
238
|
-
});
|
|
239
|
-
const span = createMockSpan({
|
|
240
|
-
name: 'query',
|
|
241
|
-
instrumentationScope: { name: '@opentelemetry/instrumentation-pg' },
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
exporter.export([span], () => {});
|
|
245
|
-
|
|
246
|
-
expect(consoleLogs.some((log) => log.includes('[pg]'))).toBe(false);
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
it('shows attributes when enabled', () => {
|
|
250
|
-
const exporter = new PrettyConsoleExporter({
|
|
251
|
-
colors: false,
|
|
252
|
-
showAttributes: true,
|
|
253
|
-
});
|
|
254
|
-
const span = createMockSpan({
|
|
255
|
-
name: 'db.query',
|
|
256
|
-
attributes: {
|
|
257
|
-
'db.system': 'postgresql',
|
|
258
|
-
'db.name': 'users',
|
|
259
|
-
},
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
exporter.export([span], () => {});
|
|
263
|
-
|
|
264
|
-
expect(
|
|
265
|
-
consoleLogs.some((log) => log.includes('db.system=postgresql')),
|
|
266
|
-
).toBe(true);
|
|
267
|
-
expect(consoleLogs.some((log) => log.includes('db.name=users'))).toBe(
|
|
268
|
-
true,
|
|
269
|
-
);
|
|
270
|
-
});
|
|
271
|
-
|
|
272
|
-
it('hides attributes when showAttributes is false', () => {
|
|
273
|
-
const exporter = new PrettyConsoleExporter({
|
|
274
|
-
colors: false,
|
|
275
|
-
showAttributes: false,
|
|
276
|
-
});
|
|
277
|
-
const span = createMockSpan({
|
|
278
|
-
name: 'db.query',
|
|
279
|
-
attributes: { 'db.system': 'postgresql' },
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
exporter.export([span], () => {});
|
|
283
|
-
|
|
284
|
-
expect(consoleLogs.some((log) => log.includes('db.system'))).toBe(false);
|
|
285
|
-
});
|
|
286
|
-
|
|
287
|
-
it('hides specific attributes from hideAttributes list', () => {
|
|
288
|
-
const exporter = new PrettyConsoleExporter({
|
|
289
|
-
colors: false,
|
|
290
|
-
showAttributes: true,
|
|
291
|
-
hideAttributes: ['http.user_agent', 'secret'],
|
|
292
|
-
});
|
|
293
|
-
const span = createMockSpan({
|
|
294
|
-
name: 'request',
|
|
295
|
-
attributes: {
|
|
296
|
-
'http.method': 'GET',
|
|
297
|
-
'http.user_agent': 'Mozilla/5.0...',
|
|
298
|
-
secret: 'should-not-show',
|
|
299
|
-
},
|
|
300
|
-
});
|
|
301
|
-
|
|
302
|
-
exporter.export([span], () => {});
|
|
303
|
-
|
|
304
|
-
expect(consoleLogs.some((log) => log.includes('http.method=GET'))).toBe(
|
|
305
|
-
true,
|
|
306
|
-
);
|
|
307
|
-
expect(consoleLogs.some((log) => log.includes('http.user_agent'))).toBe(
|
|
308
|
-
false,
|
|
309
|
-
);
|
|
310
|
-
expect(consoleLogs.some((log) => log.includes('secret'))).toBe(false);
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
it('truncates long attribute values', () => {
|
|
314
|
-
const exporter = new PrettyConsoleExporter({
|
|
315
|
-
colors: false,
|
|
316
|
-
showAttributes: true,
|
|
317
|
-
maxValueLength: 20,
|
|
318
|
-
});
|
|
319
|
-
const span = createMockSpan({
|
|
320
|
-
name: 'request',
|
|
321
|
-
attributes: {
|
|
322
|
-
'long.value':
|
|
323
|
-
'This is a very long attribute value that should be truncated',
|
|
324
|
-
},
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
exporter.export([span], () => {});
|
|
328
|
-
|
|
329
|
-
expect(
|
|
330
|
-
consoleLogs.some((log) =>
|
|
331
|
-
log.includes('long.value=This is a very lo...'),
|
|
332
|
-
),
|
|
333
|
-
).toBe(true);
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
it('shows trace ID when showTraceId is true', () => {
|
|
337
|
-
const exporter = new PrettyConsoleExporter({
|
|
338
|
-
colors: false,
|
|
339
|
-
showTraceId: true,
|
|
340
|
-
});
|
|
341
|
-
const span = createMockSpan({
|
|
342
|
-
traceId: 'abc123def456',
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
exporter.export([span], () => {});
|
|
346
|
-
|
|
347
|
-
expect(
|
|
348
|
-
consoleLogs.some((log) => log.includes('trace: abc123def456')),
|
|
349
|
-
).toBe(true);
|
|
350
|
-
});
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
describe('span tree building', () => {
|
|
354
|
-
let consoleLogs: string[];
|
|
355
|
-
let originalConsoleLog: typeof console.log;
|
|
356
|
-
|
|
357
|
-
beforeEach(() => {
|
|
358
|
-
consoleLogs = [];
|
|
359
|
-
originalConsoleLog = console.log;
|
|
360
|
-
console.log = (...args: unknown[]) => {
|
|
361
|
-
consoleLogs.push(args.map(String).join(' '));
|
|
362
|
-
};
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
afterEach(() => {
|
|
366
|
-
console.log = originalConsoleLog;
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
it('shows parent-child relationships with tree characters', () => {
|
|
370
|
-
const exporter = new PrettyConsoleExporter({
|
|
371
|
-
colors: false,
|
|
372
|
-
showAttributes: false,
|
|
373
|
-
});
|
|
374
|
-
|
|
375
|
-
const parentSpan = createMockSpan({
|
|
376
|
-
name: 'parent',
|
|
377
|
-
traceId: 'trace1',
|
|
378
|
-
spanId: 'span1',
|
|
379
|
-
parentSpanId: undefined,
|
|
380
|
-
});
|
|
381
|
-
|
|
382
|
-
const childSpan = createMockSpan({
|
|
383
|
-
name: 'child',
|
|
384
|
-
traceId: 'trace1',
|
|
385
|
-
spanId: 'span2',
|
|
386
|
-
parentSpanId: 'span1',
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
exporter.export([parentSpan, childSpan], () => {});
|
|
390
|
-
|
|
391
|
-
// Parent should be at root level (no prefix)
|
|
392
|
-
expect(consoleLogs.some((log) => log.includes('✓ parent'))).toBe(true);
|
|
393
|
-
// Child should have tree prefix
|
|
394
|
-
expect(consoleLogs.some((log) => log.includes('└─ ✓ child'))).toBe(true);
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
it('handles multiple children with proper tree characters', () => {
|
|
398
|
-
const exporter = new PrettyConsoleExporter({
|
|
399
|
-
colors: false,
|
|
400
|
-
showAttributes: false,
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
const parent = createMockSpan({
|
|
404
|
-
name: 'parent',
|
|
405
|
-
traceId: 'trace1',
|
|
406
|
-
spanId: 'p1',
|
|
407
|
-
parentSpanId: undefined,
|
|
408
|
-
startTime: [1000, 0],
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
const child1 = createMockSpan({
|
|
412
|
-
name: 'child1',
|
|
413
|
-
traceId: 'trace1',
|
|
414
|
-
spanId: 'c1',
|
|
415
|
-
parentSpanId: 'p1',
|
|
416
|
-
startTime: [1000, 100_000],
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
const child2 = createMockSpan({
|
|
420
|
-
name: 'child2',
|
|
421
|
-
traceId: 'trace1',
|
|
422
|
-
spanId: 'c2',
|
|
423
|
-
parentSpanId: 'p1',
|
|
424
|
-
startTime: [1000, 200_000],
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
exporter.export([parent, child1, child2], () => {});
|
|
428
|
-
|
|
429
|
-
// First child should use ├─
|
|
430
|
-
expect(consoleLogs.some((log) => log.includes('├─ ✓ child1'))).toBe(true);
|
|
431
|
-
// Last child should use └─
|
|
432
|
-
expect(consoleLogs.some((log) => log.includes('└─ ✓ child2'))).toBe(true);
|
|
433
|
-
});
|
|
434
|
-
|
|
435
|
-
it('groups spans by trace ID', () => {
|
|
436
|
-
const exporter = new PrettyConsoleExporter({
|
|
437
|
-
colors: false,
|
|
438
|
-
showAttributes: false,
|
|
439
|
-
showTraceId: true,
|
|
440
|
-
});
|
|
441
|
-
|
|
442
|
-
const span1 = createMockSpan({
|
|
443
|
-
name: 'span1',
|
|
444
|
-
traceId: 'trace-a',
|
|
445
|
-
spanId: 's1',
|
|
446
|
-
});
|
|
447
|
-
|
|
448
|
-
const span2 = createMockSpan({
|
|
449
|
-
name: 'span2',
|
|
450
|
-
traceId: 'trace-b',
|
|
451
|
-
spanId: 's2',
|
|
452
|
-
});
|
|
453
|
-
|
|
454
|
-
exporter.export([span1, span2], () => {});
|
|
455
|
-
|
|
456
|
-
// Both trace IDs should appear
|
|
457
|
-
expect(consoleLogs.some((log) => log.includes('trace: trace-a'))).toBe(
|
|
458
|
-
true,
|
|
459
|
-
);
|
|
460
|
-
expect(consoleLogs.some((log) => log.includes('trace: trace-b'))).toBe(
|
|
461
|
-
true,
|
|
462
|
-
);
|
|
463
|
-
});
|
|
464
|
-
});
|
|
465
|
-
|
|
466
|
-
describe('shutdown and forceFlush', () => {
|
|
467
|
-
it('shutdown returns resolved promise', async () => {
|
|
468
|
-
const exporter = new PrettyConsoleExporter();
|
|
469
|
-
await expect(exporter.shutdown()).resolves.toBeUndefined();
|
|
470
|
-
});
|
|
471
|
-
|
|
472
|
-
it('forceFlush returns resolved promise', async () => {
|
|
473
|
-
const exporter = new PrettyConsoleExporter();
|
|
474
|
-
await expect(exporter.forceFlush()).resolves.toBeUndefined();
|
|
475
|
-
});
|
|
476
|
-
});
|
|
477
|
-
|
|
478
|
-
describe('error handling', () => {
|
|
479
|
-
let originalConsoleLog: typeof console.log;
|
|
480
|
-
|
|
481
|
-
beforeEach(() => {
|
|
482
|
-
originalConsoleLog = console.log;
|
|
483
|
-
});
|
|
484
|
-
|
|
485
|
-
afterEach(() => {
|
|
486
|
-
console.log = originalConsoleLog;
|
|
487
|
-
});
|
|
488
|
-
|
|
489
|
-
it('returns SUCCESS even if formatting throws', () => {
|
|
490
|
-
const exporter = new PrettyConsoleExporter({ colors: false });
|
|
491
|
-
let result: { code: number } | undefined;
|
|
492
|
-
|
|
493
|
-
// Mock console.log to throw
|
|
494
|
-
console.log = () => {
|
|
495
|
-
throw new Error('Console broken');
|
|
496
|
-
};
|
|
497
|
-
|
|
498
|
-
// Create a span that will trigger the error
|
|
499
|
-
const span = createMockSpan({ name: 'test' });
|
|
500
|
-
|
|
501
|
-
exporter.export([span], (r) => {
|
|
502
|
-
result = r;
|
|
503
|
-
});
|
|
504
|
-
|
|
505
|
-
// Should still return success (fail-open behavior)
|
|
506
|
-
expect(result?.code).toBe(0);
|
|
507
|
-
});
|
|
508
|
-
});
|
|
509
|
-
|
|
510
|
-
describe('array attribute formatting', () => {
|
|
511
|
-
let consoleLogs: string[];
|
|
512
|
-
let originalConsoleLog: typeof console.log;
|
|
513
|
-
|
|
514
|
-
beforeEach(() => {
|
|
515
|
-
consoleLogs = [];
|
|
516
|
-
originalConsoleLog = console.log;
|
|
517
|
-
console.log = (...args: unknown[]) => {
|
|
518
|
-
consoleLogs.push(args.map(String).join(' '));
|
|
519
|
-
};
|
|
520
|
-
});
|
|
521
|
-
|
|
522
|
-
afterEach(() => {
|
|
523
|
-
console.log = originalConsoleLog;
|
|
524
|
-
});
|
|
525
|
-
|
|
526
|
-
it('formats array attributes with brackets', () => {
|
|
527
|
-
const exporter = new PrettyConsoleExporter({
|
|
528
|
-
colors: false,
|
|
529
|
-
showAttributes: true,
|
|
530
|
-
});
|
|
531
|
-
const span = createMockSpan({
|
|
532
|
-
name: 'request',
|
|
533
|
-
attributes: {
|
|
534
|
-
tags: ['a', 'b', 'c'],
|
|
535
|
-
},
|
|
536
|
-
});
|
|
537
|
-
|
|
538
|
-
exporter.export([span], () => {});
|
|
539
|
-
|
|
540
|
-
expect(consoleLogs.some((log) => log.includes('tags=[a, b, c]'))).toBe(
|
|
541
|
-
true,
|
|
542
|
-
);
|
|
543
|
-
});
|
|
544
|
-
});
|
|
545
|
-
});
|