Index: third_party/grpc/doc/health-checking.md |
diff --git a/third_party/grpc/doc/health-checking.md b/third_party/grpc/doc/health-checking.md |
new file mode 100644 |
index 0000000000000000000000000000000000000000..92512e942bd90f7d03bd1f3e6db4f48795f0a959 |
--- /dev/null |
+++ b/third_party/grpc/doc/health-checking.md |
@@ -0,0 +1,70 @@ |
+GRPC Health Checking Protocol |
+================================ |
+ |
+Health checks are used to probe whether the server is able to handle rpcs. The |
+client-to-server health checking can happen from point to point or via some |
+control system. A server may choose to reply “unhealthy” because it |
+is not ready to take requests, it is shutting down or some other reason. |
+The client can act accordingly if the response is not received within some time |
+window or the response says unhealthy in it. |
+ |
+ |
+A GRPC service is used as the health checking mechanism for both simple |
+client-to-server scenario and other control systems such as load-balancing. |
+Being a high |
+level service provides some benefits. Firstly, since it is a GRPC service |
+itself, doing a health check is in the same format as a normal rpc. Secondly, |
+it has rich semantics such as per-service health status. Thirdly, as a GRPC |
+service, it is able reuse all the existing billing, quota infrastructure, etc, |
+and thus the server has full control over the access of the health checking |
+service. |
+ |
+## Service Definition |
+ |
+The server should export a service defined in the following proto: |
+ |
+``` |
+syntax = "proto3"; |
+ |
+package grpc.health.v1; |
+ |
+message HealthCheckRequest { |
+ string service = 1; |
+} |
+ |
+message HealthCheckResponse { |
+ enum ServingStatus { |
+ UNKNOWN = 0; |
+ SERVING = 1; |
+ NOT_SERVING = 2; |
+ } |
+ ServingStatus status = 1; |
+} |
+ |
+service Health { |
+ rpc Check(HealthCheckRequest) returns (HealthCheckResponse); |
+} |
+``` |
+ |
+A client can query the server’s health status by calling the `Check` method, and |
+a deadline should be set on the rpc. The client can optionally set the service |
+name it wants to query for health status. The suggested format of service name |
+is `package_names.ServiceName`, such as `grpc.health.v1.Health`. |
+ |
+The server should register all the services manually and set |
+the individual status, including an empty service name and its status. For each |
+request received, if the service name can be found in the registry, |
+a response must be sent back with an `OK` status and the status field should be |
+set to `SERVING` or `NOT_SERVING` accordingly. If the service name is not |
+registered, the server returns a `NOT_FOUND` GRPC status. |
+ |
+The server should use an empty string as the key for server’s |
+overall health status, so that a client not interested in a specific service can |
+query the server's status with an empty request. The server can just do exact |
+matching of the service name without support of any kind of wildcard matching. |
+However, the service owner has the freedom to implement more complicated |
+matching semantics that both the client and server agree upon. |
+ |
+A client can declare the server as unhealthy if the rpc is not finished after |
+some amount of time. The client should be able to handle the case where server |
+does not have the Health service. |