Lección 12 de 20 · Lectura y práctica
Implementar interceptores para logging y métricas
Concepto claveLos interceptores en gRPC son componentes de middleware que permiten interceptar y procesar llamadas RPC antes de que lleguen al manejador del servicio o después de que se genere la respuesta. Piensa en ellos como.
Del concepto a la práctica
Taller de esta lección
Un interceptor permite medir una llamada en un punto común, pero debe registrar datos útiles y mínimos. Para comparar métodos, usa la misma unidad de tiempo y cuenta por estado, sin incluir cuerpos completos ni credenciales.
Ejemplo resuelto
método=Consultar duración=12 ms estado=OK
método=Reservar duración=31 ms estado=FAILED_PRECONDITIONEstos dos eventos alimentan un contador por estado y una observación de latencia; no exponen la solicitud.
Cierra la observación también en excepciones, usando finalmente una ruta de cleanup. Las duraciones12 y31 ms son fixtures para probar el cálculo, no tiempos garantizados. Si exportas segundos registra0,012 y0,031. Etiquetas de métricas: método y estado, sin SKU, usuario ni correlación de alta cardinalidad; estos últimos, si fueran necesarios y seguros, pertenecen a trazas con acceso controlado.
Pruébalo
Envuelve dos métodos con el interceptor.
Para unaria mide alrededor del manejador. Para streaming observa consumo completo, cierre o cancelación; devolver un iterador no significa que el stream haya terminado.
Incrementa una cuenta para cada estado y conserva la duración en milisegundos.
Error frecuente: iniciar el cronómetro después del manejador o registrar el token completo. Corrección: inicia antes, finaliza siempre y aplica enmascarado a los metadatos.
Comprueba tu resultado
Ejercicio: ejecuta una llamada exitosa y otra rechazada. Resultado esperado: dos registros con método, duración y estado; los contadores suman uno para OK y uno para el estado de rechazo, sin secretos.

