opentracing-contrib / java-jdbc

OpenTracing Instrumentation for JDBC
Apache License 2.0
82 stars 56 forks source link

Why we need to have TracingDriver as the first registered driver? #73

Closed jagdishkulkarni closed 4 years ago

jagdishkulkarni commented 4 years ago

Any specific reason why we are deregistering other driver's and reregistering it again?

quaff commented 4 years ago

@safris Oracle ojdbc doesn't support registering after deregistering, It will throw exception.

Caused by: java.lang.IllegalStateException: Timer already cancelled.
    at java.util.Timer.sched(Timer.java:398) ~[?:?]
    at java.util.Timer.schedule(Timer.java:194) ~[?:?]
    at oracle.net.nt.TimeoutInterruptHandler.scheduleInterrupt(TimeoutInterruptHandler.java:90) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.net.nt.TimeoutInterruptHandler.scheduleInterrupt(TimeoutInterruptHandler.java:103) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.net.nt.TimeoutSocketChannel.scheduleInterrupt(TimeoutSocketChannel.java:235) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.net.nt.TimeoutSocketChannel.connect(TimeoutSocketChannel.java:97) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.net.nt.TimeoutSocketChannel.<init>(TimeoutSocketChannel.java:77) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:192) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.net.nt.ConnOption.connect(ConnOption.java:174) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:510) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:548) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:682) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:309) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1596) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:588) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:793) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:57) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:747) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:562) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
quaff commented 4 years ago

A regression introduced by https://github.com/opentracing-contrib/java-jdbc/pull/51

quaff commented 4 years ago

Any specific reason why we are deregistering other driver's and reregistering it again?

Because interceptor mode need TracingDriver be the first driver, so it can accepts any jdbc url then delegate to the real driver, It's a pity that DriverManager doesn't provide a mechanism to control drivers order.

quaff commented 4 years ago

A regression introduced by #51

I suggest not try to deregister and register again because some drivers are one-off, leave it to the application to make sure TracingDriver is registered first since they must call setInterceptorMode(true) somewhere, for example before a servlet context initialized.

    @Override
    public void contextInitialized(ServletContextEvent event) {
        io.opentracing.contrib.jdbc.TracingDriver.setInterceptorMode(true);
    }

we could add an instruction in https://github.com/opentracing-contrib/java-jdbc#interceptor. WDYT @safris

felipeazv commented 4 years ago

Hello, I am currently facing this specific issue. Is there any fix (or workaround) for Tracing with Oracle ojdbc?

specs: spring-boot: 2.3.0 ojdbc10: 19.3.0.0 opentracing-jdbc:0.2.8 (from opentracing-spring-cloud-jdbc-starter: 0.5.4) flyway-core:6.4.1

Thanks!

jagdishkulkarni commented 4 years ago

@safris Oracle ojdbc doesn't support registering after deregistering, It will throw exception.

Caused by: java.lang.IllegalStateException: Timer already cancelled.
  at java.util.Timer.sched(Timer.java:398) ~[?:?]
  at java.util.Timer.schedule(Timer.java:194) ~[?:?]
  at oracle.net.nt.TimeoutInterruptHandler.scheduleInterrupt(TimeoutInterruptHandler.java:90) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.net.nt.TimeoutInterruptHandler.scheduleInterrupt(TimeoutInterruptHandler.java:103) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.net.nt.TimeoutSocketChannel.scheduleInterrupt(TimeoutSocketChannel.java:235) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.net.nt.TimeoutSocketChannel.connect(TimeoutSocketChannel.java:97) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.net.nt.TimeoutSocketChannel.<init>(TimeoutSocketChannel.java:77) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:192) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.net.nt.ConnOption.connect(ConnOption.java:174) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:510) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:548) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:682) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.net.ns.NSProtocol.connect(NSProtocol.java:309) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1596) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:588) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:793) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:57) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:747) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
  at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:562) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]

Right, Oracle throws Timeout exception

quaff commented 4 years ago

@jagdishkulkarni This issue is resolved in v0.2.11, you can try it.

jagdishkulkarni commented 4 years ago

@jagdishkulkarni This issue is resolved in v0.2.11, you can try it.

Thank you. Will test and confirm.

jaroslaw-bochniak commented 4 years ago

I can confirm that it works with version 0.2.11

unkish commented 4 years ago

Confirming that updating to version 0.2.11 resolved the issue.

jagdishkulkarni commented 4 years ago

Its working after upgrading to version 0.2.11