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

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

详细阅读,参考度量(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

Dotnet全平台下APM-Trace探索相关推荐

  1. 带你掌握不同平台下,探索JDK源码所需的native方法

    摘要:要探索JDK的核心底层源码,那必须掌握native用法.文章中会以"获取系统的默认时区"为例,介绍说明如何查看native对应方法的源码. 本文分享自华为云社区<要探索 ...

  2. 海量IT资料 + 各种平台下的Oracle安装文件 + 公开课录像 + 各种视频教程资料

      海量IT资料 + 各种平台下的Oracle安装文件 + 公开课录像 + 各种视频教程资料 + 其它资料 觉得老师的公开课讲的都挺好的,这里把我录的一些公开课视频分享给大家,都用的是<屏幕录像 ...

  3. BEA WebLogic平台下J2EE调优攻略--转载

    BEA WebLogic平台下J2EE调优攻略   2008-06-25 作者:周海根 出处:网络   前 言 随着近来J2EE软件广泛地应用于各行各业,系统调优也越来越引起软件开发者和应用服务器提供 ...

  4. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的SPI驱动架构分析

    PowerPC + Linux2.6.25平台下的SPI驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

  5. 2019(dotNet全栈开发)公众号回顾

    2019年已经过去,人口红利已经逐渐消失,也许这是这10年互联网史上最糟糕的一年,也可能这是未来10年互联网史上最好的一年 关于公众号,我其实很早就开始注册了,只是一直没怎么运营(ps:不知道怎么推广 ...

  6. 制作WinCE平台下Pocket PC安装程序

    看论坛上经常有人问,如何从桌面系统下安装WinCE平台下Pocket PC应用程序.特此把以前参考VCHelp上雷神的安装制作写的一个Win32 SDK安装WinCE应用系统的程序,放了上来.希望能为 ...

  7. php生鲜超市系统,毕业论文:基于PHP平台下的Ajax开发实践—网上生鲜超市系统的开发...

    毕业论文:基于PHP平台下的Ajax开发实践-网上生鲜超市系统的开发 发表时间:2013-5-8 12:17:49 大学学士毕业论文 基于PHP平台下的Ajax开发实践 --网上生鲜超市系统的开发 专 ...

  8. mediaplayer java_Java平台下的Media Player

    实验四  windows或java平台下的Media Player(6学时) 基本要求 l  实现media player,支持多种媒体类型的播放 l  视频:avi l  音频:wav.midi l ...

  9. linux程序卸载动态库,Intel平台下linux中ELF文件动态链接的加载、解析及实例分析(二): 函数解析与卸载...

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 相信读者已经看过了 Intel平台下Linux中ELF文件动态链接的加载.解析及实例分析(一): 加载的内容了,了解了ELF文件被加载的 ...

最新文章

  1. python使用statsmodels包中的adfuller函数执行增强迪基-福勒检验(ADF检验、augmented Dickey-Fuller test)、判断时间序列数据是否平稳
  2. C Screen Shot Implementation
  3. 告别运营怪圈,不做“背锅侠+加班狗+低薪族”!
  4. 模型学习 - HNN、RBM、DBN
  5. leetcode第一刷_Combinations
  6. spring boot security ajax_Spring-Boot-应用可视化监控
  7. matlab 辅助函数 —— 文件下载与文件解压
  8. java vector 实现二维数组
  9. 【软件安装】IDM安装并扩展到FireFox和Google Chrome
  10. ClearCase Overview
  11. 用AVX2指令集优化整形数组求和
  12. 最大公约数的四种求法(暴力、短除法、辗转相除法递归和非递归)
  13. 什么叫单模光纤_单模光纤和多模光纤的区别,以及作用是什么?
  14. #1265 - Data truncated for column
  15. Flex和Flash一起使用开发项目各取所长
  16. before和after怎么区分_before和after区别
  17. 大数据分析师年薪几十万,学什么专业才能从事大数据?
  18. ASP.NET 用 FlexPaper 在页面上显示 PDF 文件
  19. 小程序如何与智能电视相结合?
  20. cocos2d-x中为什么要用sharedXX()函数创建单例类的static对象

热门文章

  1. facebook 文本分类_如何禁用和自定义Facebook的通知,文本和电子邮件
  2. pixel 解锁_如何在Google Pixel 4和Pixel 4 XL上禁用面部解锁
  3. 设计模式之代理模式(上) 静态代理与JDK动态代理
  4. mybatis由浅入深day01_5mybatis开发dao的方法(5.1SqlSession使用范围_5.2原始dao开发方法)...
  5. jquery验证手机号码和邮箱地址例子
  6. 把C#.NET程序移植到DB2上的经验浅谈(C#连接DB2可以用IBM.Data.DB2.dll)
  7. [收藏]REST -维基百科
  8. microdot - 一个开源 .NET 微服务框架。
  9. WPF 实现截屏控件之移动(二)(仿微信)
  10. 叮,您有一份ML.NET 速查手册请查收!