Skip to content

Commit cbcffb0

Browse files
committed
merge
2 parents 976c65b + b9849d6 commit cbcffb0

20 files changed

+555
-259
lines changed

src/main/java/com/databricks/client/jdbc/Driver.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
import static com.databricks.jdbc.driver.DatabricksJdbcConstants.*;
44

55
import com.databricks.jdbc.client.DatabricksClientType;
6+
import com.databricks.jdbc.commons.ErrorTypes;
67
import com.databricks.jdbc.commons.LogLevel;
78
import com.databricks.jdbc.commons.util.DeviceInfoLogUtil;
89
import com.databricks.jdbc.commons.util.DriverUtil;
10+
import com.databricks.jdbc.commons.util.ErrorCodes;
911
import com.databricks.jdbc.commons.util.LoggingUtil;
1012
import com.databricks.jdbc.core.DatabricksConnection;
1113
import com.databricks.jdbc.core.DatabricksSQLException;
@@ -57,19 +59,31 @@ public Connection connect(String url, Properties info) throws DatabricksSQLExcep
5759
Throwable cause = e;
5860
while (cause != null) {
5961
if (cause instanceof DatabricksSQLException) {
60-
throw new DatabricksSQLException(
62+
String errorMessage =
6163
"Communication link failure. Failed to connect to server. : "
6264
+ connectionContext.getHostUrl()
63-
+ cause.getMessage(),
64-
cause.getCause());
65+
+ cause.getMessage();
66+
throw new DatabricksSQLException(
67+
errorMessage,
68+
cause.getCause(),
69+
connectionContext,
70+
ErrorTypes.COMMUNICATION_FAILURE,
71+
null,
72+
ErrorCodes.COMMUNICATION_FAILURE);
6573
}
6674
cause = cause.getCause();
6775
}
68-
throw new DatabricksSQLException(
69-
"Communication link failure. Failed to connect to server. :"
76+
String errorMessage =
77+
"Communication link failure. Failed to connect to server. : "
7078
+ connectionContext.getHostUrl()
71-
+ e.getMessage(),
72-
e);
79+
+ e.getMessage();
80+
throw new DatabricksSQLException(
81+
errorMessage,
82+
e,
83+
connectionContext,
84+
ErrorTypes.COMMUNICATION_FAILURE,
85+
null,
86+
ErrorCodes.COMMUNICATION_FAILURE);
7387
}
7488
}
7589

src/main/java/com/databricks/jdbc/client/DatabricksRetryHandlerException.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,39 @@
11
package com.databricks.jdbc.client;
22

3+
import com.databricks.jdbc.driver.IDatabricksConnectionContext;
4+
import com.databricks.jdbc.telemetry.DatabricksMetrics;
35
import java.io.IOException;
46

