Skip to content

Commit 97fbdaf

Browse files
committed
CAMEL-19648: readiness/liveness probes
1 parent 9c5f25c commit 97fbdaf

File tree

5 files changed

+146
-0
lines changed

5 files changed

+146
-0
lines changed

core/camel-spring-boot/src/main/docs/spring-boot.adoc

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,3 +416,24 @@ implementing your custom https://docs.spring.io/spring-boot/docs/current/referen
416416
or by providing GraalVM JSON hint files that can be generated by the https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html#native-image.advanced.using-the-tracing-agent[Tracing Agent].
417417

418418
For more details about `GraalVM Native Image Support` in Spring Boot please refer to https://docs.spring.io/spring-boot/docs/current/reference/html/native-image.html
419+
420+
== Camel Readiness and Liveness State Indicators
421+
422+
Camel specific Readiness and Liveness checks can be added to a Spring Boot 3 application including respectively in the
423+
readiness and livenss groups camelLivenessStateHealthIndicator and camelReadinessStateHealthIndicator. In particular:
424+
425+
[source,properties]
426+
----
427+
management.endpoint.health.group.liveness.include=livenessState,camelLivenessState
428+
management.endpoint.health.group.readiness.include=readinessState,camelReadinessState
429+
----
430+
431+
Using camel specific readiness and liveness health indicators, the probes will be augmented with camel components
432+
health checks that support this feature. In enable the probes locally, they need to be enabled
433+
434+
[source,properties]
435+
----
436+
management.endpoint.health.probes.enabled=true
437+
----
438+
439+
Finally, http://localhost:8080/actuator/health/liveness will show the updated probe.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.apache.camel.spring.boot.actuate.health;
2+
3+
import org.apache.camel.CamelContext;
4+
import org.apache.camel.spring.boot.CamelAutoConfiguration;
5+
import org.apache.camel.spring.boot.actuate.health.liveness.CamelLivenessStateHealthIndicator;
6+
import org.apache.camel.spring.boot.actuate.health.readiness.CamelReadinessStateHealthIndicator;
7+
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
8+
import org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration;
9+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
10+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
11+
import org.springframework.boot.availability.ApplicationAvailability;
12+
import org.springframework.context.annotation.Bean;
13+
import org.springframework.context.annotation.Configuration;
14+
15+
@Configuration(proxyBeanMethods = false)
16+
@AutoConfigureAfter({CamelAutoConfiguration.class, ApplicationAvailabilityAutoConfiguration.class})
17+
@ConditionalOnBean(CamelAutoConfiguration.class)
18+
public class CamelAvailabilityCheckAutoConfiguration {
19+
20+
@Bean
21+
@ConditionalOnMissingBean(CamelLivenessStateHealthIndicator.class)
22+
public CamelLivenessStateHealthIndicator camelLivenessStateHealthIndicator(ApplicationAvailability applicationAvailability,
23+
CamelContext camelContext) {
24+
return new CamelLivenessStateHealthIndicator(applicationAvailability, camelContext);
25+
}
26+
27+
@Bean
28+
@ConditionalOnMissingBean({CamelReadinessStateHealthIndicator.class})
29+
public CamelReadinessStateHealthIndicator camelReadinessStateHealthIndicator(
30+
ApplicationAvailability applicationAvailability,
31+
CamelContext camelContext) {
32+
return new CamelReadinessStateHealthIndicator(applicationAvailability, camelContext);
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.apache.camel.spring.boot.actuate.health.liveness;
2+
3+
import org.apache.camel.CamelContext;
4+
import org.apache.camel.health.HealthCheck;
5+
import org.apache.camel.health.HealthCheckHelper;
6+
import org.apache.camel.spring.boot.actuate.health.readiness.CamelReadinessStateHealthIndicator;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
import org.springframework.boot.actuate.availability.LivenessStateHealthIndicator;
10+
import org.springframework.boot.availability.ApplicationAvailability;
11+
import org.springframework.boot.availability.AvailabilityState;
12+
import org.springframework.boot.availability.LivenessState;
13+
14+
import java.util.Collection;
15+
16+
public class CamelLivenessStateHealthIndicator extends LivenessStateHealthIndicator {
17+
18+
private static final Logger LOG = LoggerFactory.getLogger(CamelLivenessStateHealthIndicator.class);
19+
20+
private CamelContext camelContext;
21+
22+
public CamelLivenessStateHealthIndicator(
23+
ApplicationAvailability availability,
24+
CamelContext camelContext) {
25+
super(availability);
26+
27+
this.camelContext = camelContext;
28+
}
29+
30+
@Override
31+
protected AvailabilityState getState(ApplicationAvailability applicationAvailability) {
32+
Collection<HealthCheck.Result> results = HealthCheckHelper.invokeLiveness(camelContext);
33+
34+
boolean isLive = CamelReadinessStateHealthIndicator.checkState(results, LOG);
35+
36+
return isLive ?
37+
LivenessState.CORRECT : LivenessState.BROKEN;
38+
}
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.apache.camel.spring.boot.actuate.health.readiness;
2+
3+
import org.apache.camel.CamelContext;
4+
import org.apache.camel.health.HealthCheck;
5+
import org.apache.camel.health.HealthCheckHelper;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.springframework.boot.actuate.availability.ReadinessStateHealthIndicator;
9+
import org.springframework.boot.availability.ApplicationAvailability;
10+
import org.springframework.boot.availability.AvailabilityState;
11+
import org.springframework.boot.availability.ReadinessState;
12+
13+
import java.util.Collection;
14+
15+
public class CamelReadinessStateHealthIndicator extends ReadinessStateHealthIndicator {
16+
17+
private static final Logger LOG = LoggerFactory.getLogger(CamelReadinessStateHealthIndicator.class);
18+
19+
private CamelContext camelContext;
20+
21+
public CamelReadinessStateHealthIndicator(
22+
ApplicationAvailability availability,
23+
CamelContext camelContext) {
24+
super(availability);
25+
26+
this.camelContext = camelContext;
27+
}
28+
29+
@Override
30+
protected AvailabilityState getState(ApplicationAvailability applicationAvailability) {
31+
Collection<HealthCheck.Result> results = HealthCheckHelper.invokeReadiness(camelContext);
32+
33+
boolean isReady = checkState(results, LOG);
34+
35+
return isReady ?
36+
ReadinessState.ACCEPTING_TRAFFIC : ReadinessState.REFUSING_TRAFFIC;
37+
}
38+
39+
public static boolean checkState(Collection<HealthCheck.Result> results, Logger log) {
40+
boolean isUp = true;
41+
for (HealthCheck.Result result : results) {
42+
if (!HealthCheck.State.UP.equals(result.getState())) {
43+
isUp = false;
44+
45+
result.getError().ifPresent(error -> log.warn(result.getCheck().getId(), error));
46+
}
47+
}
48+
49+
return isUp;
50+
}
51+
}

core/camel-spring-boot/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ org.apache.camel.spring.boot.actuate.console.CamelDevConsoleAutoConfiguration
2020
org.apache.camel.spring.boot.actuate.endpoint.CamelRouteControllerEndpointAutoConfiguration
2121
org.apache.camel.spring.boot.actuate.endpoint.CamelRoutesEndpointAutoConfiguration
2222
org.apache.camel.spring.boot.actuate.health.CamelHealthCheckAutoConfiguration
23+
org.apache.camel.spring.boot.actuate.health.CamelAvailabilityCheckAutoConfiguration
2324
org.apache.camel.spring.boot.actuate.info.CamelInfoAutoConfiguration
2425
org.apache.camel.spring.boot.cloud.CamelCloudAutoConfiguration
2526
org.apache.camel.spring.boot.cloud.CamelCloudServiceCallConfigurationAutoConfiguration

0 commit comments

Comments
 (0)