Check if Application Nodes are Ready to Accept Traffic Using a Readiness Probe
You can configure readiness probes to make sure your application nodes are ready to accept network traffic. The readiness status of an application node determines if a load balancer should include or exclude the node when forwarding requests. For example, the Kubernetes Service does not load balance requests to a leader node that has an unready status.
You might want to use a readiness probe in the following scenarios:
- If you have slow-starting application nodes that require warm caches or must perform other tasks before serving network requests.
- If you want to mark certain application nodes as unready when they are overloaded with outstanding client requests.
Use the following Types to configure a readiness probe for your application:
Requirements
Have at least one of the following roles:
AppAdminrole to configure a readiness probe for your own applications.EnvAdminrole to configure a readiness probe for applications in your environment.ClusterAdminrole to configure a readiness probe for applications in your cluster.
Create an instance of the readiness probe
In the C3 AI Console for your application, create an instance of the App.Probe Type. Specify the following parameters:
Probe.READINESSas the probe name- The App instance of your application
Here is an example of how to create an instance of the readiness probe:
app = C3.app()
probe = App.Probe.make({ name: Probe.READINESS, app: app })Configure a readiness probe
Prepare a configuration for a readiness probe using the App.Probe.Config Type. Specify the following code:
- The probe action to check if the application node is ready to accept requests
Probe.READINESSas the configuration name- How often you want to run the probe action on each of the application nodes
- The timeout period in seconds for the probe action
If the probe does not complete the readiness check within the timeout limit, the readiness status is not ready.
Here is an example configuration for the readiness probe:
JavaScriptprobeAction = PartiallyAppliedAction.make({ typeName: "Echo", actionName: "echoAnyJava", args: { "msg": true }}); probeConfig = App.Probe.Config.make({ name: Probe.READINESS, action: probeAction, periodSeconds: 10, timeout: { interruptInSec: 5 }});Call the
App.Probe#configureAPI to configure the readiness probe, and theApp.Probe#syncAllAPI to broadcast the change to all nodes in the application:JavaScriptprobe.configure(probeConfig) probe.syncAll()
Check if an application node is ready
Call the Server#isReady API to check if an application node is ready to accept requests:
myAppNode = C3.app().nodes(true)[0]
myAppNode.call("Server", "isReady")If the response is true, then the application node is ready to accept requests. If your nodes have a load balancer, the load balancer includes the ready node when sending requests.
If the response is false, then the application node is not ready to accept requests. If your nodes have a load balancer, the load balancer excludes the unready node when sending requests.
Remove the readiness probe
To remove the readiness probe for your application, complete the following steps:
Call the App.Probe#remove API to remove the readiness probe, and the App.Probe#syncAll API to broadcast the change to all nodes in the application:
probe.remove()
probe.syncAll()Seed a readiness probe configuration
If you are developing a root package, you can seed a readiness probe configuration so that your app users do not need to configure it themselves.
Create a file called readiness.json to seed the App.Probe Type at the path config/App.Probe.Config/.
Here is an example readiness.json file:
{
"name": "readiness",
"action": {
"typeName": "Echo",
"actionName": "echoAnyJava",
"args": {
"msg": {
"value": true
}
}
},
"timeout": {
"interruptInSec": 5.0
},
"periodSeconds": 10
}Users with the AppAdmin role can override the seeded readiness probe by following the configuration steps at "Configure a readiness probe" in this topic.