写点什么

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

  • 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:003999

评论

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

node.js的模块化与npm

急需上岸的小谢

11月月更

应用程序现代化指南

世开 Coding

应用现代化 软件升级

【LeetCode】统计匹配检索规则的物品数量Java题解

Albert

算法 LeetCode 11月月更

HUAWEI DevEco Studio 3.1版本发布,配套ArkTS声明式开发全面升级

HarmonyOS开发者

HarmonyOS

精彩议程更新,从云原生到 Serverless 的思考和收获,邀你共同见证丨PingCAP DevCon 2022

PingCAP

TiDB

打开时空隧道,重演云栖72小时云世界

阿里云CloudImagine

阿里云 云栖大会

分布式锁

急需上岸的小谢

11月月更

数据库精选 60 道面试题

钟奕礼

Java Java 面试 java程序员 java编程

5种GaussDB ETCD服务异常实例分析处理

华为云开发者联盟

数据库 后端 华为云

MetaForce佛萨奇2.0系统开发DAPP搭建

薇電13242772558

dapp开发

node.js的path路径模块和http模块

急需上岸的小谢

11月月更

HMS Core手语服务荣获2022中国互联网大会“特别推荐案例”:助力建设数字社会

HarmonyOS SDK

手语 HMS Core

有奖报名|StarRocks 获开源热力值增速第一,有你的贡献

StarRocks

数据库

战略合作再升级!合合信息与腾讯云联合推出海外智能风控方案

科技热闻

阿里P8出,入职阿里必会199道SpringCloud面试题,你能掌握多少?

钟奕礼

Java java程序员 java面试 java编程

微服务中的服务发现是什么?

API7.ai 技术团队

微服务 服务发现 API网关 APISIX

DTSE Tech Talk | 第11期:深入浅出畅谈华为云低时延直播技术

华为云开发者联盟

云计算 后端 华为云

软件测试 | 接口自动化你不懂?听HttpRunner的作者怎么说

测试人

软件测试 自动化测试 接口测试 接口自动化 HttpRunner

StarRocks 与 DataPipeline 完成兼容性互认证,携手共建数据基础设施生态

StarRocks

数据库

学历不是问题!社招大专老哥阿里 腾讯Java面试,上岸入职京东

钟奕礼

java程序员 java面试 java编程 #java

Dive into TensorFlow系列(3)- 揭开Tensor的神秘面纱

京东科技开发者

Python 人工智能 深度学习 tensorflow

「Go实战」在 Go 项目中基于本地内存缓存的实现及应用

Go学堂

golang 缓存 开源 程序员 性能

成为千行百业数字化转型催化剂的,竟然是它!

元年技术洞察

微服务 低代码 数字化转型

云服务器的四大作用讲解-行云管家

行云管家

云计算 服务器 云服务 云服务器

首次!阿里巴巴团队共同携手编写“大厂面试参考指南”v1.0版本

钟奕礼

Java 面试 java程序员 java 编程 #java Java 面试题

Spring 5(五)事务操作

浅辄

Spring5 事务 11月月更

张文歆:思维需碰撞,才有更大的“火花”|对话 Doris

SelectDB

开源 职场 成长 学习路线 开源治理

EventBridge 生态实践:融合 SLS 构建一体化日志服务

阿里巴巴云原生

阿里云 云原生 EventBridge

计算机网络:IEEE 802.11无线局域网

timerring

计算机网络 11月月更

软件测试 | 测试开发 | 校招面试真题 | 实习生和应届生有什么区别?

测吧(北京)科技有限公司

软件测试 软件测试工程师

Wallys/ WiFi6 MiniPCIe Module 2T2R 2×2.4GHz 2x5GHz MT7915 MT7975 /industrial mini pcie card

wallysSK

MT7915

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