O Zipkin é um sistema de rastreamento distribuído de código aberto desenvolvido originalmente pelo Twitter. Ele agrega dados de monitoramento em tempo real de vários sistemas heterogêneos. Use a biblioteca zipkin4net para instrumentar aplicativos .NET e relatar dados de rastreamento ao Application Real-Time Monitoring Service (ARMS) Tracing Analysis.
Este tópico aborda três métodos de instrumentação para aplicativos .NET e C#.
Escolha um método de instrumentação
Selecione o método adequado ao framework do seu aplicativo.
|
Método |
Indicado para |
Pacotes NuGet necessários |
|
ASP.NET Core |
Aplicativos web multiplataforma desenvolvidos com ASP.NET Core |
|
|
OWIN |
Aplicativos web .NET Framework que usam middleware OWIN |
|
|
Manual |
Jobs em segundo plano, consumidores de mensagens ou protocolos personalizados que exigem controle refinado de spans |
|
Pré-requisitos
Antes de começar, verifique se você tem:
Uma conta Alibaba Cloud com o ARMS ativado
Um ambiente de desenvolvimento .NET
O endpoint do Zipkin da sua instância do ARMS Tracing Analysis (consulte Obter um endpoint do Zipkin)
Obtenha um endpoint do Zipkin
Faça login no console do Tracing Analysis.
No painel de navegação à esquerda, clique em Cluster Configurations. Em seguida, clique na guia Access point information.
Na barra de navegação superior, selecione uma região. Na seção Cluster Information, ative Show Token.
Na seção Client, clique em Jaeger ou Zipkin.
Na coluna Related Information, copie a URL do endpoint.

