虚拟环境无头流量版本传递
场景
链路上底层服务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);
会导致发起调用时取不到版本(CanaryCarrierItem
中getHeaderValue
取的是链路context中的内容,而不是header内容)