ASP.NET Core整合Zipkin链路跟踪的实现要领(4)

ITraceDiagnosticListener是我们利便操纵DiagnosticListener界说的接口,接口仅包括DiagnosticName用来暗示DiagnosticListener监听的名称,有了这个接口接下来的操纵我们会利便很多,接下来我们来看订阅操纵的实现。

public class TraceObserver :IObserver<DiagnosticListener> { private IEnumerable<ITraceDiagnosticListener> _traceDiagnostics; public TraceObserver(IEnumerable<ITraceDiagnosticListener> traceDiagnostics) { _traceDiagnostics = traceDiagnostics; } public void OnCompleted() { } public void OnError(Exception error) { } public void OnNext(DiagnosticListener listener) { //这样的话我们可以更轻松的扩展其他DiagnosticListener的操纵 var traceDiagnostic = _traceDiagnostics.FirstOrDefault(i=>i.DiagnosticName==listener.Name); if (traceDiagnostic!=null) { //适配订阅 listener.SubscribeWithAdapter(traceDiagnostic); } } }

通过这种操纵我们就无需体贴如何将自界说的DiagnosticListener订阅类适配到DiagnosticAdapter中去,利便我们自界说其他DiagnosticListener的订阅类,这样的话我们只需注册自界说的订阅类即可。

services.AddSingleton<TraceObserver>(); services.AddSingleton<ITraceDiagnosticListener, HttpDiagnosticListener>();

通过这种改造方法,我们可以办理雷同HttpClient封装到框架中,而且我们我们无法通过外部措施去修改配置的时候。好比我们在架构中引入了Ocelot网关,我们就可以回收雷同这种方法,在网关层集成zipkin4net。

自界说埋点

    通过上面我们查察TracingHandler的源码我们得知埋点主要是通过ClientTrace举办的,它是在提倡请求的客户端举办埋点。在处事端埋点的方法我们可以通过TracingMiddleware中间件中的源码查察到[点击查察源码👈]叫ServerTrace。有了ClientTrace和ServerTrace我们可以很是轻松的实现一次完整的客户端和处事端埋点,只需要通过它们打上一些标签即可。其实它们都是对Trace类的封装,我们找到它们的源码举办查察

public class ClientTrace : BaseStandardTrace, IDisposable { public ClientTrace(string serviceName, string rpc) { if (Trace.Current != null) { Trace = Trace.Current.Child(); } Trace.Record(Annotations.ClientSend()); Trace.Record(Annotations.ServiceName(serviceName)); Trace.Record(Annotations.Rpc(rpc)); } public void Dispose() { Trace.Record(Annotations.ClientRecv()); } } public class ServerTrace : BaseStandardTrace, IDisposable { public override Trace Trace { get { return Trace.Current; } } public ServerTrace(string serviceName, string rpc) { Trace.Record(Annotations.ServerRecv()); Trace.Record(Annotations.ServiceName(serviceName)); Trace.Record(Annotations.Rpc(rpc)); } public void Dispose() { Trace.Record(Annotations.ServerSend()); } }

因此,假如你想通过更原始的方法去记录跟踪日志可以回收如下方法

var trace = Trace.Create(); trace.Record(Annotations.ServerRecv()); trace.Record(Annotations.ServiceName(serviceName)); trace.Record(Annotations.Rpc("GET")); trace.Record(Annotations.ServerSend()); trace.Record(Annotations.Tag("http.url", "<url>"));

示例Demo

由于上面说的较量多,并且有一部门关于源码的解读,为了防备由本人文笔有限,给各人带来领略误区,另一方面也为了更清晰的展示Zipkin的集成方法,我本身做了一套Demo,目次布局如下

ASP.NET Core整合Zipkin链路跟踪的实现方式

ApiGateway为网关项目可以转发针对OrderApi的请求,OrderApi和ProductApi用于模仿业务系统,这三个项目都集成了zipkin4net链路跟踪,他们之间是通过Nacos实现处事的注册和发明。这个演示Demo我当地是可以直接运行乐成的,假如有下载下来运行不乐成的,可以评论区给我留言。由于博客园有文件上传巨细的限制,所以我将Demo上传到了百度网盘中
下载链接:链接: https://pan.baidu.com/s/1LDyoRQehaE0FzedFTC4_Og 提取码: i45x 

总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdffd.html