标签 链路追踪 下的文章

场景

链路上底层服务CCC通过定时任务补偿发出业务MQ,此时MQ消息没有子版本;

下游配置MQ引流可解决直接消费问题,此时若消费逻辑中再调用其他服务,会发起无头流量,打到基线环境

下文中foo、bar、aaa、bbb、ccc均为链路上的微服务,此时期望流量打到ccc服务的v123虚拟环境版本,实际打到了基线的ccc

foo-v123 -> bar-v123 -> 基线aaa定时任务 -> MQ
                                         |-> bbb-v123(引流消费无头消息) -> ccc基线

解决

MQ client中已经开发了优先取链路版本的逻辑,取不到再取实例环境变量,实现MQ链路的无头传递

SkyWalking中没有这部分逻辑,加上类似逻辑:

private static String getTraceVersionOrEnv(CorrelationContext correlationContext, String headerName) {
    String version = correlationContext.get(headerName).orElse("");
    //  sniff virtual env version from 1. trace, 2. instance environment variable
    if (VIRTUAL_ENV_HEADER.equalsIgnoreCase(headerName) && StringUtil.isEmpty(version)) {
        version = Optional.ofNullable(System.getenv(VIRTUAL_ENV_ENVIRONMENT)).orElse("");
        if (StringUtil.isNotEmpty(version)) {
            //  put virtual env version into correlation context, or instance environment variable version won't be record
            correlationContext.put(VIRTUAL_ENV_HEADER, version);
        }
    }
    return version;
}

注意

之前没有加 correlationContext.put(VIRTUAL_ENV_HEADER, version); 会导致发起调用时取不到版本(CanaryCarrierItemgetHeaderValue取的是链路context中的内容,而不是header内容)

SkyWalking 作为一套 OpenTracing 标准的实现,其存储的数据结构也遵循 OpenTracing 的规范。

关于 OpenTracing 的语义标准,SkyWalking 的作者吴晟贡献了一篇翻译文献:OpenTracing官方标准-中文版,目前包含两个部分:

  1. specification.md, OpenTracing 标准正本
  2. semantic_conventions.md, 该文档描述,在常见场景下,Span进行tag、log操作时,key的使用习惯。

OpenTracing 标准提供了最基础的 APM 记录内容的语义,具体存储的数据结构下面以 SkyWalking 在ES 中的存储为例分析。

- 阅读剩余部分 -