@@ -7,10 +7,18 @@ import sinon from "sinon";
77import { AgentLoader } from "../../../src/agent/agentLoader" ;
88import * as azureMonitor from "@azure/monitor-opentelemetry" ;
99import { DiagnosticMessageId } from "../../../src/agent/types" ;
10+ import { trace , metrics } from "@opentelemetry/api" ;
11+ import { BasicTracerProvider } from "@opentelemetry/sdk-trace-node" ;
12+ import { MeterProvider } from "@opentelemetry/sdk-metrics" ;
13+ import { logs as otelLogs } from "@opentelemetry/api-logs" ;
14+ import { LoggerProvider } from "@opentelemetry/sdk-logs" ;
1015
1116describe ( "agent/agentLoader" , ( ) => {
1217 let originalEnv : NodeJS . ProcessEnv ;
1318 let sandbox : sinon . SinonSandbox ;
19+ let originalOtelGlobalV1 : any ;
20+ let originalOtelGlobalV2 : any ;
21+ let originalLogsGlobal : any ;
1422
1523 const defaultConfig = {
1624 azureMonitorExporterOptions : {
@@ -51,11 +59,32 @@ describe("agent/agentLoader", () => {
5159
5260 beforeEach ( ( ) => {
5361 originalEnv = process . env ;
62+ const otelSymbolV1 = Symbol . for ( 'opentelemetry.js.api.1' ) ;
63+ const otelSymbolV2 = Symbol . for ( 'opentelemetry.js.api.2' ) ;
64+ const logsSymbol = Symbol . for ( 'io.opentelemetry.js.api.logs' ) ;
65+ originalOtelGlobalV1 = ( global as any ) [ otelSymbolV1 ] ;
66+ originalOtelGlobalV2 = ( global as any ) [ otelSymbolV2 ] ;
67+ originalLogsGlobal = ( global as any ) [ logsSymbol ] ;
5468 } ) ;
5569
5670 afterEach ( ( ) => {
5771 process . env = originalEnv ;
5872 sandbox . restore ( ) ;
73+ const otelSymbolV1 = Symbol . for ( 'opentelemetry.js.api.1' ) ;
74+ const otelSymbolV2 = Symbol . for ( 'opentelemetry.js.api.2' ) ;
75+ const logsSymbol = Symbol . for ( 'io.opentelemetry.js.api.logs' ) ;
76+ ( global as any ) [ otelSymbolV1 ] = originalOtelGlobalV1 ;
77+ ( global as any ) [ otelSymbolV2 ] = originalOtelGlobalV2 ;
78+ ( global as any ) [ logsSymbol ] = originalLogsGlobal ;
79+ if ( typeof trace . disable === "function" ) {
80+ trace . disable ( ) ;
81+ }
82+ if ( typeof metrics . disable === "function" ) {
83+ metrics . disable ( ) ;
84+ }
85+ if ( typeof otelLogs . disable === "function" ) {
86+ otelLogs . disable ( ) ;
87+ }
5988 } ) ;
6089
6190 it ( "should initialize constructor" , ( ) => {
@@ -179,4 +208,45 @@ describe("agent/agentLoader", () => {
179208 agent [ "_validate" ] ( ) ;
180209 assert . deepEqual ( statusLoggerStub . args [ 0 ] [ 0 ] . AgentInitializedSuccessfully , false ) ;
181210 } ) ;
211+
212+ it ( "should log detected OpenTelemetry tracer and meter providers" , ( ) => {
213+ const env = {
214+ [ "APPLICATIONINSIGHTS_CONNECTION_STRING" ] : "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333" ,
215+ } ;
216+ process . env = env ;
217+ const tracerProvider = new BasicTracerProvider ( ) ;
218+ trace . setGlobalTracerProvider ( tracerProvider ) ;
219+ const meterProvider = new MeterProvider ( ) ;
220+ metrics . setGlobalMeterProvider ( meterProvider as any ) ;
221+
222+ const agent = new AgentLoader ( ) ;
223+ const diagnosticLoggerStub = sandbox . stub ( agent [ "_diagnosticLogger" ] , "logMessage" ) ;
224+
225+ ( agent as any ) . _detectOpenTelemetryGlobals ( ) ;
226+
227+ assert . ok ( diagnosticLoggerStub . calledOnce ) ;
228+ const logged = diagnosticLoggerStub . args [ 0 ] [ 0 ] ;
229+ assert . strictEqual ( logged . messageId , DiagnosticMessageId . openTelemetryConflict ) ;
230+ assert . ok ( ( logged . message as string ) . includes ( "TracerProvider" ) ) ;
231+ assert . ok ( ( logged . message as string ) . includes ( "MeterProvider" ) ) ;
232+ } ) ;
233+
234+ it ( "should log detected OpenTelemetry logger provider via logs symbol getter" , ( ) => {
235+ const env = {
236+ [ "APPLICATIONINSIGHTS_CONNECTION_STRING" ] : "InstrumentationKey=1aa11111-bbbb-1ccc-8ddd-eeeeffff3333" ,
237+ } ;
238+ process . env = env ;
239+ const loggerProvider = new LoggerProvider ( ) ;
240+ ( otelLogs as any ) . setGlobalLoggerProvider ( loggerProvider ) ;
241+
242+ const agent = new AgentLoader ( ) ;
243+ const diagnosticLoggerStub = sandbox . stub ( agent [ "_diagnosticLogger" ] , "logMessage" ) ;
244+
245+ ( agent as any ) . _detectOpenTelemetryGlobals ( ) ;
246+
247+ assert . ok ( diagnosticLoggerStub . calledOnce ) ;
248+ const logged = diagnosticLoggerStub . args [ 0 ] [ 0 ] ;
249+ assert . strictEqual ( logged . messageId , DiagnosticMessageId . openTelemetryConflict ) ;
250+ assert . ok ( ( logged . message as string ) . includes ( "LoggerProvider" ) ) ;
251+ } ) ;
182252} ) ;
0 commit comments