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 

总结

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

转载注明出处:http://www.heiqu.com/57fd3e79b8983cc80de0d99a9611a15a.html