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