Page 80 - 《软件学报》2021年第5期
P. 80

1304                                     Journal of Software  软件学报 Vol.32, No.5,  May 2021

                 出现问题的原因.比如,根据链路日志数据可以生成各个模块间的因果关系图(一般是有向无环图),再通过图的
                 相关算法分析出现问题的节点            [3−7] .生成 Tracing 类型的监控数据有较多的开源技术框架都能实现,例如
                                [9]
                       [8]
                 X-Trace 和 Dapper .Tracing 数据可以标识一个全局唯一 id,此外,每个节点中的监控数据段同样可以标识一个
                 id 值,而这些技术框架则通过将完整请求中所有节点内部的监控数据串联起来形成完整的 Tracing 数据.
                 1.2   CAT的日志数据类型

                 1.2.1    Transaction 数据
                    被监控服务使用 CAT 所生成的监控数据为 Transaction 监控数据,它可以视作 Tracing 中一个单节点内的监
                 控数据,也同样是链路跟踪型日志数据.一个 Transaction 内部能够嵌套多个其他类型的监控数据,并记录下函数
                 调用中的参数、自定义数据以及耗时等.在图 1 中展示了一条完整的 Transaction 数据,从中可以看出整体的数
                 据结构、嵌套关系、自定义数据等.














                                               Fig.1    Visualization of “LogView”
                                                图 1  LogView 的数据可视化
                 1.2.2    LogView
                    本文将一条完整的 Transaction 类型日志数据定义为 LogView,每条 LogView 中会记录一次请求调用中单
                 台机器单个进程上的服务实例的函数调用过程以及各种自定义的数据.此外,每条 LogView 具有全局唯一的 id
                 标识值,该值由应用名、机器 ip 等信息组成.LogView 的 id 的统一格式为{domain}-{ip}-{hour}-{index},它由 4
                 部分组成.
                    •   {domain}:指被监控的应用名.
                    •   {ip}:ip 地址的 16 进制表示,指被监控应用所部署机器的 ip-v4 地址.
                    •   {hour}:表示该条 logView 发生的小时,使用时间戳表示.
                    •   {index}:递增值.index 需要以一定的周期将持久化到单独的文件中,当前采取了每 3s 刷新到磁盘一次
                        的策略,这样可以避免机器宕机后,index 重置为 0 导致大量 id 重复.宕机重启后,首先从文件中加载之
                        前的 index 值,并在此值基础上进行自增操作.此外,在多线程并发运行的情况下,可以通过对 index 值进
                        行原子操作实现自增,不存在因同步引起的性能问题.每过 1 小时后,该值会重置为 0 重新开始计数.
                    图 1 展示了一条完整的 LogView 日志数据,从图中的长方框可以看出有 3 种类型的监控数据(即 E/t/T),t 是
                 Transaction 的开始标识,T 是结束标识,而 E 代表 Event 类型监控数据.整体来看,存在两层 Transaction 嵌套关系
                 以及 3 个内部 Transaction 的并列关系,并且内部有多个 Event 类型.从该 LogView 中可以获取到多项监控指标,
                 比如调用是否成功、开始与结束时间戳、耗时、自定义的分类名、自定义的附加数据.例如,图中的第 1 行与
                 最后一行为一个 Transaction,第 1 列数据标识了数据类型、起始与结束的时间戳;而对应的第 2 列与第 3 列的信
                 息是自定义的两级分类:一级分类为“URL.API”,二级分类为“/cat/r/model”;从第 4 列的信息可以看出,最外层
                 Transaction 的整体耗时小于 1ms,还附加了其他自定义的数据“module=r&in=model&out=model”.
                    Tracing 的完整数据可以视作将多个 LogView 数据按时间先后和调用关系关联起来的数据集合,数据集合
                 中含有多个节点级的 Transaction 数据,且 Tracing 数据同样会具有唯一的 id 标识.
   75   76   77   78   79   80   81   82   83   84   85