使用Spring Boot搭配Sleuth时遭遇IllegalArgumentException异常求助
修复思路
首先明确异常根源:ZipkinHttpSpanExtractor在提取链路追踪ID时,收到了空的十六进制字符串,导致Span.hexToId()转换失败抛出IllegalArgumentException。
针对这个问题,给出以下几种修复方案:
方案1:过滤空的追踪头
自定义一个HttpSpanExtractor的包装类,在调用原ZipkinHttpSpanExtractor提取Span前,先检查X-B3-TraceId、X-B3-SpanId等B3协议头的值是否为空,若为空则直接返回空Span(不加入已有追踪链),避免进入转换逻辑。
示例代码片段:@Bean public HttpSpanExtractor customHttpSpanExtractor(ZipkinHttpSpanExtractor delegate) { return carrier -> { // 检查核心追踪头是否为空 String traceId = carrier.getFirst("X-B3-TraceId"); String spanId = carrier.getFirst("X-B3-SpanId"); if (org.springframework.util.StringUtils.isEmpty(traceId) || org.springframework.util.StringUtils.isEmpty(spanId)) { return null; // 不加入追踪链,由Sleuth生成新的Span } return delegate.joinTrace(carrier); }; }方案2:升级Sleuth版本
1.3.x早期版本的Sleuth存在空值处理缺陷,后续同分支的稳定版本(如1.3.6+)已修复该问题。可将spring-cloud-sleuth-core升级到Dalston分支的稳定版本,确保与Spring Boot 1.5.x版本兼容(Spring Cloud Dalston分支适配Spring Boot 1.5.x,最高版本为Dalston.SR5)。方案3:拦截非法请求头
在网关或服务的过滤器层,拦截带有空X-B3-TraceId/X-B3-SpanId头的请求,要么清空这些空请求头,要么直接返回非法请求提示,避免请求进入业务服务触发异常。
异常堆栈关键信息:
ZipkinHttpSpanExtractor.joinTrace 51 : Exception occurred while trying to extract span from carrier java.lang.IllegalArgumentException: Can't convert empty hex string to long at org.springframework.util.Assert.hasText(Assert.java:181) at org.springframework.cloud.sleuth.Span.hexToId(Span.java:583) at org.springframework.cloud.sleuth.instrument.web.ZipkinHttpSpanExtractor.buildParentSpan(ZipkinHttpSpanExtractor.java:91) at org.springframework.cloud.sleuth.instrument.web.ZipkinHttpSpanExtractor.joinTrace(ZipkinHttpSpanExtractor.java:49) at org.springframework.cloud.sleuth.instrument.web.ZipkinHttpSpanExtractor.joinTrace(ZipkinHttpSpanExtractor.java:19)
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

