调用链与日志关联的探索式查询

2020 年 2 月 06 日

调用链与日志关联的探索式查询

一、Observability


Observability 是一个最近几年开始在监控社区流行的术语。本文将 Observability 视为一种理念,一种监控的超集,包括监控、日志聚合、分布式跟踪,可以实时更深入地观察系统。本文将就其中的日志聚合、分布式跟踪及具体应用中结合使用进行展开说明。


二、日志与调用链的探索式查询


微服务、云和容器化架构的出现,改变了我们构建系统的方式。应用程序是分布式的,而且瞬息万变。加之底层的基础设施和网络服务愈加健壮,日常系统运维的大部分工作将来自应用程序层或者是不同应用程序之间的复杂交互调用。


对于复杂的跨系统调用,一次请求可能需要后台几台或上百台节点的支持。此时具体到一次请求已经很难通过人力确认其处理的完整流程,此时最能反映每次请求处理过程的应该是分布式追踪(下文简称调用链)。


调用链是从一次具体请求的全局角度看待问题,当细粒具体到一个节点时,应用系统自身打印的日志最能说明当前节点处理逻辑。


下面通过一张简图来说明调用链和日志聚合做的事情:


1571629086581087897.png


调用链的作用是将一次请求所经过的所有节点和关键操作进行记录并汇总展示出来,就像图中绿色箭头,能够提供一个全局的视角去看待一次请求。


日志聚合的作用是将所有节点和系统产生的日志进行汇总整理,并提供给用户一个有效并友好的查询能力。


但是我们在具体使用过程中往往是这样的:


从调用链进来以后发现了一个问题,然后切换到日志聚合去根据特定属性查询对应的日志信息,通过排查日志信息发现还需要再次去查询与之关联的调用链信息……如此往返多次。


日志与调用链的探索式查询对于这种经典场景提供了一种新的闭环处理问题模式:


1571629102936057015.png


从调用链入口进入,可以根据调用链关联到具体应用的与当前调用链相关的日志,根据日志也可以关联到具体一条调用链;从日志入口进入,可以根据日志关联到与当前日志相关的具体一条调用链,根据一条调用链又可以关联到与当前调用链相关联的日志。而且两种模式可以相互切换。


三、举个栗子


1571629108206035185.png


用户小明通过日志聚合搜索发现有 A 系统一段日志有异常信息,此时他可以通过此条日志关联找出对应的调用过程 a。通过观察 a 这条调用链小明发现,是由于 a 上的节点 a[2]超时导致。此时小明可以从调用链关联到与节点 a[2]相关的日志内容从而确定问题所在(具体效果见下文)。


四、整体架构设计


1571629132771045854.png


4.1 数据抓取:


应用集群中的机器上部署的 agent 用于数据收集和上送,探针内嵌在容器(tomcat 等)用于为应用画像和收集应用信息


4.2 数据传输:


agent 将处理过后的日志通过 mq 上送到监控服务器


4.3 数据处理及存储:


监控服务器将采集上来的数据进行处理并将其存入 ES,方便用户通过特定特征快速定位


4.4 数据展示:


将数据进行可视化展示,并提供方便的可视化自定义查询服务


五、具体实现


在介绍调用链和日志聚合具体实现之前需要明确的几个概念:


5.1 中间件劫持技术


通过在中间件启动时动态将我们自己的代码行为植入到中间件的各种行为中的技术。比如在 tomcat 启动时动态在 tomcat 处理请求的开始位置添加代码劫持,则能够实现在 tomcat 执行处理请求逻辑之前进行服务调用画像等功能。更多能力和实现方式可以参考:http://chuansong.me/n/603660351655


5.2 traceId


通过中间件劫持技术在服务调用最前端产生且能够唯一确定一条调用链的 id。


主要实现逻辑:


  • 在应用容器启动时,使用中间件劫持技术在服务调用入口和应用日志写文件入口位置添加劫持点

  • 在发生服务调用时生成调用链元数据和上下文

  • 当应用写日志时通过写文件入口劫持点获取当前调用的调用链上下文,将traceId与应用日志一同写入应用日志文件

  • 日志归集将生成的日志文件聚合整理上送到监控服务器

  • 监控服务器将收集到的日志信息,进行处理并存入es

  • web页面将存储在es中的数据进行展示


