济宁市住房和城乡建设局网站,百度小程序如何做网站,工装设计案例网站,wordpress get_header前言最新一直在忙着项目上的事情#xff0c;很久没有写博客了#xff0c;在这里对关注我的粉丝们说声抱歉#xff0c;后面我可能更多的分享我们在微服务落地的过程中的一些经验。那么今天给大家讲一下在 .NET Core 2 中引入的全新 DiagnosticSource 事件机制#xff0c;为什… 前言最新一直在忙着项目上的事情很久没有写博客了在这里对关注我的粉丝们说声抱歉后面我可能更多的分享我们在微服务落地的过程中的一些经验。那么今天给大家讲一下在 .NET Core 2 中引入的全新 DiagnosticSource 事件机制为什么说是全新呢 在以前的 .NET Framework 有心的同学应该知道也有 Diagnostics那么新的 .NET Core 中有什么变化呢 让我们一起来看看吧。DiagnosticsDiagnostics 一直是一个被大多数开发者忽视的东西我猜测很多同学看到这里的时候可能还是第一次听说 Diagnostics 这个东西为什么会被忽视呢 我们等会说我们先来看一下 Diagnostics 是用来做什么的。Diagnostics 是什么呢让我们把时间往前拉回到 2013 年 8 月微软在 NuGet 发布了一个新的关于 Diagnostics 的包叫做 Microsoft.Diagnostics.Tracing.TraceEvent这个包用来为 Windows 事件追踪ETW提供一个强大的支持使用这个包可以很容易的为我们在云环境和生产环境来提供端到端的监控日志事件记录它轻量级高效并且可以和系统日志进行交互。PS通过这个包我们可以获取到 CLR 运行的一些细节信息由于本篇主题对此不介绍过多了。看到这个包提供的功能那么博主就自己总结一下对 Diagnostics 下个定义 在应用程序出现问题的时候特别是出现可用性或者性能问题的时候开发人员或者IT人员经常会对这些问题花费大量的时间来进行诊断很多时候生产环境的问题都无法复现这可能会对业务造成很大的影响Diagnostics 就是提供一组功能使我们能够很方便的可以记录在应用程序运行期间发生的关键性操作以及他们的执行时间等使管理员可以查找特别是生产环境中出现问题所在的根本原因。有同学可能会说了这不就是 APM(Application Performance Management) 么嗯从宏观的角度来说这属于APM的一部分但 APM 不仅仅只有这些。.NET Framework 之 EventSource在上面我们了解到了 Microsoft.Diagnostics.Tracing.TraceEvent那么相关搭配使用的还有两个 NuGet 包就是 Microsoft.Diagnostics.Tracing.EventSource 这个包那我就简单讲一下我不准备在这个部分讲述太多毕竟已经被替换掉了我们来看下 EventSource。EventSource在 .NET Framework 中 EventSource 通过 Windows ETW 提供的 ETW Channels 与其进行集成下面给出一个示例代码[EventSource(Name Samples-EventSourceDemos-Minimal)]public sealed class MinimalEventSource : EventSource{ // Define singleton instancepublic static MinimalEventSource Log new MinimalEventSource(); // Define Event methodspublic void Load(long baseAddress, string imageName) { WriteEvent(1, baseAddress, imageName);}
}那么在 ETW 中我们就可以看到相关的事件信息了注意在 .NET Framework 4.5 以及更高版本EventSource 已经被集成到了 System 命名空间。学习也是一个总结的过程对此我们也许可以总结出来一个比较重要的信息就是通过 Diagnostics 的命名空间变化由 Microsoft 变为了 System 我们可以看到 Diagnostics 对于我们的应用程序来说变得更加重要了。由于 EventSource 只支持 Windows所以在全新的 .NET Core 中它已经被悄悄的取代了下面我们来看一下全新的 DiagnosticSource。.NET Core 之 全新 DiagnosticSource在 .NET Core 中 .NET 团队设计了一个全新的 DiagnosticSource新的 DiagnosticSource 非常的简单它允许你在生产环境记录丰富的 payload 数据然后你可以在另外一个消费者可以消费感兴趣的记录是不是听着有点懵逼没关系等会我再详细说。我们先来说说 DiagnosticSource 和上面的 EventSource 的区别他们的架构设计有点类似主要区别是 EventSource 它记录的数据是可序列化的数据会被在进程外消费所以要求记录的对象必须是可以被序列化的。而 DiagnosticSource 被设计为在进程内处理数据所以通过它可以拿到更加丰富的一些数据信息它支持非序列化的对象比如 HttpContext , HttpResponseMessage 等。如果你想在 EventSource 中获取 DiagnosticSource 中的事件数据你可以通过 DiagnosticSourceEventSource 这个对象来进行数据桥接。下面我们来看一下在代码中如何使用 DiagnosticSource对象。在这之前我们需要了解另外一个对象 DiagnosticListenerDiagnosticListener 从命名上来看它是一个监听诊断信息的对象它确实是一个用来接收事件的类在 .NET Core 中 DiagnosticSource 它其实是一个抽象类定义了记录事件日志所需要的方法那么我们在使用的时候就需要使用具体的对象DiagnosticListener 就是 DiagnosticSource 的默认实现明白了吧。好了现在我们来看一下如何使用吧。生成 Diagnostic 日志记录如何生成 Diagnostic 日志记录呢首先我们需要创建一个 DiagnosticListener 对象比如private static DiagnosticSource httpLogger new DiagnosticListener(System.Net.Http);DiagnosticListener 参数中的名称即为需要监听的事件组件名称这个名称在以后会被用来被它的消费者所订阅使用。DiagnosticSource 其核心只包含了两个方法分别是 bool IsEnabled(string name)void Write(string name, object value);那么然后我们可以这样来调用if (httpLogger.IsEnabled(RequestStart)){httpLogger.Write(RequestStart, new { Urlhttp://clr, RequestaRequest });
}IsEnabled(string param1) 这个方法用来判断是否有消费者注册了当前的事件组件名称监听通常有消费者关心了相关数据我们才会进行事件记录。Write(string param1,object param2) 这个方法用来向 DiagnosticSource 中写入日志记录param1 和上面一样用来指定名称的也就是所向指定名称中写入数据param2 即为写入的 payloads 数据你可以使用 匿名类型来向 param2 中写入数据这样会方便很多。这样我们就已经把 Diagnostic 事件日志写入到 DiagnosticSource中了是不是很简单 我们再看一下如何进行消费监听这些事件信息。监听 Diagnostic 日志记录在监听 Diagnostic 日志记录之前你需要知道你要关心的事件数据名称那么如果仅仅是在代码中把 DiagnosticListeners 都写死到监听的消费者代码中的话这样就太不灵活了所以这里设计了一个机制用来发现中那些在运行时被激活的DiagnosticListeners。你可以使用 DiagnosticListener.AllListeners 来获取一个 IObservableDiagnosticListener对象IObservable接口大家应该都不陌生了吧不太清楚的可以看这里然后通过其Subscribe方法进行OnNext“回调”关心的事件数据。示例代码static IDisposable networkSubscription null;// 使用 AllListeners 来获取所有的DiagnosticListeners对象传入一个IObserverDiagnosticListener 回调static IDisposable listenerSubscription DiagnosticListener.AllListeners.Subscribe(delegate (DiagnosticListener listener){ // 当 DiagnosticsListener 激活的时候这里将获得一个回调用 if (listener.Name System.Net.Http) { // 订阅者监听消费代码 lock(allListeners) { if (networkSubscription ! null) networkSubscription.Dispose(); //回调业务代码 ActionKeyValuePairstring, object callback (KeyValuePairstring, object evnt) Console.WriteLine(From Listener {0} Received Event {1} with payload {2}, networkListener.Name, evnt.Key, evnt.Value); //创建一个匿名Observer对象 ObserverKeyValuePairstring, object observer new AnonymousObserverKeyValuePairstring, object(callback); //筛选你感兴趣的事件 Predicatestring predicate (string eventName) eventName RequestStart; networkSubscription listener.Subscribe(observer, predicate); } }});// 通常情况下这里你需要保持 listenerSubscription 始终处于激活状态// 如果你像取消回调你可以调用 listenerSubscription.Dispose() 来取消订阅者通过这种方式我们就可以在触发回调的之后做一些我们想要的操作了。是不是发现上面的那种写法有点麻烦和丑陋ASP.NET 团队考虑到了所以为我们封装了一个适配器的库来方便我们进行监听的一些操作你可以通过打 attribute 标记的方式来进行相关事件的订阅有兴趣的同学可以看下这个Microsoft.Extensions.DiagnosticAdapte NuGet 包。现在我们已经可以拿到数据了有同学可能会说在生产环境数据这么多这些数据我存到哪里又怎么样来处理呢我不可能一条一条的来找性能在哪里吧OK我们接着往下看。为你的框架支持 Diagnostics随着微服务的流行服务的链路追踪以及应用程序的性能问题变得越来越重要而 APM 也成为了整个微服务架构中很重要的一个中间件它可以协助我们快速查找生产环境中所遇到的问题以及在应用程序发生异常的时候收集异常运行时的上下文信息来快速排查问题。对 Google 的 Dapper 或者 OpenTracing 协议有了解的同学应该已经想到了我们可以利用上面的那些数据按照这些协议的约定进行包装然后发送到支持这些协议的 APM 的服务端剩下的工作是不是可以由这些服务端来帮助我们处理了包括图形化展示性能查看调用链查看等。大多数的开源APM项目都支持 Dapper 或者 OpenTracing 协议如 Apache SkyWalking , ZipKinpinpoint 等。 顺便说一句我们 NCC开源项目组 的 Lemon 同学正在给 SkyWalking 写 C# 的 客户端驱动项目 这是一项非常具有挑战性的工作感兴趣的同学可以 Star 一下。相信阅读本篇文章也有不少的架构师开源项目作者框架开发者甚至应用程序开发者那么我建议可以从现在开始对你的项目提供 Diagnostics 支持目前 .NET Core 中 CoreFx , ASP.NET Core, EntityFramework Core 都已经对 Diagnostics 提供了支持。CAP 在 2.2 版本中已经对 Diagnostics 提供了支持。CAP 中的 DiagnosticsCAP: https://github.com/dotnetcore/CAPCAP 是我的一个开源项目用来处理在微服务或者SOA架构中分布式事务的一个解决方案你可以在这篇文章中看到更多关于 CAP 的介绍喜欢的同学可以给个 Star 也是我继续做的更好的动力谢谢。CAP 对外提供的事件监听者名称为 CapDiagnosticListenerCAP 中的 Diagnostics 提供对外提供的事件信息有消息持久化之前消息持久化之后消息持久化异常消息向MQ发送之前消息向MQ发送之后消息向MQ发送异常消息从MQ消费保存之前消息从MQ消费保存之后订阅者方法执行之前订阅者方法执行之后订阅者方法执行异常相关涉及到的对象你可以在 DotNetCore.CAP.Diagnostics 命名空间下看到。基于这些对外的事件数据我们可以来对接APM下面这个是我对接的 ZipKin 的一个图总结通过本篇文章我们知道了 .NET Core 中为我们提供的一个新的事件数据记录对象DiagnosticSource 通过这个对象我们可以对外提供一些诊断信息以便于在生产环境中对我们的应用程序进行性能问题排查和调用链跟踪然后我们知道了一下CAP对外提供的一些Diagnostics事件。原文地址 https://www.cnblogs.com/savorboard/p/diagnostics.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com