Dotnet全平台下APM-Trace探索

随着支撑的内部业务系统越来越多,向着服务化架构进化,在整个迭代过程中,会逐渐暴露出以下问题。

  1. 传统依赖于应用服务器日志等手段的排除故障原因的复杂度越来越高,传统的监控服务已经无法满足需求。

    终端--> Nginx --> IIS --> Asp.net 管道 --> [数据缓存]->[HTTP调用]->[DB读写]在以上调用链路上,我们以往勉强能从 Nginx 日志中分析出 客户端调用时长,Nginx 调用API服务时长。
    但是到了应用程序代码,对于[数据缓存]->[HTTP调用]->[DB读写]等操作,变成了链路调用黑盒。
  2. 在出现性能问题定位,也严重依赖高级工程师经验,定位困难,指标不明确。

  3. 在分析整个应用调用链路,不能清晰、直观的分析展现。

0|1度量(Metrics),跟踪(Tracing),日志(Logging)



Logging,Metrics 和 Tracing 有各自专注的部分。

  • Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。

  • Metrics - 用于记录可聚合的数据。例如,队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP 请求个数可被定义为一个计数器,新请求到来时进行累加。

  • Tracing - 用于记录请求范围内的信息。例如,一次远程方法调用的执行过程和耗时。它是我们排查系统性能问题的利器。

640?wx_fmt=png

详细阅读,参考度量(Metrics),跟踪(Tracing),日志(Logging)

这三者的交集,才是对于我们分析应用程序运行状态及调用链路分析,有这直观重要的意义。

日志(Logging),可以使用ELK技术栈,解决我们的应用程序日志查询分析的大部分需求。

度量(Metrics),可以使用AppMetrics 和 Prometheus 来满足一部分需求。

跟踪(Tracing),全链路的调用分析追踪,目前解决方案大部分也是商业解决方案,如Application Insights、OneAPM、听云、Datadog等,开源方案,如SkyAPM (.net core适用)

目前,针对 .net 平台下探针的解决方案进行调研,大部分是付费,开源方案大部分针对 .net core。

有没有一种可能,我们使用开源技术,搭建自己的全链路调用分析的解决方案,这是本篇博文需要探索的议题。

我们将带着以下几个问题,进行探索解决方案

  1. 我们基于什么标准规范来收集指标?

  2. 出于保护企业现有投资的情况下,我们需要针对Full Framework(.net Framework、.net core)下进行支持,也可以考虑公有云应用监控。

  • 代码级定位性能问题

  • 记录应用错误过程

  • 检测慢SQL语句

  • 检测外部调用API耗时

  • 检测调用外部HTTP请求耗时,请求信息记录

  • 请求/RPC 调用关系拓扑

  1. 基于什么架构来搭建,有哪些组件可用,能不能达到商业解决方案的相差无几的解决方案?

  2. 用什么的技术来实现?

跟踪(Tracing)标准 OpenTracking

OpenTracking 为监测提供了一组标准的框架无关、厂商无关的标准规范,这意味着开发者能够很方便的添加/切换跟踪系统

简单说,OpenTracking 提供了一组规范,也是分布式跟踪系统的标准的抽象,来解决不同的分布式追踪系统的API标准的不兼容问题。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。

更多关于 OpenTracing 数据模型的知识,请参考 OpenTracing语义标准。

技术探索

分布式追踪系统,由追踪器(Tracker)、追踪信息收集代理(Agent)、追踪信息存储分析服务(APM Server)组成。

追踪器(Tracker):负责应用程序监控(代码级别执行时间、异常调用)
追踪信息收集代理(Agent):负责应用程序监控信息上报
追踪信息存储分析服务(APM Server):负责存储应用程序监控信息存储分析展示等服务

追踪器(Tracker)

代码埋点是实现Tracker重要一步。

如果在业务代码中实现追踪埋点,不但工程量大,而且代码入侵严重。

