Spring Boot Actuator Metrics的process.start.time返回异常Unix纪元值如何解决
Spring Boot Actuator
process.start.time 返回值处理方案 /actuator/metrics/process.start.time 接口返回的原始值默认是毫秒级的Unix时间戳,Spring Boot Actuator的Metrics返回的数值默认以浮点数格式输出,当数值过大时就会自动转为科学计数法(比如1.69E12这类格式),属于正常输出规则,不是返回值错误。
1. 接口返回结构说明
正常调用接口后的返回结构示例如下:
{ "name": "process.start.time", "measurements": [ { "statistic": "VALUE", "value": 1.696123456789E12 } ] }
其中value字段就是进程启动的毫秒级时间戳,无需调整单位,仅需要处理科学计数法格式即可。
2. 不同场景的转换方法
- Java代码中处理
直接将拿到的浮点型数值强转为long类型即可自动兼容科学计数法,不会出现精度丢失:
Double metricsValue = 1.696123456789E12; long epochMilli = metricsValue.longValue(); // 转成日期对象 Date startDate = new Date(epochMilli); // 如需秒级Unix时间戳,做除法即可 long epochSecond = epochMilli / 1000;
- Shell/命令行中处理
如果用curl调用接口后直接处理,可以借助jq完成格式转换:
# 输出纯数字的毫秒级时间戳 curl http://你的服务地址/actuator/metrics/process.start.time | jq '.measurements[0].value | tonumber | floor' # 直接转换为可读日期格式(Linux环境) date -d @$(curl http://你的服务地址/actuator/metrics/process.start.time | jq '.measurements[0].value | tonumber | floor / 1000')
- Python中处理
直接将浮点值转为int即可:
import datetime value = 1.696123456789E12 epoch_milli = int(value) # 转换为可读日期 start_time = datetime.datetime.fromtimestamp(epoch_milli / 1000)
3. 永久关闭科学计数法输出(可选)
如果不需要科学计数法格式,可以通过修改Spring Boot配置关闭:
- 在application.properties中添加配置:
management.metrics.export.simple.enabled=false - 也可以自定义Jackson序列化规则,全局关闭浮点数科学计数法输出:
@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true); mapper.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN, true); return mapper; } }
配置完成后接口返回的value字段会直接输出纯数字格式,不会出现科学计数法标识。
内容的提问来源于stack exchange,提问作者Nalini Wanjale
相关产品推荐
相关产品推荐

