xref: /aosp_15_r20/external/grpc-grpc/doc/health-checking.md (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard WorkerGRPC Health Checking Protocol
2*cc02d7e2SAndroid Build Coastguard Worker================================
3*cc02d7e2SAndroid Build Coastguard Worker
4*cc02d7e2SAndroid Build Coastguard WorkerHealth checks are used to probe whether the server is able to handle rpcs. The
5*cc02d7e2SAndroid Build Coastguard Workerclient-to-server health checking can happen from point to point or via some
6*cc02d7e2SAndroid Build Coastguard Workercontrol system. A server may choose to reply “unhealthy” because it
7*cc02d7e2SAndroid Build Coastguard Workeris not ready to take requests, it is shutting down or some other reason.
8*cc02d7e2SAndroid Build Coastguard WorkerThe client can act accordingly if the response is not received within some time
9*cc02d7e2SAndroid Build Coastguard Workerwindow or the response says unhealthy in it.
10*cc02d7e2SAndroid Build Coastguard Worker
11*cc02d7e2SAndroid Build Coastguard Worker
12*cc02d7e2SAndroid Build Coastguard WorkerA GRPC service is used as the health checking mechanism for both simple
13*cc02d7e2SAndroid Build Coastguard Workerclient-to-server scenario and other control systems such as load-balancing.
14*cc02d7e2SAndroid Build Coastguard WorkerBeing a high
15*cc02d7e2SAndroid Build Coastguard Workerlevel service provides some benefits. Firstly, since it is a GRPC service
16*cc02d7e2SAndroid Build Coastguard Workeritself, doing a health check is in the same format as a normal rpc. Secondly,
17*cc02d7e2SAndroid Build Coastguard Workerit has rich semantics such as per-service health status. Thirdly, as a GRPC
18*cc02d7e2SAndroid Build Coastguard Workerservice, it is able reuse all the existing billing, quota infrastructure, etc,
19*cc02d7e2SAndroid Build Coastguard Workerand thus the server has full control over the access of the health checking
20*cc02d7e2SAndroid Build Coastguard Workerservice.
21*cc02d7e2SAndroid Build Coastguard Worker
22*cc02d7e2SAndroid Build Coastguard Worker## Service Definition
23*cc02d7e2SAndroid Build Coastguard Worker
24*cc02d7e2SAndroid Build Coastguard WorkerThe server should export a service defined in the following proto:
25*cc02d7e2SAndroid Build Coastguard Worker
26*cc02d7e2SAndroid Build Coastguard Worker```
27*cc02d7e2SAndroid Build Coastguard Workersyntax = "proto3";
28*cc02d7e2SAndroid Build Coastguard Worker
29*cc02d7e2SAndroid Build Coastguard Workerpackage grpc.health.v1;
30*cc02d7e2SAndroid Build Coastguard Worker
31*cc02d7e2SAndroid Build Coastguard Workermessage HealthCheckRequest {
32*cc02d7e2SAndroid Build Coastguard Worker  string service = 1;
33*cc02d7e2SAndroid Build Coastguard Worker}
34*cc02d7e2SAndroid Build Coastguard Worker
35*cc02d7e2SAndroid Build Coastguard Workermessage HealthCheckResponse {
36*cc02d7e2SAndroid Build Coastguard Worker  enum ServingStatus {
37*cc02d7e2SAndroid Build Coastguard Worker    UNKNOWN = 0;
38*cc02d7e2SAndroid Build Coastguard Worker    SERVING = 1;
39*cc02d7e2SAndroid Build Coastguard Worker    NOT_SERVING = 2;
40*cc02d7e2SAndroid Build Coastguard Worker    SERVICE_UNKNOWN = 3;  // Used only by the Watch method.
41*cc02d7e2SAndroid Build Coastguard Worker  }
42*cc02d7e2SAndroid Build Coastguard Worker  ServingStatus status = 1;
43*cc02d7e2SAndroid Build Coastguard Worker}
44*cc02d7e2SAndroid Build Coastguard Worker
45*cc02d7e2SAndroid Build Coastguard Workerservice Health {
46*cc02d7e2SAndroid Build Coastguard Worker  rpc Check(HealthCheckRequest) returns (HealthCheckResponse);
47*cc02d7e2SAndroid Build Coastguard Worker
48*cc02d7e2SAndroid Build Coastguard Worker  rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse);
49*cc02d7e2SAndroid Build Coastguard Worker}
50*cc02d7e2SAndroid Build Coastguard Worker```
51*cc02d7e2SAndroid Build Coastguard Worker
52*cc02d7e2SAndroid Build Coastguard WorkerA client can query the server’s health status by calling the `Check` method, and
53*cc02d7e2SAndroid Build Coastguard Workera deadline should be set on the rpc. The client can optionally set the service
54*cc02d7e2SAndroid Build Coastguard Workername it wants to query for health status.
55*cc02d7e2SAndroid Build Coastguard Worker
56*cc02d7e2SAndroid Build Coastguard WorkerThe server should register all the services manually and set
57*cc02d7e2SAndroid Build Coastguard Workerthe individual status, including an empty service name and its status. For each
58*cc02d7e2SAndroid Build Coastguard Workerrequest received, if the service name can be found in the registry,
59*cc02d7e2SAndroid Build Coastguard Workera response must be sent back with an `OK` status and the status field should be
60*cc02d7e2SAndroid Build Coastguard Workerset to `SERVING` or `NOT_SERVING` accordingly. If the service name is not
61*cc02d7e2SAndroid Build Coastguard Workerregistered, the server returns a `NOT_FOUND` GRPC status.
62*cc02d7e2SAndroid Build Coastguard Worker
63*cc02d7e2SAndroid Build Coastguard WorkerThe server should use an empty string as the key for server's
64*cc02d7e2SAndroid Build Coastguard Workeroverall health status, so that a client not interested in a specific service can
65*cc02d7e2SAndroid Build Coastguard Workerquery the server's status with an empty request. The server can just do exact
66*cc02d7e2SAndroid Build Coastguard Workermatching of the service name without support of any kind of wildcard matching.
67*cc02d7e2SAndroid Build Coastguard WorkerHowever, the service owner has the freedom to implement more complicated
68*cc02d7e2SAndroid Build Coastguard Workermatching semantics that both the client and server agree upon.
69*cc02d7e2SAndroid Build Coastguard Worker
70*cc02d7e2SAndroid Build Coastguard WorkerA client can declare the server as unhealthy if the rpc is not finished after
71*cc02d7e2SAndroid Build Coastguard Workersome amount of time. The client should be able to handle the case where server
72*cc02d7e2SAndroid Build Coastguard Workerdoes not have the Health service.
73*cc02d7e2SAndroid Build Coastguard Worker
74*cc02d7e2SAndroid Build Coastguard WorkerA client can call the `Watch` method to perform a streaming health-check.
75*cc02d7e2SAndroid Build Coastguard WorkerThe server will immediately send back a message indicating the current
76*cc02d7e2SAndroid Build Coastguard Workerserving status.  It will then subsequently send a new message whenever
77*cc02d7e2SAndroid Build Coastguard Workerthe service's serving status changes.
78