使用BeetleX.Tracks对APM关系链埋点
在现今微服务流行的年代相信一定有了解APM,对于APM核心来说是数据来源,一般各自的APM都有对应的组件帮助完成这些工作。如果需要制作自己的APM系统 ,那需要考虑服务程序调用埋点问题;在这里介绍使用BeetleX.Tracks组件进行代码埋点,组件基于Activity机制实现,它可以轻松方便地对代码处理逻辑进行埋点,并可实现跨线程跨组调用链跟踪记录,最终过订阅的方式提交到相应的服务中。
基础实现
组件通过.NetCore内置Activity对象实现代码调用链记录,并通过DiagnosticSource对象进行调用记录发布。这样做的好处是不管其他组件是不是使用BeetleX.Tracks组件记录,只要其内部使用Activity即可保持各组件调用的关系链信息串连起来达到不同组件都能构建完整跟踪信息。

由于Activity和DiagnosticSource是框架内部集成,因此只需要按规则实现即可共享之间代码调用的关系链数据。
使用
在使用组件埋点的时候需要先引用它,可能通过以下地址安装下载:https://www.nuget.org/packages/BeetleX.Tracks/
安装组件后你只需要通过以下方式对代码进行跟踪
public async Task Hello()
{
using (CodeTrackFactory.Track("/Hello", CodeTrackLevel.Bussiness, null))
{
var host = new Http.Clients.HttpHost("https://www.baidu.com");
var request = host.Get("/");
var txt = await request.Execute(); await DefaultRedis.Instance.Flushall();
await DefaultRedis.Get<Employee>("nonexisting");
await DefaultRedis.Set("emp3", Northwind.Data.DataHelper.Defalut.Employees[3]);
await DefaultRedis.Get<Employee>("emp3"); var wss = new TextClient("wss://echo.websocket.org");
await wss.ReceiveFrom("henry");
}
}
通过CodeTrackFactory.Track方法创建一个跟踪对象,以上示例是创建一个/Hello的跟踪标签,等级是Bussiness。没指定父ID通过组件内部自动获取上一层的Activity的ID信息作为父信息,这个父ID一般用于不同服务进程间交互指定,用于指定当前执行代码是由那个服务路由过来;还有一种情况就是跨队列任务处理难以确定关系的时候也可以显式指定ID,一般同一代码块下来的都无须指定(即使不同组件间调用)。以下是针对上面代码的运行效果:

