This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch hc-producer in repository https://gitbox.apache.org/repos/asf/camel.git
commit fd0bd08f0d0cbe4638c6603104122b113676336e Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Jul 28 09:58:08 2023 +0200 CAMEL-19645: camel-aws - producer health check --- .../EventbridgeComponentConfigurer.java | 18 +++++++++++++ .../aws2/eventbridge/aws2-eventbridge.json | 7 +++-- .../aws2/eventbridge/EventbridgeComponent.java | 5 ++-- .../aws2/eventbridge/EventbridgeEndpoint.java | 24 ++++------------- .../aws2/eventbridge/EventbridgeProducer.java | 31 ++++++++++++++++++++++ ...ck.java => EventbridgeProducerHealthCheck.java} | 6 ++--- ...bridgeProducerHealthCheckProfileCredsTest.java} | 13 ++------- ...tbridgeProducerHealthCheckStaticCredsTest.java} | 12 ++------- 8 files changed, 69 insertions(+), 47 deletions(-) diff --git a/components/camel-aws/camel-aws2-eventbridge/src/generated/java/org/apache/camel/component/aws2/eventbridge/EventbridgeComponentConfigurer.java b/components/camel-aws/camel-aws2-eventbridge/src/generated/java/org/apache/camel/component/aws2/eventbridge/EventbridgeComponentConfigurer.java index b7a8c3f7fad..0e386323ee4 100644 --- a/components/camel-aws/camel-aws2-eventbridge/src/generated/java/org/apache/camel/component/aws2/eventbridge/EventbridgeComponentConfigurer.java +++ b/components/camel-aws/camel-aws2-eventbridge/src/generated/java/org/apache/camel/component/aws2/eventbridge/EventbridgeComponentConfigurer.java @@ -37,6 +37,12 @@ public class EventbridgeComponentConfigurer extends PropertyConfigurerSupport im case "eventPatternFile": getOrCreateConfiguration(target).setEventPatternFile(property(camelContext, java.lang.String.class, value)); return true; case "eventbridgeclient": case "eventbridgeClient": getOrCreateConfiguration(target).setEventbridgeClient(property(camelContext, software.amazon.awssdk.services.eventbridge.EventBridgeClient.class, value)); return true; + case "healthcheckconsumerenabled": + case "healthCheckConsumerEnabled": target.setHealthCheckConsumerEnabled(property(camelContext, boolean.class, value)); return true; + case "healthcheckenabled": + case "healthCheckEnabled": target.setHealthCheckEnabled(property(camelContext, boolean.class, value)); return true; + case "healthcheckproducerenabled": + case "healthCheckProducerEnabled": target.setHealthCheckProducerEnabled(property(camelContext, boolean.class, value)); return true; case "lazystartproducer": case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true; case "operation": getOrCreateConfiguration(target).setOperation(property(camelContext, org.apache.camel.component.aws2.eventbridge.EventbridgeOperations.class, value)); return true; @@ -84,6 +90,12 @@ public class EventbridgeComponentConfigurer extends PropertyConfigurerSupport im case "eventPatternFile": return java.lang.String.class; case "eventbridgeclient": case "eventbridgeClient": return software.amazon.awssdk.services.eventbridge.EventBridgeClient.class; + case "healthcheckconsumerenabled": + case "healthCheckConsumerEnabled": return boolean.class; + case "healthcheckenabled": + case "healthCheckEnabled": return boolean.class; + case "healthcheckproducerenabled": + case "healthCheckProducerEnabled": return boolean.class; case "lazystartproducer": case "lazyStartProducer": return boolean.class; case "operation": return org.apache.camel.component.aws2.eventbridge.EventbridgeOperations.class; @@ -127,6 +139,12 @@ public class EventbridgeComponentConfigurer extends PropertyConfigurerSupport im case "eventPatternFile": return getOrCreateConfiguration(target).getEventPatternFile(); case "eventbridgeclient": case "eventbridgeClient": return getOrCreateConfiguration(target).getEventbridgeClient(); + case "healthcheckconsumerenabled": + case "healthCheckConsumerEnabled": return target.isHealthCheckConsumerEnabled(); + case "healthcheckenabled": + case "healthCheckEnabled": return target.isHealthCheckEnabled(); + case "healthcheckproducerenabled": + case "healthCheckProducerEnabled": return target.isHealthCheckProducerEnabled(); case "lazystartproducer": case "lazyStartProducer": return target.isLazyStartProducer(); case "operation": return getOrCreateConfiguration(target).getOperation(); diff --git a/components/camel-aws/camel-aws2-eventbridge/src/generated/resources/org/apache/camel/component/aws2/eventbridge/aws2-eventbridge.json b/components/camel-aws/camel-aws2-eventbridge/src/generated/resources/org/apache/camel/component/aws2/eventbridge/aws2-eventbridge.json index 16dc8a82822..d2aecb2457b 100644 --- a/components/camel-aws/camel-aws2-eventbridge/src/generated/resources/org/apache/camel/component/aws2/eventbridge/aws2-eventbridge.json +++ b/components/camel-aws/camel-aws2-eventbridge/src/generated/resources/org/apache/camel/component/aws2/eventbridge/aws2-eventbridge.json @@ -39,8 +39,11 @@ "useDefaultCredentialsProvider": { "index": 14, "kind": "property", "displayName": "Use Default Credentials Provider", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.eventbridge.EventbridgeConfiguration", "configurationField": "configuration", "description": "Set whether the Eventbridge client should ex [...] "useProfileCredentialsProvider": { "index": 15, "kind": "property", "displayName": "Use Profile Credentials Provider", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.aws2.eventbridge.EventbridgeConfiguration", "configurationField": "configuration", "description": "Set whether the Eventbridge client should ex [...] "autowiredEnabled": { "index": 16, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching [...] - "accessKey": { "index": 17, "kind": "property", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.eventbridge.EventbridgeConfiguration", "configurationField": "configuration", "description": "Amazon AWS Access Key" }, - "secretKey": { "index": 18, "kind": "property", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.eventbridge.EventbridgeConfiguration", "configurationField": "configuration", "description": "Amazon AWS Secret Key" } + "healthCheckConsumerEnabled": { "index": 17, "kind": "property", "displayName": "Health Check Consumer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all consumer based health checks from this component" }, + "healthCheckEnabled": { "index": 18, "kind": "property", "displayName": "Health Check Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all health checks from this component" }, + "healthCheckProducerEnabled": { "index": 19, "kind": "property", "displayName": "Health Check Producer Enabled", "group": "health", "label": "health", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Used for enabling or disabling all producer based health checks from this component" }, + "accessKey": { "index": 20, "kind": "property", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.eventbridge.EventbridgeConfiguration", "configurationField": "configuration", "description": "Amazon AWS Access Key" }, + "secretKey": { "index": 21, "kind": "property", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.eventbridge.EventbridgeConfiguration", "configurationField": "configuration", "description": "Amazon AWS Secret Key" } }, "headers": { "CamelAwsEventbridgeOperation": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation we want to perform", "constantName": "org.apache.camel.component.aws2.eventbridge.EventbridgeConstants#OPERATION" }, diff --git a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeComponent.java b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeComponent.java index d06d1ffcc59..af08ad47cc2 100644 --- a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeComponent.java +++ b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeComponent.java @@ -22,13 +22,14 @@ import org.apache.camel.CamelContext; import org.apache.camel.Endpoint; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.annotations.Component; -import org.apache.camel.support.DefaultComponent; +import org.apache.camel.support.HealthCheckComponent; /** * For working with Amazon Eventbridge SDK v2. */ @Component("aws2-eventbridge") -public class EventbridgeComponent extends DefaultComponent { +public class EventbridgeComponent extends HealthCheckComponent { + @Metadata private EventbridgeConfiguration configuration = new EventbridgeConfiguration(); diff --git a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeEndpoint.java b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeEndpoint.java index f1557c53149..3793b6238ce 100644 --- a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeEndpoint.java +++ b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeEndpoint.java @@ -22,8 +22,6 @@ import org.apache.camel.Consumer; import org.apache.camel.Processor; import org.apache.camel.Producer; import org.apache.camel.component.aws2.eventbridge.client.EventbridgeClientFactory; -import org.apache.camel.health.HealthCheckHelper; -import org.apache.camel.impl.health.ComponentsHealthCheckRepository; import org.apache.camel.spi.Metadata; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; @@ -44,9 +42,6 @@ public class EventbridgeEndpoint extends DefaultEndpoint { private EventBridgeClient eventbridgeClient; - private ComponentsHealthCheckRepository healthCheckRepository; - private EventbridgeClientHealthCheck clientHealthCheck; - @UriPath(description = "Event bus name or ARN") @Metadata(required = true) private String eventbusNameOrArn; // to support component docs @@ -58,6 +53,11 @@ public class EventbridgeEndpoint extends DefaultEndpoint { this.configuration = configuration; } + @Override + public EventbridgeComponent getComponent() { + return (EventbridgeComponent) super.getComponent(); + } + @Override public Consumer createConsumer(Processor processor) throws Exception { throw new UnsupportedOperationException("You cannot receive messages from this endpoint"); @@ -75,24 +75,10 @@ public class EventbridgeEndpoint extends DefaultEndpoint { eventbridgeClient = configuration.getEventbridgeClient() != null ? configuration.getEventbridgeClient() : EventbridgeClientFactory.getEventbridgeClient(configuration).getEventbridgeClient(); - - healthCheckRepository = HealthCheckHelper.getHealthCheckRepository(getCamelContext(), - ComponentsHealthCheckRepository.REPOSITORY_ID, ComponentsHealthCheckRepository.class); - - if (healthCheckRepository != null) { - // Do not register the health check until we resolve CAMEL-18992 - // clientHealthCheck = new EventbridgeClientHealthCheck(this, getId()); - // healthCheckRepository.addHealthCheck(clientHealthCheck); - } } @Override public void doStop() throws Exception { - if (healthCheckRepository != null && clientHealthCheck != null) { - healthCheckRepository.removeHealthCheck(clientHealthCheck); - clientHealthCheck = null; - } - if (ObjectHelper.isEmpty(configuration.getEventbridgeClient())) { if (eventbridgeClient != null) { eventbridgeClient.close(); diff --git a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducer.java b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducer.java index 519ebf45868..8e4d7828c41 100644 --- a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducer.java +++ b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducer.java @@ -26,6 +26,9 @@ import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.InvalidPayloadException; import org.apache.camel.Message; +import org.apache.camel.health.HealthCheck; +import org.apache.camel.health.HealthCheckHelper; +import org.apache.camel.health.WritableHealthCheckRepository; import org.apache.camel.support.DefaultProducer; import org.apache.camel.support.ResourceHelper; import org.apache.camel.util.ObjectHelper; @@ -69,6 +72,8 @@ public class EventbridgeProducer extends DefaultProducer { private static final Logger LOG = LoggerFactory.getLogger(EventbridgeProducer.class); private transient String eventbridgeProducerToString; + private HealthCheck producerHealthCheck; + private WritableHealthCheckRepository healthCheckRepository; public EventbridgeProducer(Endpoint endpoint) { super(endpoint); @@ -548,4 +553,30 @@ public class EventbridgeProducer extends DefaultProducer { public static Message getMessageForResponse(final Exchange exchange) { return exchange.getMessage(); } + + @Override + protected void doStart() throws Exception { + // health-check is optional so discover and resolve + healthCheckRepository = HealthCheckHelper.getHealthCheckRepository( + getEndpoint().getCamelContext(), + "components", + WritableHealthCheckRepository.class); + + if (healthCheckRepository != null) { + String id = getEndpoint().getId(); + producerHealthCheck = new EventbridgeProducerHealthCheck(getEndpoint(), id); + producerHealthCheck.setEnabled(getEndpoint().getComponent().isHealthCheckEnabled() + && getEndpoint().getComponent().isHealthCheckProducerEnabled()); + healthCheckRepository.addHealthCheck(producerHealthCheck); + } + } + + @Override + protected void doStop() throws Exception { + if (healthCheckRepository != null && producerHealthCheck != null) { + healthCheckRepository.removeHealthCheck(producerHealthCheck); + producerHealthCheck = null; + } + } + } diff --git a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeClientHealthCheck.java b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheck.java similarity index 92% rename from components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeClientHealthCheck.java rename to components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheck.java index d60d04d7901..bc4af16a873 100644 --- a/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeClientHealthCheck.java +++ b/components/camel-aws/camel-aws2-eventbridge/src/main/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheck.java @@ -27,12 +27,12 @@ import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.eventbridge.EventBridgeClient; import software.amazon.awssdk.services.eventbridge.model.ListEventBusesRequest; -public class EventbridgeClientHealthCheck extends AbstractHealthCheck { +public class EventbridgeProducerHealthCheck extends AbstractHealthCheck { private final EventbridgeEndpoint eventbridgeEndpoint; - public EventbridgeClientHealthCheck(EventbridgeEndpoint eventbridgeEndpoint, String clientId) { - super("camel", "aws2-eventbridge-client-" + clientId); + public EventbridgeProducerHealthCheck(EventbridgeEndpoint eventbridgeEndpoint, String clientId) { + super("camel", "aws2-eventbridge-producer-" + clientId); this.eventbridgeEndpoint = eventbridgeEndpoint; } diff --git a/components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeClientHealthCheckProfileCredsTest.java b/components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheckProfileCredsTest.java similarity index 86% rename from components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeClientHealthCheckProfileCredsTest.java rename to components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheckProfileCredsTest.java index 9c74813ec65..6ef04ea30a4 100644 --- a/components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeClientHealthCheckProfileCredsTest.java +++ b/components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheckProfileCredsTest.java @@ -28,16 +28,11 @@ import org.apache.camel.health.HealthCheckRegistry; import org.apache.camel.impl.health.DefaultHealthCheckRegistry; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import static org.testcontainers.shaded.org.awaitility.Awaitility.await; -public class EventbridgeClientHealthCheckProfileCredsTest extends CamelTestSupport { - - private static final Logger LOG = LoggerFactory.getLogger(EventbridgeClientHealthCheckProfileCredsTest.class); +public class EventbridgeProducerHealthCheckProfileCredsTest extends CamelTestSupport { CamelContext context; @@ -73,9 +68,7 @@ public class EventbridgeClientHealthCheckProfileCredsTest extends CamelTestSuppo } @Test - @Disabled("Do not register the Producer Health Check until we solve CAMEL-18992") public void testConnectivity() { - Collection<HealthCheck.Result> res = HealthCheckHelper.invokeLiveness(context); boolean up = res.stream().allMatch(r -> r.getState().equals(HealthCheck.State.UP)); Assertions.assertTrue(up, "liveness check"); @@ -85,9 +78,7 @@ public class EventbridgeClientHealthCheckProfileCredsTest extends CamelTestSuppo Collection<HealthCheck.Result> res2 = HealthCheckHelper.invokeReadiness(context); boolean down = res2.stream().allMatch(r -> r.getState().equals(HealthCheck.State.DOWN)); boolean containsAwsEventbridgeHealthCheck = res2.stream() - .filter(result -> result.getCheck().getId().startsWith("aws2-eventbridge-client")) - .findAny() - .isPresent(); + .anyMatch(result -> result.getCheck().getId().startsWith("aws2-eventbridge-producer")); boolean hasRegionMessage = res2.stream() .anyMatch(r -> r.getMessage().stream().anyMatch(msg -> msg.contains("region"))); Assertions.assertTrue(down, "liveness check"); diff --git a/components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeClientHealthCheckStaticCredsTest.java b/components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheckStaticCredsTest.java similarity index 86% rename from components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeClientHealthCheckStaticCredsTest.java rename to components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheckStaticCredsTest.java index 8c3f43ac686..7e719e02f90 100644 --- a/components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeClientHealthCheckStaticCredsTest.java +++ b/components/camel-aws/camel-aws2-eventbridge/src/test/java/org/apache/camel/component/aws2/eventbridge/EventbridgeProducerHealthCheckStaticCredsTest.java @@ -28,16 +28,11 @@ import org.apache.camel.health.HealthCheckRegistry; import org.apache.camel.impl.health.DefaultHealthCheckRegistry; import org.apache.camel.test.junit5.CamelTestSupport; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import static org.testcontainers.shaded.org.awaitility.Awaitility.await; -public class EventbridgeClientHealthCheckStaticCredsTest extends CamelTestSupport { - - private static final Logger LOG = LoggerFactory.getLogger(EventbridgeClientHealthCheckStaticCredsTest.class); +public class EventbridgeProducerHealthCheckStaticCredsTest extends CamelTestSupport { CamelContext context; @@ -73,7 +68,6 @@ public class EventbridgeClientHealthCheckStaticCredsTest extends CamelTestSuppor } @Test - @Disabled("Do not register the Producer Health Check until we solve CAMEL-18992") public void testConnectivity() { Collection<HealthCheck.Result> res = HealthCheckHelper.invokeLiveness(context); @@ -85,9 +79,7 @@ public class EventbridgeClientHealthCheckStaticCredsTest extends CamelTestSuppor Collection<HealthCheck.Result> res2 = HealthCheckHelper.invokeReadiness(context); boolean down = res2.stream().allMatch(r -> r.getState().equals(HealthCheck.State.DOWN)); boolean containsAwsEventbridgeHealthCheck = res2.stream() - .filter(result -> result.getCheck().getId().startsWith("aws2-eventbridge-client")) - .findAny() - .isPresent(); + .anyMatch(result -> result.getCheck().getId().startsWith("aws2-eventbridge-producer")); boolean hasRegionMessage = res2.stream() .anyMatch(r -> r.getMessage().stream().anyMatch(msg -> msg.contains("region"))); Assertions.assertTrue(down, "liveness check");