使用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致力于监控和管理应 ...
随机推荐
- axios+Qs请求数据转表单格式
import axios from 'axios' import qs from 'qs' axios.post('http://localhost:8888/baseitem/update', qs ...
- Halcon使用骨架法处理激光条并拟合直线
dev_close_window () * 设置颜色 dev_set_color ('green') * 读取图像 read_image (Image, 'images3/1') * 获得图像尺寸 g ...
- jsp(java server pages):java服务器端的页面
jsp(java server pages):java服务器端的页面 JSP的执行过程1.浏览器输入一个jsp页面2.tomcat会接受*.jsp请求,将该请求发送到org.apache.jasper ...
- vue学习02-v-text
vue学习02-v-text 引入环境版本,cdn网络引用或者本地js应用 html的结构,一般是div 创建vue实例 el:挂载点 v-text指令的作用是设置标签的内容 默认写法会替换全部内容, ...
- Python爬取股票信息,并实现可视化数据
前言 截止2019年年底我国股票投资者数量为15975.24万户, 如此多的股民热衷于炒股,首先抛开炒股技术不说, 那么多股票数据是不是非常难找, 找到之后是不是看着密密麻麻的数据是不是头都大了? 今 ...
- Sequence(Poj2442)
Sequence(Poj2442) 题意: 有m个数列,每个数列n个值,每个序列中选取一个值可以组成n^m种不同的序列,求前n小的序列和. Input 12 31 2 32 2 3 Output 3 ...
- SQL错题集
查找最晚入职员工的所有信息 select * from employees where hire_date = (select max(hire_date) from employees) 查找入职员 ...
- Arduino 串口的一些高级用法
来源: 1.配置串口通信数据位.校验位.停止位 通常我们使用Serial.begin(speed)来完成串口的初始化,这种方式,只能配置串口的波特率. 而使用Serial.begin(speed, c ...
- ubuntu19.10如何添加开机启动项
$sudo vi /lib/systemd/system/rc-local.service内容如下[Unit]Description=/etc/rc.local CompatibilityDocume ...
- 多测师讲解unittest介绍及自动化测试实现流程_高级讲师肖sir
unittest框架介绍 unittest框架是python中一个标准的库中的一个模块,该模块包括许多的类如 test case类.test suit类.texttest runner类.textte ...