From 8ac8f5187660c0e74e1c494f1662ad0dcabca58e Mon Sep 17 00:00:00 2001 From: AMit-Cloudsufi Date: Wed, 29 Jan 2025 18:30:25 +0000 Subject: [PATCH] Update error messages --- .../action/BigQueryArgumentSetter.java | 14 +++-- .../gcp/bigquery/action/BigQueryExecute.java | 22 +++++--- .../bigquery/common/BigQueryErrorUtil.java | 56 +++++++++++++++++-- 3 files changed, 76 insertions(+), 16 deletions(-) diff --git a/src/main/java/io/cdap/plugin/gcp/bigquery/action/BigQueryArgumentSetter.java b/src/main/java/io/cdap/plugin/gcp/bigquery/action/BigQueryArgumentSetter.java index bb7c1c7b6..dac16a8ca 100644 --- a/src/main/java/io/cdap/plugin/gcp/bigquery/action/BigQueryArgumentSetter.java +++ b/src/main/java/io/cdap/plugin/gcp/bigquery/action/BigQueryArgumentSetter.java @@ -35,8 +35,10 @@ import io.cdap.cdap.api.annotation.Name; import io.cdap.cdap.api.annotation.Plugin; 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.action.Action; import io.cdap.cdap.etl.api.action.ActionContext; import io.cdap.plugin.gcp.bigquery.common.BigQueryErrorUtil; @@ -115,12 +117,16 @@ public void run(ActionContext context) { // Check for errors if (queryJob.getStatus().getError() != null) { - String errorReason = String.format("The bigquery job failed with reason: %s", - queryJob.getStatus().getError().getReason()); + String errorReason = String.format( + "The bigquery job failed with reason: %s. For more details, see %s", + queryJob.getStatus().getError().getReason(), GCPUtils.BQ_SUPPORTED_DOC_URL); ErrorType type = BigQueryErrorUtil.getErrorType(queryJob.getStatus().getError().getReason()); + String errorCode = BigQueryErrorUtil.getErrorCode( + queryJob.getStatus().getError().getReason()); throw ErrorUtils.getProgramFailureException( - new ErrorCategory(ErrorCategory.ErrorCategoryEnum.PLUGIN), errorReason, errorReason, type, - true, null); + new ErrorCategory(ErrorCategory.ErrorCategoryEnum.PLUGIN), errorReason, + queryJob.getStatus().getExecutionErrors().toString(), type, true, ErrorCodeType.HTTP, + errorCode, GCPUtils.BQ_SUPPORTED_DOC_URL, null); } TableResult queryResults; try { diff --git a/src/main/java/io/cdap/plugin/gcp/bigquery/action/BigQueryExecute.java b/src/main/java/io/cdap/plugin/gcp/bigquery/action/BigQueryExecute.java index 56fdc4952..db9d36652 100644 --- a/src/main/java/io/cdap/plugin/gcp/bigquery/action/BigQueryExecute.java +++ b/src/main/java/io/cdap/plugin/gcp/bigquery/action/BigQueryExecute.java @@ -45,6 +45,7 @@ import io.cdap.cdap.api.annotation.Name; import io.cdap.cdap.api.annotation.Plugin; 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.etl.api.FailureCollector; @@ -255,20 +256,27 @@ private void executeQuery(BigQuery bigQuery, QueryJobConfiguration queryConfig, if (queryJob.getStatus().getError() != null) { // You can also look at queryJob.getStatus().getExecutionErrors() for all // errors, not just the latest one. - LOG.error( - String.format("The query job %s failed with error %s and reason %s.", jobId.getJob(), - queryJob.getStatus().getError().getReason(), queryJob.getStatus().getError())); + LOG.error("The query job {} failed with reason: {} and error: {}.", jobId.getJob(), + queryJob.getStatus().getError().getReason(), + queryJob.getStatus().getExecutionErrors().toString()); if (RETRY_ON_REASON.contains(queryJob.getStatus().getError().getReason())) { throw new BigQueryJobExecutionException(queryJob.getStatus().getError().getMessage()); } - String error = String.format( - "The bigquery query execution failed with reason: %s and message: %s", + String errorReason = String.format( + "The bigquery query execution failed due to reason: %s and error: %s. " + + "For more details, see %s", queryJob.getStatus().getError().getReason(), + queryJob.getStatus().getExecutionErrors().toString(), GCPUtils.BQ_SUPPORTED_DOC_URL); + String errorMessage = String.format( + "The bigquery query execution failed due to reason: %s , error: %s and message: %s", queryJob.getStatus().getError().getReason(), + queryJob.getStatus().getExecutionErrors().toString(), queryJob.getStatus().getError().getMessage()); ErrorType type = BigQueryErrorUtil.getErrorType(queryJob.getStatus().getError().getReason()); + String errorCode = BigQueryErrorUtil.getErrorCode( + queryJob.getStatus().getError().getReason()); throw ErrorUtils.getProgramFailureException( - new ErrorCategory(ErrorCategory.ErrorCategoryEnum.PLUGIN), error, error, type, true, - null); + new ErrorCategory(ErrorCategory.ErrorCategoryEnum.PLUGIN), errorReason, errorMessage, + type, true, ErrorCodeType.HTTP, errorCode, GCPUtils.BQ_SUPPORTED_DOC_URL, null); } TableResult queryResults; diff --git a/src/main/java/io/cdap/plugin/gcp/bigquery/common/BigQueryErrorUtil.java b/src/main/java/io/cdap/plugin/gcp/bigquery/common/BigQueryErrorUtil.java index 5f88dd60a..bdf30a7e9 100644 --- a/src/main/java/io/cdap/plugin/gcp/bigquery/common/BigQueryErrorUtil.java +++ b/src/main/java/io/cdap/plugin/gcp/bigquery/common/BigQueryErrorUtil.java @@ -16,6 +16,7 @@ package io.cdap.plugin.gcp.bigquery.common; +import io.cdap.cdap.api.exception.ErrorCategory; import io.cdap.cdap.api.exception.ErrorType; import io.cdap.cdap.api.exception.ProgramFailureException; import io.cdap.plugin.gcp.common.GCPErrorDetailsProviderUtil; @@ -30,6 +31,7 @@ public class BigQueryErrorUtil { // https://cloud.google.com/bigquery/docs/error-messages#errortable private static final Map ERROR_REASON_TO_ERROR_TYPE = new HashMap<>(); + private static final Map ERROR_REASON_TO_ERROR_CODE = new HashMap<>(); static { // User Errors @@ -39,11 +41,9 @@ public class BigQueryErrorUtil { ERROR_REASON_TO_ERROR_TYPE.put("resourceInUse", ErrorType.USER); ERROR_REASON_TO_ERROR_TYPE.put("resourcesExceeded", ErrorType.USER); ERROR_REASON_TO_ERROR_TYPE.put("badRequest", ErrorType.USER); - ERROR_REASON_TO_ERROR_TYPE.put("failedPrecondition", ErrorType.USER); - ERROR_REASON_TO_ERROR_TYPE.put("outOfRange", ErrorType.USER); + ERROR_REASON_TO_ERROR_TYPE.put("invalidUser", ErrorType.USER); ERROR_REASON_TO_ERROR_TYPE.put("notFound", ErrorType.USER); ERROR_REASON_TO_ERROR_TYPE.put("duplicate", ErrorType.USER); - ERROR_REASON_TO_ERROR_TYPE.put("conditionNotMet", ErrorType.USER); ERROR_REASON_TO_ERROR_TYPE.put("accessDenied", ErrorType.USER); ERROR_REASON_TO_ERROR_TYPE.put("billingNotEnabled", ErrorType.USER); ERROR_REASON_TO_ERROR_TYPE.put("quotaExceeded", ErrorType.USER); @@ -51,17 +51,50 @@ public class BigQueryErrorUtil { ERROR_REASON_TO_ERROR_TYPE.put("responseTooLarge", ErrorType.USER); ERROR_REASON_TO_ERROR_TYPE.put("blocked", ErrorType.USER); ERROR_REASON_TO_ERROR_TYPE.put("proxyAuthenticationRequired", ErrorType.USER); - ERROR_REASON_TO_ERROR_TYPE.put("invalidClient", ErrorType.USER); - ERROR_REASON_TO_ERROR_TYPE.put("invalidGrant", ErrorType.USER); + ERROR_REASON_TO_ERROR_TYPE.put("jobRateLimitExceeded", ErrorType.USER); // System Errors ERROR_REASON_TO_ERROR_TYPE.put("tableUnavailable", ErrorType.SYSTEM); ERROR_REASON_TO_ERROR_TYPE.put("backendError", ErrorType.SYSTEM); ERROR_REASON_TO_ERROR_TYPE.put("internalError", ErrorType.SYSTEM); ERROR_REASON_TO_ERROR_TYPE.put("notImplemented", ErrorType.SYSTEM); + ERROR_REASON_TO_ERROR_TYPE.put("jobBackendError", ErrorType.SYSTEM); + ERROR_REASON_TO_ERROR_TYPE.put("jobInternalError", ErrorType.SYSTEM); + ERROR_REASON_TO_ERROR_TYPE.put("timeout", ErrorType.SYSTEM); // Unknown Errors ERROR_REASON_TO_ERROR_TYPE.put("stopped", ErrorType.UNKNOWN); + + //Error codes + ERROR_REASON_TO_ERROR_CODE.put("invalid", 400); + ERROR_REASON_TO_ERROR_CODE.put("invalidQuery", 400); + ERROR_REASON_TO_ERROR_CODE.put("billingTierLimitExceeded", 400); + ERROR_REASON_TO_ERROR_CODE.put("resourceInUse", 400); + ERROR_REASON_TO_ERROR_CODE.put("resourcesExceeded", 400); + ERROR_REASON_TO_ERROR_CODE.put("badRequest", 400); + ERROR_REASON_TO_ERROR_CODE.put("invalidUser", 400); + ERROR_REASON_TO_ERROR_CODE.put("notFound", 404); + ERROR_REASON_TO_ERROR_CODE.put("duplicate", 409); + ERROR_REASON_TO_ERROR_CODE.put("accessDenied", 403); + ERROR_REASON_TO_ERROR_CODE.put("billingNotEnabled", 403); + ERROR_REASON_TO_ERROR_CODE.put("quotaExceeded", 403); + ERROR_REASON_TO_ERROR_CODE.put("rateLimitExceeded", 403); + ERROR_REASON_TO_ERROR_CODE.put("responseTooLarge", 403); + ERROR_REASON_TO_ERROR_CODE.put("blocked", 403); + ERROR_REASON_TO_ERROR_CODE.put("proxyAuthenticationRequired", 407); + + // System Errors + ERROR_REASON_TO_ERROR_CODE.put("tableUnavailable", 400); + ERROR_REASON_TO_ERROR_CODE.put("backendError", 503); + ERROR_REASON_TO_ERROR_CODE.put("internalError", 500); + ERROR_REASON_TO_ERROR_CODE.put("notImplemented", 501); + ERROR_REASON_TO_ERROR_CODE.put("jobBackendError", 400); + ERROR_REASON_TO_ERROR_CODE.put("jobInternalError", 400); + ERROR_REASON_TO_ERROR_CODE.put("jobRateLimitExceeded", 400); + ERROR_REASON_TO_ERROR_CODE.put("timeout", 400); + + // Unknown Errors + ERROR_REASON_TO_ERROR_CODE.put("stopped", 200); } /** @@ -77,6 +110,19 @@ public static ErrorType getErrorType(String errorReason) { return ErrorType.UNKNOWN; } + /** + * Method to get the error codes based on the error reason. + * + * @param errorReason the error reason to classify + * @return the corresponding ErrorType (USER, SYSTEM, UNKNOWN) + */ + public static String getErrorCode(String errorReason) { + if (errorReason != null && ERROR_REASON_TO_ERROR_CODE.containsKey(errorReason)) { + return String.valueOf(ERROR_REASON_TO_ERROR_CODE.get(errorReason)); + } + return null; + } + /** * Method to get the Program Failure exception based on error reason *