跟踪标签
组件提供两种跟踪标签,上面示例用到的Track是一种,它的信息最终通过订单来获取;实际应用中可能在执行完成就需要一个详细信息,这个时候就需要TrackReport方法来创建。
using (var track = CodeTrackFactory.TrackReport(actionUrl, CodeTrackLevel.Module, parentID, "HTTP", "Action"))
{
//....
}
Console.Write($"{CodeTrackFactory.Activity.GetReport()}")
以上是建立TrackReport的示例,并在后面把结果打印出来。在上面的使用代码中定义TrackReport标签,在处理完成后即可把完整结果打印出来。由于TrackReport是组件单独扩展的,所以只能把BeetleX.Tracks自己的跟踪链串起来;如果想和其他方式的关系串起来只能自己通过DiagnosticSource订阅后再自行处理。
跟踪等级
组件跟踪分为以下几个等级
All = 0,
Code = 1,
Function = 2,
Class = 4,
Module = 8,
Bussiness = 16,
Off = 512,
通过等级配置来实现当前的跟踪信息是否需要发布,因此在写完所有埋点信息后还可以通过配置来设置那些埋点信息需要启用;特别在不同的运行状态下有些埋点信息是不需要的。可以通过以下方式配置输出的埋点信息级别
public static CodeTrackLevel Level { get; set; } = CodeTrackLevel.Off;
设置级别越低输出信息越多,当设置为Off后则所有跟踪信息都无效;为了性能上的考虑组件针对不输出的信息是不会创建对应的Activity对象也不会发布订阅信息,只是一个没有任何逻辑的Track结构处理。
订阅
单一进程的跟踪数据只是一个数据孤岛,它存在的作用非常有限;通过订阅的方式来获取跟踪数据并提交到服务上做整合才能发挥其主要作用。
CodeTrackFactory.SubscribeTrack((name, data) =>{ //...});
组件可以通过CodeTrackFactory.SubscribeTrack方法来订阅相关跟踪数据,然后加工后传送到相应的服务上。
多服务关系链
一个完整的业务往往需要关联到多个服务应用,对这个关系的维护只需要在服务之前传递个Activity的ParentID即可,每个服务在接管数据处理后只需要把ParentID传递给每个创建跟踪的Activity上即可以实现不同服务的关系链引用。
总结
BeetleX.Tracks只针对本地程序埋点,APM整合需要自行订阅跟踪信息并发布到相关服务器上,在多服务关系链处理上需要自动传递事件的ParentID用于保证各服务之前的执行关系。由于实现是基于Activity和DiagnosticSource所以无法在.NETFramework上运行。
使用BeetleX.Tracks对APM关系链埋点的更多相关文章
- .NET ClrProfiler ILRewrite 商业级APM原理
Demo:https://github.com/caozhiyuan/ClrProfiler.Trace 背景 为了实现自动.无依赖地跟踪分析应用程序性能(达到商业级APM效果),作者希望能动态修改应 ...
- APM 原理与框架选型
发些存稿:) 0. APM简介 随着微服务架构的流行,一次请求往往需要涉及到多个服务,因此服务性能监控和排查就变得更复杂: 不同的服务可能由不同的团队开发.甚至可能使用不同的编程语言来实现 服务有可能 ...
- [APM] 解读APM技术分类和实现方式
在讲了APM的历史.作用和实际案例之后,下面我们来了解一下APM技术分类和实现方式以及它未来的发展趋势.在这之前,我们首先需要了解一下典型的互联网或移动互联网应用的整个应用交付链. 图1 上面这张示意 ...
- [APM] 解读2016之APM国内篇:快速增长的APM市场和技术
前言 2016年是APM技术和市场快速发展的一年,在这一年里APM市场特别是国内的市场取得了极大的增长,用户对APM价值的认识和接受度也有了很大的提升,国内市场已基本完成了用户教育和市场培养的阶段.与 ...
- 【连载6】二手电商APP的导购功能与关系链机制分析
导读:得益于十余年来各种一手电商平台对市场与用户的教育以及共享.分享经济浪潮的兴起,互联网化的二手.闲置商品买卖.置换成为越来越普遍且简单可实现的生活方式. 第三章目录: 三.对比:主流二手电商竞品的 ...
- Pinpoint - 应用性能管理(APM)平台实践之部署篇
0.0 前言 国内的APM行业这两年刚刚起步,但是在国外却比较成熟了,并且由于这两年人力成本的快速提高,国内外涌现了几家非常不错的APM企业,例如APPdynamic,Dynamic,NewRelic ...
- 什么是真正的APM?
近年来APM行业被越来越多的企业所关注,尤其是在2014年末,NewRelic的成功上市,更加激发了人们对这个行业前景的无限遐想.那么究竟什么是APM?APM的目的是什么?要求我们做什么?有不少企业对 ...
- 聊聊对APM的理解
本文主要从以下几个列举对APM的认识: -什么是APM工具 -为什么要用APM工具,APM工具的价值在哪里: -什么样的APM工具适合于传统金融业: -如何用好APM工具: -精准告警 - ...
- APM简介
1.什么是APM APM (应用性能管理) - Application Performance Management & Monitoring在信息科学和系统控制领域,APM致力于监控和管理应 ...
随机推荐
- SSM框架整合核心内容
所需要的jar包及其版本 Spring 版本:4.3.18 tx.aop.beans.core.web.web-mvc.context.expression.jdbc MyBatis:3.4.6 ...
- Kubernetes入门(四)——如何在Kubernetes中部署一个可对外服务的Tensorflow机器学习模型
机器学习模型常用Docker部署,而如何对Docker部署的模型进行管理呢?工业界的解决方案是使用Kubernetes来管理.编排容器.Kubernetes的理论知识不是本文讨论的重点,这里不再赘述, ...
- java关键字static和final
static可以修饰变量,方法或者类(普通类是不能用static修饰的,只能用来修饰内部类) static静态变量又称之为类变量(和c++中的全局变量概念是一样的),在类加载后,jvm只为类变量分配一 ...
- Flutter学习三之搭建一个简单的项目框架
上一篇文章介绍了Dart的语法的基本使用,从这篇文章开始,开发一个基于玩Android网站的app.使用的他们开放的api来获取网站数据. 根据网站的结构,我们app最外层框架需要添加一个底部导航栏, ...
- 【转】Locust性能-零基础入门系列(1)-wait_time属性用法
本篇文章,从局部出发,利用一个简单的测试,来说明场景模拟的wait_time属性的用法.wait_time为什么要单独拎出来讲,是因为它主要有两种模式,而初学者对这两种模式,容易混淆.1) wait_ ...
- Typecho反序列化漏洞
Typecho Typecho是一款快速建博客的程序,外观简洁,应用广泛.这次的漏洞通过install.php安装程序页面的反序列化函数,造成了命令执行,Typecho 1.1(15.5.12)之前的 ...
- Android Widget开发过程中的一些问题汇总
一.基本实现要点 布局文件 配置文件 控制文件 AndroidManifest.xml
- React学习小记--setState的同步与异步
react中,state不能直接修改,而是需要使用setState()来对state进行修改,那什么时候是同步而什么时候是异步呢? 基础代码: setCounter = (v) => { thi ...
- mysql-5-aggregation
#2.分组函数 /* 分组函数/聚合函数:传入一组值,经过统计处理,得到一个输出值 sum, avg, max, min, count */ USE myemployees; #简单使用 SELECT ...
- 小伙伴想学Jenkins自动构建发布项目,我:安排上了!!
写在前面 趁着十一长假,很多小伙伴都在悄悄学习,有些是为了能够顺利通过面试,进入大厂升职加薪.有些则是为了进一步巩固和提高自己的专业技能,希望有朝一日能过成为互联网架构师乃至技术专家.这不,就有小伙伴 ...