@@ -39,100 +39,33 @@ import {
3939 ATTR_DB_OPERATION_NAME ,
4040} from './semconv' ;
4141
42+ import type * as oracleDBTypes from 'oracledb' ;
43+ type TraceHandlerBaseCtor = new ( ) => any ;
44+
4245// Local modules.
4346import { AttributeNames } from './constants' ;
4447import { OracleInstrumentationConfig , SpanConnectionConfig } from './types' ;
4548import { TraceSpanData , SpanCallLevelConfig } from './internal-types' ;
4649import { SpanNames , DB_SYSTEM_VALUE_ORACLE } from './constants' ;
4750
48- // extend oracledb module with traceHandler until type definations are
49- // available.
50- // see https://github.com/DefinitelyTyped/DefinitelyTyped/pull/72060/files
51- declare module 'oracledb' {
52- /**
53- * Type representing the trace context object.
54- */
55- type TraceContext = Record < string , any > ;
56-
57- /**
58- * Base class for handling tracing.
59- */
60- class TraceHandlerBase {
61- constructor ( ) ;
62-
63- /**
64- * Checks if sending traces is enabled.
65- */
66- isEnabled ( ) : boolean ;
67-
68- /**
69- * Enables sending traces.
70- */
71- enable ( ) : void ;
72-
73- /**
74- * Disables sending traces.
75- */
76- disable ( ) : void ;
77-
78- /**
79- * Called before invoking a public async method.
80- * @param traceContext input/output trace context object.
81- */
82- onEnterFn ( traceContext ?: TraceContext ) : void ;
83-
84- /**
85- * Called after invoking a public async method.
86- * @param traceContext input/output trace context object.
87- */
88- onExitFn ( traceContext ?: TraceContext ) : void ;
89-
90- /**
91- * Called when a round trip is begun.
92- * @param traceContext input/output trace context object.
93- */
94- onBeginRoundTrip ( traceContext ?: TraceContext ) : void ;
95-
96- /**
97- * Called when a round trip has ended.
98- * @param traceContext input/output trace context object.
99- */
100- onEndRoundTrip ( traceContext ?: TraceContext ) : void ;
101- }
102-
103- interface traceHandler {
104- TraceHandlerBase : typeof TraceHandlerBase ;
105- }
106-
107- const traceHandler : traceHandler ;
108- }
109-
110- // define a constructor type used by OracleTelemetryTraceHandler
111- // to extend the TraceHandlerBase class. This is needed
112- // to avoid importing values from oracledb and only import types.
113- interface TraceHandlerBaseConstructor {
114- new ( ) : traceHandler [ 'TraceHandlerBase' ] ;
115- }
116-
117- import type { traceHandler } from 'oracledb' ; // Import only for type checking
118-
119- // It returns the TraceHandlerBase class, if oracledb module is available.
120- function getTraceHandlerBaseClass ( ) : TraceHandlerBaseConstructor | null {
51+ // It dynamically retrieves the TraceHandlerBase class from the oracledb module
52+ // (if available) while avoiding direct imports that could cause issues if
53+ // the module is missing.
54+ function getTraceHandlerBaseClass (
55+ obj : typeof oracleDBTypes
56+ ) : TraceHandlerBaseCtor | null {
12157 try {
122- // Use require() for CommonJS compatibility
123- // dynamically loading the TraceHandlerBase class
124- // from the oracledb module and casting it to
125- // the TraceHandlerBaseConstructor type.
126- return require ( 'oracledb' ) . traceHandler
127- . TraceHandlerBase as TraceHandlerBaseConstructor ;
58+ return ( obj as any ) . traceHandler . TraceHandlerBase as TraceHandlerBaseCtor ;
12859 } catch ( err ) {
129- diag . error ( 'The required module oracledb installation failed. ' , err ) ;
60+ diag . error ( 'Failed to load oracledb module. ' , err ) ;
13061 return null ;
13162 }
13263}
13364
134- export function getOracleTelemetryTraceHandlerClass ( ) : any {
135- const traceHandlerBase = getTraceHandlerBaseClass ( ) ;
65+ export function getOracleTelemetryTraceHandlerClass (
66+ obj : typeof oracleDBTypes
67+ ) : any {
68+ const traceHandlerBase = getTraceHandlerBaseClass ( obj ) ;
13669 if ( traceHandlerBase ) {
13770 /**
13871 * OracleTelemetryTraceHandler extends TraceHandlerBase from oracledb module
0 commit comments