APM是一种应用性能监控工具,可以帮助理解系统行为, 用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题, 通过汇聚业务系统各处理环节的实时数据,分析业务系统各事务处理的交易路径和处理时间,实现对应用的全链路性能监测。

[1]

组成结构

探针(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 的特性,我们可以拦截需要获取数据的方法,如果你在项目中,普遍使用依赖注入的话,可以达到方法级别的监控,获取到的信息非常可观,另外需要注意的是,获取的信息越详细,数据量也越大,是全量采集数据还是抽样采集也是要考虑的点

EWT(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) 编译和代码间距调整事件。•类加载和卸载事件。•线程创建和析构事件。•函数入口和退出事件。•异常。•托管和非托管代码执行之间的转换。•不同运行时上下文之间的转换。•有关运行时挂起的信息。•有关运行时内存堆和垃圾回收活动的信息。

这可能要求你掌握 C++ 和 C#, 另外需要注意的是,Profiler 是一个非托管的 DLL 库,会在应用运行时被加载到 CLR 中并与应用处于同一进程空间下,所以 Profiler DLL 实质上是不受托管代码的访问控制的,还有,Profiler DLL 作为 CLR 的一个插件,其运行错误可能会引起 CLR 本身的崩溃,所以你必须要知道这些风险,并且足够小心,最后祝你好运

另外

HttpReports 是针对.Net Core 开发的APM系统, 基于MIT开源协议,针对于微服务场景,感兴趣的同学可以点个 Star 支持下,谢谢

Github:https://github.com/dotnetcore/HttpReports

在.NET Core 中收集数据的几种方式相关推荐

  1. es重建字段类型_关于elasticsearch中更新数据的几种方式

    作为一个成熟的框架,Elasticsearch里面提供了丰富的操作数据的api,本篇我们就来学习一下在es中更新数据的几种方式. (一)更新文档 (1)部分更新: java api: ` HashMa ...

  2. 控制器中接收数据的四种方式

    控制器中接收数据的四种方式: (仅限于个别的方式(get/post)有效) 通过形参的方式接收表单提交的数据(可以接收post与get提交的数据): 注释: GetData自己定义的方法名里面存入形参 ...

  3. 向数据库中插入数据的三种方式

    在数据库中,向数据库中插入数据,使用insert into关键字.在数据库中插入数据有三种方法. 1)插入单个字段的情况 insert into table_name(列名) values(值); 2 ...

  4. sql中删除数据的几种方式

    1.delete语句 Delete删除表数据,保留表结构,且可以加where,删除一行或多行. delete from 表名 where codition 2 .truncate 只清除数据,保留表结 ...

  5. MySQL 清空表数据的两种方式和区别

    在MySQL中删除数据有两种方式:truncate table 表名.delete from 表名. 它们在以下方面存在区别: 执行效率 truncate不扫描表,相当于重新创建了表,只保留了表的结构 ...

  6. CSDN首例Python自动化运维实战:从Linux系统中收集数据

    目录:导读 从Linux系统中收集数据 通过邮件发送收集的数据 使用time和date模块 定期运行脚本 从Linux系统中收集数据 使用Linux命令可以查看当前系统状态和运行状况的相关数据.然而, ...

  7. Servlet获取Excel中数据的两种方式

    Servlet解析Excel文件的两种方式 简单分享一下Servlet通过解析Excel文件得到其中数据的两种方式 第一种:前端获取 思路:通过layui的第三方插件 layui.excel 解析ex ...

  8. html中获取modelandview中的json数据_从Bitmap中获取YUV数据的两种方式

    从Bitmap中我们能获取到的是RGB颜色分量,当需要获取YUV数据的时候,则需要先提取R,G,B分量的值,然后将RGB转化为YUV(根据具体的YUV的排列格式做相应的Y,U,V分量的排列) 所以这篇 ...

  9. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

最新文章

  1. php怎样指定主页,如何修改apache指定主页
  2. 手工接口测试考虑的点
  3. mysql 优化(一)
  4. Android adb.exe程序启动不起来处理方法
  5. 一文搞定Swing和Qt按钮和文本框的创建
  6. stream去重_重复数据如何处理?List集合去重的四种方式
  7. 原创 | 我说我了解集合类,面试官竟然问我为啥HashMap的负载因子不设置成1!?...
  8. 自然语言处理中的词性标注全称
  9. 开关电源入门1-基本原理
  10. android三国2,三国演义2单机版安卓
  11. 【自学Python:Day3】放假的心该怎么冷静下来学……
  12. B 站顶流何同学对话苹果 CEO 库克
  13. 关系型数据库中一对多,多对一,多对多关系(详细)
  14. Java freemarker 生成word文档
  15. 电商平台订单号生成策略
  16. amp;#9733;电车难题的n个坑爹变种
  17. Ubuntu下完全卸载nginx服务器
  18. 基于Java的项目人力资源管理系统【附:源码课件】
  19. Spring入门须知
  20. bilibili go框架_当红语言只认Go!趣头条技术沙龙聚焦Golang应用热点

热门文章

  1. Generative Adversarial Learning Towards Fast Weakly Supervised Detection(CVPR2018)阅读笔记
  2. pycharm中如何正确配置pyqt5
  3. 通过修改然后commit的方式创建自己的镜像
  4. 使用myeclipse建立maven项目(重要)
  5. WinHEC(Windows硬件project产业创新峰会)将2015回归
  6. Ant—使用Ant构建一个简单的Java工程(两)
  7. Struts 2.x No result defined for action 异常
  8. Asp.Net+Jquery.Ajax详解5-$.getScript
  9. Mysql-高可用集群[MyCat中间件使用](三)
  10. oneproxy检测主从复制同步延迟