Path: blob/main/extensions/copilot/src/platform/otel/common/test/otelConfig.spec.ts
13406 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { describe, expect, it } from 'vitest';6import { resolveOTelConfig, type OTelConfigInput } from '../otelConfig';78function makeInput(overrides: Partial<OTelConfigInput> = {}): OTelConfigInput {9return {10env: {},11extensionVersion: '1.0.0',12sessionId: 'test-session',13...overrides,14};15}1617describe('resolveOTelConfig', () => {1819it('returns disabled config by default', () => {20const config = resolveOTelConfig(makeInput());21expect(config.enabled).toBe(false);22});2324it('enables when COPILOT_OTEL_ENABLED=true', () => {25const config = resolveOTelConfig(makeInput({26env: { 'COPILOT_OTEL_ENABLED': 'true' },27}));28expect(config.enabled).toBe(true);29});3031it('enables when OTEL_EXPORTER_OTLP_ENDPOINT is set', () => {32const config = resolveOTelConfig(makeInput({33env: { 'OTEL_EXPORTER_OTLP_ENDPOINT': 'http://collector:4318' },34}));35expect(config.enabled).toBe(true);36expect(config.otlpEndpoint).toBe('http://collector:4318/');37});3839it('enables via VS Code setting', () => {40const config = resolveOTelConfig(makeInput({41settingEnabled: true,42}));43expect(config.enabled).toBe(true);44});4546it('env COPILOT_OTEL_ENABLED overrides VS Code setting', () => {47const config = resolveOTelConfig(makeInput({48env: { 'COPILOT_OTEL_ENABLED': 'false' },49settingEnabled: true,50}));51expect(config.enabled).toBe(false);52});5354it('disables when vscodeTelemetryLevel is off', () => {55const config = resolveOTelConfig(makeInput({56env: { 'COPILOT_OTEL_ENABLED': 'true' },57vscodeTelemetryLevel: 'off',58}));59expect(config.enabled).toBe(false);60});6162it('uses file exporter when COPILOT_OTEL_FILE_EXPORTER_PATH is set', () => {63const config = resolveOTelConfig(makeInput({64env: {65'COPILOT_OTEL_ENABLED': 'true',66'COPILOT_OTEL_FILE_EXPORTER_PATH': '/tmp/otel.jsonl',67},68}));69expect(config.enabled).toBe(true);70expect(config.exporterType).toBe('file');71expect(config.fileExporterPath).toBe('/tmp/otel.jsonl');72});7374it('uses VS Code setting for exporter type', () => {75const config = resolveOTelConfig(makeInput({76settingEnabled: true,77settingExporterType: 'console',78}));79expect(config.exporterType).toBe('console');80});8182it('resolves COPILOT_OTEL_CAPTURE_CONTENT', () => {83const config = resolveOTelConfig(makeInput({84env: {85'COPILOT_OTEL_ENABLED': 'true',86'COPILOT_OTEL_CAPTURE_CONTENT': 'true',87},88}));89expect(config.captureContent).toBe(true);90});9192it('captureContent env overrides VS Code setting', () => {93const config = resolveOTelConfig(makeInput({94env: {95'COPILOT_OTEL_ENABLED': 'true',96'COPILOT_OTEL_CAPTURE_CONTENT': 'false',97},98settingCaptureContent: true,99}));100expect(config.captureContent).toBe(false);101});102103it('parses OTEL_RESOURCE_ATTRIBUTES', () => {104const config = resolveOTelConfig(makeInput({105env: {106'COPILOT_OTEL_ENABLED': 'true',107'OTEL_RESOURCE_ATTRIBUTES': 'benchmark.id=test-123,benchmark.name=say_hello',108},109}));110expect(config.resourceAttributes).toEqual({111'benchmark.id': 'test-123',112'benchmark.name': 'say_hello',113});114});115116it('uses grpc protocol when OTEL_EXPORTER_OTLP_PROTOCOL=grpc', () => {117const config = resolveOTelConfig(makeInput({118env: {119'COPILOT_OTEL_ENABLED': 'true',120'OTEL_EXPORTER_OTLP_PROTOCOL': 'grpc',121'OTEL_EXPORTER_OTLP_ENDPOINT': 'http://collector:4317',122},123}));124expect(config.otlpProtocol).toBe('grpc');125expect(config.exporterType).toBe('otlp-grpc');126// gRPC should use origin (strip path)127expect(config.otlpEndpoint).toBe('http://collector:4317');128});129130it('preserves service version and session id', () => {131const config = resolveOTelConfig(makeInput({132settingEnabled: true,133extensionVersion: '2.5.0',134sessionId: 'abc-123',135}));136expect(config.serviceVersion).toBe('2.5.0');137expect(config.sessionId).toBe('abc-123');138});139140it('defaults service name to copilot-chat', () => {141const config = resolveOTelConfig(makeInput({142settingEnabled: true,143}));144expect(config.serviceName).toBe('copilot-chat');145});146147it('overrides service name from OTEL_SERVICE_NAME', () => {148const config = resolveOTelConfig(makeInput({149env: {150'COPILOT_OTEL_ENABLED': 'true',151'OTEL_SERVICE_NAME': 'my-service',152},153}));154expect(config.serviceName).toBe('my-service');155});156157it('returns frozen config objects', () => {158const enabled = resolveOTelConfig(makeInput({ settingEnabled: true }));159const disabled = resolveOTelConfig(makeInput());160expect(Object.isFrozen(enabled)).toBe(true);161expect(Object.isFrozen(disabled)).toBe(true);162});163164describe('enabledVia', () => {165166it('returns disabled when OTel is off', () => {167const config = resolveOTelConfig(makeInput());168expect(config.enabledVia).toBe('disabled');169});170171it('returns envVar when COPILOT_OTEL_ENABLED is set', () => {172const config = resolveOTelConfig(makeInput({173env: { 'COPILOT_OTEL_ENABLED': 'true' },174}));175expect(config.enabledVia).toBe('envVar');176});177178it('returns disabled when COPILOT_OTEL_ENABLED=false overrides setting', () => {179const config = resolveOTelConfig(makeInput({180env: { 'COPILOT_OTEL_ENABLED': 'false' },181settingEnabled: true,182}));183expect(config.enabledVia).toBe('disabled');184});185186it('returns dbSpanExporterOnly when COPILOT_OTEL_ENABLED=false but dbSpanExporter is on', () => {187const config = resolveOTelConfig(makeInput({188env: { 'COPILOT_OTEL_ENABLED': 'false' },189settingDbSpanExporter: true,190}));191// env var disabled OTel export, but dbSpanExporter keeps SDK loaded192expect(config.enabledVia).toBe('dbSpanExporterOnly');193});194195it('returns setting when enabled via VS Code setting', () => {196const config = resolveOTelConfig(makeInput({197settingEnabled: true,198}));199expect(config.enabledVia).toBe('setting');200});201202it('returns otlpEndpointEnvVar when enabled via OTEL_EXPORTER_OTLP_ENDPOINT', () => {203const config = resolveOTelConfig(makeInput({204env: { 'OTEL_EXPORTER_OTLP_ENDPOINT': 'http://collector:4318' },205}));206expect(config.enabledVia).toBe('otlpEndpointEnvVar');207});208209it('returns dbSpanExporterOnly when only dbSpanExporter is on', () => {210const config = resolveOTelConfig(makeInput({211settingDbSpanExporter: true,212}));213expect(config.enabledVia).toBe('dbSpanExporterOnly');214});215216it('returns setting when both dbSpanExporter and setting are on', () => {217const config = resolveOTelConfig(makeInput({218settingEnabled: true,219settingDbSpanExporter: true,220}));221expect(config.enabledVia).toBe('setting');222});223224it('returns envVar when env var takes precedence over dbSpanExporter', () => {225const config = resolveOTelConfig(makeInput({226env: { 'COPILOT_OTEL_ENABLED': 'true' },227settingDbSpanExporter: true,228}));229expect(config.enabledVia).toBe('envVar');230});231});232});233234235