摘要:本文将就 Observability 中的日志聚合、分布式跟踪及具体应用中结合使用进行展开说明。
一、Observability
Observability 是一个最近几年开始在监控社区流行的术语。本文将 Observability 视为一种理念,一种监控的超集,包括监控、日志聚合、分布式跟踪,可以实时更深入地观察系统。本文将就其中的日志聚合、分布式跟踪及具体应用中结合使用进行展开说明。
二、日志与调用链的探索式查询
微服务、云和容器化架构的出现,改变了我们构建系统的方式。应用程序是分布式的,而且瞬息万变。加之底层的基础设施和网络服务愈加健壮,日常系统运维的大部分工作将来自应用程序层或者是不同应用程序之间的复杂交互调用。
对于复杂的跨系统调用,一次请求可能需要后台几台或上百台节点的支持。此时具体到一次请求已经很难通过人力确认其处理的完整流程,此时最能反映每次请求处理过程的应该是分布式追踪(下文简称调用链)。
调用链是从一次具体请求的全局角度看待问题,当细粒具体到一个节点时,应用系统自身打印的日志最能说明当前节点处理逻辑。
下面通过一张简图来说明调用链和日志聚合做的事情:
调用链的作用是将一次请求所经过的所有节点和关键操作进行记录并汇总展示出来,就像图中绿色箭头,能够提供一个全局的视角去看待一次请求。
日志聚合的作用是将所有节点和系统产生的日志进行汇总整理,并提供给用户一个有效并友好的查询能力。
但是我们在具体使用过程中往往是这样的:
从调用链进来以后发现了一个问题,然后切换到日志聚合去根据特定属性查询对应的日志信息,通过排查日志信息发现还需要再次去查询与之关联的调用链信息……如此往返多次。
日志与调用链的探索式查询对于这种经典场景提供了一种新的闭环处理问题模式:
从调用链入口进入,可以根据调用链关联到具体应用的与当前调用链相关的日志,根据日志也可以关联到具体一条调用链;从日志入口进入,可以根据日志关联到与当前日志相关的具体一条调用链,根据一条调用链又可以关联到与当前调用链相关联的日志。而且两种模式可以相互切换。
三、举个栗子
用户小明通过日志聚合搜索发现有 A 系统一段日志有异常信息,此时他可以通过此条日志关联找出对应的调用过程 a。通过观察 a 这条调用链小明发现,是由于 a 上的节点 a[2] 超时导致。此时小明可以从调用链关联到与节点 a[2] 相关的日志内容从而确定问题所在(具体效果见下文)。
四、整体架构设计
4.1 数据抓取:
应用集群中的机器上部署的 agent 用于数据收集和上送,探针内嵌在容器(tomcat 等)用于为应用画像和收集应用信息
4.2 数据传输:
agent 将处理过后的日志通过 mq 上送到监控服务器
4.3 数据处理及存储:
监控服务器将采集上来的数据进行处理并将其存入 ES,方便用户通过特定特征快速定位
4.4 数据展示:
将数据进行可视化展示,并提供方便的可视化自定义查询服务
五、具体实现
在介绍调用链和日志聚合具体实现之前需要明确的几个概念:
5.1 中间件劫持技术
通过在中间件启动时动态将我们自己的代码行为植入到中间件的各种行为中的技术。比如在 tomcat 启动时动态在 tomcat 处理请求的开始位置添加代码劫持,则能够实现在 tomcat 执行处理请求逻辑之前进行服务调用画像等功能。更多能力和实现方式可以参考:http://chuansong.me/n/6036603…
5.2 traceId
通过中间件劫持技术在服务调用最前端产生且能够唯一确定一条调用链的 id。
主要实现逻辑:
- 在应用容器启动时,使用中间件劫持技术在服务调用入口和应用日志写文件入口位置添加劫持点
- 在发生服务调用时生成调用链元数据和上下文
- 当应用写日志时通过写文件入口劫持点获取当前调用的调用链上下文,将 traceId 与应用日志一同写入应用日志文件
- 日志归集将生成的日志文件聚合整理上送到监控服务器
- 监控服务器将收集到的日志信息,进行处理并存入 es
- web 页面将存储在 es 中的数据进行展示
核心逻辑如下图:
六、调用链和日志聚合实现
调用链部分分为:模型设计、服务端信息收集(轻 / 重)、方法级信息收集(轻 / 重)、客户端信息收集(轻 / 重)、调用链协议设计(轻 / 重)、调用链上下文传递、调用信息记录及传递、调用数据统计处理几个关键过程。关键技术为中间件劫持增强框架、调用模型设计和调用链上下文传递。
应用日志部分分为:日志归集,日志内容处理传输,服务端日志处理及存储等几个关键步骤。关键技术为:服务画像技术、日志归集。
七、效果展示
7.1 调用链入口
通过特定条件搜素出关心的具体一次调用过程,点击进入调用的详细过程界面。
点击右侧的关联按钮可快速定位到与之相关联日志。
7.2 日志入口
通过特定特征(图中为按照 Hello 关键字进行搜索)搜索出符合条件的日志。
通过点击具体日志即可进入对应的调用过程。
参考资料
更多详情:https://uavorg.github.io/docu…
下载 UAVStack 的源码(https://github.com/uavorg)
下载 AllInOne 开发演示版(https://uavorg.github.io/main/)
作者:李崇
来源:宜信技术学院