首页 > 其他分享 >.NET6之MiniAPI(二十八):Tracing

.NET6之MiniAPI(二十八):Tracing

时间:2022-11-30 20:44:35浏览次数:50  
标签:MiniAPI Tracing builder Jaeger OpenTracing using var NET6 tracer

  Log,Metrics,Tracing是为服务正常运行保驾护航的三件套,前面有介绍过Log和Metrics,本篇说明说一下Tracing。Tracing的思路和Metrics一样,通过三方服务,来达成效果,这里选用的是Jaeger,通过在MiniAPI项目中引入Jaeger和OpenTracing的库,来向Jaeger推送跟踪数据,通过访问http://localhost:16686/search,来查看跟踪结果。

   Jaeger下载地址:

  https://www.jaegertracing.io/download/

  接来了定议两个项目,Order项目和Stock项目,Order通过httpclient调用Stock来查看商品库存,这样,两个项目就开成了一个调用链路。

Order项目

using Jaeger;
using OpenTracing.Propagation;
using OpenTracing;
using OpenTracing.Util;
using Jaeger.Samplers;
using Jaeger.Senders.Thrift;
using Jaeger.Senders;
using Jaeger.Reporters;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient();
//注入OpenTracing服务
builder.Services.AddOpenTracing();
builder.Services.AddSingleton<ITracer>(serviceProvider =>
{
    var serviceName = serviceProvider.GetRequiredService<IWebHostEnvironment>().ApplicationName;
    var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
    //配置跟踪
    Jaeger.Configuration.SenderConfiguration.DefaultSenderResolver = new SenderResolver(loggerFactory)
        .RegisterSenderFactory<ThriftSenderFactory>();  
    var tracer = new Tracer.Builder(serviceName)
        //添加日志框架
        .WithLoggerFactory(loggerFactory)
        //添加数据采集器
        .WithSampler(new ConstSampler(true))   
        .Build();
    //注册全局跟踪器
    GlobalTracer.Register(tracer);
    return tracer;
});

var app = builder.Build();

app.MapGet("/order", async (ILogger<Program> logger, IHttpClientFactory clientFactory, ITracer tracer) =>
{
    using (var scope = tracer.BuildSpan("订单系统").StartActive(true))
    {
        logger.LogInformation("订单查询库存");
        var client = clientFactory.CreateClient();
        var content = await client.GetStringAsync("http://localhost:5160/stock/D0001");
        return $"stock调用结果:{content}";
    }
});

app.Run();

Stock项目

using Jaeger;
using Jaeger.Reporters;
using Jaeger.Samplers;
using Jaeger.Senders;
using Jaeger.Senders.Thrift;
using OpenTracing;
using OpenTracing.Util;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTracing();
builder.Services.AddSingleton<ITracer>(serviceProvider =>
{
    var serviceName = serviceProvider.GetRequiredService<IWebHostEnvironment>().ApplicationName;
    var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
    Jaeger.Configuration.SenderConfiguration.DefaultSenderResolver = new SenderResolver(loggerFactory)
        .RegisterSenderFactory<ThriftSenderFactory>();
    var tracer = new Tracer.Builder(serviceName)
        .WithLoggerFactory(loggerFactory)
        .WithSampler(new ConstSampler(true))
        .Build();
    GlobalTracer.Register(tracer);
    return tracer;
});
var app = builder.Build();

app.MapGet("/stock/{no}", (string no, ILogger<Program> logger, ITracer tracer) =>
{
    using (var scope = tracer.BuildSpan("库存系统").StartActive(true))
    {
        logger.LogInformation("按{0}查询库存", no);
        return new Product { No = no, Quantity = 1324, Name = "Surface Go 3" };
    }
});
app.Run();

public class Product
{
    public string? No { get; set; }
    public string? Name { get; set; }
    public int Quantity { get; set; }
}

  用命令行运行下载的jaeger-all-in-one.exe,在浏览器或postman访问Order项目的/order地址,再进入Jaeger,查看结果:http://localhost:16686/search

 

 

 

 

 

 通过上面的UI,可以很方便地查看请求链条上的调用,当调用关系很复杂时,特别有用。

  想要更快更方便的了解相关知识,可以关注微信公众号

 

 

标签:MiniAPI,Tracing,builder,Jaeger,OpenTracing,using,var,NET6,tracer
From: https://www.cnblogs.com/ljknlb/p/16939665.html

相关文章

  • .NET6之MiniAPI(二十七):Metrics
    应用的各种Metrics是保证应用健康稳定运行的基础,特别对于一些可用性有所要求的应用,本文介绍prometheus-net这个三方指示库。prometheus-net的工作原理是,在应用内......
  • .NET6之MiniAPI(二十七):Metrics
    应用的各种Metrics是保证应用健康稳定运行的基础,特别对于一些可用性有所要求的应用,本文介绍prometheus-net这个三方指示库。prometheus-net的工作原理是,在应用内......
  • .NET6之MiniAPI(特别篇):.NET7 Preview1&2
    在写.NET6MiniAPI的时候,.NET7的新功能也在发展,这里就用特别篇把新加的特点分享给大家,本篇先说Preview1和2特点1文件上传,demo如下:varbuilder=WebApplication......
  • .NET6之MiniAPI(特别篇):.NET7 Preview1&2
    在写.NET6MiniAPI的时候,.NET7的新功能也在发展,这里就用特别篇把新加的特点分享给大家,本篇先说Preview1和2特点1文件上传,demo如下:varbuilder=WebApplic......
  • .NET6之MiniAPI(二十五):Dapper
    注:如果你使用Dapper一段时间了,这篇你可以跳过去了。在第十二篇中,我们聊过官方的ORM——EntityFramework,它可以把SQL细节都隐藏,这对于一些标准化的关系数据库项目......
  • .NET6之MiniAPI(特别篇):.NET7 Preview1&2
    在写.NET6MiniAPI的时候,.NET7的新功能也在发展,这里就用特别篇把新加的特点分享给大家,本篇先说Preview1和2特点1文件上传,demo如下:varbuilder=WebApplic......
  • .net core .net6 webapi 连接mysql 8
    1.表结构:CREATETABLE`table2`(`id`BIGINTNOTNULLAUTO_INCREMENT,`myname`varchar(255)NOTNULL,`create_time`DATETIMENOTNULL,PRIMARYKEY(`......
  • .NET6之MiniAPI(二十四):用Polly重试
    为了保障系统的稳定和安全,在调用三方服务时,可以增加重试和熔断。重试是调用一次失败后再试几试,避免下游服务一次闪断,就把整个链路终止;熔断是为了防止太多的次数的无效访......
  • .NET6之MiniAPI(二十五):Dapper
    注:如果你使用Dapper一段时间了,这篇你可以跳过去了。在第十二篇中,我们聊过官方的ORM——EntityFramework,它可以把SQL细节都隐藏,这对于一些标准化的关系数据库项目非......
  • .NET6之MiniAPI(二十四):用Polly重试
    为了保障系统的稳定和安全,在调用三方服务时,可以增加重试和熔断。重试是调用一次失败后再试几试,避免下游服务一次闪断,就把整个链路终止;熔断是为了防止太多的次数的无效......