From 297a94c0e33542e79fae325fcd2ef4c56709f54a Mon Sep 17 00:00:00 2001 From: Yuya Ebihara Date: Mon, 21 Aug 2023 07:40:18 +0900 Subject: [PATCH 1/2] Use unwrap in Oracle and Phoenix connectors --- .../src/main/java/io/trino/plugin/oracle/OracleClient.java | 6 +++--- .../main/java/io/trino/plugin/phoenix5/PhoenixClient.java | 2 +- .../java/io/trino/plugin/phoenix5/PhoenixSplitManager.java | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java b/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java index b6f0d0c68715..eeeaccb62ac9 100644 --- a/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java +++ b/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClient.java @@ -757,18 +757,18 @@ private static BooleanWriteFunction oracleBooleanWriteFunction() public static LongWriteFunction oracleRealWriteFunction() { return LongWriteFunction.of(Types.REAL, (statement, index, value) -> - ((OraclePreparedStatement) statement).setBinaryFloat(index, intBitsToFloat(toIntExact(value)))); + statement.unwrap(OraclePreparedStatement.class).setBinaryFloat(index, intBitsToFloat(toIntExact(value)))); } public static DoubleWriteFunction oracleDoubleWriteFunction() { return DoubleWriteFunction.of(Types.DOUBLE, (statement, index, value) -> - ((OraclePreparedStatement) statement).setBinaryDouble(index, value)); + statement.unwrap(OraclePreparedStatement.class).setBinaryDouble(index, value)); } private SliceWriteFunction oracleCharWriteFunction() { - return SliceWriteFunction.of(Types.NCHAR, (statement, index, value) -> ((OraclePreparedStatement) statement).setFixedCHAR(index, value.toStringUtf8())); + return SliceWriteFunction.of(Types.NCHAR, (statement, index, value) -> statement.unwrap(OraclePreparedStatement.class).setFixedCHAR(index, value.toStringUtf8())); } @Override diff --git a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java index 023fa93945e5..b65a51aeeb25 100644 --- a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java +++ b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClient.java @@ -309,7 +309,7 @@ public PreparedStatement buildSql(ConnectorSession session, Connection connectio table, columnHandles, Optional.of(split)); - QueryPlan queryPlan = getQueryPlan((PhoenixPreparedStatement) query); + QueryPlan queryPlan = getQueryPlan(query.unwrap(PhoenixPreparedStatement.class)); ResultSet resultSet = getResultSet(((PhoenixSplit) split).getPhoenixInputSplit(), queryPlan); return new DelegatePreparedStatement(query) { diff --git a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixSplitManager.java b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixSplitManager.java index 9a0a94abda36..557e1bc1418c 100644 --- a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixSplitManager.java +++ b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixSplitManager.java @@ -81,12 +81,13 @@ public ConnectorSplitSource getSplits( List columns = tableHandle.getColumns() .map(columnSet -> columnSet.stream().map(JdbcColumnHandle.class::cast).collect(toList())) .orElseGet(() -> phoenixClient.getColumns(session, tableHandle)); - PhoenixPreparedStatement inputQuery = (PhoenixPreparedStatement) phoenixClient.prepareStatement( + PhoenixPreparedStatement inputQuery = phoenixClient.prepareStatement( session, connection, tableHandle, columns, - Optional.empty()); + Optional.empty()) + .unwrap(PhoenixPreparedStatement.class); int maxScansPerSplit = session.getProperty(PhoenixSessionProperties.MAX_SCANS_PER_SPLIT, Integer.class); List splits = getSplits(inputQuery, maxScansPerSplit).stream() From 3c0917771b91ab934d1c8d3f3a7bb2c7bd6d6b06 Mon Sep 17 00:00:00 2001 From: Yuya Ebihara Date: Mon, 21 Aug 2023 07:51:15 +0900 Subject: [PATCH 2/2] Add support for OpenTelemetry in JDBC connectors --- plugin/trino-base-jdbc/pom.xml | 11 ++ .../plugin/jdbc/DriverConnectionFactory.java | 19 ++- .../plugin/jdbc/JdbcConnectorFactory.java | 2 + .../trino/plugin/jdbc/TracingDataSource.java | 124 ++++++++++++++++++ .../jdbc/TestJdbcConnectionCreation.java | 3 +- .../io/trino/plugin/jdbc/TestingDatabase.java | 3 +- .../clickhouse/ClickHouseClientModule.java | 5 +- .../plugin/druid/DruidJdbcClientModule.java | 6 +- .../plugin/example/ExampleClientModule.java | 5 +- .../plugin/ignite/IgniteClientModule.java | 11 +- .../plugin/mariadb/MariaDbClientModule.java | 5 +- .../trino/plugin/mysql/MySqlClientModule.java | 6 +- .../plugin/oracle/OracleClientModule.java | 6 +- .../plugin/phoenix5/PhoenixClientModule.java | 6 +- .../phoenix5/PhoenixConnectorFactory.java | 2 + .../PostgreSqlConnectionFactoryModule.java | 5 +- .../TestPostgreSqlJdbcConnectionCreation.java | 3 +- .../plugin/redshift/RedshiftClientModule.java | 6 +- .../singlestore/SingleStoreClientModule.java | 6 +- .../sqlserver/SqlServerClientModule.java | 15 ++- 20 files changed, 218 insertions(+), 31 deletions(-) create mode 100644 plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/TracingDataSource.java diff --git a/plugin/trino-base-jdbc/pom.xml b/plugin/trino-base-jdbc/pom.xml index ad3daffdf826..9615529fdedb 100644 --- a/plugin/trino-base-jdbc/pom.xml +++ b/plugin/trino-base-jdbc/pom.xml @@ -83,6 +83,11 @@ units + + io.opentelemetry.instrumentation + opentelemetry-jdbc + + io.trino trino-cache @@ -129,6 +134,12 @@ jmxutils + + io.opentelemetry + opentelemetry-api + provided + + io.trino trino-spi diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DriverConnectionFactory.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DriverConnectionFactory.java index 58f40a256108..4c6bcae53c86 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DriverConnectionFactory.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DriverConnectionFactory.java @@ -13,6 +13,7 @@ */ package io.trino.plugin.jdbc; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.credential.CredentialPropertiesProvider; import io.trino.plugin.jdbc.credential.CredentialProvider; import io.trino.plugin.jdbc.credential.DefaultCredentialPropertiesProvider; @@ -34,6 +35,7 @@ public class DriverConnectionFactory private final String connectionUrl; private final Properties connectionProperties; private final CredentialPropertiesProvider credentialPropertiesProvider; + private final TracingDataSource dataSource; public DriverConnectionFactory(Driver driver, BaseJdbcConfig config, CredentialProvider credentialProvider) { @@ -45,16 +47,27 @@ public DriverConnectionFactory(Driver driver, BaseJdbcConfig config, CredentialP public DriverConnectionFactory(Driver driver, String connectionUrl, Properties connectionProperties, CredentialProvider credentialProvider) { - this(driver, connectionUrl, connectionProperties, new DefaultCredentialPropertiesProvider(credentialProvider)); + this(driver, connectionUrl, connectionProperties, new DefaultCredentialPropertiesProvider(credentialProvider), OpenTelemetry.noop()); } - public DriverConnectionFactory(Driver driver, String connectionUrl, Properties connectionProperties, CredentialPropertiesProvider credentialPropertiesProvider) + public DriverConnectionFactory(Driver driver, String connectionUrl, Properties connectionProperties, CredentialProvider credentialProvider, OpenTelemetry openTelemetry) + { + this(driver, connectionUrl, connectionProperties, new DefaultCredentialPropertiesProvider(credentialProvider), openTelemetry); + } + + public DriverConnectionFactory( + Driver driver, + String connectionUrl, + Properties connectionProperties, + CredentialPropertiesProvider credentialPropertiesProvider, + OpenTelemetry openTelemetry) { this.driver = requireNonNull(driver, "driver is null"); this.connectionUrl = requireNonNull(connectionUrl, "connectionUrl is null"); this.connectionProperties = new Properties(); this.connectionProperties.putAll(requireNonNull(connectionProperties, "connectionProperties is null")); this.credentialPropertiesProvider = requireNonNull(credentialPropertiesProvider, "credentialPropertiesProvider is null"); + this.dataSource = new TracingDataSource(requireNonNull(openTelemetry, "openTelemetry is null"), driver, connectionUrl); } @Override @@ -62,7 +75,7 @@ public Connection openConnection(ConnectorSession session) throws SQLException { Properties properties = getCredentialProperties(session.getIdentity()); - Connection connection = driver.connect(connectionUrl, properties); + Connection connection = dataSource.getConnection(properties); checkState(connection != null, "Driver returned null connection, make sure the connection URL '%s' is valid for the driver %s", connectionUrl, driver); return connection; } diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcConnectorFactory.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcConnectorFactory.java index 29f3df70cf87..6b0d90082c70 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcConnectorFactory.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcConnectorFactory.java @@ -16,6 +16,7 @@ import com.google.inject.Injector; import com.google.inject.Module; import io.airlift.bootstrap.Bootstrap; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.base.CatalogName; import io.trino.spi.NodeManager; import io.trino.spi.VersionEmbedder; @@ -61,6 +62,7 @@ public Connector create(String catalogName, Map requiredConfig, binder -> binder.bind(TypeManager.class).toInstance(context.getTypeManager()), binder -> binder.bind(NodeManager.class).toInstance(context.getNodeManager()), binder -> binder.bind(VersionEmbedder.class).toInstance(context.getVersionEmbedder()), + binder -> binder.bind(OpenTelemetry.class).toInstance(context.getOpenTelemetry()), binder -> binder.bind(CatalogName.class).toInstance(new CatalogName(catalogName)), new JdbcModule(), module); diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/TracingDataSource.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/TracingDataSource.java new file mode 100644 index 000000000000..c9a1a91dca7f --- /dev/null +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/TracingDataSource.java @@ -0,0 +1,124 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.trino.plugin.jdbc; + +import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.jdbc.datasource.OpenTelemetryDataSource; + +import javax.sql.DataSource; + +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.Driver; +import java.sql.SQLException; +import java.util.Properties; +import java.util.logging.Logger; + +import static java.util.Objects.requireNonNull; + +public class TracingDataSource +{ + private final OpenTelemetry openTelemetry; + private final Driver driver; + private final String connectionUrl; + + public TracingDataSource(OpenTelemetry openTelemetry, Driver driver, String connectionUrl) + { + this.openTelemetry = requireNonNull(openTelemetry, "openTelemetry is null"); + this.driver = requireNonNull(driver, "driver is null"); + this.connectionUrl = requireNonNull(connectionUrl, "connectionUrl is null"); + } + + public Connection getConnection(Properties properties) + throws SQLException + { + DataSource dataSource = new JdbcDataSource(driver, connectionUrl, properties); + try (OpenTelemetryDataSource openTelemetryDataSource = new OpenTelemetryDataSource(dataSource, openTelemetry)) { + return openTelemetryDataSource.getConnection(); + } + catch (Exception e) { + throw new SQLException(e); + } + } + + private static class JdbcDataSource + implements DataSource + { + private final Driver driver; + private final String connectionUrl; + private final Properties properties; + + public JdbcDataSource(Driver driver, String connectionUrl, Properties properties) + { + this.driver = requireNonNull(driver, "driver is null"); + this.connectionUrl = requireNonNull(connectionUrl, "connectionUrl is null"); + this.properties = requireNonNull(properties, "properties is null"); + } + + @Override + public Connection getConnection() + throws SQLException + { + return driver.connect(connectionUrl, properties); + } + + @Override + public Connection getConnection(String username, String password) + { + throw new UnsupportedOperationException(); + } + + @Override + public PrintWriter getLogWriter() + { + throw new UnsupportedOperationException(); + } + + @Override + public void setLogWriter(PrintWriter out) + { + throw new UnsupportedOperationException(); + } + + @Override + public void setLoginTimeout(int seconds) + { + throw new UnsupportedOperationException(); + } + + @Override + public int getLoginTimeout() + { + throw new UnsupportedOperationException(); + } + + @Override + public Logger getParentLogger() + { + throw new UnsupportedOperationException(); + } + + @Override + public T unwrap(Class iface) + { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isWrapperFor(Class iface) + { + throw new UnsupportedOperationException(); + } + } +} diff --git a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcConnectionCreation.java b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcConnectionCreation.java index f2969e99c68e..a31a026eb105 100644 --- a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcConnectionCreation.java +++ b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcConnectionCreation.java @@ -19,6 +19,7 @@ import com.google.inject.Module; import com.google.inject.Provides; import com.google.inject.Singleton; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.base.mapping.IdentifierMapping; import io.trino.plugin.jdbc.credential.EmptyCredentialProvider; import io.trino.testing.QueryRunner; @@ -46,7 +47,7 @@ protected QueryRunner createQueryRunner() throws Exception { String connectionUrl = createH2ConnectionUrl(); - DriverConnectionFactory delegate = new DriverConnectionFactory(new Driver(), connectionUrl, new Properties(), new EmptyCredentialProvider()); + DriverConnectionFactory delegate = new DriverConnectionFactory(new Driver(), connectionUrl, new Properties(), new EmptyCredentialProvider(), OpenTelemetry.noop()); this.connectionFactory = new ConnectionCountingConnectionFactory(delegate); return createH2QueryRunner( ImmutableList.of(NATION, REGION), diff --git a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestingDatabase.java b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestingDatabase.java index 5477d8e5ba3f..02ec936eeb8f 100644 --- a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestingDatabase.java +++ b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestingDatabase.java @@ -13,6 +13,7 @@ */ package io.trino.plugin.jdbc; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.credential.EmptyCredentialProvider; import io.trino.spi.connector.ConnectorSession; import io.trino.spi.connector.ConnectorSplitSource; @@ -45,7 +46,7 @@ public TestingDatabase() String connectionUrl = "jdbc:h2:mem:" + databaseName + ";NON_KEYWORDS=KEY,VALUE"; // key and value are reserved keywords in H2 2.x jdbcClient = new TestingH2JdbcClient( new BaseJdbcConfig(), - new DriverConnectionFactory(new Driver(), connectionUrl, new Properties(), new EmptyCredentialProvider())); + new DriverConnectionFactory(new Driver(), connectionUrl, new Properties(), new EmptyCredentialProvider(), OpenTelemetry.noop())); connection = DriverManager.getConnection(connectionUrl); connection.createStatement().execute("CREATE SCHEMA example"); diff --git a/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClientModule.java b/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClientModule.java index a203b809ebe1..a343b3f6d981 100644 --- a/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClientModule.java +++ b/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClientModule.java @@ -20,6 +20,7 @@ import com.google.inject.Scopes; import com.google.inject.Singleton; import io.airlift.configuration.ConfigBinder; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.BaseJdbcConfig; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DecimalModule; @@ -54,11 +55,11 @@ public void configure(Binder binder) @Provides @Singleton @ForBaseJdbc - public static ConnectionFactory createConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider) + public static ConnectionFactory createConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider, OpenTelemetry openTelemetry) { Properties properties = new Properties(); // The connector expects byte array for FixedString and String types properties.setProperty(USE_BINARY_STRING.getKey(), "true"); - return new ClickHouseConnectionFactory(new DriverConnectionFactory(new ClickHouseDriver(), config.getConnectionUrl(), properties, credentialProvider)); + return new ClickHouseConnectionFactory(new DriverConnectionFactory(new ClickHouseDriver(), config.getConnectionUrl(), properties, credentialProvider, openTelemetry)); } } diff --git a/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClientModule.java b/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClientModule.java index d90da9c3b312..b5e1f88f2939 100644 --- a/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClientModule.java +++ b/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClientModule.java @@ -18,6 +18,7 @@ import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.Singleton; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.BaseJdbcConfig; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DriverConnectionFactory; @@ -45,13 +46,14 @@ public void configure(Binder binder) @Provides @Singleton @ForBaseJdbc - public static ConnectionFactory createConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider) + public static ConnectionFactory createConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider, OpenTelemetry openTelemetry) { Properties connectionProperties = new Properties(); return new DriverConnectionFactory( new Driver(), config.getConnectionUrl(), connectionProperties, - credentialProvider); + credentialProvider, + openTelemetry); } } diff --git a/plugin/trino-example-jdbc/src/main/java/io/trino/plugin/example/ExampleClientModule.java b/plugin/trino-example-jdbc/src/main/java/io/trino/plugin/example/ExampleClientModule.java index 328f65d1d808..fc76c6f39458 100644 --- a/plugin/trino-example-jdbc/src/main/java/io/trino/plugin/example/ExampleClientModule.java +++ b/plugin/trino-example-jdbc/src/main/java/io/trino/plugin/example/ExampleClientModule.java @@ -18,6 +18,7 @@ import com.google.inject.Scopes; import com.google.inject.Singleton; import io.airlift.configuration.AbstractConfigurationAwareModule; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.BaseJdbcConfig; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DriverConnectionFactory; @@ -41,10 +42,10 @@ public void setup(Binder binder) @Provides @Singleton @ForBaseJdbc - public static ConnectionFactory getConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider) + public static ConnectionFactory getConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider, OpenTelemetry openTelemetry) throws SQLException { Properties connectionProperties = new Properties(); - return new DriverConnectionFactory(DriverManager.getDriver(config.getConnectionUrl()), config.getConnectionUrl(), connectionProperties, credentialProvider); + return new DriverConnectionFactory(DriverManager.getDriver(config.getConnectionUrl()), config.getConnectionUrl(), connectionProperties, credentialProvider, openTelemetry); } } diff --git a/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteClientModule.java b/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteClientModule.java index 81db0757b63e..3526f634be26 100644 --- a/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteClientModule.java +++ b/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteClientModule.java @@ -18,6 +18,7 @@ import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.Singleton; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.BaseJdbcConfig; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DecimalModule; @@ -28,6 +29,8 @@ import io.trino.plugin.jdbc.credential.CredentialProvider; import org.apache.ignite.IgniteJdbcThinDriver; +import java.util.Properties; + import static com.google.inject.multibindings.OptionalBinder.newOptionalBinder; import static io.airlift.configuration.ConfigBinder.configBinder; import static io.trino.plugin.jdbc.JdbcModule.bindTablePropertiesProvider; @@ -48,11 +51,13 @@ public void configure(Binder binder) @Provides @Singleton @ForBaseJdbc - public static ConnectionFactory createConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider) + public static ConnectionFactory createConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider, OpenTelemetry openTelemetry) { return new DriverConnectionFactory( new IgniteJdbcThinDriver(), - config, - credentialProvider); + config.getConnectionUrl(), + new Properties(), + credentialProvider, + openTelemetry); } } diff --git a/plugin/trino-mariadb/src/main/java/io/trino/plugin/mariadb/MariaDbClientModule.java b/plugin/trino-mariadb/src/main/java/io/trino/plugin/mariadb/MariaDbClientModule.java index dea89f09351d..c516a8ee9195 100644 --- a/plugin/trino-mariadb/src/main/java/io/trino/plugin/mariadb/MariaDbClientModule.java +++ b/plugin/trino-mariadb/src/main/java/io/trino/plugin/mariadb/MariaDbClientModule.java @@ -18,6 +18,7 @@ import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.Singleton; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.BaseJdbcConfig; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DecimalModule; @@ -49,9 +50,9 @@ public void configure(Binder binder) @Provides @Singleton @ForBaseJdbc - public static ConnectionFactory createConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider) + public static ConnectionFactory createConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider, OpenTelemetry openTelemetry) { - return new DriverConnectionFactory(new Driver(), config.getConnectionUrl(), getConnectionProperties(), credentialProvider); + return new DriverConnectionFactory(new Driver(), config.getConnectionUrl(), getConnectionProperties(), credentialProvider, openTelemetry); } private static Properties getConnectionProperties() diff --git a/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClientModule.java b/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClientModule.java index 5a13fe34e43c..46dd48b5e9c2 100644 --- a/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClientModule.java +++ b/plugin/trino-mysql/src/main/java/io/trino/plugin/mysql/MySqlClientModule.java @@ -19,6 +19,7 @@ import com.google.inject.Singleton; import com.mysql.cj.jdbc.Driver; import io.airlift.configuration.AbstractConfigurationAwareModule; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.BaseJdbcConfig; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DecimalModule; @@ -55,14 +56,15 @@ protected void setup(Binder binder) @Provides @Singleton @ForBaseJdbc - public static ConnectionFactory createConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider, MySqlConfig mySqlConfig) + public static ConnectionFactory createConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider, MySqlConfig mySqlConfig, OpenTelemetry openTelemetry) throws SQLException { return new DriverConnectionFactory( new Driver(), config.getConnectionUrl(), getConnectionProperties(mySqlConfig), - credentialProvider); + credentialProvider, + openTelemetry); } public static Properties getConnectionProperties(MySqlConfig mySqlConfig) diff --git a/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClientModule.java b/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClientModule.java index ea626b8eae64..118c8728299a 100644 --- a/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClientModule.java +++ b/plugin/trino-oracle/src/main/java/io/trino/plugin/oracle/OracleClientModule.java @@ -19,6 +19,7 @@ import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.Singleton; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.BaseJdbcConfig; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DriverConnectionFactory; @@ -57,7 +58,7 @@ public void configure(Binder binder) @Provides @Singleton @ForBaseJdbc - public static ConnectionFactory connectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider, OracleConfig oracleConfig) + public static ConnectionFactory connectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider, OracleConfig oracleConfig, OpenTelemetry openTelemetry) throws SQLException { Properties connectionProperties = new Properties(); @@ -78,6 +79,7 @@ public static ConnectionFactory connectionFactory(BaseJdbcConfig config, Credent new OracleDriver(), config.getConnectionUrl(), connectionProperties, - credentialProvider)); + credentialProvider, + openTelemetry)); } } diff --git a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClientModule.java b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClientModule.java index d18b567200c2..852d76723aa4 100644 --- a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClientModule.java +++ b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixClientModule.java @@ -19,6 +19,7 @@ import com.google.inject.Scopes; import com.google.inject.Singleton; import io.airlift.configuration.AbstractConfigurationAwareModule; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.base.classloader.ClassLoaderSafeConnectorMetadata; import io.trino.plugin.base.classloader.ClassLoaderSafeConnectorPageSinkProvider; import io.trino.plugin.base.classloader.ClassLoaderSafeConnectorPageSourceProvider; @@ -165,7 +166,7 @@ private void checkConfiguration(String connectionUrl) @Provides @Singleton @ForBaseJdbc - public ConnectionFactory getConnectionFactory(PhoenixConfig config) + public ConnectionFactory getConnectionFactory(PhoenixConfig config, OpenTelemetry openTelemetry) throws SQLException { return new ConfiguringConnectionFactory( @@ -173,7 +174,8 @@ public ConnectionFactory getConnectionFactory(PhoenixConfig config) PhoenixDriver.INSTANCE, // Note: for some reason new PhoenixDriver won't work. config.getConnectionUrl(), getConnectionProperties(config), - new EmptyCredentialProvider()), + new EmptyCredentialProvider(), + openTelemetry), connection -> { // Per JDBC spec, a Driver is expected to have new connections in auto-commit mode. // This seems not to be true for PhoenixDriver, so we need to be explicit here. diff --git a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixConnectorFactory.java b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixConnectorFactory.java index 5e27a1d6e242..da46fa3a2127 100644 --- a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixConnectorFactory.java +++ b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixConnectorFactory.java @@ -16,6 +16,7 @@ import com.google.inject.Injector; import io.airlift.bootstrap.Bootstrap; import io.airlift.json.JsonModule; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.base.CatalogName; import io.trino.spi.NodeManager; import io.trino.spi.classloader.ThreadContextClassLoader; @@ -60,6 +61,7 @@ public Connector create(String catalogName, Map requiredConfig, binder.bind(ClassLoader.class).toInstance(PhoenixConnectorFactory.class.getClassLoader()); binder.bind(TypeManager.class).toInstance(context.getTypeManager()); binder.bind(NodeManager.class).toInstance(context.getNodeManager()); + binder.bind(OpenTelemetry.class).toInstance(context.getOpenTelemetry()); }); Injector injector = app diff --git a/plugin/trino-postgresql/src/main/java/io/trino/plugin/postgresql/PostgreSqlConnectionFactoryModule.java b/plugin/trino-postgresql/src/main/java/io/trino/plugin/postgresql/PostgreSqlConnectionFactoryModule.java index 84dab79e42fd..9faa4c0c71fd 100644 --- a/plugin/trino-postgresql/src/main/java/io/trino/plugin/postgresql/PostgreSqlConnectionFactoryModule.java +++ b/plugin/trino-postgresql/src/main/java/io/trino/plugin/postgresql/PostgreSqlConnectionFactoryModule.java @@ -17,6 +17,7 @@ import com.google.inject.Provides; import com.google.inject.Singleton; import io.airlift.configuration.AbstractConfigurationAwareModule; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.BaseJdbcConfig; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DriverConnectionFactory; @@ -37,10 +38,10 @@ public void setup(Binder binder) {} @Provides @Singleton @ForBaseJdbc - public static ConnectionFactory getConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider) + public static ConnectionFactory getConnectionFactory(BaseJdbcConfig config, CredentialProvider credentialProvider, OpenTelemetry openTelemetry) { Properties connectionProperties = new Properties(); connectionProperties.put(REWRITE_BATCHED_INSERTS.getName(), "true"); - return new DriverConnectionFactory(new Driver(), config.getConnectionUrl(), connectionProperties, credentialProvider); + return new DriverConnectionFactory(new Driver(), config.getConnectionUrl(), connectionProperties, credentialProvider, openTelemetry); } } diff --git a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlJdbcConnectionCreation.java b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlJdbcConnectionCreation.java index 236d551f406d..fb0803c9b185 100644 --- a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlJdbcConnectionCreation.java +++ b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlJdbcConnectionCreation.java @@ -19,6 +19,7 @@ import com.google.inject.Provides; import com.google.inject.Singleton; import io.airlift.configuration.AbstractConfigurationAwareModule; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.BaseJdbcConnectionCreationTest; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DriverConnectionFactory; @@ -61,7 +62,7 @@ protected QueryRunner createQueryRunner() CredentialProvider credentialProvider = new StaticCredentialProvider( Optional.of(postgreSqlServer.getUser()), Optional.of(postgreSqlServer.getPassword())); - DriverConnectionFactory delegate = new DriverConnectionFactory(new Driver(), postgreSqlServer.getJdbcUrl(), connectionProperties, credentialProvider); + DriverConnectionFactory delegate = new DriverConnectionFactory(new Driver(), postgreSqlServer.getJdbcUrl(), connectionProperties, credentialProvider, OpenTelemetry.noop()); this.connectionFactory = new ConnectionCountingConnectionFactory(delegate); return createPostgreSqlQueryRunner(postgreSqlServer, ImmutableList.of(NATION, REGION), connectionFactory); } diff --git a/plugin/trino-redshift/src/main/java/io/trino/plugin/redshift/RedshiftClientModule.java b/plugin/trino-redshift/src/main/java/io/trino/plugin/redshift/RedshiftClientModule.java index 35dc0ed8e58b..983585b4fe32 100644 --- a/plugin/trino-redshift/src/main/java/io/trino/plugin/redshift/RedshiftClientModule.java +++ b/plugin/trino-redshift/src/main/java/io/trino/plugin/redshift/RedshiftClientModule.java @@ -18,6 +18,7 @@ import com.google.inject.Provides; import com.google.inject.Singleton; import io.airlift.configuration.AbstractConfigurationAwareModule; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.BaseJdbcConfig; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DecimalModule; @@ -56,12 +57,13 @@ public void setup(Binder binder) @ForBaseJdbc public static ConnectionFactory getConnectionFactory( BaseJdbcConfig config, - CredentialProvider credentialProvider) + CredentialProvider credentialProvider, + OpenTelemetry openTelemetry) { Properties properties = new Properties(); properties.put("reWriteBatchedInserts", "true"); properties.put("reWriteBatchedInsertsSize", "512"); - return new DriverConnectionFactory(new Driver(), config.getConnectionUrl(), properties, credentialProvider); + return new DriverConnectionFactory(new Driver(), config.getConnectionUrl(), properties, credentialProvider, openTelemetry); } } diff --git a/plugin/trino-singlestore/src/main/java/io/trino/plugin/singlestore/SingleStoreClientModule.java b/plugin/trino-singlestore/src/main/java/io/trino/plugin/singlestore/SingleStoreClientModule.java index 23fe707d3b83..95e72cc6b059 100644 --- a/plugin/trino-singlestore/src/main/java/io/trino/plugin/singlestore/SingleStoreClientModule.java +++ b/plugin/trino-singlestore/src/main/java/io/trino/plugin/singlestore/SingleStoreClientModule.java @@ -19,6 +19,7 @@ import com.google.inject.Scopes; import com.google.inject.Singleton; import com.singlestore.jdbc.Driver; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DecimalModule; import io.trino.plugin.jdbc.DriverConnectionFactory; @@ -49,7 +50,7 @@ public void configure(Binder binder) @Provides @Singleton @ForBaseJdbc - public static ConnectionFactory createConnectionFactory(SingleStoreJdbcConfig config, CredentialProvider credentialProvider, SingleStoreConfig singleStoreConfig) + public static ConnectionFactory createConnectionFactory(SingleStoreJdbcConfig config, CredentialProvider credentialProvider, SingleStoreConfig singleStoreConfig, OpenTelemetry openTelemetry) { Properties connectionProperties = new Properties(); // we don't want to interpret tinyInt type (with cardinality as 2) as boolean/bit @@ -61,6 +62,7 @@ public static ConnectionFactory createConnectionFactory(SingleStoreJdbcConfig co new Driver(), config.getConnectionUrl(), connectionProperties, - credentialProvider); + credentialProvider, + openTelemetry); } } diff --git a/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClientModule.java b/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClientModule.java index c0b2f399a581..04dda541845a 100644 --- a/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClientModule.java +++ b/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClientModule.java @@ -20,6 +20,7 @@ import com.google.inject.Singleton; import com.microsoft.sqlserver.jdbc.SQLServerDriver; import io.airlift.configuration.AbstractConfigurationAwareModule; +import io.opentelemetry.api.OpenTelemetry; import io.trino.plugin.jdbc.BaseJdbcConfig; import io.trino.plugin.jdbc.ConnectionFactory; import io.trino.plugin.jdbc.DriverConnectionFactory; @@ -33,6 +34,8 @@ import io.trino.plugin.jdbc.ptf.Query; import io.trino.spi.function.table.ConnectorTableFunction; +import java.util.Properties; + import static com.google.inject.multibindings.Multibinder.newSetBinder; import static com.google.inject.multibindings.OptionalBinder.newOptionalBinder; import static io.airlift.configuration.ConditionalModule.conditionalModule; @@ -68,8 +71,16 @@ protected void setup(Binder binder) public static ConnectionFactory getConnectionFactory( BaseJdbcConfig config, SqlServerConfig sqlServerConfig, - CredentialProvider credentialProvider) + CredentialProvider credentialProvider, + OpenTelemetry openTelemetry) { - return new SqlServerConnectionFactory(new DriverConnectionFactory(new SQLServerDriver(), config, credentialProvider), sqlServerConfig.isSnapshotIsolationDisabled()); + return new SqlServerConnectionFactory( + new DriverConnectionFactory( + new SQLServerDriver(), + config.getConnectionUrl(), + new Properties(), + credentialProvider, + openTelemetry), + sqlServerConfig.isSnapshotIsolationDisabled()); } }