场景

链路上底层服务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, 链路追踪, istio, 服务网格, MQ

添加新评论