Java 杂谈Java架构进阶

五分钟教会你分布式系统调用链监控

2019-05-09  本文已影响2人  java架构进阶

分布式系统调用链监控

全链路性能监控

一个请求完整的调用链可能如下图,经过多个系统服务,调用关系复杂。


期间我们会关注各个调用的各项性能指标,比如吞吐量(TPS)、响应时间及错误记录等。

全链路性能监控从整体维度到局部维度展示各项指标,将跨应用的所有调用链性能信息集中展现,可方便度量整体和局部性能,并且方便找到故障产生的源头,生产上可极大缩短故障排除时间。

Google Dapper

系统整个调用链

  1. 当用户发起一个请求时,首先到达前端A服务,然后分别对B服务和C服务进行RPC调用;
  2. B服务处理完给A做出响应,但是C服务还需要和后端的D服务和E服务交互之后再返还给A服务,最后由A服务来响应用户的请求;


对整个调用过程的追踪

  1. 请求到来生成一个全局TraceID,通过TraceID可以串联起整个调用链,一个TraceID代表一次请求。
  2. 除了TraceID外,还需要SpanID用于记录调用父子关系。每个服务会记录下parent id和span id,通过他们可以组织一次完整调用链的父子关系。
  3. 一个没有parent id的span成为root span,可以看成调用链入口。
  4. 所有这些ID可用全局唯一的64位整数表示;
  5. 整个调用过程中每个请求都要透传TraceID和SpanID。
  6. 每个服务将该次请求附带的TraceID和附带的SpanID作为parent id记录下,并且将自己生成的SpanID也记录下。
  7. 要查看某次完整的调用则只要根据TraceID查出所有调用记录,然后通过parent id和span id组织起整个调用父子关系。


调用链监控核心工作

整体架构

AGENT无侵入部署

通过AGENT代理的无侵入式部署,将性能测量与业务逻辑完全分离,可以测量任意类的任意方法的执行时间,这种方式大大提高了采集效率,并且减少运维成本。根据服务跨度主要分为两大类AGENT:

  1. 服务内AGENT,这种方式是通过Java的agent机制,对服务内部的方法调用层次信息进行数据收集,如方法调用耗时、入参、出参等信息。

  2. 跨服务AGENT,这种情况需要对主流RPC框架以插件形式提供无缝支持。并通过提供标准数据规范以适应自定义RPC框架:

比如生成的数据格式如下:

{
    "hostIp": "192.168.4.1",
    "instanceName": "TracingDemo",
    "isEntry": true,
    "errCode": 0,
    "spanId": "3cbfe7f0-141c-4597-8b15-38d2fb145e01",
    "parentId": "16a52a9f-e697-45ce-92fb-7395339eae4b",
    "traceId": "e5549498-60f3-4870-8483-fe26f6d0367b",
    "className": "dao.impl.ProductDaoImpl",
    "methodName": "queryProduct",
    "inParam": "",
    "createTime": 1448442004537,
    "returnTime": 1448442004537,
    "callTime": 5
}

调用链监控好处

上一篇下一篇

猜你喜欢

热点阅读