var tracker = Tracker.Instance;using(var context = tracker.Begin())
{    context.SetSpan("name of span");    /// some business logiccontext.EndSpan();tracker.Send(context); }

为了实现dotnet全平台下(Framework、dotcore)追踪,我们需要清楚C#代码是如何变成机器可运行的代码。

  • 第一步,C# 编译生成中间语言 IL

  • 第二步,中间语言IL 通过CLR的即时编译JIT,编译成Native Code

我们只能通过,在CLR即时编译 IL之前,修改已生成的IL,来实现代码埋点。这样以来,我们便可以轻松的实现零入侵业务代码。

如何实现修改已生成的IL ? 我们通过实现CLR公共语言运行时ICorProfilerCallback 中重写JITCompilationStarted 方法即可实现。

在dotnet core 下通过DiagnosticSource 实现,应用程序性能诊断

DiagnosticSource VS EventSource

  • EventSource,只支持Windows,主要记录可序列化的数据,被进程意外的消费。

  • DiagnosticSource,支持 .net core下,主要在进程内处理数据,可以支持非序列化的对象,比如HttpConext,HttpResponse。

  • 如果在 EventSource 中获取 DiagnosticSource 中的事件数据,可以通过 DiagnosticSourceEventSource 这个对象来进行数据桥接。

0|1Further Reading



  • Apache SkyWalking 为.NET Core带来开箱即用的分布式追踪和应用性能监控

  • 开放分布式追踪(OpenTracing)入门与 Jaeger 实现

  • 几种分布式调用链监控组件的实践与比较(一)实践

  • 在 .NET Core 中使用 DiagnosticSource 记录跟踪信息

  • CLR公共运行时下性能分析Profiling

  • .NET ClrProfiler ILRewrite实现对应用的跟踪和分析

  • .NET运行时中的监测和可观测性 [英文版]

  • Jaeger vs Apache Skywalking

  • Profiling API PR

原文地址:https://www.cnblogs.com/yankliu-vip/p/how-to-implement-apm-tracer-on-dotnet.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


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

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

相关文章

部署Chart应用并使用.net core读取Kubernetes中的configMap

上一篇文章讲了 k8s使用helm打包chart并上传到腾讯云TencentHub,今天就讲一下使用Helm部署应用并使用configMap代替asp.net core 中的appsettings.json文件。把Chart上传到TencentHub之后,我们就可以通过腾讯云的容器服务,直接部署Helm应用了…

EFCore Lazy Loading + Inheritance = 干净的数据表 (一)

前言α角 与 β角关于α角 与 β角的介绍,请见上文 如何用EFCore Lazy Loading实现Entity Split。本篇会继续有关于β角的彩蛋在等着大家去发掘。/斜眼笑其他本篇的程序,可以在 https://github.com/kentliu2007/EFCoreDemo/tree/master/InheritanceWithE…

程序员过关斩将--快速迁移10亿级数据

菜菜呀,咱们业务BJKJ有个表数据需要做迁移程序员主力 Y总现在有多少数据?菜菜大约21亿吧,2017年以前的数据没有业务意义了,给你半天时间把这个事搞定,绩效给你A程序员主力 Y总有绩效奖金吗?菜菜钱的事你去问…

CodeForces - 76E Points

CodeForces - 76E Points 题意&#xff1a; 给你n个点的坐标&#xff0c;求所有一对点之间的距离的平方和 n<100000 题解&#xff1a; 直接暴力n2肯定不行&#xff0c;我们把这个的式子列出来&#xff1a; 代码&#xff1a; #include<bits/stdc.h> #define deb…

模板:Miller-RabinPollard-Rho(数论)

所谓 pollard-rho&#xff0c;就是泼辣的肉 &#xff08;逃&#xff09; 前言 许多题解都把这两个算法放在了一起。 那我也这样办吧&#xff01; miller-rabin可以在优秀的时间复杂度内完成对一个数的素性检测。 而pollard-rho则是立足于Miler-rabin之上&#xff0c;可以在 …

Asp.NetCore轻松学-部署到 Linux 进行托管

前言上一篇文章介绍了如何将开发好的 Asp.Net Core 应用程序部署到 IIS&#xff0c;且学习了进程内托管和进程外托管的区别&#xff1b;接下来就要说说应用 Asp.Net Core 的特性&#xff08;跨平台&#xff09;&#xff0c;将 .NetCore 部署到 Linux 中&#xff0c;主流的 Linu…

DevC++ 用C语言的多线程 实现简单的客户端和服务器

知识来源一&#xff1a; 使用Dev-C实现简单的客户端和服务器-CSDN博客 此先生的博客使用的是win32 SDK来创建多线程&#xff0c;然后鄙人对这个版本的多线程细节不明。于是又重新用C语言的线程替代win32API,以此继续学习服务器代码。 知识来源二&#xff1a;DevC 多线程创建…

从初创公司的角度来看微服务

在开展微服务的过程中&#xff0c;了解要考虑哪些因素可能是非常有挑战性的事情。没有可以直接使用的金科玉律。每个过程都是不同的&#xff0c;因为每个组织面临的都是不同的环境。在本文中&#xff0c;我将从初创公司的角度分享我们学习到的经验和面临的挑战&#xff0c;以及…

MySQL 集群方案介绍

mysql集群方案这里介绍2种&#xff0c;PXC 和 Replication。大型互联网程序用户群体庞大&#xff0c;所以架构设计单节点数据库已经无法满足需求。大家也深有体会&#xff0c;有一万人在学校网站查成绩或是选课的时候网站时常是访问不了或者相应特别特别慢。这种情况就凸显出来…

ML.NET案例详解:在.NET下使用机器学习API实现化学分子式数据格式的判定

半年前写过一篇类似的文章&#xff0c;题目是&#xff1a;《在.NET中使用机器学习API&#xff08;ML.NET&#xff09;实现化学分子式数据格式的判定》&#xff0c;在该文中&#xff0c;我介绍了化学分子式数据格式的基本知识&#xff0c;同时给出了一个案例&#xff0c;展示了如…

数据结构之线段树合并——永无乡,Lomsat gelral,Tree Rotations,Tree Rotations Escape Through Leaf

文章目录[HNOI2012]永无乡Lomsat gelral「POI2011 R2 Day2」旋转树木 Tree RotationsEscape Through Leaf线段树合并与 fhq-treap合并很类似&#xff0c;也是将两个不同根的线段树暴力合并至于时间复杂度&#xff0c;线段树合并一次是可以达到O(n)O(n)O(n)的&#xff0c;但是大…

吉特仓储管理系统--开源2018年源码

应该说今天过完&#xff0c;这个年就算真正意义上的过完了&#xff0c;没有想到的是又是在出差的路上写这样的文章。废话也不多说&#xff0c;写这篇文章主要的目的是想将去年吉特仓储管理系统开发的一个版本源代码开放出来&#xff0c;供各位开发者阅读使用。github 源代码地址…

自定义Visual Studio.net Extensions 开发符合ABP vnext框架代码生成插件[附源码]

介绍我很早之前一直在做mvc5 scaffolder的开发功能做的已经非常完善,使用代码对mvc5的项目开发效率确实能成倍的提高,就算是刚进团队的新成员也能很快上手,如果你感兴趣 可以参考 http://neozhu.github.io/MVC5-Scaffolder/#/ https://github.com/neozhu/MVC5-Scaffolder但是m…

洛谷P1650:田忌赛马(贪心)

解析 其实并不简单的一道题。 是刘汝佳老师的例题&#xff0c;搜到之后按照讲的策略写了一发。 &#xff08;由于这个策略并不完全正确&#xff0c;就不展开讲了&#xff09; 好啊&#xff01; 可是感觉讲的策略特别对&#xff0c;为什么呢&#xff1f; 原因在于&#xff0…

EFCore Lazy Loading + Inheritance = 干净的数据表 (二)

前言本篇是上一篇EFCore Lazy Loading Inheritance 干净的数据表 &#xff08;一&#xff09; 【献给处女座的DB First程序猿】 前菜 的续篇。这一篇才是真的为处女座的DB First程序猿准备的正餐。继续上一篇的话题&#xff0c;我们希望用EFCore&#xff0c;且继续使用与逻辑…

我们为什么要搞长沙.NET技术社区?

某种意义上讲&#xff0c;长沙和中国大部分内地城市一样&#xff0c;都是互联网时代的灯下黑。没有真正意义上的互联网公司&#xff0c;例如最近发布的中国互联网企业一百强中没有一家湖南或者长沙的公司就是明证。然而长沙并非没有互联网人&#xff0c;在麓谷几十万计的IT 从业…

在ASP.NET Core中使用EPPlus导入出Excel文件

这篇文章说明了如何使用EPPlus在ASP.NET Core中导入和导出.xls/.xlsx文件&#xff08;Excel&#xff09;。在考虑使用.NET处理excel时&#xff0c;我们总是寻找第三方库或组件。使用Open Office Xml格式&#xff08;xlsx&#xff09;读取和写入Excel 2007/2010文件的最流行的.n…

月旦评 之 DevOps招贤令2019 - 没有人比我们更懂DevOps

公元164-182年间&#xff0c;汝南平舆的许氏兄弟于每月初一品评人物&#xff0c;褒贬时政&#xff0c;被称为“月旦评”。所谓“子治世之能臣&#xff0c;乱世之奸雄也”这句许邵评价曹操的话也是来自于“月旦评”&#xff1b;时间一下子来到了2019年&#xff0c;DevOps招贤令再…

HDU - 2204 Eddy‘s爱好(尚未完全解决)

HDU - 2204 Eddy’s爱好 题意&#xff1a; 给你一个正整数N&#xff0c;确定在1到N之间有多少个可以表示成M^K&#xff08;K>1)的数 题解&#xff1a; 参考题解&#xff1a; 我们先举例找找规律 1~10以内2的次方有多少个&#xff1f;有121,224,329,一共三个&#xff0c;…

EF Core中避免贫血模型的三种行之有效的方法(翻译)

[Paul Hiles: 3 ways to avoid an anemic domain model in EF Core &#xff1a;https://www.devtrends.co.uk/blog/3-ways-to-avoid-an-anemic-domain-model-in-ef-core]1.引言在使用ORM中&#xff08;比如Entity Framework&#xff09;贫血领域模型十分常见 。本篇文章将先探…