57
public class DatabricksRetryHandlerException extends IOException {
68
private int errCode = 0;
79

10+
private void exportError(
11+
IDatabricksConnectionContext connectionContext,
12+
String errorName,
13+
String sqlQueryId,
14+
int errorCode) {
15+
DatabricksMetrics metricsExporter = connectionContext.getMetricsExporter();
16+
if (metricsExporter != null) {
17+
metricsExporter.exportError(errorName, sqlQueryId, errorCode);
18+
}
19+
}
20+
821
public DatabricksRetryHandlerException(String message, int errCode) {
922
super(message);
1023
this.errCode = errCode;
1124
}
1225

26+
public DatabricksRetryHandlerException(
27+
String message,
28+
int errCode,
29+
IDatabricksConnectionContext connectionContext,
30+
String errorName,
31+
String sqlQueryId) {
32+
super(message);
33+
this.errCode = errCode;
34+
exportError(connectionContext, errorName, sqlQueryId, errCode);
35+
}
36+
1337
public int getErrCode() {
1438
return errCode;
1539
}

src/main/java/com/databricks/jdbc/client/http/DatabricksHttpClient.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.databricks.jdbc.client.DatabricksHttpException;
88
import com.databricks.jdbc.client.DatabricksRetryHandlerException;
99
import com.databricks.jdbc.client.IDatabricksHttpClient;
10+
import com.databricks.jdbc.commons.ErrorTypes;
1011
import com.databricks.jdbc.commons.LogLevel;
1112
import com.databricks.jdbc.commons.util.LoggingUtil;
1213
import com.databricks.jdbc.driver.IDatabricksConnectionContext;
@@ -79,6 +80,7 @@ public class DatabricksHttpClient implements IDatabricksHttpClient {
7980
private static int rateLimitRetryTimeout;
8081
protected static int idleHttpConnectionExpiry;
8182
private CloseableHttpClient httpDisabledSSLClient;
83+
private IDatabricksConnectionContext connectionContext;
8284

8385
private DatabricksHttpClient(IDatabricksConnectionContext connectionContext) {
8486
initializeConnectionManager();
@@ -90,6 +92,7 @@ private DatabricksHttpClient(IDatabricksConnectionContext connectionContext) {
9092
httpClient = makeClosableHttpClient(connectionContext);
9193
httpDisabledSSLClient = makeClosableDisabledSslHttpClient();
9294
idleHttpConnectionExpiry = connectionContext.getIdleHttpConnectionExpiry();
95+
this.connectionContext = connectionContext;
9396
}
9497

9598
@VisibleForTesting
@@ -235,14 +238,21 @@ private void handleResponseInterceptor(HttpResponse httpResponse, HttpContext ht
235238
if (httpResponse.containsHeader(THRIFT_ERROR_MESSAGE_HEADER)) {
236239
String errorMessage = httpResponse.getFirstHeader(THRIFT_ERROR_MESSAGE_HEADER).getValue();
237240
throw new DatabricksRetryHandlerException(
238-
"HTTP Response code: " + errCode + ", Error message: " + errorMessage, errCode);
241+
"HTTP Response code: " + errCode + ", Error message: " + errorMessage,
242+
errCode,
243+
connectionContext,
244+
ErrorTypes.HTTP_RETRY_ERROR,
245+
"");
239246
}
240247
throw new DatabricksRetryHandlerException(
241248
"HTTP Response code: "
242249
+ errCode
243250
+ ", Error Message: "
244251
+ httpResponse.getStatusLine().getReasonPhrase(),
245-
errCode);
252+
errCode,
253+
connectionContext,
254+
ErrorTypes.HTTP_RETRY_ERROR,
255+
"");
246256
}
247257
}
248258

src/main/java/com/databricks/jdbc/client/impl/sdk/DatabricksSdkClient.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
import com.databricks.jdbc.client.sqlexec.ExternalLink;
1616
import com.databricks.jdbc.client.sqlexec.GetStatementResponse;
1717
import com.databricks.jdbc.client.sqlexec.ResultData;
18+
import com.databricks.jdbc.commons.ErrorTypes;
1819
import com.databricks.jdbc.commons.LogLevel;
20+
import com.databricks.jdbc.commons.util.ErrorCodes;
1921
import com.databricks.jdbc.commons.util.LoggingUtil;
2022
import com.databricks.jdbc.core.*;
2123
import com.databricks.jdbc.core.types.ComputeResource;
@@ -284,15 +286,22 @@ void handleFailedExecution(
284286
"Statement execution failed %s -> %s\n%s: %s",
285287
statementId, statement, statementState, response.getStatus().getError().getMessage());
286288
LoggingUtil.log(LogLevel.DEBUG, errorMessage, this.getClass().getName());
289+
int errorCode;
287290
switch (statementState) {
288291
case FAILED:
292+
errorCode = ErrorCodes.EXECUTE_STATEMENT_FAILED;
293+
break;
289294
case CLOSED:
295+
errorCode = ErrorCodes.EXECUTE_STATEMENT_CLOSED;
296+
break;
290297
case CANCELED:
291-
// TODO: Handle differently for failed, closed and cancelled with proper error codes
292-
throw new DatabricksSQLException(errorMessage);
298+
errorCode = ErrorCodes.EXECUTE_STATEMENT_CANCELLED;
299+
break;
293300
default:
294301
throw new IllegalStateException("Invalid state for error");
295302
}
303+
throw new DatabricksSQLException(
304+
errorMessage, connectionContext, ErrorTypes.EXECUTE_STATEMENT, statementId, errorCode);
296305
}
297306

