Skip to content

Commit 687cffe

Browse files
jaydelucalaurit
andauthored
Add support for informix connection string parsing in jdbc instrumentation (#11542)
Co-authored-by: Lauri Tulmin <[email protected]>
1 parent 40cea5e commit 687cffe

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed

instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParser.java

+62
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,62 @@ DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) {
829829

830830
return MODIFIED_URL_LIKE.doParse(jdbcUrl, builder);
831831
}
832+
},
833+
INFORMIX_SQLI("informix-sqli") {
834+
private static final int DEFAULT_PORT = 9088;
835+
836+
@Override
837+
DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) {
838+
builder = MODIFIED_URL_LIKE.doParse(jdbcUrl, builder);
839+
840+
DbInfo dbInfo = builder.build();
841+
if (dbInfo.getPort() == null) {
842+
builder.port(DEFAULT_PORT);
843+
}
844+
845+
int hostIndex = jdbcUrl.indexOf("://");
846+
if (hostIndex == -1) {
847+
return builder;
848+
}
849+
850+
int dbNameStartIndex = jdbcUrl.indexOf('/', hostIndex + 3);
851+
if (dbNameStartIndex == -1) {
852+
return builder;
853+
}
854+
int dbNameEndIndex = jdbcUrl.indexOf(':', dbNameStartIndex);
855+
if (dbNameEndIndex == -1) {
856+
dbNameEndIndex = jdbcUrl.length();
857+
}
858+
String name = jdbcUrl.substring(dbNameStartIndex + 1, dbNameEndIndex);
859+
if (name.isEmpty()) {
860+
builder.name(null);
861+
} else {
862+
builder.name(name);
863+
}
864+
865+
return builder;
866+
}
867+
},
868+
869+
INFORMIX_DIRECT("informix-direct") {
870+
private final Pattern pattern = Pattern.compile("://(.*?)(:|;|$)");
871+
872+
@Override
873+
DbInfo.Builder doParse(String jdbcUrl, DbInfo.Builder builder) {
874+
builder = MODIFIED_URL_LIKE.doParse(jdbcUrl, builder);
875+
builder.host(null);
876+
builder.port(null);
877+
878+
Matcher matcher = pattern.matcher(jdbcUrl);
879+
if (matcher.find()) {
880+
String name = matcher.group(1);
881+
if (!name.isEmpty()) {
882+
builder.name(name);
883+
}
884+
}
885+
886+
return builder;
887+
}
832888
};
833889

834890
private static final Logger logger = Logger.getLogger(JdbcConnectionUrlParser.class.getName());
@@ -998,6 +1054,10 @@ private static String toDbSystem(String type) {
9981054
return DbSystemValues.H2;
9991055
case "hsqldb": // Hyper SQL Database
10001056
return "hsqldb";
1057+
case "informix-sqli": // IBM Informix
1058+
return DbSystemValues.INFORMIX_SQLI;
1059+
case "informix-direct":
1060+
return DbSystemValues.INFORMIX_DIRECT;
10011061
case "mariadb": // MariaDB
10021062
return DbSystemValues.MARIADB;
10031063
case "mysql": // MySQL
@@ -1024,6 +1084,8 @@ private static final class DbSystemValues {
10241084
static final String MYSQL = "mysql";
10251085
static final String ORACLE = "oracle";
10261086
static final String DB2 = "db2";
1087+
static final String INFORMIX_SQLI = "informix-sqli";
1088+
static final String INFORMIX_DIRECT = "informix-direct";
10271089
static final String POSTGRESQL = "postgresql";
10281090
static final String HANADB = "hanadb";
10291091
static final String DERBY = "derby";

instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcConnectionUrlParserTest.java

+57
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,63 @@ public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
638638
.setDb("sapdb")
639639
.build(),
640640

641+
// https://www.ibm.com/support/pages/how-configure-informix-jdbc-connection-string-connect-group
642+
arg("jdbc:informix-sqli://infxhost:99/infxdb:INFORMIXSERVER=infxsn;user=infxuser;password=PW")
643+
.setSystem("informix-sqli")
644+
.setUser("infxuser")
645+
.setShortUrl("informix-sqli://infxhost:99")
646+
.setHost("infxhost")
647+
.setPort(99)
648+
.setName("infxdb")
649+
.build(),
650+
arg("jdbc:informix-sqli://localhost:9088/stores_demo:INFORMIXSERVER=informix")
651+
.setSystem("informix-sqli")
652+
.setShortUrl("informix-sqli://localhost:9088")
653+
.setHost("localhost")
654+
.setPort(9088)
655+
.setName("stores_demo")
656+
.build(),
657+
arg("jdbc:informix-sqli://infxhost:99")
658+
.setSystem("informix-sqli")
659+
.setShortUrl("informix-sqli://infxhost:99")
660+
.setHost("infxhost")
661+
.setPort(99)
662+
.build(),
663+
arg("jdbc:informix-sqli://infxhost/")
664+
.setSystem("informix-sqli")
665+
.setShortUrl("informix-sqli://infxhost:9088")
666+
.setHost("infxhost")
667+
.setPort(9088)
668+
.build(),
669+
arg("jdbc:informix-sqli:")
670+
.setSystem("informix-sqli")
671+
.setShortUrl("informix-sqli:")
672+
.setPort(9088)
673+
.build(),
674+
675+
// https://www.ibm.com/docs/en/informix-servers/12.10?topic=method-format-database-urls
676+
arg("jdbc:informix-direct://infxdb:999;user=infxuser;password=PW")
677+
.setSystem("informix-direct")
678+
.setShortUrl("informix-direct:")
679+
.setUser("infxuser")
680+
.setName("infxdb")
681+
.build(),
682+
arg("jdbc:informix-direct://infxdb;user=infxuser;password=PW")
683+
.setSystem("informix-direct")
684+
.setShortUrl("informix-direct:")
685+
.setUser("infxuser")
686+
.setName("infxdb")
687+
.build(),
688+
arg("jdbc:informix-direct://infxdb")
689+
.setSystem("informix-direct")
690+
.setShortUrl("informix-direct:")
691+
.setName("infxdb")
692+
.build(),
693+
arg("jdbc:informix-direct:")
694+
.setSystem("informix-direct")
695+
.setShortUrl("informix-direct:")
696+
.build(),
697+
641698
// http://www.h2database.com/html/features.html#database_url
642699
arg("jdbc:h2:mem:").setShortUrl("h2:mem:").setSystem("h2").setSubtype("mem").build(),
643700
arg("jdbc:h2:mem:")

0 commit comments

Comments
 (0)