You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Elastic至8.16后Spring Boot Micrometer间歇性上报指标失败:Premature EOF

问题分析与解决方案

问题概述

使用Spring Boot 3.3.6(依赖micrometer-elastic-registry 1.13.6),将Elasticsearch从8.11.4升级至8.16后,出现间歇性指标上报失败的Premature EOF错误,此前无此问题,未修改其他配置,错误出现频率较低,未找到官方明确的版本不兼容信息。

错误堆栈如下:

java.io.UncheckedIOException: java.io.IOException: Premature EOF
    at io.micrometer.core.instrument.util.IOUtils.toString(IOUtils.java:55)
    at io.micrometer.core.instrument.util.IOUtils.toString(IOUtils.java:65)
    at io.micrometer.core.ipc.http.HttpUrlConnectionSender.send(HttpUrlConnectionSender.java:112)
    at io.micrometer.core.ipc.http.HttpSender$Request$Builder.send(HttpSender.java:306)
    at io.micrometer.elastic.ElasticMeterRegistry.publish(ElasticMeterRegistry.java:129)
    at io.micrometer.core.instrument.push.PushMeterRegistry.publishSafelyOrSkipIfInProgress(PushMeterRegistry.java:64)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: Premature EOF
    at java.base/sun.net.www.http.ChunkedInputStream.fastRead(Unknown Source)
    at java.base/sun.net.www.http.ChunkedInputStream.read(Unknown Source)
    at java.base/java.io.FilterInputStream.read(Unknown Source)
    at java.base/sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
    at java.base/sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at java.base/sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at java.base/sun.nio.cs.StreamDecoder.lockedRead(Unknown Source)
    at java.base/sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.base/java.io.InputStreamReader.read(Unknown Source)
    at java.base/java.io.BufferedReader.fill(Unknown Source)
    at java.base/java.io.BufferedReader.read1(Unknown Source)
    at java.base/java.io.BufferedReader.implRead(Unknown Source)
    at java.base/java.io.BufferedReader.read(Unknown Source)
    at java.base/java.io.Reader.read(Unknown Source)
    at io.micrometer.core.instrument.util.IOUtils.toString(IOUtils.java:49)
    ... 11 more

可能的解决方案

  • 升级Micrometer Elastic Registry版本:当前1.13.6版本可能未适配Elasticsearch 8.16的HTTP协议细节,尝试升级到与Spring Boot 3.3.6兼容的最新Micrometer版本(如1.13.x系列最新版,或Spring Boot依赖管理推荐的版本),新版本通常会修复与高版本Elasticsearch的通信问题。
  • 更换HTTP客户端实现:默认的HttpUrlConnectionSender可能存在与Elasticsearch 8.16分块响应处理的兼容性问题,尝试切换到OkHttp或Apache HttpClient作为Micrometer的HTTP发送器。例如添加OkHttp依赖后,配置elastic.metrics.export.http-client=okhttp。
  • 调整连接超时与重试策略:增加连接、读取超时时间,并配置重试机制,应对间歇性的网络或服务端响应中断。可通过以下配置调整:
    management.metrics.export.elastic.connect-timeout=10s
    management.metrics.export.elastic.read-timeout=10s
    management.metrics.export.elastic.num-threads=2
    management.metrics.export.elastic.retries=3
    
  • 检查Elasticsearch服务端日志:查看Elasticsearch 8.16的服务端日志,确认是否存在请求处理异常、连接中断等情况,排查是否是服务端主动关闭连接导致的EOF。
  • 临时禁用HTTP分块编码:尝试在Micrometer的HTTP请求中禁用分块编码,测试是否能规避问题。可通过自定义HttpUrlConnectionSender修改请求配置,关闭分块模式。

内容的提问来源于stack exchange,提问作者Xli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:40:08