298307
private ExecuteStatementResponse wrapGetStatementResponse(
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.databricks.jdbc.commons;
2+
3+
public class ErrorTypes {
4+
public static String CHUNK_DOWNLOAD = "CHUNK_DOWNLOAD";
5+
public static String EXECUTE_STATEMENT = "EXECUTE_STATEMENT";
6+
public static String COMMUNICATION_FAILURE = "COMMUNICATION_FAILURE";
7+
public static String FEATURE_NOT_SUPPORTED = "FEATURE_NOT_SUPPORTED";
8+
public static String TIMEOUT_ERROR = "TIMEOUT_ERROR";
9+
public static String HTTP_RETRY_ERROR = "HTTP_RETRY_ERROR";
10+
public static String VOLUME_OPERATION_ERROR = "VOLUME_OPERATION_ERROR";
11+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.databricks.jdbc.commons;
2+
3+
import java.util.concurrent.TimeUnit;
4+
5+
public class MetricsConstants {
6+
public static final String METRICS_MAP_STRING = "metrics_map";
7+
public static final String METRICS_TYPE = "metrics_type";
8+
public static final String TELEMETRY_BASE_URL =
9+
"https://aa87314c1e33d4c1f91a919f8cf9c4ba-387609431.us-west-2.elb.amazonaws.com:443";
10+
public static final String METRICS_URL =
11+
TELEMETRY_BASE_URL + "/api/2.0/oss-sql-driver-telemetry/metrics";
12+
public static final String ERROR_LOGGING_URL =
13+
TELEMETRY_BASE_URL + "/api/2.0/oss-sql-driver-telemetry/logs";
14+
public static final String USAGE_METRICS_URL =
15+
TELEMETRY_BASE_URL + "/api/2.0/oss-sql-driver-telemetry/usageMetrics";
16+
public static final long INTERVAL_DURATION = TimeUnit.SECONDS.toMillis(10 * 60);
17+
public static final String WORKSPACE_ID = "workspace_id";
18+
public static final String SQL_QUERY_ID = "sql_query_id";
19+
public static final String TIMESTAMP = "timestamp";
20+
public static final String DRIVER_VERSION = "driver_version";
21+
public static final String CONNECTION_CONFIG = "connection_config";
22+
public static final String ERROR_CODE = "error_code";
23+
public static final String JVM_NAME = "jvm_name";
24+
public static final String JVM_SPEC_VERSION = "jvm_spec_version";
25+
public static final String JVM_IMPL_VERSION = "jvm_impl_version";
26+
public static final String JVM_VENDOR = "jvm_vendor";
27+
public static final String OS_NAME = "os_name";
28+
public static final String OS_VERSION = "os_version";
29+
public static final String OS_ARCH = "os_arch";
30+
public static final String LOCALE_NAME = "locale_name";
31+
public static final String CHARSET_ENCODING = "charset_encoding";
32+
}

src/main/java/com/databricks/jdbc/commons/util/DeviceInfoLogUtil.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.databricks.jdbc.commons.LogLevel;
44
import com.databricks.jdbc.driver.IDatabricksConnectionContext;
5-
import com.databricks.jdbc.telemetry.DatabricksUsageMetrics;
65
import java.nio.charset.Charset;
76

87
public class DeviceInfoLogUtil {
@@ -32,16 +31,17 @@ public static void logProperties(IDatabricksConnectionContext context) {
3231
"Operating System Name: %s, Version: %s, Architecture: %s, Locale: ",
3332
osName, osVersion, osArch, localeName));
3433
LoggingUtil.log(LogLevel.INFO, String.format("Default Charset Encoding: %s", charsetEncoding));
35-
DatabricksUsageMetrics.exportUsageMetrics(
36-
context,
37-
jvmName,
38-
jvmSpecVersion,
39-
jvmImplVersion,
40-
jvmVendor,
41-
osName,
42-
osVersion,
43-
osArch,
44-
localeName,
45-
charsetEncoding);
34+
context
35+
.getMetricsExporter()
36+
.exportUsageMetrics(
37+
jvmName,
38+
jvmSpecVersion,
39+
jvmImplVersion,
40+
jvmVendor,
41+
osName,
42+
osVersion,
43+
osArch,
44+
localeName,
45+
charsetEncoding);
4646
}
4747
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.databricks.jdbc.commons.util;
2+
3+
// TODO: https://databricks.atlassian.net/browse/PECO-1814
4+
public class ErrorCodes {
5+
public static final int CHUNK_DOWNLOAD_ERROR = 1001;
6+
public static final int EXECUTE_STATEMENT_FAILED = 1003;
7+
public static final int EXECUTE_STATEMENT_CANCELLED = 2001;
8+
public static final int EXECUTE_STATEMENT_CLOSED = 2001;
9+
public static final int RESULT_SET_ERROR = 1004;
10+
public static final int COMMUNICATION_FAILURE = 1005;
11+
public static final int MAX_FIELD_SIZE_EXCEEDED = 1006;
12+
public static final int CURSOR_NAME_NOT_FOUND = 1007;
13+
public static final int MORE_RESULTS_UNSUPPORTED = 1008;
14+
public static final int UNSUPPORTED_FETCH_FORWARD = 1009;
15+
public static final int BATCH_OPERATION_UNSUPPORTED = 1010;
16+
public static final int EXECUTE_METHOD_UNSUPPORTED = 1011;
17+
public static final int POOLABLE_METHOD_UNSUPPORTED = 1012;
18+
public static final int STATEMENT_UNWRAP_UNSUPPORTED = 1013;
19+
public static final int STATEMENT_EXECUTION_TIMEOUT = 1014;
20+
public static final int STATEMENT_CLOSED = 1015;
21+
public static final int VOLUME_OPERATION_PARSING_ERROR = 1015;
22+
}

src/main/java/com/databricks/jdbc/core/ChunkDownloader.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import com.databricks.jdbc.client.sqlexec.ExternalLink;
88
import com.databricks.jdbc.client.sqlexec.ResultData;
99
import com.databricks.jdbc.client.sqlexec.ResultManifest;
10+
import com.databricks.jdbc.commons.ErrorTypes;
1011
import com.databricks.jdbc.commons.LogLevel;
12+
import com.databricks.jdbc.commons.util.ErrorCodes;
1113
import com.databricks.jdbc.commons.util.LoggingUtil;
1214
import com.databricks.jdbc.core.types.CompressionType;
1315
import com.databricks.sdk.service.sql.BaseChunkInfo;
@@ -150,7 +152,12 @@ public ArrowResultChunk getChunk() throws DatabricksSQLException {
150152
chunk.wait();
151153
}
152154
if (chunk.getStatus() != ArrowResultChunk.ChunkStatus.DOWNLOAD_SUCCEEDED) {
153-
throw new DatabricksSQLException(chunk.getErrorMessage());
155+
throw new DatabricksSQLException(
156+
chunk.getErrorMessage(),
157+
session.getConnectionContext(),
158+
ErrorTypes.CHUNK_DOWNLOAD,
159+
statementId,
160+
ErrorCodes.CHUNK_DOWNLOAD_ERROR);
154161
}
155162
} catch (InterruptedException e) {
156163
LoggingUtil.log(

src/main/java/com/databricks/jdbc/core/DatabricksConnection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public Statement createStatement() {
6161
}
6262

6363
@Override
64-
public PreparedStatement prepareStatement(String sql) throws SQLException {
64+
public PreparedStatement prepareStatement(String sql) {
6565
LoggingUtil.log(
6666
LogLevel.DEBUG,
6767
String.format("public PreparedStatement prepareStatement(String sql = {%s})", sql));

0 commit comments

Comments
 (0)