上一篇定義了兩種使用Jaeger的方式:中間件和action過濾器,下面這個例子定義了兩個服務 WebAPI01,請求WebAPI02,採用的是中間件的請求方式。json
引入JaegerSharp包(或發佈到本身的Nuget庫裏引用)app
WebAPI01的Startupasync
using JaegerSharp; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.OpenApi.Models; using System; namespace WebAPI01 { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { //命名客戶端 services.AddHttpClient("WebAPI02", client => { client.BaseAddress = new Uri(Configuration.GetSection("DownStreamUrl").Value); }); services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebAPI01", Version = "v1" }); }); //添加OpenTracing services.AddOpenTracing(); //注入Jaeger if (Convert.ToBoolean(Configuration.GetSection("OpenTracing:Enable")?.Value)) { var agentHost = Configuration.GetSection("OpenTracing:Agent").GetValue<string>("Host"); var agentPort = Configuration.GetSection("OpenTracing:Agent").GetValue<int>("Port"); var agentMaxPacketSize = Configuration.GetSection("OpenTracing:Agent").GetValue<int>("MaxPacketSize"); services.AddJaegerSharp(agentHost, agentPort, agentMaxPacketSize); } } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebAPI01 v1")); } app.UseHttpsRedirection(); if (Convert.ToBoolean(Configuration.GetSection("OpenTracing:Enable")?.Value)) { app.UseJaegerSharp(); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } }
WebAPI01的appsettings.jsonide
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "OpenTracing": { "Enable": true, "Agent": { "Host": "localhost", "Port": 6831, "MaxPacketSize": 0 } }, "DownStreamUrl": "https://localhost:6001" }
調用下游服務 WebAPI02,下游服務 WebAPI02與WebAPI01相似,須要引入JaegerSharp,添加配置文件,指向同一個Jaeger的host,若是WebAPI02有下游API調用,繼續配置調用。ui
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System.Net.Http; using System.Threading.Tasks; namespace WebAPI01.Controllers { [ApiController] [Route("[controller]")] public class HomeController : ControllerBase { private readonly IHttpClientFactory _clientFactory; private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger, IHttpClientFactory clientFactory) { _clientFactory = clientFactory; _logger = logger; } [HttpGet] public async Task<string> Get() { _logger.LogInformation("WebAPI01中請求WebAPI02"); var result = await GetWebAPI02(); return $"WebAPI01請求WebAPI02返回值 :{ result}"; } async Task<string> GetWebAPI02() { using var client = _clientFactory.CreateClient("WebAPI02"); var request = new HttpRequestMessage(HttpMethod.Get, "/home"); using var response = await client.SendAsync(request); if (response.IsSuccessStatusCode) { var result = await response.Content.ReadAsStringAsync(); return result; } else { return "error"; } } } }
下載Jaeger(https://www.jaegertracing.io/download/) ,我用的是1.21.0的Windows版本,由於個人開發環境是Windows,運行jaeger-all-in-one.exe
,再跑本身的應用,訪問完鏈路後,打開localhost:16686,查看結果以下:
查詢WebAPI01結果
點擊WebAPI01:HTTP GET 7151a0a結果以下,鏈路清晰
spa