使用OpenTelemetry搭配Zipkin构建NetCore分布式链路跟踪 | WebAPI + gRPC
OpenTelemetry介紹
OpenTelemetry是一組標準和工具的集合,旨在管理觀測類數據,如 trace、metrics、logs 等。
通過標準化不同的應用程序和框架如何收集和發出可觀察性遙測數據,OpenTelemetry旨在解決這些環境帶來的一些挑戰。
OpenTelemetry包括:
可觀察性遙測(分布式跟蹤、指標等)的供應商中立規范
實現用于檢測的公共接口的API
應用程序使用SDK為插件作者配置工具和接口以編寫導出器
使你能夠將數據發送到你選擇的遙測后端的導出器
隨著OpenTelemetry對可觀察性遙測集合的標準化,你可以選擇遙測后端而無需更改檢測代碼。你可以自由選擇可為你提供最有效數據分析的平臺。
在本文中,我們選擇的是Zipkin。
Zipkin介紹
Zipkin是一個分布式追蹤系統。它有助于收集對服務架構中的延遲問題進行故障排除所需的計時數據。功能包括收集和查找這些數據。
下面,我們就來演示,如何使用OpenTelemetry搭配Zipkin來追蹤ASP.NET Core服務之間的WebAPI和gRPC請求。
Demo
創建3個應用程序,WebApplication1使用Web API調用WebApplication2,WebApplication2使用gRPC調用GrpcService1。
WebApplication1
引用Nuget包,包括預發行版:
OpenTelemetry.Extensions.Hosting OpenTelemetry.Instrumentation.AspNetCore OpenTelemetry.Exporter.Zipkin新增配置,Endpoint對應Zipkin部署地址:
"Zipkin":?{"ServiceName":?"WebApplication1","Endpoint":?"http://192.168.1.11:9411/api/v2/spans" }修改Startup.cs:
public?void?ConfigureServices(IServiceCollection?services) {...services.AddOpenTelemetryTracing((builder)?=>?builder.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(this.Configuration.GetValue<string>("Zipkin:ServiceName"))).AddAspNetCoreInstrumentation().AddZipkinExporter(zipkinOptions?=>{zipkinOptions.Endpoint?=?new?Uri(Configuration.GetValue<string>("Zipkin:Endpoint"));})); }修改WeatherForecastController.cs,訪問WebApplication2:
[HttpGet] public?async?Task<string>?Get() {var?response?=?await?_httpClientFactory.CreateClient().GetStringAsync("http://localhost:5200/WeatherForecast");return?response; }WebApplication2
引用Nuget包,包括預發行版:
OpenTelemetry.Extensions.Hosting OpenTelemetry.Instrumentation.AspNetCore OpenTelemetry.Exporter.Zipkin Grpc.Net.Client OpenTelemetry.Instrumentation.GrpcNetClient新增配置,Endpoint對應Zipkin部署地址:
"Zipkin":?{"ServiceName":?"WebApplication2","Endpoint":?"http://192.168.1.11:9411/api/v2/spans" }修改Startup.cs:
public?void?ConfigureServices(IServiceCollection?services) {...services.AddOpenTelemetryTracing((builder)?=>?builder.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(this.Configuration.GetValue<string>("Zipkin:ServiceName"))).AddGrpcClientInstrumentation().AddAspNetCoreInstrumentation().AddZipkinExporter(zipkinOptions?=>{zipkinOptions.Endpoint?=?new?Uri(Configuration.GetValue<string>("Zipkin:Endpoint"));})); }修改WeatherForecastController.cs,訪問GrpcService1:
[HttpGet] public?async?Task<string>??Get() {var?channel?=?GrpcChannel.ForAddress("http://localhost:5300");var?client?=?new?Greeter.GreeterClient(channel);var?response?=?await?client.SayHelloAsync(new?HelloRequest?{?Name?=?"World"?});return?response.Message; }GrpcService1
引用Nuget包,包括預發行版:
OpenTelemetry.Extensions.Hosting OpenTelemetry.Instrumentation.AspNetCore OpenTelemetry.Exporter.Zipkin新增配置,Endpoint對應Zipkin部署地址:
"Zipkin":?{"ServiceName":?"GrpcService1","Endpoint":?"http://192.168.1.11:9411/api/v2/spans" }修改Startup.cs:
private?IConfiguration?Configuration?{?get;?}public?Startup(IConfiguration?configuration) {Configuration?=?configuration; } public?void?ConfigureServices(IServiceCollection?services) {...services.AddOpenTelemetryTracing((builder)?=>?builder.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(this.Configuration.GetValue<string>("Zipkin:ServiceName"))).AddAspNetCoreInstrumentation().AddZipkinExporter(zipkinOptions?=>{zipkinOptions.Endpoint?=?new?Uri(Configuration.GetValue<string>("Zipkin:Endpoint"));})); }運行效果
啟動3個應用程序:
WebApplication1 http://localhost/5100
WebApplication2 http://localhost/5200
GrpcService1? ? ? ? http://localhost/5300
訪問WebApplication1后,即可在Zipkin上查看調用鏈:
結論
使用OpenTelemetry搭配Zipkin,可以輕松實現監控WebAPI/gRPC調用鏈。
總結
以上是生活随笔為你收集整理的使用OpenTelemetry搭配Zipkin构建NetCore分布式链路跟踪 | WebAPI + gRPC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 6 中的七个 System.T
- 下一篇: 2021技术文大盘点 | 打包过去,