错误归因调用链

1、背景介绍

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

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

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

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

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

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

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

2、架构图

 数据采集:spa

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

数据传输层:rest

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

数据过滤与转换:

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

数据存储:

  Elasticsearch和mysql等,能够本身扩展。

3、调用链数据(span)

一、调用链自己数据
二、本地服务信息
三、远程服务信息
四、参数、协议等
五、异常信息

       { 
          "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": "",
        }

一、调用树结构

二、调用过程

 

三、采集校验流程

4、数据过滤和存储

一、数据过滤与存储

过滤器可横向扩展多个、本身实现的过滤器更加灵活;能够根据需求去作统计、分析、预警等。

二、数据查询与展现

由Elasticsearch聚合api作统计分析。

5、效果展现

调用链列表页面:

 

 调用链树:

调用链详情:

相关文章
相关标签/搜索