NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

评论

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

Kubernetes常见组件

Rayzh

Docker Kubernetes 云原生

域名基本信息查询小技巧

喀拉峻

网络安全 安全 信息安全

社区原生的 Go Agent 即将开源

火线安全

DevSecOps IAST

接口文档自动更改?百度程序员开发效率MAX的秘诀

百度Geek说

百度 前端 工具 后端 软件开发

基于DataX的数据同步(下)-应用DataX进行数据同步

恒生LIGHT云社区

数据库 数据同步 DataX

基于Gradle的Spring源码下载及构建技巧

Tom弹架构

Java spring 源码

三位一体,网易智企的融合与进击

ToB行业头条

架构训练营 - 模块三作业

伊静西蒙

Dubbo 框架学习笔记十七

风翱

dubbo 12月日更

人工智能(NLP)|社交网络中的网络表示学习技术研究

索信达控股

人工智能 算法 网络结构

恒源云(GPUSHARE)_云GPU服务器如何使用SpaCy?

恒源云

gpu 服务器 自然语言

网易有道项目实践技术分享合集

有道技术团队

技术分享 网易有道 技术专题合集

30个类手写Spring核心原理之自定义ORM(下)(7)

Tom弹架构

Java spring 源码

爆肝30天,肝出来史上最透彻Spring原理和27道高频面试题总结

Tom弹架构

Java spring 源码

2022 年你必须知道的 Serverless 云产品

开源之巅

Serverless 云开发

助车企升级,旺链科技与南方电网、联想等名企同斩获「创新案例奖」

旺链科技

区块链 产业区块链 供应链金融

How old are you | 尚硅谷大数据之Canal视频教程

编程江湖

大数据 canal

揭秘字节跳动基于Hudi的实时数据湖平台

字节跳动数据平台

大数据 实时数据湖

谈谈Golang的同步等待组

恒生LIGHT云社区

golang Go 语言

模块八作业

panxiaochun

架构实战营

Apsara Stack 技术百科|标准化的云时代:一云多芯

云计算 芯片 科技 混合云

千万级日志回放引擎设计稿

FunTester

性能测试 测试框架 FunTester 流量回放 GOREPLAY

一次完整的渗透测试&仅供学习研究

H

黑客 网络安全 渗透测试·

一文带你了解数据库安全基础

坚果

数据库 28天写作 12月日更

使用Docker Configs存储配置信息

yombo

Docker Docker Swarm

腾讯云容器安全获得云安全守卫者计划优秀案例

腾讯安全云鼎实验室

容器安全

实现一键部署与高效集群管理,SphereEx-Boot 正式上线

SphereEx

开源 开源社区 SphereEx ShadingSphere 一键安装

seata分布式事务AT模式介绍(二)

恒生LIGHT云社区

分布式 分布式事务 seata

用300行代码手写1个Spring框架,麻雀虽小五脏俱全

Tom弹架构

Java spring 源码

整理了一些JPA常用注解

yombo

Java Spring JPA

用EasyRecovery恢复手残误删的文件

淋雨

EasyRecovery

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