From 24860ed53fcc1b921a9b6bef58be1151215c340c Mon Sep 17 00:00:00 2001 From: psainics Date: Tue, 17 Dec 2024 14:44:49 +0530 Subject: [PATCH 1/2] Add CloudSQLMySQLErrorDetailsProvider --- .../sink/CloudMySqlRunTimeMacro.feature | 4 +++ .../features/source/CloudMySqlRunTime.feature | 2 ++ .../CloudSQLMySQLErrorDetailsProvider.java | 31 +++++++++++++++++++ .../cloudsql/mysql/CloudSQLMySQLSink.java | 5 +++ .../cloudsql/mysql/CloudSQLMySQLSource.java | 5 +++ 5 files changed, 47 insertions(+) create mode 100644 cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLErrorDetailsProvider.java diff --git a/cloudsql-mysql-plugin/src/e2e-test/features/sink/CloudMySqlRunTimeMacro.feature b/cloudsql-mysql-plugin/src/e2e-test/features/sink/CloudMySqlRunTimeMacro.feature index 717f9dcf5..5ab8b4727 100644 --- a/cloudsql-mysql-plugin/src/e2e-test/features/sink/CloudMySqlRunTimeMacro.feature +++ b/cloudsql-mysql-plugin/src/e2e-test/features/sink/CloudMySqlRunTimeMacro.feature @@ -142,7 +142,9 @@ Feature: CloudMySql Sink - Run time scenarios (macro) Then Enter runtime argument value "invalidTablename" for key "invalidTablename" Then Run the Pipeline in Runtime with runtime arguments Then Wait till pipeline is in running state + And Open and capture logs And Verify the pipeline status is "Failed" + And Close the pipeline logs Then Open Pipeline logs and verify Log entries having below listed Level and Message: | Level | Message | | ERROR | errorLogsMessageInvalidTableName | @@ -181,7 +183,9 @@ Feature: CloudMySql Sink - Run time scenarios (macro) Then Enter runtime argument value "invalidPassword" for key "Password" Then Run the Pipeline in Runtime with runtime arguments Then Wait till pipeline is in running state + And Open and capture logs And Verify the pipeline status is "Failed" + And Close the pipeline logs Then Open Pipeline logs and verify Log entries having below listed Level and Message: | Level | Message | | ERROR | errorLogsMessageInvalidCredentials | diff --git a/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTime.feature b/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTime.feature index b884fa7fa..242e53d5d 100644 --- a/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTime.feature +++ b/cloudsql-mysql-plugin/src/e2e-test/features/source/CloudMySqlRunTime.feature @@ -224,7 +224,9 @@ Feature: CloudMySql Source - Run time scenarios Then Deploy the pipeline Then Run the Pipeline in Runtime Then Wait till pipeline is in running state + And Open and capture logs And Verify the pipeline status is "Failed" + And Close the pipeline logs Then Open Pipeline logs and verify Log entries having below listed Level and Message: | Level | Message | | ERROR | errorLogsMessageInvalidBoundingQuery | diff --git a/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLErrorDetailsProvider.java b/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLErrorDetailsProvider.java new file mode 100644 index 000000000..87f5ed2ec --- /dev/null +++ b/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLErrorDetailsProvider.java @@ -0,0 +1,31 @@ +/* + * Copyright © 2024 Cask Data, Inc. + * + * 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.cdap.plugin.cloudsql.mysql; + + +import io.cdap.plugin.mysql.MysqlErrorDetailsProvider; + +/** + * A custom ErrorDetailsProvider for CloudSQL MySQL plugins. + */ +public class CloudSQLMySQLErrorDetailsProvider extends MysqlErrorDetailsProvider { + + @Override + protected String getExternalDocumentationLink() { + return "https://cloud.google.com/sql/docs/mysql/error-messages"; + } +} diff --git a/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLSink.java b/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLSink.java index 6149c114b..86a8e6f52 100644 --- a/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLSink.java +++ b/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLSink.java @@ -103,6 +103,11 @@ String getDbColumns() { return dbColumns; } + @Override + protected String getErrorDetailsProviderClassName() { + return CloudSQLMySQLErrorDetailsProvider.class.getName(); + } + @Override protected LineageRecorder getLineageRecorder(BatchSinkContext context) { String host; diff --git a/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLSource.java b/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLSource.java index b0bea9e7a..aad074ba4 100644 --- a/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLSource.java +++ b/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLSource.java @@ -127,6 +127,11 @@ protected SchemaReader getSchemaReader() { return new MysqlSchemaReader(null, cloudsqlMysqlSourceConfig.getConnectionArguments()); } + @Override + protected String getErrorDetailsProviderClassName() { + return CloudSQLMySQLErrorDetailsProvider.class.getName(); + } + /** CloudSQL MySQL source config. */ public static class CloudSQLMySQLSourceConfig extends AbstractDBSpecificSourceConfig { From 5c958cb7e0bf581f070be00e2284774ad8e77b9b Mon Sep 17 00:00:00 2001 From: psainics Date: Tue, 17 Dec 2024 10:30:57 +0530 Subject: [PATCH 2/2] Add errorCodeType, errorCode & supportedDocURL in exception --- .../cloudsql/mysql/CloudSQLMySQLErrorDetailsProvider.java | 3 ++- .../main/java/io/cdap/plugin/db/DBErrorDetailsProvider.java | 5 ++++- .../src/main/java/io/cdap/plugin/db/DBRecord.java | 1 - .../src/main/java/io/cdap/plugin/util/DBUtils.java | 2 ++ .../java/io/cdap/plugin/mysql/MysqlErrorDetailsProvider.java | 3 ++- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLErrorDetailsProvider.java b/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLErrorDetailsProvider.java index 87f5ed2ec..fe276a27a 100644 --- a/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLErrorDetailsProvider.java +++ b/cloudsql-mysql-plugin/src/main/java/io/cdap/plugin/cloudsql/mysql/CloudSQLMySQLErrorDetailsProvider.java @@ -18,6 +18,7 @@ import io.cdap.plugin.mysql.MysqlErrorDetailsProvider; +import io.cdap.plugin.util.DBUtils; /** * A custom ErrorDetailsProvider for CloudSQL MySQL plugins. @@ -26,6 +27,6 @@ public class CloudSQLMySQLErrorDetailsProvider extends MysqlErrorDetailsProvider @Override protected String getExternalDocumentationLink() { - return "https://cloud.google.com/sql/docs/mysql/error-messages"; + return DBUtils.CLOUDSQLMYSQL_SUPPORTED_DOC_URL; } } diff --git a/database-commons/src/main/java/io/cdap/plugin/db/DBErrorDetailsProvider.java b/database-commons/src/main/java/io/cdap/plugin/db/DBErrorDetailsProvider.java index bafdba3e3..22a979d58 100644 --- a/database-commons/src/main/java/io/cdap/plugin/db/DBErrorDetailsProvider.java +++ b/database-commons/src/main/java/io/cdap/plugin/db/DBErrorDetailsProvider.java @@ -19,11 +19,13 @@ import com.google.common.base.Strings; import com.google.common.base.Throwables; import io.cdap.cdap.api.exception.ErrorCategory; +import io.cdap.cdap.api.exception.ErrorCodeType; import io.cdap.cdap.api.exception.ErrorType; import io.cdap.cdap.api.exception.ErrorUtils; import io.cdap.cdap.api.exception.ProgramFailureException; import io.cdap.cdap.etl.api.exception.ErrorContext; import io.cdap.cdap.etl.api.exception.ErrorDetailsProvider; +import io.cdap.plugin.util.DBUtils; import java.sql.SQLException; import java.util.List; @@ -76,7 +78,8 @@ private ProgramFailureException getProgramFailureException(SQLException e, Error externalDocumentationLink); } return ErrorUtils.getProgramFailureException(new ErrorCategory(ErrorCategory.ErrorCategoryEnum.PLUGIN), - errorMessage, errorMessageWithDetails, getErrorTypeFromErrorCode(errorCode), false, e); + errorMessage, errorMessageWithDetails, getErrorTypeFromErrorCode(errorCode), false, ErrorCodeType.SQLSTATE, + sqlState, externalDocumentationLink, e); } /** diff --git a/database-commons/src/main/java/io/cdap/plugin/db/DBRecord.java b/database-commons/src/main/java/io/cdap/plugin/db/DBRecord.java index a0b1ec14e..a5a9fcf5f 100644 --- a/database-commons/src/main/java/io/cdap/plugin/db/DBRecord.java +++ b/database-commons/src/main/java/io/cdap/plugin/db/DBRecord.java @@ -17,7 +17,6 @@ package io.cdap.plugin.db; import com.google.common.base.Preconditions; -import com.google.common.base.Strings; import io.cdap.cdap.api.common.Bytes; import io.cdap.cdap.api.data.format.StructuredRecord; import io.cdap.cdap.api.data.schema.Schema; diff --git a/database-commons/src/main/java/io/cdap/plugin/util/DBUtils.java b/database-commons/src/main/java/io/cdap/plugin/util/DBUtils.java index 584c7bb3f..d526d5e36 100644 --- a/database-commons/src/main/java/io/cdap/plugin/util/DBUtils.java +++ b/database-commons/src/main/java/io/cdap/plugin/util/DBUtils.java @@ -60,6 +60,8 @@ public final class DBUtils { private static final Logger LOG = LoggerFactory.getLogger(DBUtils.class); public static final Calendar PURE_GREGORIAN_CALENDAR = createPureGregorianCalender(); + public static final String MYSQL_SUPPORTED_DOC_URL = "https://dev.mysql.com/doc/mysql-errors/9.0/en/"; + public static final String CLOUDSQLMYSQL_SUPPORTED_DOC_URL = "https://cloud.google.com/sql/docs/mysql/error-messages"; // Java by default uses October 15, 1582 as a Gregorian cut over date. // Any timestamp created with time less than this cut over date is treated as Julian date. diff --git a/mysql-plugin/src/main/java/io/cdap/plugin/mysql/MysqlErrorDetailsProvider.java b/mysql-plugin/src/main/java/io/cdap/plugin/mysql/MysqlErrorDetailsProvider.java index 2f0a8f739..00f6d9810 100644 --- a/mysql-plugin/src/main/java/io/cdap/plugin/mysql/MysqlErrorDetailsProvider.java +++ b/mysql-plugin/src/main/java/io/cdap/plugin/mysql/MysqlErrorDetailsProvider.java @@ -18,6 +18,7 @@ import io.cdap.cdap.api.exception.ErrorType; import io.cdap.plugin.db.DBErrorDetailsProvider; +import io.cdap.plugin.util.DBUtils; /** * A custom ErrorDetailsProvider for MySQL plugins. @@ -26,7 +27,7 @@ public class MysqlErrorDetailsProvider extends DBErrorDetailsProvider { @Override protected String getExternalDocumentationLink() { - return "https://dev.mysql.com/doc/mysql-errors/9.0/en/"; + return DBUtils.MYSQL_SUPPORTED_DOC_URL; } @Override