硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

通过链路追踪快速发现和定位业务问题的实践

  • 2020-01-20
  • 本文字数:2732 字

    阅读完需:约 9 分钟

通过链路追踪快速发现和定位业务问题的实践

引言

在可观察性领域,Metrics,Tracing 和 Logging 的介绍由来已久。三种之间的边界越来越模糊。OpenTracing 中已经支持 LogEvent,OpenTelemetry 已经把 OpenMetric 和 OpenTracing 整合到一块。今天我们要介绍的链路追踪的业务分析功能,通过对链路数据进行聚合统计,可以查看各种业务报表。



为什么需要业务分析关联链路数据?


精细化分析,全链路数据,快速发现和定位问题。


在传统的 APM 分析中,主要是关注各种接口的响应时间,对业务不够贴切,这样会带来一些问题:


发现问题


同一个接口被很多业务方调用,某一个重要业务调用出了问题,由于这个业务占比不高,无法通过平均数或者 p90 分析出来。例如创建订单中重要客户,这些客户订单占比不高,但是重要性比较高,需要重点分析和监控。


排查定位问题


某些用户反馈下单或者付款出现问题,但是这种情况只存在少量用户,重现比较困难。如果把用户的异常和链路关联起来,分析异常用户的链路数据,比如出入参数,用户属性等,可以发现一些线索。例如查看用户 ID 对应的失败订单,分析订单上链路,发现失败订单的来源都是某个旧版的客户端调用。

业务分析概述

在介绍业务分析功能之前,先简单提两个问题,大家发散思考下怎么解决这两个问题。


1、某个应用的对外接口流量突增,是不是由于某个用户或者地域流量暴涨?


2、应用出现比较多空指针异常,这些异常对业务有多大的影响?


通用的监控系统主要是对操作系统,分布式调用,数据库组件进行监控。如果对业务监控,那就需要开发同学对调用链埋点添加业务属性(用 tag 来记录各种业务属性)。通过对 tag 标签进行过滤和统计聚合,达到业务分析和监控的效果。


业务分析的实现方式

业务分析是在链路上标注一些业务数据,以下我们用 Jaeger 和 Skywalking 为例子讲解业务埋点。


Jaeger 中添加 Tag 信息


以 Java 语言为例,


// 获取业务中的用户IdString userId = ****;Tracer tracer = GlobalTracer.get();if (tracer != null && tracer.activeSpan() != null) {  // 将 UserId以 Tag 的形式存放到链路中  tracer.activeSpan().setTag("userId", userId);}
复制代码


Skywalking 中添加 Tag 信息


不插入代码的方式:https://github.com/apache/skywalking/blob/master/docs/en/setup/service-agent/java-agent/Customize-enhance-trace.md


<class class_name="test.apache.skywalking.testcase.customize.service.TestService2">     <method method="staticMethod(java.lang.String,int.class)" operation_name="/is_2_static_method" static="true">          <tag key="tag_2_1">arg[0]</tag>          <log key="log_1_1">arg[1]</log>     </method></class>
复制代码


用 OpenTracing 插入代码方式


// global tracer objectprivate static Tracer tracer = new SkywalkingTracer();... if (tracer != null && tracer.activeSpan() != null) {      tracer.activeSpan().setTag("userId", yourUserId);  }
复制代码


Java 代码方式


ActiveSpan.tag("userId", yourUserId);
复制代码


Java 注解方式


