使用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致力于监控和管理应 ...
随机推荐
- hystrix(8) 插件
上一节讲到HystrixCommand的执行流程. Hystrix内部将一些模块实现成了插件,并且提供了用户提供自己的实现,通过配置来替换插件.Hystrix提供了5个插件,分别为并发相关插件(Hys ...
- 一文读懂MySQL的索引结构及查询优化
回顾前文: 一文学会MySQL的explain工具 (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论不一定适用于其他版本) MySQL官方文档中(https://dev.m ...
- Orchard Core创建CMS/Blog站点
安装.NET Core SDK 下载并安装当前最新版本.NET Core SDK 3.1: https://dotnet.microsoft.com/download 安装visual studio ...
- Redis中的订阅模式
redis中的客户端可以订阅一个自定义的频道,接受来自该频道的消息 订阅 订阅指定频道-SUBSCRIBE SUBSCRIBE channel [channel2]... SUBSCRIBE 频道名 ...
- 使用springboot方式配置监听器
//2.配置监听器 @Bean public ServletListenerRegistrationBean<DataInitializeListener> getDataInitiali ...
- vue +signalR 实现服务端到客户端消息发送
承接上一篇 上一篇博客实现是了消息的实时通信,这一篇博客主要讲如何从中心服务内部向客户端发送消息. 先看下最终效果: 在core应用程序里加一个控制器TestController 注入控制器中的IHu ...
- 学习OpenGL
重要!!! OpenGL新人一枚,希望可以再此和大家分享有用的知识,少走弯路 文章会定期更新,把前面几段已经整理过的知识更完后,接下来每周至少会更两次. 文章如果有不对的,理解错误的地方,也非常希望在 ...
- Linux/(centos、unix等)的ssh双向免密登录原理和实现
原理: 双向,顾名思义,双方互通,此处的意思是多台 linux 两两免密登录. 双向比单向多了些操作,单向只需把某一个linux的公钥发送给其他linux即可,而双向要实现集群中的每一台机器都保存其他 ...
- .NetCore.RazorPages 获取访客的公网IP与局域网IP
dotnet.core 获取访客的公网IP与局域网IP 现在奉上代码 public void OnGet() {var ip = Content(HttpContext.Connection.Remo ...
- STM32的CCM RAM
STM32F407ZGT6的Flash大小为1MB,SRAM大小为(128KB+64KB). 这里SRAM之所以分开表示是因为在芯片内部前面的128KB和后面的64KB地址不是连续的,后面的64KB在 ...