错误归因调用链(代码片段)

wangzhuxing wangzhuxing     2023-02-23     805

关键词:

一、背景介绍

1、在微服务时代,服务与服务之间的调用关系错综复杂,某一服务出问题可能会导致整条链路雪崩。

2、微服务的请求链路长、涉及服务多、排查问题难,我们如何快速的定位到异常服务,尽快解决生产问题

3、我们保持对业界方案关注的同时,如:zipkin、skywalking、ELK等,如何结合自身项目的特点,搭建一套高可用、可扩展的错误归因系统?

目前的zipkin和ELK也存在一些问题没有解决:

zipkin主要是告诉我们请求报错了,但是并不能发现运行时异常,例如:业务系统捕获了一个Exception,返回了一个异常码,这是上游调用链不会上报错误信息。对于链路平均请求时间没有提供统计功能。

ELK使用于已经知道错误的情况下去查找具体发生了什么?但是对于发生的频率,接口调用次数、错误率没有很直观的展示。另外频繁的在zipkin和ELK之间切换也是很不好的体验。

开始想在zipkin的基础上进行改造,后来发现自己实现更加灵活、更容易扩展。

 二、架构图

技术分享图片

 数据采集:

  基本是过滤器和aop思想在请求前后埋点、收集请求信息。

数据传输层:

  收集完可以选择发送kafka或打印日志到本地,从日志中收集请求信息类似ELK。

数据过滤与转换:

  可采样、去重复、去ELK中查询运行时异常信息等分析。可以自己扩展。处理完可以选择存储方式、包括做一些优化、例如:列储存、每天建立一个索引。

数据存储:

  Elasticsearch和mysql等,可以自己扩展。

三、调用链数据(span)

1、调用链本身数据
2、本地服务信息
3、远程服务信息
4、参数、协议等
5、异常信息

        
          "traceId": "cc43026d3e04462fb7fd488fab860891",
          "id": "i6pmhdzdw6sln8vr",     
          "parentId": "7n01ym82zzvmfquj",   
          "traceType": "http-client"
          "name": "http://127.0.0.1:8090/doNormal",
          "duration": 53,
          "start": 1543034698671,
          "resultType": "success",
          "localHost": "172.22.51.117",
          "localPort": 80,
          "localServiceName": "sscj-games-server-entrance",
          "remoteHost": "127.0.0.1",
          "remotePort": 8090,
           "remoteServiceName": "sscj-games-server-entrance",
          "tagMap": 
            "rest.method": "getForObject",
            "result": "resp_normal",
            "http.reqHeader": "user-agent=Java/1.8.0_51",
            "args[1]": "‘java.lang.String‘",
            "args[0]": "http://127.0.0.1:8090/doNormal",
            "http.method": "GET",
            "http.code": "200",
            "args[2]": "[]"
          ,
          "exceptionMsg": "", 
          "exceptionType": "",
        

 1、调用树结构

技术分享图片

2、调用过程

技术分享图片

 

技术分享图片

 3、采集校验流程

技术分享图片

四、数据过滤和存储

1、数据过滤与存储

技术分享图片

过滤器可横向扩展多个、自己实现的过滤器更加灵活;可以根据需求去做统计、分析、预警等。

技术分享图片

2、数据查询与展示

技术分享图片

由Elasticsearch聚合api做统计分析。

五、效果展示

调用链列表页面:

技术分享图片

 

 调用链树:

技术分享图片

调用链详情:

技术分享图片

 

多渠道归因分析(attribution):用attention-rnn来做归因建模(附代码demo)(代码片段)

之前几篇多渠道归因分析应该算是比较通用的一些方法论:多渠道归因分析(Attribution):传统归因(一)多渠道归因分析:互联网的归因江湖(二)多渠道归因分析:python实现马尔可夫链... 查看详情

营销渠道客户转化分析(归因分析模型)(代码片段)

1.背景及问题现某IT产品销售公司,有一定量的小公司水平的用户,这些用户在做出购买时,会接触到销售公司的多个营销渠道,不同的渠道上投入怎样分配,以实现营销效益的最大化,便成为了很多公司的市场营销部门亟需解... 查看详情

Python中的渠道归因(马尔可夫链模型)

】Python中的渠道归因(马尔可夫链模型)【英文标题】:ChannelAttribution(MarkovChainModel)inPython【发布时间】:2018-08-1307:27:52【问题描述】:如何在Python中进行渠道归因(马尔可夫链模型)?就像我们在R中有“ChannelAttribution”包。【... 查看详情

rails中的方法链(逐步调用方法)(代码片段)

