在.NET Core 中收集数据的几种方式

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 连接池连接mysql数据库需要哪些jar包_DBCP-基于Java8导入DBCP连接池所需JAR包并编写DBCPUtils工具类...

上述五个jar包缺一不可下载解压后,进入解压出的文件夹将这五个jar包复制出来放入自己创建的myJar文件夹中(myJar文件夹创建与说明)接下来就可以在工程中进行使用package utils;import com.mysql.cj.jdbc.Driver;import org.apache.commons.dbcp2.BasicDataSource;import java.s…

C# 在自定义的控制台输出重定向类中整合调用方信息

C# 在自定义的控制台输出重定向类中整合调用方信息目录C# 在自定义的控制台输出重定向类中整合调用方信息一、前言二、输出重定向基础版三、输出重定向进阶版(传递调用方信息)四、后记及资源独立观察员 2021 年 1 月 6 日一、前言众所周知,在…

mac 上mysql怎么卸载不了_mac的mysql怎么卸载?

Mac下卸载mysql的方法:1、关闭mysql查看mysql是否启动:ps -ef |grep mysql输入:kill -9 (./mysqld前面第二个数字,这里是627) 然后回车,关闭mysql。2、卸载:在Mac终端使用下面的命令删除所有mysql文件即可s…

C#实现网页加载后将页面截取成长图片

背景最近再做一个需求,需要对网页生成预览图,如下图但是网页千千万,总不能一个个打开,截图吧;于是想着能不能使用代码来实现网页的截图。其实要实现这个功能,无非就是要么实现一个仿真浏览器,要…

“既然计划没有变化快,那制订计划还有个卵用啊!”

这是头哥侃码的第229篇原创每年年初,我的朋友圈里都会炸出不少在打完鸡血之后,迫不及待向全世界宣告自己 “新年Flag” 的人。有的人,把健身、养生设为目标,什么不暴瘦20斤不换头像呀,什么再也不吃炸鸡啤酒啦&#xff…

图书管理系统jsp代码_【程序源代码】使用Java开发的图书管理系统

关键字:java 管理系统 正文 | 内容01—【概述】使用Java开发的图书管理系统,读者可以注册登录,登录时会判断账号类型再分别跳到各自对应的页面,读者可以查找,借阅,还书,查看历史借阅记录&#x…

整合.NET WebAPI和 Vuejs——在.NET单体应用中使用 Vuejs 和 ElementUI

.NET简介.NET 是一种用于构建多种应用的免费开源开发平台,例如:Web 应用、Web API 和微服务云中的无服务器函数云原生应用移动应用桌面应用1). Windows WPF2). Windows 窗体3). 通用 Windows 平台 (UWP)游戏物联网 (IoT)机器学习控制台应用Windows 服务跨…

【gRPC】 在.Net core中使用gRPC

最近在学习.net core的微服务体系架构。微服务之间的通信常常通过gRPC进行同步通信,但是需要注意的是,大多数微服务之间的通信是通过事件总线进行异步通信。在微软介绍.net微服务体系架构的项目eShop中,微服务之间进行同步通信的场景很多&…

disconf mysql_Docker搭建disconf环境,三部曲之三:细说搭建过程

Docker下的disconf实战全文链接细说搭建过程在前两章中,我们利用远程或本地的镜像,快速体验了本地启动disconf的过程,本章我们一起来分析和梳理整个定制和搭建过程,了解这些后,我们就能根据自己的需要来定制本地的disc…

轻量级 Kubernetes K3s - Github热点

轻量级 Kubernetes k3sstar: 15.5kK3s是完全符合生产要求的Kubernetes发行版, 安装简单,可用于生产,整个二进制文件小于100M,作为单一文件打包部署,优势在于,你只需几秒钟就可以得到一个完全成熟的Kubernetes集群。htt…

java 固定长度队列_如何彻底搞懂 Java 数据结构?|CSDN 博文精选

作者 | 张振华.Jack责编 | 郭芮出品 | CSDN 博客本文和大家一起来重温《Java数据结构》经典之作。Java数据结构要理解Java数据结构,必须能清楚何为数据结构?数据结构:Data_Structure,它是储存数据的一种结构体,在此结构…

IdentityServer4 之 Resource Owner Password Credentials 其实有点尴尬

前言接着IdentityServer4的授权模式继续聊,这篇来说说 Resource Owner Password Credentials授权模式,这种模式在实际应用场景中使用的并不多,只怪其太开放啦,直接在客户端上拿着用户名和密码就去授权服务器获取AccessToken&#…

Xamarin使XRPC实现接口/委托远程调用

在之前的文章中已经介绍如何使用Beetlex.XRCP组件进行接口/委托远程调用;由于组件BeetleX.XRPC.Clients支持.NETStandard2,因此Xamarin同样可以使用它来实现基于接口/委托的数据交互通讯。接下来通过Xamarin实现一个简单的移动程序,并通过XRP…

mysql 拷贝安装_Mysql的安装和主从复制

安装mysql服务步骤一:首先下载mysql的yum源配置 ,下载mysql的yum源wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm步骤二:安装mysql的yum源yum -y install mysql57-community-release-el7-11.noarch.rpm步骤三&…

浅谈CLR基础知识

中午的时候,有一个小伙伴问我,CLR到底是进程还是线程,它和自己写的程序是怎么关联的。这一问,直接把我问懞了。下面我尝试用简单的语言来描述这个问题,有的地方无法讲的太细(不然内容会太多)&am…

Asp.Net Core使用Skywalking实现分布式链路追踪

介绍Skywalking 是 Apache 基金会下面的一个开源 APM 项目,是一套(APM)分布式追踪系统,提供了很多数据存储列如:Mysql,H2,Elasticsearch7 等。其中APM 全称是应用性能监测软件,主要是用来处理以及追踪分布式…

python 里什么时候缩进_python什么时候缩进

Python中的缩进(Indentation)决定了代码的作用域范围。这一点和传统的c/c有很大的不同(传统的c/c使用花括号花括号{}符决定作用域的范围;python使用缩进空格来表示作用域的范围,相同缩进行的代码是处于同一范围)。每行代码中开头的空格数(whitespace)用于…

C# 9 新特性 —— 补充篇

C# 9 新特性 —— 补充篇Intro前面我们分别介绍了一些 C# 9 中的新特性,还有一些我觉得需要了解一下的新特性,写一篇作为补充。Top-Level Statements在以往的代码里,一个应用程序必须要有 Main 方法才能运行,从 C# 9 开始&#xf…

使用Popup窗口创建无限级Web页菜单(5)

代码框架在(4)里面已经全部列出来了,现在工作就是按流程把他们完成。本来实现一个prototype的Menu菜单类只需要最多300行代码,可是后来做了一些操作习惯支持和UI显示上的优化后,代码猛增到了1000多行。不过final版本看起来确实比土不拉叽的pr…

【gRPC】ProtoBuf 语言快速学习指南

继上篇【gRPC】 在.Net core中使用gRPC了解了gRPC的使用,gRPC基于HTTP/2和ProtoBuf,ProtoBuf就非常有必要好好了解一下了,那么ProtoBuf究竟是什么?ProtoBuf Google Protocol Buffer是一种语言无关、平台无关、可扩展的序列化结构数…