Page 381 - 《软件学报》2025年第9期
P. 381

4292                                                       软件学报  2025  年第  36  卷第  9  期


                    ● 单调值处理. 在跨度数据中, 通常可以看到一些字段具有单调的值, 尤其对于连续的条目, 可能会有相近的
                 取值, 这些字段包括时间戳、数据库事务标识符、计数器等. 例如, “startTimeUnixNano”和“endTimeUnixNano”字
                 段是由   19  个字符的长字符串组成, 而一个请求通常在秒甚至毫秒级别即可执行完成, 时间戳中代表年份、月份和
                 日期部分的数字是多余的. 对于这些单调值的字段, NCQT                首先记录最小的值, 然后用偏移量代替原始值, 从而删
                 除大量不必要的数字. 在解压缩时, 只需要通过最小值和偏移量重新计算实际值. 在图                          4  中可知, 跨度大多数字段
                 涵盖了字段取值的类型, 因此很容易即可找出可以处理的字段, 而对于跨度开始和结束时间, 我们记录根跨度的开
                 始时间, 对于每条追踪以此作为基准值计算每个跨度的时间偏移.
                    图  5  展示了一个跨度容器如何抽取数据冗余并返回编码后的数据. 最终的输出为一个元组, 其中包括一个                              32
                 位组合   ID, 两个  64  位的时间偏移以及一个     32  位参数  ID  组成的序列, 序列的长度对应于该组合下字段的个数. 这
                 种结构旨在提供对跨度数据的紧凑表示, 有助于进一步的压缩和处理, 同时确保了重要信息的完整性.


                                     跨度数据
                                                                              参数值
                                                    字段值         指针
                                     索引字典
                                                                              参数值


                                                                              参数值
                                                    组合
                                     组合字典


                                                    开始时间偏移 结束时间偏移        参数索引
                                     编码后数据



                                                       图 5 预处理

                 3.1.2    调用图嵌入和聚类
                    在原始的追踪文件中, 追踪按照收集的时间顺序存储, 不同请求产生的追踪交错排列. 这种排列方式不利于压
                 缩算法识别数据中的重复模式, 且进一步增大了搜索的时间成本. 图嵌入和聚类旨在通过识别不同追踪结构的相
                 似性, 将具有相似跨度组成或调用关系的追踪数据组织在一起, 减少局部信息熵, 进而提高编码器的压缩率以及搜
                 索器的查询效率.
                    追踪的调用图是由跨度节点组成的多叉树, 理论上, 基于树编辑距离的方法可以更好地衡量追踪结构之间的
                                                                                   2
                 差异. 然而, 在许多微服务系统中它们的成本太高, 因为比较所需的时间复杂度为                        O(N ), 其中, N  为追踪调用图中
                 包含的跨度数量. 因此, 已有研究提出了一些轻量级的嵌入方法                   [6,17] 以获取追踪图的向量表示, 从而减少不同追踪
                 间比较的时间开销. 然而, 这些方法要么忽略了追踪的树状结构, 要么与具体的跨度数据相关. 因此, 我们提出了一
                 种轻量的基于     N-gram  的追踪结构嵌入方法, 通过在图上滑动一个长度为              N  的窗口提取局部特征.
                    如算法   1  和图  6  所示, NCQT  通过以下方式生成追踪的表示. 首先, 通过深度优先搜索的顺序遍历每一个调用
                 图的节点, 并将节点加入从根节点开始的路径列表, 其中每一层中优先遍历开始时间较早的节点. 当列表长度不小
                 于  N  时, 将列表末尾  N  个节点的服务调用序列作为尾节点的调用路径. 如果遍历到叶子节点时列表长度小于                             N,
                 则将从根节点开始的完整调用链加入该调用图的路径表中. 最后, 方法收集所有调用图的调用路径, 并根据调用路
                 径为每种结构生成一个向量表示. 具体而言, 方法判断每个调用路径的存在性, 如果某个调用路径存在, 方法将该
                 维度的取值设为此调用路径的数量, 否则设为               0. 值得注意的是, 由于一个追踪中可能含有重复的跨度, 因此可能
                 存在某个调用路径出现多次的情况.
   376   377   378   379   380   381   382   383   384   385   386