Requisitos: En la arquitectura de microservicios, al encontrarse con problemas, suele ser muy difícil solucionar el problema, sin saber si es una excepción lanzada por el servicio, puede ser que el servicio escriba un error o que haya un problema con la información transmitida por el servicio que llama al servicio. Si se puede registrar el contexto de todas las solicitudes, es decir, el enlace a toda la solicitud de transacción, es fundamental diagnosticar y analizar el problema.
Revisión:
Las pistas de pila de excepciones son ideales para aplicaciones que apuntan a un solo proceso, como un sistema de aplicaciones monolítico. Pero, por otro lado, para tratar con aplicaciones distribuidas, como arquitecturas de microservicios, los rastros de pila no son suficientes para mostrar el trazado global del mensaje. Por eso se hacen necesarias las herramientas y estándares de rastreo distribuido. El W3C define un estándar para este tipo de traza llamado Trace Context.
Estándar Trace Context
Documentación del contexto trazado del W3C:El inicio de sesión del hipervínculo es visible.
La especificación Trace Context del W3C define estándares y formatos para que los encabezados HTTP propaguen información de contexto de traza distribuida. Define 2 campos que se utilizan para propagar el flujo de traza en la cabecera de la petición HTTP. Veamos estos 2 campos en la definición estándar:
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
Campo traceparent
La especificación para el campo traceparent se define en forma del Paradigma Extendido de Baccos (ABNF) y consta de 4 partes:
Versión - traceid - parentid/spanid - traceflags Por ejemplo:
00-480e2a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,El valor es exactamente el mismo en el mismo enlace。
- Parent-ID/SPAN-ID: 8 bytes para expresar el padre del span actual en una solicitud entrante o saliente.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Todos los campos están codificados en hexadecimal, como se muestra en la imagen de abajo:
Trazado distribuido .NET
El trazado distribuido es una técnica de diagnóstico que ayuda a los ingenieros a localizar fallos y problemas de rendimiento en aplicaciones, especialmente aquellas que pueden estar distribuidas entre varios ordenadores o procesos. Esta técnica correlaciona el trabajo realizado por diferentes componentes de la aplicación mediante el seguimiento de solicitudes en la aplicación y lo separa de otros trabajos que la aplicación podría realizar al gestionar solicitudes concurrentes. Por ejemplo, un balanceador de carga podría recibir primero una solicitud para un servicio web típico, luego reenviarla a un proceso de servidor web y después emitir múltiples consultas a la base de datos. Con el trazado distribuido, los ingenieros pueden distinguir si estos pasos fallaron, cuánto tiempo tarda cada paso y qué mensajes pueden registrarse cuando se ejecuta cada paso.
En .NET, la biblioteca System.Diagnostics.Activity ha sido configurada para usar el estándar W3C. El encabezado traceparent de estilo W3C, Request-Id, se añadió en ASP.NET Core 2.0. Para cambiarlo a un encabezado traceparent que cumpla con el Contexto de Traza del W3C, establece la propiedad estática Activity.DefaultIdFormat en W3C al iniciar el programa. El código es el siguiente:
proceso de prueba,Interfaz de servicio A (/http> Navegador - A (/http, backend usa HttpClient para solicitar el servicio B) interfaz -> Interfaz de servicio B (/test), el Servicio A genera su propio Contexto de Traza y el Contexto de Traza del Servicio B, el código es el siguiente:
Inicien los servicios A y B, como se muestra en la siguiente figura:
El navegador abre el Servicio A, como se muestra en la siguiente figura:
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Contenido de la respuesta: {"id":"00-9891603e6c4921598951f425d98e4df7-8874f9b2f9c0702e-00","traceId":"9891603e6c4921598951f425d98e4df7","spanId":"8874f9b2f9c0702e","parentId": "00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00","traceFlags":"None","isSampled":false}
--------------------------------------------------
Name: HttpHandlerDiagnosticListener
DateTime: 2025/12/22 9:37:22
Id: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: e0336cc56a4f2150
ParentId: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
Key: System.Net.Http.HttpRequestOut.Stop, Value: { Response = StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{ Fecha: Lun, 22 Dic 2025 01:37:21 GMT Saqueadora: Kestrel Codificación de transferencia: fragmentada Conexión: mantener la vida Tipo de contenido: application/json; Charset=UTF-8 }, Request = Método: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', Version: 1.1, Content: <null>, Encabezados:
{ traceparent: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- Utilizando la herramienta de captura de paquetes Charles Proxy, la solicitud y respuesta son las siguientes:
Si quieres desactivar que el Cliente Http pase traceparent, las variables de entorno se establecen de la siguiente manera:
Referencia:
El inicio de sesión del hipervínculo es visible.
El inicio de sesión del hipervínculo es visible.
El inicio de sesión del hipervínculo es visible.
El inicio de sesión del hipervínculo es visible.
El inicio de sesión del hipervínculo es visible.
El inicio de sesión del hipervínculo es visible. |