Skip to content

Commit 34afcad

Browse files
committed
- get the baseclass, TraceHandlerBase from the parameter,
moduleExports passed from patch function
1 parent fa0463b commit 34afcad

File tree

2 files changed

+16
-83
lines changed

2 files changed

+16
-83
lines changed

plugins/node/opentelemetry-instrumentation-oracledb/src/OracleTelemetryTraceHandler.ts

Lines changed: 15 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
4346
import { AttributeNames } from './constants';
4447
import { OracleInstrumentationConfig, SpanConnectionConfig } from './types';
4548
import { TraceSpanData, SpanCallLevelConfig } from './internal-types';
4649
import { 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

plugins/node/opentelemetry-instrumentation-oracledb/src/instrumentation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export class OracleInstrumentation extends InstrumentationBase {
4545
this._tmHandler = null;
4646
}
4747
const config = this.getConfig();
48-
const thClass = getOracleTelemetryTraceHandlerClass();
48+
const thClass = getOracleTelemetryTraceHandlerClass(moduleExports);
4949
if (thClass) {
5050
const obj = new thClass(() => this.tracer, config);
5151
obj.enable();

0 commit comments

Comments
 (0)