@Tag(key = "userId", value = "arg[0]")@Tag(key = "requestId", value = "arg[1]")public someMethod(final String userId, final String requestId) {    // ...}
复制代码

对链路数据进行业务分析

Tag 信息就好比给图书打上编号分类信息,让我们可以在图书馆海量的图书中找到我们需要图书。通过 Tag 来进行分类、查找、统计,可以快速找到我们需要的数据。


业务标签的过滤


可以通过筛选 Tag 进行过滤,寻找所需要的链路。如下图,查看手机端下单的请求的变化趋势,详情等。



业务标签的聚合


指定 Tag 进行聚合,分析 Tag 聚合的统计。如下图查看每个入口(PC 和 Mobile)的请求数,响应时间,异常查询。可以识别是不同业务的对比情况。


业务分析的一些使用场景案例

Tag 功能主要是业务开发同学用来进行业务监控的, 通过在链路上写入 Tag,可以把业务和链路打通,从而很好的发现,定位,跟踪问题。


我们接下来做一些业务场景举例。


业务异常分析


生成订单时,会调用优惠,库存,物流,商品等系统接口。这些接口都有可能会返回异常,有些异常有些比较重要,有些只是用于展示。我们怎么快速识别当前应用的异常严重程度呢?可以通过加 Tag 的方式来实现。我们对异常进行分 1~5 级,1 级表示非常严重。


那我们每次调用远程接口完成后,对返回的异常添加 Tag,例如调用优惠时返回系统异常加 Tag: tracer.activeSpan().setTag(“bizErr”, “1-PromotionSysExcep”); ,调用库存返回库存不足,可以添加 tracer.activeSpan().setTag(“bizErr”, “5-InventoryNotEmpty”);


那么通过 Tag bizErr 进行聚合,对数量进行排序下,如果 1-** 开头的比较多,那表示当前系统比较严重,需要紧急处理。查看这些异常链路的请求参数或者返回值,我们可以快速定位问题。



用户分析


将 UserId 用 Tag 方式写入到 Span 中,可以统计到没有用户的数据,例如访问量,响应时间。我们之前遇到一个问题,Web 的流量突然变大,响应比较慢。从监控来看流量比较大,但为什么流量会比较大呢,通过 UserId 分组统计后,发现某个用户的流量暴涨,导致整个后台响应比较慢,对这个用户进行限流后,web 流量和相应时间恢复正常。


业务大盘

中台系统中各个业务的创建订单大盘。


在中台应用中,各个业务使用同一个交易系统,通过订单中的一个业务类型字段来区分不同的业务。通过在链路上的标签,可以查看到不同业务线的下单成功和失败曲线。比如大盘上可以展示天猫,聚划算,盒马生鲜等业务的订单情况。一旦有异常就可以分析链路的明细信息来查找原因。

和传统的统计不同点

传统的 ELK 方式,用户通过插入代码,将业务的属性都打到日志里面。通过数据聚合,可以生成各种 Metrics,添加告警等。这样做监控是合适的,但是需要更深层次的挖掘问题的话,还需要和链路打通。将监控的内容上下游的信息都串起来,可以更方便的定位问题。


比如:更新库存失败,发现异常都是上游某个业务的某台机器上,而这条机器是灰度机器,使用了非稳定版本的。

总结

业务排查的问题方式有很多种,调用链和业务信息打通已经是一种行之有效的方法。通过在调用链写入业务信息,将会给调用链配上显微镜,快速发现隐藏在链路数据中的各种问题。而业务数据关联调用链,也给业务排查插上翅膀,从链路的上下文信息中快速找到线索。


作者介绍


徐建伟,花名竹影,阿里云技术专家,多年系统架构,性能调优经验, 目前主要从事链路跟踪,应用监控相关工作。


本文转载自公众号阿里巴巴中间件(ID:Aliware_2018)。


原文链接


https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247488705&idx=4&sn=eeefc5f24790f869d787ce6772a153c3&chksm=fdeb26a1ca9cafb768b1b197a75760555ac97ff5b0c480ff9be9a42b42bd5dd0eb33aa7b75df&scene=27#wechat_redirect


2020-01-20 14:004056

评论

发布
暂无评论
发现更多内容

鸿蒙系统ARKUI框架对于分布式计算和请求API的实战研究

恒山其若陋兮

前端 11月月更

一个宁静祥和没有bug的下午和SqlSession的故事

京东科技开发者

mybatis sql Spring Boot CLI SQLSession

ArkUI框架基于鸿蒙系统的Scroll和Scroller和自定义组件之插槽的实战案例心得

恒山其若陋兮

前端 11月月更

Bigkey问题的解决思路与方式探索

vivo互联网技术

redis dba bigkey

【Ajax进阶】跨域和JSONP的学习

坚毅的小解同志

ajax 11月月更

【原生Ajax】全面了解xhr的概念与使用。

坚毅的小解同志

ajax 11月月更

LR低代码快速开发平台 高效调整企业组织架构

力软低代码开发平台

数维图智慧化工园区三维系统 助力危化企业安全生产

2D3D前端可视化开发

物联网 数据可视化 数字孪生 智慧化工园区 化工园区三维可视化

Go定时任务源码 - robfig/cron

人生如梦

Go 定时任务 cron

5分钟搭建图片压缩应用

华为云开发者联盟

云计算 后端 华为云 函数工作流

传输线路动态巡检探索

鲸品堂

网络 传输网络

深度解析KubeEdge EdgeMesh 高可用架构

华为云开发者联盟

云计算 云原生 后端 华为云

基于Spring-AOP的自定义分片工具

京东科技开发者

aop 数据分片 spring aop 配置文件

【Ajax】如何通过axios发起Ajax请求

坚毅的小解同志

ajax 11月月更

计算机网络:数据链路层设备

timerring

计算机网络 11月月更 网桥

度量BGP监测源数量对AS可见性的影响

郑州埃文科技

AS IP地址 BGP数据源

元器件科普|变压器的分类及形状构造

元器件秋姐

元器件采购 华秋商城 变压器 电感器 电压

【Ajax】全面了解http协议

坚毅的小解同志

HTTP 11月月更

字节跳动基于数据湖技术的近实时场景实践

字节跳动数据平台

数据湖 火山引擎

基于鸿蒙系统的ArkUI框架的公共剪切类属性和多态样式在前后端分离项目中的表现

恒山其若陋兮

11月月更

【web 开发基础】PHP 变量的作用范围 (29)

迷彩

作用域 静态变量 全局变量 局部变量 11月月更

通过实战总结的 使用Go的小技巧

王中阳Go

Go golang 高效工作 学习方法 11月月更

【jquery ajax】实现文件上传提交

坚毅的小解同志

ajax 11月月更

4.0体验站|OceanBase 4.0 我回来给你点个赞

OceanBase 数据库

提升80%上云集成效率, TA是如何做到的

华为云开发者联盟

云计算 后端 华为云 云集成

OpenHarmony 3.2 Beta多媒体系列——音视频播放框架

OpenHarmony开发者

OpenHarmony

不懂Hybird开发,感觉错过一个亿~

FinFish

小程序 前端框架 APP开发 APP软件开发、 混合开发

大模型狂欢背后:AI基础设施的“老化”与改造工程

OneFlow

人工智能 深度学习 大模型

“如何实现高效的应用交付”鲁班会开发者训练营厦门站进行时

华为云开发者联盟

云计算 软件开发 华为云 应用集成

【Ajax】如何通过axios发起Ajax请求

坚毅的小解同志

ajax 11月月更

旺链科技肖慧荣登超级账本2022年第三季度中国贡献榜

旺链科技

区块链 产业区块链 VoneBaaS 企业号十月PK榜

通过链路追踪快速发现和定位业务问题的实践_架构_竹影_InfoQ精选文章