Skip to content

Commit fe870ae

Browse files
committed
Add tracer to MBean Configurataion
1 parent a7dc26c commit fe870ae

File tree

3 files changed

+89
-12
lines changed

3 files changed

+89
-12
lines changed

ojdbc-provider-opentelemetry/src/main/java/oracle/jdbc/provider/opentelemetry/OpenTelemetryTraceEventListener.java

+30-9
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,6 @@ public class OpenTelemetryTraceEventListener
109109

110110
private static Logger logger = Logger.getLogger(OpenTelemetryTraceEventListener.class.getName());
111111

112-
private Tracer tracer;
113-
114112
/**
115113
* <p>
116114
* Singleton enumeration containing the TraceEventListener's configuration. Two
@@ -126,12 +124,13 @@ public class OpenTelemetryTraceEventListener
126124
* </p>
127125
*/
128126
private enum Configuration {
129-
INSTANCE(true, false);
127+
INSTANCE(true, false, null);
130128

131129
private AtomicBoolean enabled;
132130
private AtomicBoolean sensitiveDataEnabled;
131+
private Tracer tracer;
133132

134-
private Configuration(boolean enabled, boolean sensitiveDataEnabled) {
133+
private Configuration(boolean enabled, boolean sensitiveDataEnabled, Tracer tracer) {
135134
String enabledStr = System.getProperty(OPEN_TELEMENTRY_TRACE_EVENT_LISTENER_ENABLED);
136135
String sensitiveStr = System.getProperty(OPEN_TELEMENTRY_TRACE_EVENT_LISTENER_SENSITIVE_ENABLED);
137136
this.enabled = new AtomicBoolean(enabledStr == null ? enabled : Boolean.parseBoolean(enabledStr));
@@ -154,14 +153,23 @@ private boolean isSensitiveDataEnabled() {
154153
private void setSensitiveDataEnabled(boolean enabled) {
155154
this.sensitiveDataEnabled.set(enabled);
156155
}
156+
157+
private void setTracer(Tracer tracer) {
158+
this.tracer = tracer;
159+
}
160+
161+
private Tracer getTracer() {
162+
return this.tracer;
163+
}
157164
}
158165

159166
public OpenTelemetryTraceEventListener() {
160-
this(GlobalOpenTelemetry.get().getTracer(OpenTelemetryTraceEventListener.class.getName()));
167+
this(Configuration.INSTANCE.getTracer() != null ? Configuration.INSTANCE.getTracer()
168+
: GlobalOpenTelemetry.get().getTracer(OpenTelemetryTraceEventListener.class.getName()));
161169
}
162170

163171
public OpenTelemetryTraceEventListener(Tracer tracer) {
164-
this.tracer = tracer;
172+
Configuration.INSTANCE.setTracer(tracer);
165173
}
166174

167175
@Override
@@ -180,6 +188,14 @@ public void setEnabled(boolean enabled) {
180188
Configuration.INSTANCE.setEnabled(enabled);
181189
}
182190

191+
@Override
192+
/**
193+
* Sets the Open Telemetry tracer to use
194+
*/
195+
public void setTracer(Tracer tracer) {
196+
Configuration.INSTANCE.setTracer(tracer);
197+
}
198+
183199
@Override
184200
/**
185201
* Indicates whether the traces should contain sensitive data.
@@ -196,6 +212,11 @@ public void setSensitiveDataEnabled(boolean enabled) {
196212
Configuration.INSTANCE.setSensitiveDataEnabled(enabled);
197213
}
198214

215+
@Override
216+
public Tracer getTracer() {
217+
return Configuration.INSTANCE.getTracer();
218+
}
219+
199220
@Override
200221
/**
201222
* If traces are enabled, exports traces to Open Telemetry for every round
@@ -238,7 +259,7 @@ public Object onExecutionEventReceived(JdbcExecutionEvent event, Object userCont
238259
return null;
239260
if (EXECUTION_EVENTS_PARAMETERS.get(event) == params.length) {
240261
if (event == TraceEventListener.JdbcExecutionEvent.VIP_RETRY) {
241-
SpanBuilder spanBuilder = tracer
262+
SpanBuilder spanBuilder = Configuration.INSTANCE.getTracer()
242263
.spanBuilder(event.getDescription())
243264
.setAttribute("Error message", params[0].toString())
244265
.setAttribute("VIP Address", params[7].toString());
@@ -255,7 +276,7 @@ public Object onExecutionEventReceived(JdbcExecutionEvent event, Object userCont
255276
return spanBuilder.startSpan();
256277
} else if (event == TraceEventListener.JdbcExecutionEvent.AC_REPLAY_STARTED
257278
|| event == TraceEventListener.JdbcExecutionEvent.AC_REPLAY_SUCCESSFUL) {
258-
SpanBuilder spanBuilder = tracer
279+
SpanBuilder spanBuilder = Configuration.INSTANCE.getTracer()
259280
.spanBuilder(event.getDescription())
260281
.setAttribute("Error Message", params[0].toString())
261282
.setAttribute("Error code", ((SQLException) params[1]).getErrorCode())
@@ -284,7 +305,7 @@ private Span initAndGetSpan(TraceContext traceContext, String spanName) {
284305
* child span to the current span. I.e. the current span in context becomes
285306
* parent to this child span.
286307
*/
287-
SpanBuilder spanBuilder = tracer
308+
SpanBuilder spanBuilder = Configuration.INSTANCE.getTracer()
288309
.spanBuilder(spanName)
289310
.setAttribute("thread.id", Thread.currentThread().getId())
290311
.setAttribute("thread.name", Thread.currentThread().getName())

ojdbc-provider-opentelemetry/src/main/java/oracle/jdbc/provider/opentelemetry/OpenTelemetryTraceEventListenerMBean.java

+17-2
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,31 @@
3838

3939
package oracle.jdbc.provider.opentelemetry;
4040

41+
import io.opentelemetry.api.trace.Tracer;
42+
4143
/**
42-
* MBean interface for the OpenTelemetryTraceEventListener, it exposes two
43-
* attributes: Enabled and SensitiveDataEnabled.
44+
* MBean interface for the OpenTelemetryTraceEventListener, it exposes three
45+
* attributes: Enabled, SensitiveDataEnabled and Tracer.
4446
*/
4547
public interface OpenTelemetryTraceEventListenerMBean {
4648
void setEnabled(boolean enabled);
4749

4850
void setSensitiveDataEnabled(boolean enabled);
4951

52+
/**
53+
* Sets the tracer used by the OpenTelemetryTraceEventListener
54+
*
55+
* @param tracer Open Telemetry Tracer to use
56+
*/
57+
void setTracer(Tracer tracer);
58+
5059
boolean isEnabled();
5160

5261
boolean isSensitiveDataEnabled();
62+
63+
/**
64+
* @return returns the Open Telemetry Tracer used by the
65+
* OpenTelemetryTraceEventListener
66+
*/
67+
Tracer getTracer();
5368
}

ojdbc-provider-opentelemetry/src/test/java/oracle/jdbc/provider/opentelemetry/OpenTelemetryTraceEventListenerTest.java

+42-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public class OpenTelemetryTraceEventListenerTest {
7171
private SpanBuilder spanBuilder = Mockito.mock(SpanBuilder.class);
7272
private Tracer tracer = Mockito.mock(Tracer.class);
7373
private TraceContext traceContext = Mockito.mock(TraceContext.class);
74-
private OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
74+
private Tracer tracer2 = Mockito.mock(Tracer.class);
7575

7676
@BeforeEach
7777
public void setupMocks() throws Exception {
@@ -115,6 +115,7 @@ void testPropertiesEnabled() throws Exception {
115115

116116
@Test
117117
public void roundTripEnabledSensitiveSuccessTest() throws Exception {
118+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
118119
traceEventListener.setEnabled(true);
119120
traceEventListener.setSensitiveDataEnabled(true);
120121
Object userContext = traceEventListener.roundTrip(Sequence.BEFORE, traceContext, null);
@@ -136,6 +137,7 @@ public void roundTripEnabledSensitiveSuccessTest() throws Exception {
136137

137138
@Test
138139
public void roundTripNotEnabledSensitiveSuccessTest() throws Exception {
140+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
139141
traceEventListener.setEnabled(false);
140142
traceEventListener.setSensitiveDataEnabled(true);
141143
Object userContext = traceEventListener.roundTrip(Sequence.BEFORE, traceContext, null);
@@ -157,6 +159,7 @@ public void roundTripNotEnabledSensitiveSuccessTest() throws Exception {
157159

158160
@Test
159161
public void roundTripEnabledNotSensitiveSuccessTest() throws Exception {
162+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
160163
traceEventListener.setEnabled(true);
161164
traceEventListener.setSensitiveDataEnabled(false);
162165
Object userContext = traceEventListener.roundTrip(Sequence.BEFORE, traceContext, null);
@@ -178,6 +181,7 @@ public void roundTripEnabledNotSensitiveSuccessTest() throws Exception {
178181

179182
@Test
180183
public void roundTripNotEnabledNotSensitiveSuccessTest() throws Exception {
184+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
181185
traceEventListener.setEnabled(false);
182186
traceEventListener.setSensitiveDataEnabled(true);
183187
Object userContext = traceEventListener.roundTrip(Sequence.BEFORE, traceContext, null);
@@ -199,6 +203,7 @@ public void roundTripNotEnabledNotSensitiveSuccessTest() throws Exception {
199203

200204
@Test
201205
public void executionEventEnabledSensitiveACReplayStarted() throws Exception {
206+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
202207
traceEventListener.setEnabled(true);
203208
traceEventListener.setSensitiveDataEnabled(true);
204209
SQLException exception = Mockito.mock(SQLException.class);
@@ -219,6 +224,7 @@ public void executionEventEnabledSensitiveACReplayStarted() throws Exception {
219224

220225
@Test
221226
public void executionEventEnabledSensitiveACReplaySuccessful() throws Exception {
227+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
222228
traceEventListener.setEnabled(true);
223229
traceEventListener.setSensitiveDataEnabled(true);
224230
SQLException exception = Mockito.mock(SQLException.class);
@@ -239,6 +245,7 @@ public void executionEventEnabledSensitiveACReplaySuccessful() throws Exception
239245

240246
@Test
241247
public void executionEventEnabledSensitiveVIPRetry() throws Exception {
248+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
242249
traceEventListener.setEnabled(true);
243250
traceEventListener.setSensitiveDataEnabled(true);
244251
Object[] params = new Object[] { "Error message", "Protocol", "Host", "Port", "Service name", "SID",
@@ -258,6 +265,7 @@ public void executionEventEnabledSensitiveVIPRetry() throws Exception {
258265

259266
@Test
260267
public void executionEventEnabledNotSensitiveACReplayStarted() throws Exception {
268+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
261269
traceEventListener.setEnabled(true);
262270
traceEventListener.setSensitiveDataEnabled(false);
263271
SQLException exception = Mockito.mock(SQLException.class);
@@ -278,6 +286,7 @@ public void executionEventEnabledNotSensitiveACReplayStarted() throws Exception
278286

279287
@Test
280288
public void executionEventEnabledNotSensitiveACReplaySuccessful() throws Exception {
289+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
281290
traceEventListener.setEnabled(true);
282291
traceEventListener.setSensitiveDataEnabled(false);
283292
SQLException exception = Mockito.mock(SQLException.class);
@@ -298,6 +307,7 @@ public void executionEventEnabledNotSensitiveACReplaySuccessful() throws Excepti
298307

299308
@Test
300309
public void executionEventEnabledNotSensitiveVIPRetry() throws Exception {
310+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
301311
traceEventListener.setEnabled(true);
302312
traceEventListener.setSensitiveDataEnabled(false);
303313
Object[] params = new Object[] { "Error message", "Protocol", "Host", "Port", "Service name", "SID",
@@ -317,6 +327,7 @@ public void executionEventEnabledNotSensitiveVIPRetry() throws Exception {
317327

318328
@Test
319329
public void executionEventNotEnabledSensitiveACReplayStarted() throws Exception {
330+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
320331
traceEventListener.setEnabled(false);
321332
traceEventListener.setSensitiveDataEnabled(true);
322333
SQLException exception = Mockito.mock(SQLException.class);
@@ -337,6 +348,7 @@ public void executionEventNotEnabledSensitiveACReplayStarted() throws Exception
337348

338349
@Test
339350
public void executionEventNotEnabledSensitiveACReplaySuccessful() throws Exception {
351+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
340352
traceEventListener.setEnabled(false);
341353
traceEventListener.setSensitiveDataEnabled(true);
342354
SQLException exception = Mockito.mock(SQLException.class);
@@ -357,6 +369,7 @@ public void executionEventNotEnabledSensitiveACReplaySuccessful() throws Excepti
357369

358370
@Test
359371
public void executionEventNotEnabledSensitiveVIPRetry() throws Exception {
372+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
360373
traceEventListener.setEnabled(false);
361374
traceEventListener.setSensitiveDataEnabled(true);
362375
Object[] params = new Object[] { "Error message", "Protocol", "Host", "Port", "Service name", "SID",
@@ -376,6 +389,7 @@ public void executionEventNotEnabledSensitiveVIPRetry() throws Exception {
376389

377390
@Test
378391
public void executionEventNotEnabledNotSensitiveACReplayStarted() throws Exception {
392+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
379393
traceEventListener.setEnabled(false);
380394
traceEventListener.setSensitiveDataEnabled(false);
381395
SQLException exception = Mockito.mock(SQLException.class);
@@ -396,6 +410,7 @@ public void executionEventNotEnabledNotSensitiveACReplayStarted() throws Excepti
396410

397411
@Test
398412
public void executionEventNotEnabledNotSensitiveACReplaySuccessful() throws Exception {
413+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
399414
traceEventListener.setEnabled(false);
400415
traceEventListener.setSensitiveDataEnabled(false);
401416
SQLException exception = Mockito.mock(SQLException.class);
@@ -416,6 +431,7 @@ public void executionEventNotEnabledNotSensitiveACReplaySuccessful() throws Exce
416431

417432
@Test
418433
public void executionEventNotEnabledNotSensitiveVIPRetry() throws Exception {
434+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
419435
traceEventListener.setEnabled(false);
420436
traceEventListener.setSensitiveDataEnabled(false);
421437
Object[] params = new Object[] { "Error message", "Protocol", "Host", "Port", "Service name", "SID",
@@ -435,6 +451,7 @@ public void executionEventNotEnabledNotSensitiveVIPRetry() throws Exception {
435451

436452
@Test
437453
public void executionEventEnabledWrongParameterCountACReplayStarted() throws Exception {
454+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
438455
traceEventListener.setEnabled(true);
439456
traceEventListener.setSensitiveDataEnabled(true);
440457
Object[] params = new Object[] { "Only one marameter" };
@@ -445,6 +462,7 @@ public void executionEventEnabledWrongParameterCountACReplayStarted() throws Exc
445462

446463
@Test
447464
public void executionEventEnabledWrongParameterCountACReplaySuccessful() throws Exception {
465+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
448466
traceEventListener.setEnabled(true);
449467
traceEventListener.setSensitiveDataEnabled(true);
450468
Object[] params = new Object[] { "Only one marameter" };
@@ -455,6 +473,7 @@ public void executionEventEnabledWrongParameterCountACReplaySuccessful() throws
455473

456474
@Test
457475
public void executionEventEnabledWrongParameterCountVIPRetry() throws Exception {
476+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer);
458477
traceEventListener.setEnabled(true);
459478
traceEventListener.setSensitiveDataEnabled(true);
460479
Object[] params = new Object[] { "Only one marameter" };
@@ -463,4 +482,26 @@ public void executionEventEnabledWrongParameterCountVIPRetry() throws Exception
463482
Mockito.verify(spanBuilder, never()).startSpan();
464483
}
465484

485+
@Test
486+
public void testChangingTracer() throws Exception {
487+
OpenTelemetryTraceEventListener traceEventListener = new OpenTelemetryTraceEventListener(tracer2);
488+
traceEventListener.setTracer(tracer);
489+
traceEventListener.setEnabled(true);
490+
traceEventListener.setSensitiveDataEnabled(true);
491+
Object[] params = new Object[] { "Error message", "Protocol", "Host", "Port", "Service name", "SID",
492+
"Connection data", "VIP Address" };
493+
traceEventListener.onExecutionEventReceived(JdbcExecutionEvent.VIP_RETRY,
494+
traceContext, params);
495+
Mockito.verify(spanBuilder, Mockito.times(1)).startSpan();
496+
Mockito.verify(spanBuilder, Mockito.times(1)).setAttribute("Error message", params[0].toString());
497+
Mockito.verify(spanBuilder, Mockito.times(1)).setAttribute("Protocol", params[1].toString());
498+
Mockito.verify(spanBuilder, Mockito.times(1)).setAttribute("Host", params[2].toString());
499+
Mockito.verify(spanBuilder, Mockito.times(1)).setAttribute("Port", params[3].toString());
500+
Mockito.verify(spanBuilder, Mockito.times(1)).setAttribute("Service name", params[4].toString());
501+
Mockito.verify(spanBuilder, Mockito.times(1)).setAttribute("SID", params[5].toString());
502+
Mockito.verify(spanBuilder, Mockito.times(1)).setAttribute("Connection data", params[6].toString());
503+
Mockito.verify(spanBuilder, Mockito.times(1)).setAttribute("VIP Address", params[7].toString());
504+
Mockito.verify(tracer2, Mockito.times(0)).spanBuilder(Mockito.anyString());
505+
}
506+
466507
}

0 commit comments

Comments
 (0)