This is an automated email from the ASF dual-hosted git repository.
remm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/master by this push:
new 2ff7bba Improve the quality of the health check
2ff7bba is described below
commit 2ff7bba79946a3716b136b0752c9fe7126b50499
Author: remm <[email protected]>
AuthorDate: Fri Sep 11 13:26:44 2020 +0200
Improve the quality of the health check
The valve will check if its associated container and all its children
are available. Will return down if any is not available.
---
.../apache/catalina/valves/HealthCheckValve.java | 43 +++++++++++++++++++++-
webapps/docs/changelog.xml | 8 ++++
webapps/docs/config/valve.xml | 15 +++++---
3 files changed, 60 insertions(+), 6 deletions(-)
diff --git a/java/org/apache/catalina/valves/HealthCheckValve.java
b/java/org/apache/catalina/valves/HealthCheckValve.java
index be9c487..c111b3b 100644
--- a/java/org/apache/catalina/valves/HealthCheckValve.java
+++ b/java/org/apache/catalina/valves/HealthCheckValve.java
@@ -19,11 +19,14 @@ package org.apache.catalina.valves;
import java.io.IOException;
import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.catalina.Container;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
+import org.apache.catalina.util.LifecycleBase;
import org.apache.tomcat.util.buf.MessageBytes;
@@ -38,6 +41,12 @@ public class HealthCheckValve extends ValveBase {
" \"checks\": []\n" +
"}";
+ private static final String DOWN =
+ "{\n" +
+ " \"status\": \"DOWN\",\n" +
+ " \"checks\": []\n" +
+ "}";
+
private String path = "/health";
/**
@@ -45,6 +54,11 @@ public class HealthCheckValve extends ValveBase {
*/
protected boolean context = false;
+ /**
+ * Check if all child containers are available.
+ */
+ protected boolean checkContainersAvailable = true;
+
public HealthCheckValve() {
super(true);
}
@@ -57,6 +71,14 @@ public class HealthCheckValve extends ValveBase {
this.path = path;
}
+ public boolean getCheckContainersAvailable() {
+ return this.checkContainersAvailable;
+ }
+
+ public void setCheckContainersAvailable(boolean checkContainersAvailable) {
+ this.checkContainersAvailable = checkContainersAvailable;
+ }
+
@Override
protected synchronized void startInternal() throws LifecycleException {
super.startInternal();
@@ -74,9 +96,28 @@ public class HealthCheckValve extends ValveBase {
context ? request.getRequestPathMB() :
request.getDecodedRequestURIMB();
if (urlMB.equals(path)) {
response.setContentType("application/json");
- response.getOutputStream().print(UP);
+ if (isAvailable(getContainer())) {
+ response.getOutputStream().print(UP);
+ } else {
+ response.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+ response.getOutputStream().print(DOWN);
+ }
} else {
getNext().invoke(request, response);
}
}
+
+ protected boolean isAvailable(Container container) {
+ for (Container child : container.findChildren()) {
+ if (!isAvailable(child)) {
+ return false;
+ }
+ }
+ if (container instanceof LifecycleBase) {
+ return ((LifecycleBase) container).getState().isAvailable();
+ } else {
+ return true;
+ }
+ }
+
}
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 737bf79..d8695c1 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -45,6 +45,14 @@
issues do not "pop up" wrt. others).
-->
<section name="Tomcat 10.0.0-M9 (markt)" rtext="in development">
+ <subsection name="Catalina">
+ <changelog>
+ <update>
+ The health check valve will now check the state of its associated
+ containers to report availability. (remm)
+ </update>
+ </changelog>
+ </subsection>
</section>
<section name="Tomcat 10.0.0-M8 (markt)" rtext="release in progress">
<subsection name="Catalina">
diff --git a/webapps/docs/config/valve.xml b/webapps/docs/config/valve.xml
index 557ee32..3111fce 100644
--- a/webapps/docs/config/valve.xml
+++ b/webapps/docs/config/valve.xml
@@ -2236,10 +2236,7 @@
<subsection name="Introduction">
<p>The <strong>Health Check Valve</strong> responds to
- cloud orchestrators health checks. Note that it checks
- that a context is mapped (so that an application is deployed),
- for example if you don't have a ROOT context but demo-1.0
- you have to check for <code>/demo-1.0/health</code></p>
+ cloud orchestrators health checks.</p>
</subsection>
<subsection name="Attributes">
@@ -2255,10 +2252,18 @@
</attribute>
<attribute name="path" required="false">
- <p>Path by the cloud orchestrators health check logic.
+ <p>Path by the cloud orchestrators health check logic. If the valve
+ is associated with a context, then this will be relative to the context
+ path. Otherwise, the valve will match the full URI.
The default value is <strong>/health</strong>.</p>
</attribute>
+ <attribute name="checkContainersAvailable" required="false">
+ <p>If <code>true</code> the valve will check if its associated
+ container and all its children are available.
+ The default value is <strong>true</strong>.</p>
+ </attribute>
+
</attributes>
</subsection>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]