Chapter 16: Interceptors and Middleware

What Interceptors Do

Interceptors are middleware that runs before/after every RPC. Used for cross-cutting concerns without modifying each handler.

Client call → [Client Interceptor] → Network → [Server Interceptor] → Handler │ │ ├── Add auth token ├── Validate auth ├── Start trace span ├── Log request ├── Record metrics ├── Rate limit └── Retry on failure └── Record metrics

Server Interceptor (C++)

class LoggingInterceptor : public grpc::experimental::Interceptor {
  void Intercept(grpc::experimental::InterceptorBatchMethods* methods) override {
    if (methods->QueryInterceptionHookPoint(
        grpc::experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA)) {
      // Log before processing
      LOG_INFO("RPC started: %s", method_name);
    }
    methods->Proceed();  // continue to next interceptor or handler
  }
};

Common Interceptor Use Cases

Use CaseClient SideServer Side
AuthenticationAttach token to metadataValidate token, reject if invalid
LoggingLog request/responseLog request/response + duration
MetricsRecord latency, errorsRecord QPS, latency, error rate
TracingStart span, propagate contextExtract span, create child span
RetryRetry on UNAVAILABLEN/A
Rate limitingN/AReject with RESOURCE_EXHAUSTED