Skip to content
  • Dan Upton's avatar
    grpc: `protoc` plugin for generating gRPC rate limit specifications (#15564) · d4c43585
    Dan Upton authored
    Adds automation for generating the map of `gRPC Method Name → Rate Limit Type`
    used by the middleware introduced in #15550, and will ensure we don't forget
    to add new endpoints.
    
    Engineers must annotate their RPCs in the proto file like so:
    
    ```
    rpc Foo(FooRequest) returns (FooResponse) {
      option (consul.internal.ratelimit.spec) = {
        operation_type: READ,
      };
    }
    ```
    
    When they run `make proto` a protoc plugin `protoc-gen-consul-rate-limit` will
    be installed that writes rate-limit specs as a JSON array to a file called
    `.ratelimit.tmp` (one per protobuf package/directory).
    
    After running Buf, `make proto` will execute a post-process script that will
    ingest all of the `.ratelimit.tmp` files and generate a Go file containing the
    mappings in the `agent/grpc-middleware` package. In the enterprise repository,
    it will write an additional file with the enterprise-only endpoints.
    
    If an engineer forgets to add the annotation to a new RPC, the plugin will
    return an error like so:
    
    ```
    RPC Foo is missing rate-limit specification, fix it with:
    
    	import "proto-public/annotations/ratelimit/ratelimit.proto";
    
    	service Bar {
    	  rpc Foo(...) returns (...) {
    	    option (hashicorp.consul.internal.ratelimit.spec) = {
    	      operation_type: OPERATION_READ | OPERATION_WRITE | OPERATION_EXEMPT,
    	    };
    	  }
    	}
    ```
    
    In the future, this annotation can be extended to support rate-limit
    category (e.g. KV vs Catalog) and to determine the retry policy.
    d4c43585