...end主要观点:如果某些事情失败(或者没有失败但是返回错误),在某些步骤中其他步骤不会调用,当然我不想添加多个ifs来检查状态并考虑如何在一个地方实现它我需要保存错误找到方法之间共享参数的方法会很棒。我可以用... 查看详情

gethgo语言调用以太坊|一起来学区块链(代码片段)

...户相关3.3控制台console:3.4删除数据:3.5help3.6常见错误4.Go语言调用合约4.1启动rpc端口4.2Go调用以太坊4.3调用接口net_versionnet_list 查看详情

删除另一列中具有转换值后日期的行以创建归因链

】删除另一列中具有转换值后日期的行以创建归因链【英文标题】:Deleterowswithdatesafterconversionvalueinanothercolumnformakingattributionchains【发布时间】:2020-07-2813:52:15【问题描述】:我有一个如下所示的pd.dataframe:cookiedatechannelgoal_reache... 查看详情

微众wecross跨链平台(12)合约总结(代码片段)

1.合约跨链调用原理由合约发起跨链调用。业务合约通过调用WeCross提供的桥接合约注册跨链调用请求,跨链路由会定时轮询桥接合约获取跨链请求并完成对目标链的调用,之后再进行回调并保存回调结果。eg.solidity合约/**... 查看详情

数仓埋点体系与归因实践(代码片段)

...2.2数仓架构图2.3事实表建设2.4维表建设2.5dws表建设3.uuid和归因建设3.1uuid建设3.2归因建设4.数据应用5.未来展望导读:当今是流量为王时代,严选作为电商,流量建设就显得尤为重要。流量数据建设比业务数据困难,... 查看详情

数仓埋点体系与归因实践(代码片段)

...2.2数仓架构图2.3事实表建设2.4维表建设2.5dws表建设3.uuid和归因建设3.1uuid建设3.2归因建设4.数据应用5.未来展望导读:当今是流量为王时代,严选作为电商,流量建设就显得尤为重要。流量数据建设比业务数据困难,... 查看详情

sparkimputer归因估算器补全缺失值(代码片段)

...支持分类功能(SPARK-15041),并且可能为分类功能创建了错误的值。*注意,均值/中值是在滤除缺失值之后计算的。*输入列中的所有Null值都被视为丢失,因此 查看详情

可选链接(代码片段)

...常失败;若为!,可选项为nil时,强制解包会触发运行时错误。即使要查询的属性,方法或下标返回的是非可选值,可选链接调用的结果也始终是可选的。 查看详情

swift归因字符串清除背景文本(代码片段)

我正在尝试使用NSMutableAttributedString制作文本标题,但是在属性字典中,我相信我有正确的代码,但是当我运行代码时,总是有灰色背景,我可能做错了什么?或者我能错过什么?lettitleTextView:UITextView=lettextView=UITextView()letattributed... 查看详情

vue2中?.可选链式调用操作符(代码片段)

...空(nullish )(null 或者 undefined)的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。  链接:链接   查看详情

dp-责任链链式调用v1(代码片段)

packageclub.interview.design_pattern.chapt9_chain;importjava.util.ArrayList;importjava.util.List;/***加工一个字符串*1.过滤敏感字符*2.修改大小写*3.增加笑脸*<p>*-v1.手动加过滤器*-v2.用list装起来,for循环*-v3.用一个对象Chain封装起来,持有list,做 查看详情

gethgo语言调用智能合约|一起来学区块链(代码片段)

...私有链4.合约部署5.初始化私有链节点创世块6.合约部署7.调用1.获取abi文件合约的接口在remix工具中编译合约后,会有一个abi,复制然后新建一个xx.abi文件,把赋值的粘贴到里面注意:代码变了,重新编译后abi... 查看详情

区块链之部署和调用以太坊智能合约(代码片段)

区块链之部署和调用以太坊智能合约作者:邹祁峰邮箱:Qifeng.zou.job@hotmail.com博客:http://blog.csdn.net/qifengzou日期:2018.03.0401:18转载请注明来自”祁峰”的CSDN博客1引言智能合约就像我们业务的后台逻辑,其运行在... 查看详情

过滤器链调用原理(代码片段)

...有2个重要的方法:doFilter和internalDoFilter  doFilter方法中调用了internalDoFilter方法,中间增加了一些安全策略。internalDoFilter方法调当前pos指向的过滤器链中的某一个filter的doFilter(request,respo 查看详情

原型链(代码片段)

...个就是我们说的原型链了。 构造函数:采用new关键字调用,eg:letp=newPerson(),调用函数时会创建对象,函数内部this指向创建的对象p,默认返回新创建的实例对象。普通函数:直接调用letp=cat(),调用函数时不会创建对象,函... 查看详情