Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 56|Resposta: 0

[ASP.NET] ASP.NET Core (34) Contexto Traço

[Copiar link]
Publicado em4 dias atrás | | | |
Requisitos: Na arquitetura de microserviços, ao encontrar problemas, muitas vezes é muito difícil solucionar problemas, não sabendo se é uma exceção lançada pelo serviço, pode ser que o serviço escreva um bug, ou que haja um problema com as informações transmitidas pelo serviço que chama o serviço. Se o contexto de todas as solicitações puder ser registrado, ou seja, o link para toda a solicitação de transação completa, é fundamental diagnosticar e analisar o problema.

Revisar:
ASP.NET O rastreamento de links core (2) utiliza integração SkyAPM
https://www.itsvse.com/thread-9458-1-1.html

ASP.NET Rastreamento de Link Core (4) Acesso ao rastreamento de links Jaeger
https://www.itsvse.com/thread-9537-1-1.html

Traces de pilha de exceção são ideais para aplicações que visam um único processo, como um sistema de aplicações monolítico. Mas, por outro lado, para lidar com aplicações distribuídas, como arquiteturas de microserviços, os rastreios de pilha não são suficientes para mostrar o rastreio geral da mensagem. É por isso que ferramentas e padrões de rastreamento distribuídos se tornam necessários. O W3C define um padrão para esse tipo de traço chamado Trace Context.

Padrão Trace Context

Documentação do Contexto Traçado do W3C:O login do hiperlink está visível.

A especificação do Contexto de Traço do W3C define padrões e formatos para cabeçalhos HTTP propagarem informações distribuídas de contexto de traço. Ele define 2 campos que são usados para propagar o fluxo de traço no cabeçalho da requisição HTTP. Vamos dar uma olhada nestes dois campos na definição padrão:

  • traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
  • tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。

Campo traceparent

A especificação para o campo traceparent é definida na forma do Paradigma Extended Baccos (ABNF) e consiste em 4 partes:
Versão - TraceID - ParentID/Spanid - Traceflags

Por exemplo:
00-480e2a2781fe54d992d878662248d94-b4b37b64bb3f6141-00

  • version: 8 位,系统适配的追踪上下文版本,当前位 00
  • trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,O valor é exatamente o mesmo no mesmo link
  • Parent-ID/SPAN-ID: 8 bytes para expressar o pai do span atual em uma requisição de entrada ou de saída.
  • trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。

Todos os campos estão codificados em hexadecimal, como mostrado na imagem abaixo:



Rastreamento distribuído .NET

Rastreamento distribuído é uma técnica de diagnóstico que ajuda engenheiros a localizar falhas e problemas de desempenho em aplicações, especialmente aquelas que podem estar distribuídas entre múltiplos computadores ou processos. Essa técnica correlaciona o trabalho realizado por diferentes componentes da aplicação por meio do rastreamento de requisições na aplicação e o separa de outros trabalhos que a aplicação pode realizar ao lidar com requisições concorrentes. Por exemplo, um balanceador de carga pode primeiro receber uma solicitação para um serviço web típico, depois encaminhá-la para um processo do servidor web e, em seguida, emitir múltiplas consultas para o banco de dados. Com rastreamento distribuído, os engenheiros podem distinguir se essas etapas falharam, quanto tempo cada etapa leva e quais mensagens podem ser registradas quando cada etapa é executada.

No .NET, a biblioteca System.Diagnostics.Activity foi configurada para usar o padrão W3C. O cabeçalho traceparent no estilo W3C, Request-Id, foi adicionado em ASP.NET Core 2.0. Para mudar para um cabeçalho traceparent que esteja em conformidade com o Contexto de Trace do W3C, defina a propriedade estática Activity.DefaultIdFormat para W3C ao iniciar o programa. O código é o seguinte:
processo de teste,Interface do serviço Navegador -> A (/http, backend usa HttpClient para solicitar serviço B) interface -> Interface do serviço B (/test), o Serviço A gera seu próprio Contexto de Traço e o Contexto de Traço do Serviço B, o código é o seguinte:
Iniciar os serviços A e B, conforme mostrado na figura a seguir:



O navegador abre o Serviço A, conforme mostrado na figura a seguir:


Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:

Conteúdo da resposta: {"id":"00-9891603e6c4921598951f425d98e4df7-8874f9b2f9c0702e-00","traceId":"9891603e6c4921598951f425d98e4df7","spanId":"8874f9b2f9c0702e","parentId": "00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00","traceFlags":"Nenhuma", "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:
{
  Data: Seg, 22 Dez 2025 01:37:21 GMT
  Saqueadora: Kestrel
  Codificação de transferência: em blocos
  Conexão: manter a vida
  Tipo de Conteúdo: application/json; charset=utf-8
}, Request = Método: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', Versão: 1.1, Conteúdo: <null>, Cabeçalhos:
{
  traceparent: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00
}, RequestTaskStatus = RanToCompletion }
--------------------------------------------------
Usando a ferramenta de captura de pacotes Charles Proxy, a solicitação e a resposta são as seguintes:



Se você quiser desabilitar o HttpClient para que não passe traceparent, as variáveis de ambiente são definidas da seguinte forma:

Referência:

O login do hiperlink está visível.
O login do hiperlink está visível.
O login do hiperlink está visível.
O login do hiperlink está visível.
O login do hiperlink está visível.
O login do hiperlink está visível.




Anterior:O Editor 010 não vem com um template DEX por padrão
Próximo:Compilação de projeto front-end Não é possível definir propriedades de undefined (definindo 'pai')
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com