Open
Description
Describe the bug
When using the MySQL driver Replication mode, JDBC insert pile trying to parse the internal generated URL **internally_generated**
because dbLoc = -1
cause StringIndexOutOfBoundsException
anomalies
Steps to reproduce
I've created a complete reproduction case with: https://github.com/wl2027/otel-java-examples/tree/main/mysql-replication-demo
Expected behavior
- fix the exception (at present)
- extract real host info (later)
I think it's necessary to add instrumentation to the MySQL driver to capture the actual url and host information. Only in this way can we construct an accurate service topology diagram.
Actual behavior
- stack trace
[otel.javaagent 2025-06-27 17:50:00:042 +0800] [Druid-ConnectionPool-Create-866045247] DEBUG io.opentelemetry.javaagent.shaded.instrumentation.jdbc.internal.JdbcConnectionUrlParser - Error parsing URL
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1967)
at io.opentelemetry.javaagent.shaded.instrumentation.jdbc.internal.JdbcConnectionUrlParser$6.doParse(JdbcConnectionUrlParser.java:355)
at io.opentelemetry.javaagent.shaded.instrumentation.jdbc.internal.JdbcConnectionUrlParser$5.doParse(JdbcConnectionUrlParser.java:281)
at io.opentelemetry.javaagent.shaded.instrumentation.jdbc.internal.JdbcConnectionUrlParser.parse(JdbcConnectionUrlParser.java:943)
at io.opentelemetry.javaagent.shaded.instrumentation.jdbc.internal.JdbcUtils.computeDbInfo(JdbcUtils.java:109)
at io.opentelemetry.javaagent.shaded.instrumentation.jdbc.internal.JdbcUtils.extractDbInfo(JdbcUtils.java:87)
at io.opentelemetry.javaagent.shaded.instrumentation.jdbc.internal.DbRequest.create(DbRequest.java:37)
- arthas
[arthas@1]$ watch io.opentelemetry.javaagent.shaded.instrumentation.jdbc.internal.JdbcConnectionUrlParser\$* doParse '{params,returnObj}' -x 3 -n 5
Press Q or Ctrl+C to abort.
Affect(class count: 20 , method count: 20) cost in 471 ms, listenerId: 1
method=io.opentelemetry.javaagent.shaded.instrumentation.jdbc.internal.JdbcConnectionUrlParser$6.doParse location=AtExceptionExit
ts=2025-06-27 22:38:46.523; [cost=0.043679ms] result=@ArrayList[
@Object[][
@String[**internally_generated**17489615264691**],
@Builder[
system=@String[mysql],
subtype=null,
shortUrl=null,
user=null,
name=null,
db=@String[**internally_generated**17489615264619**],
host=@String[localhost],
port=@Integer[3306],
],
],
null,
]
method=io.opentelemetry.javaagent.shaded.instrumentation.jdbc.internal.JdbcConnectionUrlParser$5.doParse location=AtExceptionExit
ts=2025-06-27 22:38:46.524; [cost=0.847149ms] result=@ArrayList[
@Object[][
@String[mysql:loadbalance://**internally_generated**1748961526469**],
@Builder[
system=@String[mysql],
subtype=null,
shortUrl=null,
user=null,
name=null,
db=@String[**internally_generated**1748961526469**],
host=@String[localhost],
port=@Integer[3306],
],
],
null,
]
Javaagent or library instrumentation version
v2.17.0
Environment
JDK: jdk8+
OS: macos
Additional context
recurrence #2741