上一篇定义了两种使用Jaeger的方式:中间件和action过滤器,下面这个例子定义了两个服务 WebAPI01,请求WebAPI02,采用的是中间件的请求方式。
引入JaegerSharp包(或发布到自己的Nuget库里引用)
WebAPI01的Startup
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" });});//添加OpenTracingservices.AddOpenTracing();//注入Jaegerif (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.json
{"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调用,继续配置调用。
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结果如下,链路清晰