Se o aplicativo for executado em um ambiente de produção da Alibaba Cloud, use um ponto de acesso VPC. Caso contrário, use um endpoint público. Utilize o endpoint v2, a menos que tenha um motivo específico para usar a versão v1.
Instrumente com ASP.NET Core
Baixe o projeto de demonstração completo e siga as instruções no arquivo README.md.
Etapa 1: Instale os pacotes NuGet
dotnet add package zipkin4net.middleware.aspnetcore
dotnet add package zipkin4net
|
Pacote |
Finalidade |
|
|
Biblioteca principal de rastreamento. Cria spans, gerencia amostragem e relata dados de rastreamento para um backend compatível com Zipkin. |
|
|
Middleware para ASP.NET Core. Cria automaticamente um span de servidor para cada requisição HTTP recebida. |
Etapa 2: Registre e inicie o rastreador
Adicione o código abaixo à lógica de inicialização do aplicativo para configurar o zipkin4net e conectá-lo ao endpoint do ARMS Tracing Analysis.
lifetime.ApplicationStarted.Register(() => {
TraceManager.SamplingRate = 1.0f;
var logger = new TracingLogger(loggerFactory, "zipkin4net");
// Replace with your Zipkin endpoint from the Tracing Analysis console.
// Do not append /api/v2/spans to the URL.
var httpSender = new HttpZipkinSender("<your-zipkin-endpoint>", "application/json");
var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer());
TraceManager.RegisterTracer(tracer);
TraceManager.Start(logger);
});
lifetime.ApplicationStopped.Register(() => TraceManager.Stop());
app.UseTracing(applicationName);
Substitua o placeholder abaixo pelo valor real:
|
Placeholder |
Descrição |
Exemplo |
|
|
Endpoint do Zipkin obtido no console do Tracing Analysis |
|
Etapa 3: Rastreie requisições HTTP de saída
Adicione o TracingHandler ao pipeline do HttpClient para rastrear automaticamente as chamadas HTTP de saída e correlacioná-las ao span pai.
public override void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("Tracer").AddHttpMessageHandler(provider =>
TracingHandler.WithoutInnerHandler(provider.GetService<IConfiguration>()["applicationName"]));
}
Instrumente com OWIN
O Open Web Interface for .NET (OWIN) é uma especificação de middleware para aplicativos web .NET Framework.
Baixe o projeto de demonstração completo e siga as instruções no arquivo README.md.
Etapa 1: Instale os pacotes NuGet
dotnet add package zipkin4net.middleware.aspnetcore
dotnet add package zipkin4net
|
Pacote |
Finalidade |
|
|
Biblioteca principal de rastreamento. |
|
|
Middleware para ASP.NET Core. Cria automaticamente um span de servidor para cada requisição HTTP recebida. |
Etapa 2: Registre e inicie o rastreador
// Configure tracing.
TraceManager.SamplingRate = 1.0f;
var logger = new ConsoleLogger();
// Replace with your Zipkin endpoint from the Tracing Analysis console.
// Do not append /api/v2/spans to the URL.
var httpSender = new HttpZipkinSender("<your-zipkin-endpoint>", "application/json");
var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer());
TraceManager.RegisterTracer(tracer);
TraceManager.Start(logger);
// Stop TraceManager when the application shuts down.
var properties = new AppProperties(appBuilder.Properties);
var token = properties.OnAppDisposing;
if (token != CancellationToken.None)
{
token.Register(() =>
{
TraceManager.Stop();
});
}
// Register OWIN middleware.
appBuilder.UseZipkinTracer(System.Configuration.ConfigurationManager.AppSettings["applicationName"]);
Etapa 3: Rastreie requisições HTTP de saída
Envolva o HttpClient com o TracingHandler para propagar o contexto de rastreamento entre serviços.
using (var httpClient = new HttpClient(new TracingHandler(applicationName)))
{
var response = await httpClient.GetAsync(callServiceUrl);
var content = await response.Content.ReadAsStringAsync();
await context.Response.WriteAsync(content);
}
Instrumente manualmente
Use a instrumentação manual para ter controle total sobre a criação de spans — por exemplo, ao rastrear jobs em segundo plano, consumidores de mensagens ou protocolos personalizados.
Baixe o projeto de demonstração completo e siga as instruções no arquivo README.md.
Etapa 1: Instale o pacote NuGet
Apenas a biblioteca principal de rastreamento é necessária para instrumentação manual.
dotnet add package zipkin4net
Etapa 2: Registre e inicie o rastreador
TraceManager.SamplingRate = 1.0f;
var logger = new ConsoleLogger();
// Replace with your Zipkin endpoint from the Tracing Analysis console.
// Do not append /api/v2/spans to the URL.
var httpSender = new HttpZipkinSender("<your-zipkin-endpoint>", "application/json");
var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer());
TraceManager.RegisterTracer(tracer);
TraceManager.Start(logger);
Etapa 3: Crie e registre spans
Crie um span raiz para cada requisição ou operação e registre seus eventos de ciclo de vida.
var trace = Trace.Create();
Trace.Current = trace;
trace.Record(Annotations.ClientSend());
trace.Record(Annotations.Rpc("client"));
trace.Record(Annotations.Tag("mytag", "spanFrist"));
trace.Record(Annotations.ServiceName("dotnetManual"));
// ... perform your operation here
testCall();
trace.Record(Annotations.ClientRecv());
Para registrar um span filho (por exemplo, uma chamada downstream na mesma requisição), chame o método Child() no rastreamento atual:
var trace = Trace.Current.Child();
Trace.Current = trace;
trace.Record(Annotations.ServerRecv());
trace.Record(Annotations.Rpc("server"));
trace.Record(Annotations.Tag("mytag", "spanSecond"));
trace.Record(Annotations.ServiceName("dotnetManual"));
// ... perform your operation here
trace.Record(Annotations.ServerSend());
(Opcional) Etapa 4: Adicione tags personalizadas
Anexe tags personalizadas aos spans para facilitar a solução de problemas. Por exemplo, registre o código de status HTTP ou sinalize erros.
tracer.activeSpan().setTag("http.status_code", "200");
Etapa 5: Propague o contexto de rastreamento entre serviços
Em sistemas distribuídos, o contexto de rastreamento viaja com cada requisição RPC para correlacionar spans de diferentes serviços em um único rastreamento. A biblioteca zipkin4net usa a propagação B3, transmitindo quatro valores por cabeçalhos HTTP:
|
Campo de rastreamento |
Cabeçalho HTTP |
|
TraceId |
|
|
ParentSpanId |
|
|
SpanId |
|
|
Sampled |
|
Client Span Server Span
┌──────────────────┐ ┌──────────────────┐
│ │ │ │
│ TraceContext │ Http Request Headers │ TraceContext │
│ ┌──────────────┐ │ ┌───────────────────┐ │ ┌──────────────┐ │
│ │ TraceId │ │ │ X-B3-TraceId │ │ │ TraceId │ │
│ │ │ │ │ │ │ │ │ │
│ │ ParentSpanId │ │ Inject │ X-B3-ParentSpanId │Extract │ │ ParentSpanId │ │
│ │ ├─┼─────────>│ ├────────┼>│ │ │
│ │ SpanId │ │ │ X-B3-SpanId │ │ │ SpanId │ │
│ │ │ │ │ │ │ │ │ │
│ │ Sampled │ │ │ X-B3-Sampled │ │ │ Sampled │ │
│ └──────────────┘ │ └───────────────────┘ │ └──────────────┘ │
│ │ │ │
└──────────────────┘ └──────────────────┘
Lado do cliente — injete o contexto de rastreamento nos cabeçalhos da requisição de saída:
_injector.Inject(clientTrace.Trace.CurrentSpan, request.Headers);
Lado do servidor — extraia o contexto de rastreamento dos cabeçalhos da requisição de entrada:
var traceContext = traceExtractor.Extract(context.Request.Headers);
var trace = traceContext == null ? Trace.Create() : Trace.CreateFromId(traceContext);
Se não houver contexto de rastreamento nos cabeçalhos recebidos, um novo rastreamento raiz será criado. Caso contrário, o rastreamento existente continuará.
Perguntas frequentes
P: Por que nenhum dado aparece no console do Tracing Analysis após executar a demonstração?
R: Verifique se a URL do endpoint do Zipkin na configuração do HttpZipkinSender está correta. Copie o endpoint diretamente do console do Tracing Analysis. A URL não deve incluir /api/v2/spans.
// Correct: use the base endpoint without /api/v2/spans
var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json");