Skip to content

Commit 121d0aa

Browse files
authored
chore(bqjdbc): log connection properties set by the user (#13244)
1 parent 5678fc2 commit 121d0aa

3 files changed

Lines changed: 115 additions & 2 deletions

File tree

java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.google.cloud.bigquery.storage.v1.BigQueryWriteClient;
4242
import com.google.cloud.bigquery.storage.v1.BigQueryWriteSettings;
4343
import com.google.cloud.http.HttpTransportOptions;
44+
import com.google.common.collect.ImmutableSortedSet;
4445
import java.io.IOException;
4546
import java.io.InputStream;
4647
import java.sql.CallableStatement;
@@ -76,6 +77,70 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
7677
private final String connectionId;
7778
private static final String DEFAULT_JDBC_TOKEN_VALUE = "Google-BigQuery-JDBC-Driver";
7879
private static final String DEFAULT_VERSION = "0.0.0";
80+
private static final Set<String> SAFE_TO_LOG_PROPERTIES =
81+
ImmutableSortedSet.orderedBy(String.CASE_INSENSITIVE_ORDER)
82+
.add(
83+
BigQueryJdbcUrlUtility.PROJECT_ID_PROPERTY_NAME,
84+
BigQueryJdbcUrlUtility.DEFAULT_DATASET_PROPERTY_NAME,
85+
BigQueryJdbcUrlUtility.LOCATION_PROPERTY_NAME,
86+
BigQueryJdbcUrlUtility.ENABLE_HTAPI_PROPERTY_NAME,
87+
BigQueryJdbcUrlUtility.UNSUPPORTED_HTAPI_FALLBACK_PROPERTY_NAME,
88+
BigQueryJdbcUrlUtility.HTAPI_MIN_TABLE_SIZE_PROPERTY_NAME,
89+
BigQueryJdbcUrlUtility.HTAPI_ACTIVATION_RATIO_PROPERTY_NAME,
90+
BigQueryJdbcUrlUtility.KMS_KEY_NAME_PROPERTY_NAME,
91+
BigQueryJdbcUrlUtility.QUERY_PROPERTIES_NAME,
92+
BigQueryJdbcUrlUtility.ENABLE_SESSION_PROPERTY_NAME,
93+
BigQueryJdbcUrlUtility.LOG_LEVEL_PROPERTY_NAME,
94+
BigQueryJdbcUrlUtility.LOG_PATH_PROPERTY_NAME,
95+
BigQueryJdbcUrlUtility.OAUTH_TYPE_PROPERTY_NAME,
96+
BigQueryJdbcUrlUtility.OAUTH_ACCESS_TOKEN_READONLY_PROPERTY_NAME,
97+
BigQueryJdbcUrlUtility.USE_QUERY_CACHE_PROPERTY_NAME,
98+
BigQueryJdbcUrlUtility.QUERY_DIALECT_PROPERTY_NAME,
99+
BigQueryJdbcUrlUtility.ALLOW_LARGE_RESULTS_PROPERTY_NAME,
100+
BigQueryJdbcUrlUtility.LARGE_RESULTS_TABLE_PROPERTY_NAME,
101+
BigQueryJdbcUrlUtility.LARGE_RESULTS_DATASET_PROPERTY_NAME,
102+
BigQueryJdbcUrlUtility.DESTINATION_DATASET_EXPIRATION_TIME_PROPERTY_NAME,
103+
BigQueryJdbcUrlUtility.UNIVERSE_DOMAIN_OVERRIDE_PROPERTY_NAME,
104+
BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME,
105+
BigQueryJdbcUrlUtility.PROXY_PORT_PROPERTY_NAME,
106+
BigQueryJdbcUrlUtility.JOB_CREATION_MODE_PROPERTY_NAME,
107+
BigQueryJdbcUrlUtility.MAX_RESULTS_PROPERTY_NAME,
108+
BigQueryJdbcUrlUtility.PARTNER_TOKEN_PROPERTY_NAME,
109+
BigQueryJdbcUrlUtility.ENDPOINT_OVERRIDES_PROPERTY_NAME,
110+
BigQueryJdbcUrlUtility.PRIVATE_SERVICE_CONNECT_PROPERTY_NAME,
111+
BigQueryJdbcUrlUtility.METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME,
112+
BigQueryJdbcUrlUtility.RETRY_TIMEOUT_IN_SECS_PROPERTY_NAME,
113+
BigQueryJdbcUrlUtility.JOB_TIMEOUT_PROPERTY_NAME,
114+
BigQueryJdbcUrlUtility.RETRY_INITIAL_DELAY_PROPERTY_NAME,
115+
BigQueryJdbcUrlUtility.RETRY_MAX_DELAY_PROPERTY_NAME,
116+
BigQueryJdbcUrlUtility.ADDITIONAL_PROJECTS_PROPERTY_NAME,
117+
BigQueryJdbcUrlUtility.CONNECTION_POOL_SIZE_PROPERTY_NAME,
118+
BigQueryJdbcUrlUtility.LISTENER_POOL_SIZE_PROPERTY_NAME,
119+
BigQueryJdbcUrlUtility.ENABLE_WRITE_API_PROPERTY_NAME,
120+
BigQueryJdbcUrlUtility.SWA_APPEND_ROW_COUNT_PROPERTY_NAME,
121+
BigQueryJdbcUrlUtility.SWA_ACTIVATION_ROW_COUNT_PROPERTY_NAME,
122+
BigQueryJdbcUrlUtility.FILTER_TABLES_ON_DEFAULT_DATASET_PROPERTY_NAME,
123+
BigQueryJdbcUrlUtility.REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME,
124+
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROPERTY_NAME,
125+
BigQueryJdbcUrlUtility.MAX_BYTES_BILLED_PROPERTY_NAME,
126+
BigQueryJdbcUrlUtility.LABELS_PROPERTY_NAME,
127+
BigQueryJdbcUrlUtility.REQUEST_REASON_PROPERTY_NAME,
128+
BigQueryJdbcUrlUtility.HTTP_CONNECT_TIMEOUT_PROPERTY_NAME,
129+
BigQueryJdbcUrlUtility.HTTP_READ_TIMEOUT_PROPERTY_NAME,
130+
BigQueryJdbcUrlUtility.BYOID_AUDIENCE_URI_PROPERTY_NAME,
131+
BigQueryJdbcUrlUtility.BYOID_CREDENTIAL_SOURCE_PROPERTY_NAME,
132+
BigQueryJdbcUrlUtility.BYOID_POOL_USER_PROJECT_PROPERTY_NAME,
133+
BigQueryJdbcUrlUtility.BYOID_SA_IMPERSONATION_URI_PROPERTY_NAME,
134+
BigQueryJdbcUrlUtility.BYOID_SUBJECT_TOKEN_TYPE_PROPERTY_NAME,
135+
BigQueryJdbcUrlUtility.BYOID_TOKEN_URI_PROPERTY_NAME,
136+
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_EMAIL_PROPERTY_NAME,
137+
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_CHAIN_PROPERTY_NAME,
138+
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_SCOPES_PROPERTY_NAME,
139+
BigQueryJdbcUrlUtility.OAUTH_SA_IMPERSONATION_TOKEN_LIFETIME_PROPERTY_NAME,
140+
BigQueryJdbcUrlUtility.OAUTH_SA_EMAIL_PROPERTY_NAME,
141+
BigQueryJdbcUrlUtility.OAUTH_PVT_KEY_PATH_PROPERTY_NAME,
142+
BigQueryJdbcUrlUtility.OAUTH_CLIENT_ID_PROPERTY_NAME)
143+
.build();
79144
private HeaderProvider headerProvider;
80145
BigQueryReadClient bigQueryReadClient = null;
81146
BigQueryWriteClient bigQueryWriteClient = null;
@@ -152,6 +217,18 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
152217
this.connectionId = UUID.randomUUID().toString();
153218
try (BigQueryJdbcMdc.MdcCloseable mdc = BigQueryJdbcMdc.registerInstance(this.connectionId)) {
154219
this.connectionUrl = url;
220+
if (LOG.isLoggable(java.util.logging.Level.CONFIG)) {
221+
Properties connectionProps = ds.createProperties();
222+
Properties maskedProps = new Properties();
223+
for (String name : connectionProps.stringPropertyNames()) {
224+
String value = connectionProps.getProperty(name);
225+
if (!SAFE_TO_LOG_PROPERTIES.contains(name)) {
226+
value = "*****";
227+
}
228+
maskedProps.setProperty(name, value);
229+
}
230+
LOG.config("Connection properties: %s", maskedProps.toString());
231+
}
155232
this.openStatements = ConcurrentHashMap.newKeySet();
156233
this.autoCommit = true;
157234
this.sqlWarnings = new ArrayList<>();

java-bigquery/google-cloud-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ public Connection getConnection() throws SQLException {
392392
return DriverManager.getConnection(getURL(), createProperties());
393393
}
394394

395-
private Properties createProperties() {
395+
Properties createProperties() {
396396
Properties connectionProperties = new Properties();
397397
if (this.projectId != null) {
398398
connectionProperties.setProperty(

java-bigquery/google-cloud-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,17 @@
2929
import java.io.IOException;
3030
import java.io.InputStream;
3131
import java.sql.SQLException;
32+
import java.util.Optional;
3233
import java.util.Properties;
34+
import java.util.logging.Level;
35+
import java.util.logging.LogRecord;
36+
import java.util.logging.Logger;
3337
import org.junit.jupiter.api.BeforeEach;
3438
import org.junit.jupiter.api.Test;
3539
import org.junit.jupiter.params.ParameterizedTest;
3640
import org.junit.jupiter.params.provider.CsvSource;
3741

38-
public class BigQueryConnectionTest {
42+
public class BigQueryConnectionTest extends BigQueryJdbcLoggingBaseTest {
3943

4044
private static final String DEFAULT_VERSION = "0.0.0";
4145
private static final String DEFAULT_JDBC_TOKEN_VALUE = "Google-BigQuery-JDBC-Driver";
@@ -456,4 +460,36 @@ public void testIsReadOnlyTokenProvided(String readonlyProp, boolean expectedIsR
456460
assertEquals(expectedIsReadOnly, connection.isReadOnlyTokenUsed());
457461
}
458462
}
463+
464+
@Test
465+
public void testConnectionPropertiesLoggingAndMasking() throws IOException, SQLException {
466+
Logger rootLogger = BigQueryJdbcRootLogger.getRootLogger();
467+
Level originalLevel = rootLogger.getLevel();
468+
rootLogger.setLevel(Level.CONFIG);
469+
470+
try {
471+
String url =
472+
"jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;"
473+
+ "OAuthType=2;ProjectId=MyTestProjectId;"
474+
+ "OAuthAccessToken=secretAccessToken;Location=US;";
475+
try (BigQueryConnection connection = new BigQueryConnection(url)) {
476+
// Just trigger the constructor
477+
}
478+
479+
Optional<LogRecord> connectionPropertiesLog =
480+
capturedLogs.stream()
481+
.filter(r -> r.getMessage().contains("Connection properties:"))
482+
.findFirst();
483+
assertTrue(
484+
connectionPropertiesLog.isPresent(),
485+
"Log message about Connection properties was not found");
486+
String logMessage = connectionPropertiesLog.get().getMessage();
487+
assertTrue(logMessage.contains("ProjectId=MyTestProjectId"));
488+
assertTrue(logMessage.contains("Location=US"));
489+
assertTrue(logMessage.contains("OAuthAccessToken=*****"));
490+
assertFalse(logMessage.contains("secretAccessToken"));
491+
} finally {
492+
rootLogger.setLevel(originalLevel);
493+
}
494+
}
459495
}

0 commit comments

Comments
 (0)