En Go, los errores de contexto cancelado o vencido son comunes, pero a menudo carecen de información crucial sobre la causa subyacente. Esto dificulta la depuración y la respuesta a incidentes en producción. El artículo aborda este problema, introduciendo las funciones WithCancelCause (Go 1.20) y WithTimeoutCause (Go 1.21) que permiten adjuntar una razón específica a la cancelación de un contexto.
Tradicionalmente, cuando un contexto se cancelaba, solo se proporcionaban dos opciones: context.Canceled o context.DeadlineExceeded. Esto dejaba a los desarrolladores adivinando si la cancelación se debía a una desconexión del cliente, un tiempo de espera agotado, o una cancelación explícita. Para solucionar esto, WithCancelCause permite pasar un error al cancelar el contexto, proporcionando una razón más descriptiva. Por ejemplo, en lugar de simplemente ver "context canceled", se podría ver "order ord-123: inventory check failed: connection refused". Esto facilita la identificación de la causa raíz del problema.
WithTimeoutCause es similar, pero se utiliza para agregar una razón a la cancelación debido a un tiempo de espera. Sin embargo, existe una sutileza importante: cuando se usa WithTimeoutCause, el cancel() que se obtiene no es un CancelCauseFunc (que acepta un error), sino un CancelFunc estándar. Esto significa que si el contexto expira después de que se haya establecido una causa con WithCancelCause, la causa original puede ser descartada silenciosamente. Para evitar esto, es crucial asegurarse de que la causa se establezca antes de que se ejecute el defer cancel(), o utilizar WithTimeoutCause directamente para el tiempo de espera.
En resumen, las nuevas funciones de causa de contexto en Go 1.20 y 1.21 ofrecen una forma valiosa de mejorar la depuración y la observabilidad de las aplicaciones Go, pero requieren una comprensión cuidadosa de cómo interactúan con el defer cancel() para evitar la pérdida de información crucial.
