日志监控系统中有一个ID字段能在整个系统内跟踪请求的执行路径,另外还可以通过重现微服务的请求过程,展示各个服务间的执行流程,同时展示每步操作所耗费的时间。这不仅有助于了解请求在各个服务间的流动顺序,还有助于发现可能的系统瓶颈。为此,将使用分布式链路追踪系统Jaeger和一套与OpenTracing API相兼容的类库。
分布式链路追踪开放标准
OpenTracing API是一个与供应商无关的分布式链路追踪开放标准。许多分布式跟踪系统(如Dapper、Zipkin、HTrace、X-Trace)都提供了链路追踪功能,但使用的是互不兼容的API。选择其中一个系统通常意味着可能要与使用不同编程语言的系统紧密耦合到一起,从而形成一个解决方案。OpenTracing目的是为链路追踪的信息收集提供一组约定的、标准化的API。类库可用于不同的语言和框架。
请求关联参数概念:trace和span
trace由单个或多个span组成的有向无环图(Direct Acyclic Graph,DAG),这些span的边称为reference。trace用于聚合和关联整个系统的执行流,一个trace记录整个流程。
从服务依赖的角度展示了1个trace由8个不同的span组成的。这些span可以由同一个应用触发,也可以由不同的应用触发。唯一的要求是在触发新的span时,要传递父span的ID,这样新的span就拥有了父span的引用。
每个span包含如下信息:操作名称、起始时间戳和完成时间戳、零个或者多个span标签(键值对)、零个或多个span日志(带时间戳的键值对)、span上下文(context)以及引用零个或多个span的参考(通过span上下文)。span上下文包含了引用的span所需要的信息,这个span可以是自己服务的也可以是另一个服务的。
分布式链路追踪系统Jaeger
受Dapper和OpenZipkin启发,Jaeger是一个由Uber技术公司开源发布的分布式链路追踪系统,可以用于基于微服务的分布式系统中进行监控和故障排查。
1. 初始化链路追踪器并传输创建的trace和span
首先,在待链路追踪的服务中添加一些类库并初始化链路追踪器,创建trace和span并将其传输到Jaeger服务。
Flask==0.12.0
requests==2.18.4
jaeger-client==3.7.1? ? ---? Jaeger客户端类库将服务与链路追踪系统连接起来
opentracing>=1.2,<2? ---? Python的OpenTracing平台类库
opentracing_instrumentation>=2.2,<3? ---? 用于简化带有不同框架和应用集成的注解工具集合
这样,Jaeger收到消息后,就可以展示trace与span,并将这些span关联起来。将这些span关联起来能够帮助我们详细了解在某个服务的一次调用中每个操作的耗时及其相对整体执行时间的占比。
2. 链路追踪可视化
以向SimpleBank profile服务的端点发出一个请求为例,
1)profile服务创造了一个span A。
2)profile服务与外部服务交互以获取IP,并将其包装在一个新的span B中。
3)profile服务在新建的span C中与内部的SimpleBank settings服务交互以获取用户信息,并将父span的上下文传递给下游服务。
4)两个服务将span信息传递至Jaeger服务。
为了将追踪可视化,需要访问运行在16686端口的Jaeger界面。
单击底部的Find Traces按钮,可以查到某个服务的链路追踪。
为了了解分布式系统的运行情况,可以将不同服务之间的请求流以可视化的方式展示出来,并了解每个操作执行完成所需要的时间。这种简单的设置一方面能够让我们理解微服务架构中的执行流程,另一方面又能够发现可以改进的潜在瓶颈。
还可以使用Jaeger来了解系统中不同组件之间的关系。顶部导航菜单栏有一个Dependencies链接。单击该链接,然后在出现的页面中选择DAG(Direct Acyclic Graph)选项卡。
摘取自 摩根·布鲁斯和保罗·A.佩雷拉的《微服务实战》