AWS Log Insights中字符串转数字及时间差计算问题
问题描述
我的日志是JSON格式,包含MessageTemplate字段,示例内容如下:
"[Statistics] | 1697041097288531000 | 1697041097406589000 | 1697041097458528733"
我想在AWS Log Insights中提取其中两个数值并计算差值,尝试了以下查询语句,但elaspedTime列始终为空。用硬编码数值计算时可以正常得到结果,想知道怎么把提取的字符串转为数字完成计算,这个需求是否可行?
原查询语句:
fields @timestamp, @message | filter @message like /[Statistics]/ | parse MessageTemplate "*|*|*|*" as header, pub1, pub2, pub3 | stats abs(pub2) - abs(pub1) as elaspedTime by @timestamp | limit 20
解决方案
这个需求完全可行,问题出在两个细节上:
- Parse分隔符没处理空格:你的
MessageTemplate里的分隔是|(前后带空格),但原查询用*|*提取时,会把空格包含到pub1、pub2这些变量里(比如pub1实际是" 1697041097288531000 "),带空格的字符串没法直接参与数值计算。 - 未显式转换字符串为数字:就算提取到纯数字字符串,最好用
to_number()函数显式转成数值类型,避免类型识别问题。
修正后的查询语句:
fields @timestamp, @message | filter @message like /[Statistics]/ | parse MessageTemplate "* | * | * | *" as header, pub1, pub2, pub3 | stats abs(to_number(pub2)) - abs(to_number(pub1)) as elapsedTime by @timestamp | limit 20
补充说明:
- 把parse的分隔符改成
* | *,匹配带空格的分隔符,提取到无空格的数字字符串 to_number()会把字符串转为数值类型,之后就能正常做减法计算- 顺便修正了拼写错误:
elaspedTime改成elapsedTime(不影响功能,但更规范)
内容的提问来源于stack exchange,提问作者raah
相关产品推荐
相关产品推荐

