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,目次布局如下
下载链接:链接: https://pan.baidu.com/s/1LDyoRQehaE0FzedFTC4_Og 提取码: i45x
总结