在现今微服务流行的年代相信一定有了解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关系链埋点的更多相关文章

  1. .NET ClrProfiler ILRewrite 商业级APM原理

    Demo:https://github.com/caozhiyuan/ClrProfiler.Trace 背景 为了实现自动.无依赖地跟踪分析应用程序性能(达到商业级APM效果),作者希望能动态修改应 ...

  2. APM 原理与框架选型

    发些存稿:) 0. APM简介 随着微服务架构的流行,一次请求往往需要涉及到多个服务,因此服务性能监控和排查就变得更复杂: 不同的服务可能由不同的团队开发.甚至可能使用不同的编程语言来实现 服务有可能 ...

  3. [APM] 解读APM技术分类和实现方式

    在讲了APM的历史.作用和实际案例之后,下面我们来了解一下APM技术分类和实现方式以及它未来的发展趋势.在这之前,我们首先需要了解一下典型的互联网或移动互联网应用的整个应用交付链. 图1 上面这张示意 ...

  4. [APM] 解读2016之APM国内篇:快速增长的APM市场和技术

    前言 2016年是APM技术和市场快速发展的一年,在这一年里APM市场特别是国内的市场取得了极大的增长,用户对APM价值的认识和接受度也有了很大的提升,国内市场已基本完成了用户教育和市场培养的阶段.与 ...

  5. 【连载6】二手电商APP的导购功能与关系链机制分析

    导读:得益于十余年来各种一手电商平台对市场与用户的教育以及共享.分享经济浪潮的兴起,互联网化的二手.闲置商品买卖.置换成为越来越普遍且简单可实现的生活方式. 第三章目录: 三.对比:主流二手电商竞品的 ...

  6. Pinpoint - 应用性能管理(APM)平台实践之部署篇

    0.0 前言 国内的APM行业这两年刚刚起步,但是在国外却比较成熟了,并且由于这两年人力成本的快速提高,国内外涌现了几家非常不错的APM企业,例如APPdynamic,Dynamic,NewRelic ...

  7. 什么是真正的APM?

    近年来APM行业被越来越多的企业所关注,尤其是在2014年末,NewRelic的成功上市,更加激发了人们对这个行业前景的无限遐想.那么究竟什么是APM?APM的目的是什么?要求我们做什么?有不少企业对 ...

  8. 聊聊对APM的理解

    本文主要从以下几个列举对APM的认识: -什么是APM工具 -为什么要用APM工具,APM工具的价值在哪里: -什么样的APM工具适合于传统金融业: -如何用好APM工具:    -精准告警    - ...

  9. APM简介

    1.什么是APM APM (应用性能管理) - Application Performance Management & Monitoring在信息科学和系统控制领域,APM致力于监控和管理应 ...

随机推荐

  1. Prometheus之Exporter开发

    Prometheus开发Exporter简介 Exporter 本身是一个http 服务,其指标结果只要符合 Prometheus 规范就可以被 Prometheus 使用. Prometheus中m ...

  2. python常用os模块

    OS 模块 #os模块就是对操作系统进行操作,使用该模块必须先导入模块: import os #getcwd() 获取当前工作目录(当前工作目录默认都是当前文件所在的文件夹) result = os. ...

  3. 深入了解Vue.js组件笔记

    1.组件注册 Vue.component('name',{}) 创建的组件都是全局组件,它们在注册之后可以用在任何新创建的Vue根实例(new Vue)的模板中.第一个参数是组件的名字,第二个参数是一 ...

  4. Java递归算法经典实例(兔子问题、阶乘、1到100累加)

    https://blog.csdn.net/isitman/article/details/61199070

  5. 升​级​到​w​i​n​8​.​1​导​致​o​r​a​c​l​e​服​务​丢​失​的​处​理

    针对升级到win8.1导致oracle服务丢失的处理 1.首先保证oracle相关程序能够运行,如net manager,如果能够运行,说明oracle安装仍然有效,只是因为服务被"净化&q ...

  6. Hibernate4.3 QBC查询

    一.基本查询 1 Session session = HibernateUtils.getSession(); 2 //创建QBC查询接口的实现类 3 Criteria criteria = sess ...

  7. Python-维护排序好的序列模块-bisect

    bisect模块 处理已经排序的序列,升序,从小到大,分插入数据和查看插入数据的位置两大核心,类似于插入排序算法 插入数据 # 首先这个序列按升序规则已经排序好的 # 查找规则是二分查找,当数据相等的 ...

  8. LiteOS-任务篇

    目录 前言 链接 参考 笔录草稿 基本概念 任务相关概念 LiteOS 任务运作机制 内核初始化 创建任务 创建任务有两种方案 任务相关函数 任务开发流程 创建创建任务 部分源码 例子 创建任务的任务 ...

  9. 跟我一起学.NetCore之WebApi接口裸奔有风险(Jwt)

    前言 撸码需谨慎,裸奔有风险.经常在一些技术交流群中了解到,还有很多小伙伴的项目中Api接口没有做任何安全机制验证,直接就裸奔了,对于一些临时项目或是个人小项目还好,其余的话,建议小伙伴们酌情考虑都加 ...

  10. 计数,dic的创建方式,求九九乘法表

    s1='char,python,nihao,ni,ni,python's=s1.split(',')print(s1)s2=list()for i in s: if i not in s2: s2.a ...