SpringBoot 健康檢查數據格式問題排查

最近運維一直反饋我的應用健康檢查返回的數據格式不正確,具體如下

[api@prod-xxxx-service]$ curl http://localhost:54321/actuator/health
{
    "details":{
        "elasticsearch":{
            "details":{},
            "status":{
                "code":"UP",
                "description":""
            }
        },
        "diskSpace":{
            "details":{
                "total":211242639360,
                "free":188137111552,
                "threshold":10485760
            },
            "status":{"$ref":"$.details.elasticsearch.status"}
        }
    },
    "status":{"$ref":"$.details.elasticsearch.status"}
}

正常的返回數據如下

[api@prod-xxxx-service]$ curl http://localhost:54321/actuator/health
{"status":"UP","details":{"elasticsearch":{"status":"UP"},"diskSpace":{"status":"UP","details":{"total":211242639360,"free":188136599552,"threshold":10485760}}}}

可見,異常的返回數據中,出現了很多dollar符開頭的表達式,如果把這些表達式替換成對應的值,這個返回結果並沒有什麼問題。

一開始懷疑是項目中pom文件配置不正確導致的,於是找了中間件團隊的文檔對照着重新配置pom,但是並沒有什麼作用。又找了健康檢查數據正常的應用來進行對比,仍然沒有發現問題。

這時候真是一臉蒙逼,完全不知道問題在哪裏,互聯網上也完全找不到任何類似的問題。

突然想到一個辦法:排除法

首先從springboot官網上初始化一個springboot的demo項目,同時找來一個健康檢查數據異常的項目。

將健康檢查數據異常的項目裏的代碼一點點copy到demo項目中,每做一次改動後都查看健康檢查數據是否正常。

剛開始時,demo項目的健康檢查數據都是正常的,隨着copy過來的代碼越來越多,終於健康檢查數據不正常了,此時基本可以確定是項目裏的代碼引起了健康檢查數據的異常。

查看新增的代碼時,發現瞭如下的一個配置

@Configuration
public class SpringConfig {
 
    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverters() {
        // 1.定義一個converters轉換消息的對象
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        // 2.添加fastjson的配置信息,比如: 是否需要格式化返回的json數據
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteDateUseDateFormat);
        // 3.在converter中添加配置信息
        fastConverter.setFastJsonConfig(fastJsonConfig);
        // 4.將converter賦值給HttpMessageConverter
        HttpMessageConverter<?> converter = fastConverter;
        // 5.返回HttpMessageConverters對象
        return new HttpMessageConverters(converter);
    }
}

這段配置是爲了使rest接口返回json數據時使用fastjson來進行格式化,而非springboot默認的jackson來進行格式化。

突然想到,獲取健康檢查結果的接口也是一個rest接口,那麼很可能就是這個配置導致健康檢查數據的異常。

接下來進行驗證,註釋掉上面的這段配置

重啓項目,查看健康檢查數據

正常!!!!

發佈了366 篇原創文章 · 獲贊 14 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章