Closed shivrajjadhav733 closed 4 years ago
Liveness and Readiness support is a new feature in Spring Boot 2.3, see https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#liveness-and-readiness-probes This is not supported in Spring Boot 2.2.x.
Thanks!
@bclozel About springboot 2.3.0 : Will it automatically add two endpoints? Does it mean we don't need to add those endpoints in application.yaml as management:endpoint:health:group ? Does it mean we don't need to configure that in kubernetes deployment.yaml under container specs if we want to deploy springboot app to kubernetes cluster?
@shivrajjadhav733 You can read about the new features in the reference docs:
We prefer to use the issue tracker just for bugs, if you have any further questions please ask on gitter.im or stackoverflow.com.
@bclozel @philwebb Well, I did below things. I upgraded springboot version from 2.1 to 2.3. With that I started seeing default endpoints like /actuator/health/readiness and /actuator/health/liveness I see both are those are UP.
I wanted to add these two restrictions to my application:
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-components: always
group:
readiness:
include:
- db
liveness:
exclude:
- db
With this change, when I deploy to kubernetes, I can see readiness endpoint shows: /actuator/health/readiness
{
"status": "UP",
"components": {
"db": {
"status": "UP",
"components": {
"readDataSource": {
"status": "UP"
},
"writeDataSource": {
"status": "UP"
}
}
}
}
}
but for liveness endpoing: /actuator/health/liveness
I get error like 404 not found.
is it something I am making error in application.yaml
You've defined a liveness group that contains no elements. You either need to include the specific indicators you want (or use "*") or remove it entirely and let the auto-configured "liveness" group get created.
@philwebb That's what I did with liveness. I just excluded db.
Do I have to do something like
group:
readiness:
include:
- db
liveness:
include: '*'
exclude:
- db
All I am looking for is
I don't want to touch any other default stuff readiness or liveness is doing.
I think that should do what you want. You need the include: '*'
. I've raise #22053 to see if we can't improve that in the future.
@philwebb Please correct me if I am wrong.
When I exclusively want to include everything along with something specific then I use something like:
management:
endpoint:
health:
group:
rediness:
include:
- db
or should that be:
management:
endpoint:
health:
group:
rediness:
include: '*'
- db
But when I want to exclusively exclude something then I should do
management:
endpoint:
health:
group:
liveness:
include: '*'
exclude:
- db
The "include" property can contain a list of elements or "*" to include them all. The "exclude" property can be used to exclude items that would otherwise be included.
So in your case, if you want readiness to have only "db" and liveness to have everything except "db" you should write:
group:
readiness:
include: "db"
liveness:
include: "*"
exclude: "db"
@philwebb Thank you. This below config worked for me
group:
readiness:
include:
- db
liveness:
include: '*'
exclude:
- db
@philwebb I was looking at one more additional scenario:
Lets say health end point is /actuator/health and liveness end point is /actuator/health/liveness
Can these scenrio be handled thru application.yaml config OR these are specific for deployment.yaml
@shivrajjadhav733 I'm sorry but your last comment doesn't really make sense. Did you check the links Phil provided here?
/actuator/health
will provide the health information for all indicators. /actuator/health/liveness
and /actuator/health/readiness
will provide the health information for the liveness and readiness health groups. Now it's up to you to configure those groups to select the indicators which should contribute to the health group status.
As mentioned in our docs, liveness is about whether the internal state of the application is broken or not. If it is broken, this means that the application cannot be fixed automatically and that a full restart of this instance is required. Typically, this happens when an internal state (i.e. not an external service) is broken and cannot be recovered.
the readiness is about whether you'd like to route traffic to your application. Again, it's up to you to decide what qualifies as health indicators for this. An application that is "unready" doesn't necessarily it's unhealthy - it might just be busy handling a lot of requests or tasks.
So your Spring Boot application configuration should reflect how you'd like to express liveness and readiness concepts for this application (including using the application.yml config properties). The deployment.yml is a k8s concept and this is more about how you'd like your infrastructure to check/react to the state of the application.
For further questions about the docs and features in general, feel free to use StackOverflow as it's a better format for Q&A. Thanks!
What I have:
Windows 10 Springboot 2.2.1 docker desktop installed - docker and kubernetes running openjdk 11
application.yaml in my springboot application
On my local when I start springboot application: To access health, I go to page - http://localhost:8443/api/actuator/health This works fine.
But, when I try to access https://localhost:8443/api/actuator/health/readiness or http://localhost:8443/api/actuator/health/liveness I get error
This localhost page can’t be found. No webpage was found for the web address: http://localhost:8443/api/actuator/health/readiness HTTP ERROR 404
Question - Is this an expected behaviour? readiness or liveness probe can not be tested with just springboot without deploying springboot application to kubernetes?