Mapa de prácticaEl control de acceso, las actualizaciones y las copias de seguridad cubren riesgos distintos. Una alerta necesita un procedimiento de respuesta para contener y recuperar el servicio. Varias capas reducen la exposición, pero ninguna garantiza seguridad absoluta.
Ver la infografía en tamaño completo ↗Concepto clave
Los interceptores en gRPC son componentes de middleware que permiten interceptar y procesar llamadas RPC antes de que lleguen al manejador del servicio o después de que se genere la respuesta. Piensa en ellos como los inspectores de seguridad en un aeropuerto: cada pasajero (llamada RPC) pasa por un punto de control donde se registra información, se verifican credenciales y se aplican reglas, sin interrumpir el flujo principal del viaje.
Para logging y métricas, los interceptores capturan datos como tiempos de respuesta, códigos de estado, tamaños de mensajes y errores. Esto es crucial en producción porque proporciona visibilidad en tiempo real del comportamiento del sistema, ayuda a detectar cuellos de botella y facilita la depuración de problemas. Sin interceptores, tendrías que instrumentar cada método manualmente, lo que es propenso a errores y difícil de mantener.
Cómo funciona en la práctica
En gRPC, los interceptores se implementan como funciones o clases que siguen una interfaz específica. Para logging, creas un interceptor que registre detalles de cada llamada, como el método invocado, la duración y el resultado. Para métricas, integras con herramientas como Prometheus o OpenTelemetry para exponer métricas como latencia y tasa de errores.
Ejemplo básico en Go para un interceptor de logging:
func loggingInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
start := time.Now()
resp, err := handler(ctx, req)
duration := time.Since(start)
log.Printf("Método: %s, Duración: %v, Error: %v", info.FullMethod, duration, err)
return resp, err
}Este interceptor mide el tiempo de ejecución y registra la información. Luego, lo registras en el servidor gRPC usando grpc.UnaryInterceptor(loggingInterceptor). Para métricas, podrías agregar código para incrementar contadores o medir histogramas basados en la duración y el error.
Caso de estudio
Imagina un sistema de microservicios para un e-commerce con servicios de pedidos, inventario y pagos. Implementamos interceptores para logging y métricas en el servicio de pedidos. El interceptor de logging registra cada llamada a CreateOrder con detalles como ID de usuario, productos y estado. El interceptor de métricas expone:
| Métrica | Tipo | Descripción |
|---|---|---|
| grpc_orders_created_total | Contador | Número total de pedidos creados |
| grpc_order_latency_seconds | Histograma | Duración de las llamadas a CreateOrder |
| grpc_errors_total | Contador | Errores por tipo (ej., inventario insuficiente) |
En producción, esto nos permitió detectar un pico de latencia en CreateOrder durante horas pico, lo que llevó a optimizar la base de datos. Además, los logs ayudaron a rastrear un error intermitente relacionado con el inventario, reduciendo el tiempo de resolución de incidentes de horas a minutos.
En sistemas distribuidos, la visibilidad es clave: sin logging y métricas, estás volando a ciegas. Los interceptores centralizan esta instrumentación, haciendo que sea más fácil de mantener y escalar.
Errores comunes
- No probar interceptores en entornos de staging: Implementar interceptores directamente en producción puede introducir bugs que afecten el rendimiento. Siempre valida en un entorno similar a producción primero.
- Registrar datos sensibles: Los interceptores de logging pueden capturar información confidencial como tokens o datos personales. Usa máscaras o filtros para omitir estos campos.
- Ignorar el overhead de rendimiento: Los interceptores agregan latencia. Si registras o mides en exceso, puedes degradar el servicio. Optimiza usando muestreo o niveles de log apropiados.
- No manejar errores en los interceptores: Si un interceptor falla, puede bloquear las llamadas RPC. Asegúrate de manejar excepciones y devolver errores apropiados.
- No sincronizar métricas entre servicios: Si cada servicio usa diferentes convenciones de métricas, es difícil agregar datos. Establece estándares desde el inicio.
Checklist de dominio
- ¿Puedes implementar un interceptor de logging que registre método, duración y estado para llamadas unarias y de streaming?
- ¿Sabes integrar un interceptor de métricas con Prometheus para exponer latencia y tasa de errores?
- ¿Eres capaz de configurar niveles de log (ej., debug, info, error) en los interceptores basado en el entorno?
- ¿Puedes usar interceptores para enriquecer trazas de distributed tracing (ej., con OpenTelemetry)?
- ¿Sabes evitar la fuga de datos sensibles en los logs mediante filtros o máscaras?
- ¿Puedes medir el impacto de los interceptores en el rendimiento y ajustar la configuración?
- ¿Eres capaz de escribir pruebas unitarias para interceptores que simulen diferentes escenarios de error?
Implementar un interceptor de logging y métricas para un servicio gRPC
En este ejercicio, crearás un interceptor que registre llamadas y exponga métricas para un servicio gRPC simple. Sigue estos pasos:
- Configura el entorno: Crea un nuevo proyecto en Go (o tu lenguaje preferido) con gRPC y Protocol Buffers. Define un servicio simple, como
Greetercon un métodoSayHello. - Implementa el interceptor de logging: Escribe una función que intercepte llamadas unarias. Debe registrar:
- Nombre del método (ej., /greeter.Greeter/SayHello)
- Timestamp de inicio y fin
- Duración en milisegundos
- Código de estado gRPC (ej., OK, INTERNAL_ERROR)
- Agrega métricas: Integra con Prometheus (o una biblioteca similar) para exponer:
grpc_calls_total: Contador de llamadas totales, etiquetado por método y código de estado.grpc_call_duration_seconds: Histograma de duración de llamadas, etiquetado por método.
- Configura el servidor: Registra el interceptor en el servidor gRPC. Asegúrate de que el servidor exponga un endpoint de métricas (ej., /metrics para Prometheus).
- Prueba la implementación: Ejecuta el servidor y haz llamadas de cliente. Verifica que los logs aparezcan y que las métricas se actualicen en el endpoint.
- Opcional: Extiende a streaming: Modifica el interceptor para manejar también llamadas de streaming, registrando eventos como inicio y fin de streams.
Pistas
- Usa context.Context para pasar datos entre interceptores y manejadores, como request IDs para correlación.
- Para métricas, considera usar etiquetas (labels) dinámicas basadas en el método gRPC, pero evita cardinalidad alta que afecte el rendimiento.
- Prueba el interceptor con casos de error simulados (ej., devolviendo códigos de error gRPC) para asegurar que el logging y las métricas los capturen correctamente.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con Implementación Avanzada de gRPC y Protocol Buffers para Microservicios
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.