共计 2058 个字符,预计需要花费 6 分钟才能阅读完成。
APM 是一种利用性能监控工具,能够帮忙了解零碎行为, 用于剖析性能问题的工具,以便产生故障的时候,可能疾速定位和解决问题, 通过汇聚业务零碎各解决环节的实时数据,剖析业务零碎各事务处理的交易门路和解决工夫,实现对利用的全链路性能监测。
组成构造
- 探针(Agent):负责在客户端程序运行时搜寻服务调用链路信息,发送给收集器
- 收集器(Collector):负责将数据格式化,保留到存储器
- 存储器(Storage):保留程序数据
- UI 界面(Dashboard):多维度展现数据
本文会次要针对 探针(Agent),分享下在.NET 程序中收集程序数据的几种形式,如果须要自研 APM 零碎或者收集数据来进行系统分析,心愿能能够给大家一些帮忙,以下几种形式,大家能够针对本人的场景去抉择,咱们的目标只是收集数据。
手动埋点
手动埋点比较简单,咱们须要在一些操作前后能够手动包裹咱们的埋点代码,比方 Http,RPC,DB, MQ 等调用,非常灵活,能够在任意的中央增加咱们的埋点信息,而后汇总数据,按零售送,毛病是对程序的侵入性较高,不太优雅。
Middleware 中间件 & 过滤器 Filter
得益于 .NET Core 优良的框架设计, 它具备一个极具扩展性的申请解决管道,咱们能够通过这个管道的定制来满足各种场景下的 HTTP 解决需要。ASP. NET Core 利用的很多个性,比方路由、认证、会话、缓存等,也同时定制音讯解决管道来实现的,所以咱们须要编写自定义的拦挡中间件 InterceptMiddleware,获取到申请上下文 HttpContext, 来拦挡所有的 Http 申请收集数据,留神这里中间件的地位要放到 UseEndpoints() 的下面,同样能够借助 过滤器 AcitonFilter,来实现同样的成果, 然而这种形式可获取的信息无限,只能拦挡到 Http 申请的一些信息
DiagnosticSource
实现:
SkyApm-dotnet https://github.com/SkyAPM/SkyAPM-dotnet
HttpReports APM https://github.com/dotnetcore/HttpReports
诊断 DiagnosticSource 咱们不常常用,可能都有点生疏,然而它的性能是十分弱小的,它自身是一个基于公布订阅模式的工作模式,咱们能够异步的去收集信息,比方 中间件的进入和退出,HttpClient 调用的开始和完结,并且有很多第三方的库都反对了 DiagnosticSource, 这也是微软目前举荐的形式,在改变极少代码的状况下,采集到丰盛的运行数据。
援用 AOP
额,面向切面编程,这个须要在咱们的 .NET 程序中援用 AOP 框架,如果是外部零碎的话,我觉的还是能够承受的,常见的框架 AspectCore, Castle.Core, 通过 AOP 的个性,咱们能够拦挡须要获取数据的办法,如果你在我的项目中,广泛应用依赖注入的话,能够达到办法级别的监控,获取到的信息十分可观,另外须要留神的是,获取的信息越具体,数据量也越大,是全量采集数据还是抽样采集也是要思考的点
ETW(Event Tracing for Windows)
ETW 是 Event Tracing for Windows 的简称,它是 Windows 提供的原生的事件跟踪日志零碎。因为采纳内核(Kernel)层面的缓冲和日志记录机制,所以 ETW 提供了一种十分高效的事件跟踪日志解决方案。
这个库我还没怎么用过,生而为人,我很道歉 〒▽〒
Mono.Cecil
Mono.Cecil:一个可加载并浏览现有程序集并进行动静批改并保留的.NET 框架,Mono Cecil 非常弱小,能够动态注入程序集(注入后生成新的 dll 程序集)和动静注入程序集(注入后不扭转目标程序集,只在运行时改变程序集行为,腾讯开源的 Unity 热更解决方案 xLua 有一个十分吸引人的个性就是 Hotfix,其原理是应用 Mono.Cecil 库对进行 C# 层编译进去的 dll 程序集进行 IL 代码注入。
CLR Profiling API
实现
听云 APM(商业)OneAPM(商业)Datadog(商业)
https://docs.microsoft.com/en-us/archive/blogs/yirutang/clr-profiling-api
这个真的是一个很棒的计划,你能够看到,很多的 商业 APM 零碎,都采纳了这种形式,因为它是一种无侵入的收集形式,CLR Profiling (剖析) API 是 CLR 中最酷的货色之一,剖析 API 提供 CLR 中产生的各种事件和操作的相干信息,你能够应用此信息来监督过程的外部工作状况,也可剖析 .NET 应用程序的性能
反对的性能如下:
- CLR 启动和敞开事件。
- 应用程序域创立和敞开事件。
- 程序集加载和卸载事件。
- 模块加载和卸载事件。
- COM vtable 创立和析构事件。
- 实时 (JIT) 编译和代码间距调整事件。
- 类加载和卸载事件。
- 线程创立和析构事件。
- 函数入口和退出事件。
- 异样。
- 托管和非托管代码执行之间的转换。
- 不同运行时上下文之间的转换。
- 无关运行时挂起的信息。