Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/platform/otel/common/test/otelConfig.spec.ts
13406 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { describe, expect, it } from 'vitest';
7
import { resolveOTelConfig, type OTelConfigInput } from '../otelConfig';
8
9
function makeInput(overrides: Partial<OTelConfigInput> = {}): OTelConfigInput {
10
return {
11
env: {},
12
extensionVersion: '1.0.0',
13
sessionId: 'test-session',
14
...overrides,
15
};
16
}
17
18
describe('resolveOTelConfig', () => {
19
20
it('returns disabled config by default', () => {
21
const config = resolveOTelConfig(makeInput());
22
expect(config.enabled).toBe(false);
23
});
24
25
it('enables when COPILOT_OTEL_ENABLED=true', () => {
26
const config = resolveOTelConfig(makeInput({
27
env: { 'COPILOT_OTEL_ENABLED': 'true' },
28
}));
29
expect(config.enabled).toBe(true);
30
});
31
32
it('enables when OTEL_EXPORTER_OTLP_ENDPOINT is set', () => {
33
const config = resolveOTelConfig(makeInput({
34
env: { 'OTEL_EXPORTER_OTLP_ENDPOINT': 'http://collector:4318' },
35
}));
36
expect(config.enabled).toBe(true);
37
expect(config.otlpEndpoint).toBe('http://collector:4318/');
38
});
39
40
it('enables via VS Code setting', () => {
41
const config = resolveOTelConfig(makeInput({
42
settingEnabled: true,
43
}));
44
expect(config.enabled).toBe(true);
45
});
46
47
it('env COPILOT_OTEL_ENABLED overrides VS Code setting', () => {
48
const config = resolveOTelConfig(makeInput({
49
env: { 'COPILOT_OTEL_ENABLED': 'false' },
50
settingEnabled: true,
51
}));
52
expect(config.enabled).toBe(false);
53
});
54
55
it('disables when vscodeTelemetryLevel is off', () => {
56
const config = resolveOTelConfig(makeInput({
57
env: { 'COPILOT_OTEL_ENABLED': 'true' },
58
vscodeTelemetryLevel: 'off',
59
}));
60
expect(config.enabled).toBe(false);
61
});
62
63
it('uses file exporter when COPILOT_OTEL_FILE_EXPORTER_PATH is set', () => {
64
const config = resolveOTelConfig(makeInput({
65
env: {
66
'COPILOT_OTEL_ENABLED': 'true',
67
'COPILOT_OTEL_FILE_EXPORTER_PATH': '/tmp/otel.jsonl',
68
},
69
}));
70
expect(config.enabled).toBe(true);
71
expect(config.exporterType).toBe('file');
72
expect(config.fileExporterPath).toBe('/tmp/otel.jsonl');
73
});
74
75
it('uses VS Code setting for exporter type', () => {
76
const config = resolveOTelConfig(makeInput({
77
settingEnabled: true,
78
settingExporterType: 'console',
79
}));
80
expect(config.exporterType).toBe('console');
81
});
82
83
it('resolves COPILOT_OTEL_CAPTURE_CONTENT', () => {
84
const config = resolveOTelConfig(makeInput({
85
env: {
86
'COPILOT_OTEL_ENABLED': 'true',
87
'COPILOT_OTEL_CAPTURE_CONTENT': 'true',
88
},
89
}));
90
expect(config.captureContent).toBe(true);
91
});
92
93
it('captureContent env overrides VS Code setting', () => {
94
const config = resolveOTelConfig(makeInput({
95
env: {
96
'COPILOT_OTEL_ENABLED': 'true',
97
'COPILOT_OTEL_CAPTURE_CONTENT': 'false',
98
},
99
settingCaptureContent: true,
100
}));
101
expect(config.captureContent).toBe(false);
102
});
103
104
it('parses OTEL_RESOURCE_ATTRIBUTES', () => {
105
const config = resolveOTelConfig(makeInput({
106
env: {
107
'COPILOT_OTEL_ENABLED': 'true',
108
'OTEL_RESOURCE_ATTRIBUTES': 'benchmark.id=test-123,benchmark.name=say_hello',
109
},
110
}));
111
expect(config.resourceAttributes).toEqual({
112
'benchmark.id': 'test-123',
113
'benchmark.name': 'say_hello',
114
});
115
});
116
117
it('uses grpc protocol when OTEL_EXPORTER_OTLP_PROTOCOL=grpc', () => {
118
const config = resolveOTelConfig(makeInput({
119
env: {
120
'COPILOT_OTEL_ENABLED': 'true',
121
'OTEL_EXPORTER_OTLP_PROTOCOL': 'grpc',
122
'OTEL_EXPORTER_OTLP_ENDPOINT': 'http://collector:4317',
123
},
124
}));
125
expect(config.otlpProtocol).toBe('grpc');
126
expect(config.exporterType).toBe('otlp-grpc');
127
// gRPC should use origin (strip path)
128
expect(config.otlpEndpoint).toBe('http://collector:4317');
129
});
130
131
it('preserves service version and session id', () => {
132
const config = resolveOTelConfig(makeInput({
133
settingEnabled: true,
134
extensionVersion: '2.5.0',
135
sessionId: 'abc-123',
136
}));
137
expect(config.serviceVersion).toBe('2.5.0');
138
expect(config.sessionId).toBe('abc-123');
139
});
140
141
it('defaults service name to copilot-chat', () => {
142
const config = resolveOTelConfig(makeInput({
143
settingEnabled: true,
144
}));
145
expect(config.serviceName).toBe('copilot-chat');
146
});
147
148
it('overrides service name from OTEL_SERVICE_NAME', () => {
149
const config = resolveOTelConfig(makeInput({
150
env: {
151
'COPILOT_OTEL_ENABLED': 'true',
152
'OTEL_SERVICE_NAME': 'my-service',
153
},
154
}));
155
expect(config.serviceName).toBe('my-service');
156
});
157
158
it('returns frozen config objects', () => {
159
const enabled = resolveOTelConfig(makeInput({ settingEnabled: true }));
160
const disabled = resolveOTelConfig(makeInput());
161
expect(Object.isFrozen(enabled)).toBe(true);
162
expect(Object.isFrozen(disabled)).toBe(true);
163
});
164
165
describe('enabledVia', () => {
166
167
it('returns disabled when OTel is off', () => {
168
const config = resolveOTelConfig(makeInput());
169
expect(config.enabledVia).toBe('disabled');
170
});
171
172
it('returns envVar when COPILOT_OTEL_ENABLED is set', () => {
173
const config = resolveOTelConfig(makeInput({
174
env: { 'COPILOT_OTEL_ENABLED': 'true' },
175
}));
176
expect(config.enabledVia).toBe('envVar');
177
});
178
179
it('returns disabled when COPILOT_OTEL_ENABLED=false overrides setting', () => {
180
const config = resolveOTelConfig(makeInput({
181
env: { 'COPILOT_OTEL_ENABLED': 'false' },
182
settingEnabled: true,
183
}));
184
expect(config.enabledVia).toBe('disabled');
185
});
186
187
it('returns dbSpanExporterOnly when COPILOT_OTEL_ENABLED=false but dbSpanExporter is on', () => {
188
const config = resolveOTelConfig(makeInput({
189
env: { 'COPILOT_OTEL_ENABLED': 'false' },
190
settingDbSpanExporter: true,
191
}));
192
// env var disabled OTel export, but dbSpanExporter keeps SDK loaded
193
expect(config.enabledVia).toBe('dbSpanExporterOnly');
194
});
195
196
it('returns setting when enabled via VS Code setting', () => {
197
const config = resolveOTelConfig(makeInput({
198
settingEnabled: true,
199
}));
200
expect(config.enabledVia).toBe('setting');
201
});
202
203
it('returns otlpEndpointEnvVar when enabled via OTEL_EXPORTER_OTLP_ENDPOINT', () => {
204
const config = resolveOTelConfig(makeInput({
205
env: { 'OTEL_EXPORTER_OTLP_ENDPOINT': 'http://collector:4318' },
206
}));
207
expect(config.enabledVia).toBe('otlpEndpointEnvVar');
208
});
209
210
it('returns dbSpanExporterOnly when only dbSpanExporter is on', () => {
211
const config = resolveOTelConfig(makeInput({
212
settingDbSpanExporter: true,
213
}));
214
expect(config.enabledVia).toBe('dbSpanExporterOnly');
215
});
216
217
it('returns setting when both dbSpanExporter and setting are on', () => {
218
const config = resolveOTelConfig(makeInput({
219
settingEnabled: true,
220
settingDbSpanExporter: true,
221
}));
222
expect(config.enabledVia).toBe('setting');
223
});
224
225
it('returns envVar when env var takes precedence over dbSpanExporter', () => {
226
const config = resolveOTelConfig(makeInput({
227
env: { 'COPILOT_OTEL_ENABLED': 'true' },
228
settingDbSpanExporter: true,
229
}));
230
expect(config.enabledVia).toBe('envVar');
231
});
232
});
233
});
234
235