This is an automated email from the ASF dual-hosted git repository.
oscerd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 0d915a784cc9 CAMEL-24251: camel-aws2 - guard nullable
awsErrorDetails() in producer health checks (#25089)
0d915a784cc9 is described below
commit 0d915a784cc9ccb69136c384d0e8be0cfb223672
Author: Andrea Cosentino <[email protected]>
AuthorDate: Fri Jul 24 13:11:51 2026 +0200
CAMEL-24251: camel-aws2 - guard nullable awsErrorDetails() in producer
health checks (#25089)
Every AWS producer health check catches AwsServiceException and records the
HTTP
status code and the AWS error code. The status code was guarded for null but
awsErrorDetails() was dereferenced directly:
if (ObjectHelper.isNotEmpty(e.statusCode())) { // guarded
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) { //
NPE if details are null
builder.detail(SERVICE_ERROR_CODE, e.awsErrorDetails().errorCode());
}
AwsServiceException.awsErrorDetails() is nullable. When such an exception
reaches
the block the health check throws
NullPointerException: Cannot invoke "AwsErrorDetails.errorCode()"
because the
return value of "AwsServiceException.awsErrorDetails()" is null
instead of reporting the endpoint DOWN with the message it had already
prepared,
turning a genuine "service unreachable" signal into a health-check failure.
Guarded awsErrorDetails() consistently with the neighbouring statusCode()
check
across all 21 producer health checks. Textract additionally dereferenced it
in an
equals() test that classifies certain errors as healthy, so it now reads the
error code once into a local.
Added Athena2ProducerHealthCheckErrorDetailsTest covering both the
null-details
case (DOWN, no error-code detail) and the populated case (error code still
reported).
Signed-off-by: Andrea Cosentino <[email protected]>
Co-authored-by: Claude Opus 4.8 <[email protected]>
---
.../aws/config/AWSConfigProducerHealthCheck.java | 2 +-
.../ParameterStoreProducerHealthCheck.java | 2 +-
.../SecretsManagerProducerHealthCheck.java | 2 +-
.../SecurityHubProducerHealthCheck.java | 2 +-
components/camel-aws/camel-aws2-athena/pom.xml | 5 ++
.../aws2/athena/Athena2ProducerHealthCheck.java | 2 +-
...Athena2ProducerHealthCheckErrorDetailsTest.java | 77 ++++++++++++++++++++++
.../comprehend/Comprehend2ProducerHealthCheck.java | 2 +-
.../component/aws2/cw/Cw2ProducerHealthCheck.java | 2 +-
.../component/aws2/ddb/Db2ProducerHealthCheck.java | 2 +-
.../aws2/ec2/AWS2EC2ProducerHealthCheck.java | 2 +-
.../aws2/ecs/ECS2ProducerHealthCheck.java | 2 +-
.../aws2/eks/EKS2ProducerHealthCheck.java | 2 +-
.../EventbridgeProducerHealthCheck.java | 2 +-
.../aws2/lambda/Lambda2ProducerHealthCheck.java | 2 +-
.../component/aws2/mq/MQ2ProducerHealthCheck.java | 2 +-
.../aws2/polly/Polly2ProducerHealthCheck.java | 2 +-
.../Rekognition2ProducerHealthCheck.java | 2 +-
.../StepFunctions2ProducerHealthCheck.java | 2 +-
.../textract/Textract2ProducerHealthCheck.java | 9 +--
.../query/Timestream2QueryProducerHealthCheck.java | 2 +-
.../write/Timestream2WriteProducerHealthCheck.java | 2 +-
.../translate/Translate2ProducerHealthCheck.java | 2 +-
23 files changed, 107 insertions(+), 24 deletions(-)
diff --git
a/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigProducerHealthCheck.java
b/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigProducerHealthCheck.java
index 8b33b067d21b..f881e1644773 100644
---
a/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws-config/src/main/java/org/apache/camel/component/aws/config/AWSConfigProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class AWSConfigProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreProducerHealthCheck.java
b/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreProducerHealthCheck.java
index 7fa7fd9bd9ec..881a8a4b69fa 100644
---
a/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws-parameter-store/src/main/java/org/apache/camel/component/aws/parameterstore/ParameterStoreProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class ParameterStoreProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducerHealthCheck.java
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducerHealthCheck.java
index 913d78d45d32..5c45de40402c 100644
---
a/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws-secrets-manager/src/main/java/org/apache/camel/component/aws/secretsmanager/SecretsManagerProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class SecretsManagerProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubProducerHealthCheck.java
b/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubProducerHealthCheck.java
index 3f262e92abef..8ea14cc765bf 100644
---
a/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws-security-hub/src/main/java/org/apache/camel/component/aws/securityhub/SecurityHubProducerHealthCheck.java
@@ -54,7 +54,7 @@ public class SecurityHubProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git a/components/camel-aws/camel-aws2-athena/pom.xml
b/components/camel-aws/camel-aws2-athena/pom.xml
index 1048efd4f173..c6f67b9c6290 100644
--- a/components/camel-aws/camel-aws2-athena/pom.xml
+++ b/components/camel-aws/camel-aws2-athena/pom.xml
@@ -89,5 +89,10 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.assertj</groupId>
+ <artifactId>assertj-core</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>
diff --git
a/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheck.java
index 95796de78e78..400808d8cceb 100644
---
a/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-athena/src/main/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Athena2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-athena/src/test/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheckErrorDetailsTest.java
b/components/camel-aws/camel-aws2-athena/src/test/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheckErrorDetailsTest.java
new file mode 100644
index 000000000000..b6aa71ca81d5
--- /dev/null
+++
b/components/camel-aws/camel-aws2-athena/src/test/java/org/apache/camel/component/aws2/athena/Athena2ProducerHealthCheckErrorDetailsTest.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.camel.component.aws2.athena;
+
+import org.apache.camel.health.HealthCheck;
+import org.apache.camel.impl.health.AbstractHealthCheck;
+import org.junit.jupiter.api.Test;
+import software.amazon.awssdk.awscore.exception.AwsErrorDetails;
+import software.amazon.awssdk.awscore.exception.AwsServiceException;
+import software.amazon.awssdk.services.athena.AthenaClient;
+import software.amazon.awssdk.services.athena.model.ListQueryExecutionsRequest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * {@link AwsServiceException#awsErrorDetails()} is nullable, so the health
check must not dereference it blindly when
+ * recording the AWS error code.
+ */
+class Athena2ProducerHealthCheckErrorDetailsTest {
+
+ @Test
+ void reportsDownWithoutFailingWhenTheExceptionCarriesNoErrorDetails() {
+ HealthCheck.Result result = callHealthCheckThrowing(
+
AwsServiceException.builder().message("boom").statusCode(500).build());
+
+ assertThat(result.getState()).isEqualTo(HealthCheck.State.DOWN);
+ assertThat(result.getMessage()).contains("boom");
+
assertThat(result.getDetails()).containsEntry(AbstractHealthCheck.SERVICE_STATUS_CODE,
500);
+ // there were no error details to report, so the detail is simply
absent
+
assertThat(result.getDetails()).doesNotContainKey(AbstractHealthCheck.SERVICE_ERROR_CODE);
+ }
+
+ @Test
+ void stillReportsTheErrorCodeWhenTheExceptionCarriesErrorDetails() {
+ HealthCheck.Result result = callHealthCheckThrowing(
+ AwsServiceException.builder()
+ .message("boom")
+ .statusCode(400)
+ .awsErrorDetails(AwsErrorDetails.builder()
+ .errorCode("InvalidRequestException")
+ .build())
+ .build());
+
+ assertThat(result.getState()).isEqualTo(HealthCheck.State.DOWN);
+ assertThat(result.getDetails())
+ .containsEntry(AbstractHealthCheck.SERVICE_ERROR_CODE,
"InvalidRequestException");
+ }
+
+ private HealthCheck.Result callHealthCheckThrowing(AwsServiceException
exception) {
+ AthenaClient client = mock(AthenaClient.class);
+
when(client.listQueryExecutions(any(ListQueryExecutionsRequest.class))).thenThrow(exception);
+
+ Athena2Endpoint endpoint = mock(Athena2Endpoint.class);
+ // a null region skips the region check and takes the health check
straight to the client call
+ when(endpoint.getConfiguration()).thenReturn(new
Athena2Configuration());
+ when(endpoint.getAthenaClient()).thenReturn(client);
+
+ return new Athena2ProducerHealthCheck(endpoint, "test").call();
+ }
+}
diff --git
a/components/camel-aws/camel-aws2-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerHealthCheck.java
index 81f1aa731356..0e5a43b7d77b 100644
---
a/components/camel-aws/camel-aws2-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-comprehend/src/main/java/org/apache/camel/component/aws2/comprehend/Comprehend2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Comprehend2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-cw/src/main/java/org/apache/camel/component/aws2/cw/Cw2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-cw/src/main/java/org/apache/camel/component/aws2/cw/Cw2ProducerHealthCheck.java
index ddda2736370b..01c75ad8231c 100644
---
a/components/camel-aws/camel-aws2-cw/src/main/java/org/apache/camel/component/aws2/cw/Cw2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-cw/src/main/java/org/apache/camel/component/aws2/cw/Cw2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Cw2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Db2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Db2ProducerHealthCheck.java
index d2b353044ed4..718e30b45736 100644
---
a/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Db2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-ddb/src/main/java/org/apache/camel/component/aws2/ddb/Db2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Db2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-ec2/src/main/java/org/apache/camel/component/aws2/ec2/AWS2EC2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-ec2/src/main/java/org/apache/camel/component/aws2/ec2/AWS2EC2ProducerHealthCheck.java
index 2fd3e1348aa6..bf350fe61fca 100644
---
a/components/camel-aws/camel-aws2-ec2/src/main/java/org/apache/camel/component/aws2/ec2/AWS2EC2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-ec2/src/main/java/org/apache/camel/component/aws2/ec2/AWS2EC2ProducerHealthCheck.java
@@ -54,7 +54,7 @@ public class AWS2EC2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2ProducerHealthCheck.java
index 49a3590bd2bd..44638fde8d26 100644
---
a/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-ecs/src/main/java/org/apache/camel/component/aws2/ecs/ECS2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class ECS2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2ProducerHealthCheck.java
index 91632c4f8030..edb52806c296 100644
---
a/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-eks/src/main/java/org/apache/camel/component/aws2/eks/EKS2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class EKS2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheck.java
b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheck.java
index d306f0d0b074..d8c94a85dbf2 100644
---
a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class EventbridgeProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2ProducerHealthCheck.java
index a1e71a31a88a..93fa9977ca8d 100644
---
a/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-lambda/src/main/java/org/apache/camel/component/aws2/lambda/Lambda2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Lambda2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2ProducerHealthCheck.java
index 654c5d0fb530..20ea38bf146c 100644
---
a/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-mq/src/main/java/org/apache/camel/component/aws2/mq/MQ2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class MQ2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-polly/src/main/java/org/apache/camel/component/aws2/polly/Polly2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-polly/src/main/java/org/apache/camel/component/aws2/polly/Polly2ProducerHealthCheck.java
index 7cd6205fa8b5..70a25053133d 100644
---
a/components/camel-aws/camel-aws2-polly/src/main/java/org/apache/camel/component/aws2/polly/Polly2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-polly/src/main/java/org/apache/camel/component/aws2/polly/Polly2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Polly2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-rekognition/src/main/java/org/apache/camel/component/aws2/rekognition/Rekognition2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-rekognition/src/main/java/org/apache/camel/component/aws2/rekognition/Rekognition2ProducerHealthCheck.java
index e625aeb30352..a18b05b89300 100644
---
a/components/camel-aws/camel-aws2-rekognition/src/main/java/org/apache/camel/component/aws2/rekognition/Rekognition2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-rekognition/src/main/java/org/apache/camel/component/aws2/rekognition/Rekognition2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Rekognition2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheck.java
index e1a7114b8522..e5aefc64e4ec 100644
---
a/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-step-functions/src/main/java/org/apache/camel/component/aws2/stepfunctions/StepFunctions2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class StepFunctions2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2ProducerHealthCheck.java
index 5dc04f71c0dc..3c5e56e52285 100644
---
a/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2ProducerHealthCheck.java
@@ -62,9 +62,10 @@ public class Textract2ProducerHealthCheck extends
AbstractHealthCheck {
// This will likely fail because "test" is not a valid document,
but it will validate credentials and connectivity
textractClient.detectDocumentText(testRequest);
} catch (AwsServiceException e) {
+ // awsErrorDetails() is nullable, so read the error code
defensively before using it below
+ String errorCode = e.awsErrorDetails() != null ?
e.awsErrorDetails().errorCode() : null;
// For health check, we consider certain errors as "healthy" since
they indicate the service is reachable
- if
("InvalidParameterException".equals(e.awsErrorDetails().errorCode()) ||
-
"UnsupportedDocumentException".equals(e.awsErrorDetails().errorCode())) {
+ if ("InvalidParameterException".equals(errorCode) ||
"UnsupportedDocumentException".equals(errorCode)) {
// These errors mean the service is reachable but our test
document is invalid - this is expected
builder.up();
return;
@@ -75,8 +76,8 @@ public class Textract2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
- builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
+ if (ObjectHelper.isNotEmpty(errorCode)) {
+ builder.detail(SERVICE_ERROR_CODE, errorCode);
}
builder.down();
return;
diff --git
a/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/query/Timestream2QueryProducerHealthCheck.java
b/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/query/Timestream2QueryProducerHealthCheck.java
index 4654180c7fcd..2c9ab44bff8b 100644
---
a/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/query/Timestream2QueryProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/query/Timestream2QueryProducerHealthCheck.java
@@ -56,7 +56,7 @@ public class Timestream2QueryProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/write/Timestream2WriteProducerHealthCheck.java
b/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/write/Timestream2WriteProducerHealthCheck.java
index d2abd6a04823..947a9d97951d 100644
---
a/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/write/Timestream2WriteProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-timestream/src/main/java/org/apache/camel/component/aws2/timestream/write/Timestream2WriteProducerHealthCheck.java
@@ -56,7 +56,7 @@ public class Timestream2WriteProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();
diff --git
a/components/camel-aws/camel-aws2-translate/src/main/java/org/apache/camel/component/aws2/translate/Translate2ProducerHealthCheck.java
b/components/camel-aws/camel-aws2-translate/src/main/java/org/apache/camel/component/aws2/translate/Translate2ProducerHealthCheck.java
index 431d6ef9045a..6c34f710e2e2 100644
---
a/components/camel-aws/camel-aws2-translate/src/main/java/org/apache/camel/component/aws2/translate/Translate2ProducerHealthCheck.java
+++
b/components/camel-aws/camel-aws2-translate/src/main/java/org/apache/camel/component/aws2/translate/Translate2ProducerHealthCheck.java
@@ -55,7 +55,7 @@ public class Translate2ProducerHealthCheck extends
AbstractHealthCheck {
if (ObjectHelper.isNotEmpty(e.statusCode())) {
builder.detail(SERVICE_STATUS_CODE, e.statusCode());
}
- if (ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
+ if (ObjectHelper.isNotEmpty(e.awsErrorDetails()) &&
ObjectHelper.isNotEmpty(e.awsErrorDetails().errorCode())) {
builder.detail(SERVICE_ERROR_CODE,
e.awsErrorDetails().errorCode());
}
builder.down();