通過Zipkin為應用埋點並上報鏈路資料至Managed Service for OpenTelemetry後,Managed Service for OpenTelemetry即可開始監控應用,您可以查看應用拓撲、調用鏈路、異常事務、慢事務和SQL分析等一系列監控資料。本文介紹如何使用ASP.NET Core/Owin組件進行自動埋點或直接進行手動埋點。
為獲得更豐富的功能、更先進的鏈路追蹤能力,以及最佳使用體驗,建議您使用OpenTelemetry協議將應用接入Managed Service for OpenTelemetry。
我們為您提供了詳細的OpenTelemetry接入指南和最佳實務,協助您快速上手Managed Service for OpenTelemetry。更多資訊,請參見接入應用。
前提條件
背景資訊
Zipkin是一款開源的分布式即時資料追蹤系統(Distributed Tracking System),由Twitter公司開發和貢獻。其主要功能是彙總來自各個異構系統的即時監控資料。
通過ASP.NET Core組件自動埋點
請按照以下步驟通過ASP.NET Core組件埋點。
下載Demo源碼,並按照Readme的說明運行程式。
安裝NuGet包。
// 添加以下組件。 // zipkin4net.middleware.aspnetcore(aspnetcore中介軟體) // zipkin4net(追蹤器) dotnet add package zipkin4net.middleware.aspnetcore dotnet add package zipkin4net
註冊和啟動Zipkin。
lifetime.ApplicationStarted.Register(() => { TraceManager.SamplingRate = 1.0f; var logger = new TracingLogger(loggerFactory, "zipkin4net"); // 在可觀測鏈路 OpenTelemetry 版控制台擷取Zipkin Endpoint,注意Endpoint中不包含“/api/v2/spans”。 var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json"); var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer()); TraceManager.RegisterTracer(tracer); TraceManager.Start(logger); }); lifetime.ApplicationStopped.Register(() => TraceManager.Stop()); app.UseTracing(applicationName);
在發送Get/Post請求的HttpClient中添加tracinghandler(追蹤處理者)。
public override void ConfigureServices(IServiceCollection services) { services.AddHttpClient("Tracer").AddHttpMessageHandler(provider => TracingHandler.WithoutInnerHandler(provider.GetService<IConfiguration>()["applicationName"])); }
通過Owin組件自動埋點
請按照以下步驟通過Owin組件埋點。
下載Demo源碼,並按照Readme的說明運行程式。
安裝NuGet包。
// 添加以下組件。 // zipkin4net.middleware.aspnetcore(aspnetcore中介軟體) // zipkin4net(追蹤器) dotnet add package zipkin4net.middleware.aspnetcore dotnet add package zipkin4net
註冊和啟動Zipkin。
// 設定Tracing。 TraceManager.SamplingRate = 1.0f; var logger = new ConsoleLogger(); // 在可觀測鏈路 OpenTelemetry 版控制台擷取Zipkin Endpoint,注意Endpoint中不包含“/api/v2/spans”。 var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json"); var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer()); TraceManager.RegisterTracer(tracer); TraceManager.Start(logger); //Stop TraceManager on app dispose var properties = new AppProperties(appBuilder.Properties); var token = properties.OnAppDisposing; if (token != CancellationToken.None) { token.Register(() => { TraceManager.Stop(); }); } // Setup Owin Middleware appBuilder.UseZipkinTracer(System.Configuration.ConfigurationManager.AppSettings["applicationName"]);
在發送Get/Post請求的HttpClient中添加tracinghandler(追蹤處理者)。
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); }
手動埋點
要通過Zipkin將.Net應用資料上報至Managed Service for OpenTelemetry控制台,除了利用各種現有外掛程式實現埋點的目的,也可以手動埋點。
下載Demo源碼,並按照Readme的說明運行程式。
安裝NuGet包。
// 添加zipkin4net(追蹤器)。 dotnet add package zipkin4net
註冊和啟動Zipkin。
TraceManager.SamplingRate = 1.0f; var logger = new ConsoleLogger(); // 在可觀測鏈路 OpenTelemetry 版控制台擷取Zipkin Endpoint,注意Endpoint中不包含“/api/v2/spans”。 var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json"); var tracer = new ZipkinTracer(httpSender, new JSONSpanSerializer()); TraceManager.RegisterTracer(tracer); TraceManager.Start(logger);
記錄請求資料。
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")); // ...do something testCall(); trace.Record(Annotations.ClientRecv());
說明以上代碼用於記錄請求的根操作,如果需要記錄請求的上一步和下一步操作,則需要調用ChildOf方法。樣本:
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")); // ...do something trace.Record(Annotations.ServerSend());
可選:為了快速排查問題,您可以為某個記錄添加一些自訂標籤,例如記錄是否發生錯誤、請求的傳回值等。
tracer.activeSpan().setTag("http.status_code", "200");
在分布式系統中發送RPC請求時會帶上Tracing資料,包括TraceId、ParentSpanId、SpanId、Sampled等。您可以在HTTP請求中使用Extract/Inject方法在HTTP Request Headers上透傳資料。總體流程如下:
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 │ │ │ └──────────────┘ │ └───────────────────┘ │ └──────────────┘ │ │ │ │ │ └──────────────────┘ └──────────────────┘
在用戶端調用Inject方法傳入Context資訊。
_injector.Inject(clientTrace.Trace.CurrentSpan, request.Headers);
在服務端調用Extract方法解析Context資訊。
Ivar traceContext = traceExtractor.Extract(context.Request.Headers); var trace = traceContext == null ? Trace.Create() : Trace.CreateFromId(traceContext);
常見問題
問:Demo程式執行成功,為什麼控制台上沒有上報資料?
答:請檢查senderConfiguration配置中的Endpoint是否填寫正確。
// 在可觀測鏈路 OpenTelemetry 版控制台擷取Zipkin Endpoint,注意Endpoint中不包含“/api/v2/spans”。
var httpSender = new HttpZipkinSender("http://tracing-analysis-dc-hz.aliyuncs.com/adapt_your_token", "application/json");