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 Case | Client Side | Server Side |
|---|---|---|
| Authentication | Attach token to metadata | Validate token, reject if invalid |
| Logging | Log request/response | Log request/response + duration |
| Metrics | Record latency, errors | Record QPS, latency, error rate |
| Tracing | Start span, propagate context | Extract span, create child span |
| Retry | Retry on UNAVAILABLE | N/A |
| Rate limiting | N/A | Reject with RESOURCE_EXHAUSTED |