核心逻辑如下图:


1571629154066027394.png


六、调用链和日志聚合实现


调用链部分分为:模型设计、服务端信息收集(轻/重)、方法级信息收集(轻/重)、客户端信息收集(轻/重)、调用链协议设计(轻/重)、调用链上下文传递、调用信息记录及传递、调用数据统计处理几个关键过程。关键技术为中间件劫持增强框架、调用模型设计和调用链上下文传递。


应用日志部分分为:日志归集,日志内容处理传输,服务端日志处理及存储等几个关键步骤。关键技术为:服务画像技术、日志归集。


七、效果展示


7.1 调用链入口


1571629191987008682.png


通过特定条件搜素出关心的具体一次调用过程,点击进入调用的详细过程界面。


1571629207218064984.png


点击右侧的关联按钮可快速定位到与之相关联日志。


1571629221126035306.png


7.2 日志入口


1571629221126035306.png


通过特定特征(图中为按照 Hello 关键字进行搜索)搜索出符合条件的日志。


1571629244791058963.png


通过点击具体日志即可进入对应的调用过程。


1571629244791058963.png


参考资料


更多详情:https://uavorg.github.io/documents/uavdoc_architecture/moniorframework/diao-yong-lian-shu-ju-sheng-cheng.html


下载 UAVStack 的源码(https://github.com/uavorg)


下载 AllInOne 开发演示版(https://uavorg.github.io/main/)


本文转载自宜信技术学院。


原文链接:http://college.creditease.cn/detail/311


2020 年 2 月 06 日 21:30379

评论

发布
暂无评论
发现更多内容

《从0到1学习Flink》—— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— Flink 项目如何运行?

zhisheng

大数据 flink 流计算

ARTS 第 51 周

马克图布

ARTS 打卡计划

【迁移】CQRS很难吗?(译文:底部有原文地址)

罗琦

领域驱动设计 DDD

《从0到1学习Flink》—— 如何自定义 Data Source ?

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— 如何自定义 Data Sink ?

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch

zhisheng

大数据 flink 流计算

Review week1: Amazon的领导力法则

猫吃小怪兽

学习 高效工作 程序员 个人成长

写给产品经理的信(1):产品经理的经济基础逻辑思维能力

夜来妖

产品经理 产品设计 职业规划 逻辑思维 工作

python 实现·十大排序算法之选择排序(Selection Sort)

南风以南

Python 排序算法

【迁移】用Redlock构建Redis分布式锁【译】

罗琦

分布式锁

《从0到1学习Flink》—— 介绍Flink中的Stream Windows

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— Flink parallelism 和 Slot 介绍

zhisheng

大数据 flink 流计算

勇攀监控高峰-EMonitor之根因分析

乒乓狂魔

监控 全链路监控 故障定位 根因分析 AIOPS

【迁移】读完了GFS论文之后的感悟

罗琦

大数据 GFS 论文阅读

《从0到1学习Flink》—— 你上传的 jar 包藏到哪里去了?

zhisheng

大数据 flink 流计算

极客时间的三种身份:碎片整合的大师、成长焦虑的救星、工作技能的提升站

大橘栗

《从0到1学习Flink》—— Data Sink 介绍

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— Flink Data transformation(转换)

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— Flink 写入数据到 Kafka

zhisheng

大数据 flink 流计算

图文并茂讲述如何正确的使用缓存

后端学长

缓存 后端 缓存穿透 缓存击穿 缓存雪崩

Flink 从0到1学习—— Flink 不可以连续 Split(分流)?

zhisheng

大数据 flink 流计算

【迁移】撸论文系列之——Bigtable

罗琦

论文阅读 bigtable

《从0到1学习Flink》—— Apache Flink 介绍

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— Flink 配置文件详解

zhisheng

大数据 flink 流计算

【迁移】Flink vs Spark

罗琦

flink spark 大数据处理

《从0到1学习Flink》—— Data Source 介绍

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— Flink 中几种 Time 详解

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— Flink 读取 Kafka 数据批量写入到 MySQL

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— Flink 读取 Kafka 数据写入到 RabbitMQ

zhisheng

大数据 flink 流计算

《从0到1学习Flink》—— Flink JobManager 高可用性配置

zhisheng

大数据 flink 流计算

调用链与日志关联的探索式查询-InfoQ