SLS新增单位转换函数——消除数据转换烦恼

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 在日常工作中,经常会遇到数据单位或时间单位不一致的情况,当处理或分析此类数据时,往往费事费力,非常麻烦。现在,SLS新增了单位转换函数,可以实现在不同单位之间轻松地进行转换、统一单位、格式化为可读文本,为用户减少不必要的数据转换工作,提升分析效率。

日常烦恼

作为工程师,我们在日常工作中,经常会遇到数据单位或时间单位不一致的日志或者指标数据,很多公共软件也都是将指标或数据以方便阅读的单位形式进行输出和展示的。

这类数据虽然阅读方便,但是一旦需要进行汇总分析或者进行比较排序时,往往需要将数据的单位大小进行归一化,然后再进行后续处理,这个工作本身不难但却非常繁琐,常常让我们感觉到蹩手蹩脚,影响工作效率。


一个例子

例如,下面是一个具体的实例,左图是java gc原生日志,右图是经过数据切割后的指标数据。

现在,我们需要分析每次垃圾回收后的jvm内存占比,计算公式:heap_used_after / heap_capacity_after,但是heap_used_after是M为单位,而heap_capacity_after是G为单位,为此,我们需要写出如下繁琐的SQL:

heap_used_after |select(cast(replace(heap_used_after,'M')asdouble)*1024*1024)/(cast(replace(heap_capacity_after,'G')asdouble)*1024*1024*1024)

事实上,事情可能还并非如此简单,heap_used_after的单位可能是M,可能是K,也可能是G,因此我们需要针对每种情况分别进行转换,于是,SQL变得更加冗长而繁琐:

heap_used_after |select(    CASE
      WHEN regexp_like(heap_used_after,'\d+\.?\d*B$') then cast(replace(heap_used_after,'B')asdouble)      WHEN regexp_like(heap_used_after,'\d+\.?\d*K$') then cast(replace(heap_used_after,'K')asdouble)*1024      WHEN regexp_like(heap_used_after,'\d+\.?\d*M$') then cast(replace(heap_used_after,'M')asdouble)*1024*1024      WHEN regexp_like(heap_used_after,'\d+\.?\d*G$') then cast(replace(heap_used_after,'G')asdouble)*1024*1024*1024      ELSE 0.0    END
)/(    CASE
      WHEN regexp_like(heap_capacity_after,'\d+\.?\d*B$') then cast(replace(heap_capacity_after,'B')asdouble)      WHEN regexp_like(heap_capacity_after,'\d+\.?\d*K$') then cast(replace(heap_capacity_after,'K')asdouble)*1024      WHEN regexp_like(heap_capacity_after,'\d+\.?\d*M$') then cast(replace(heap_capacity_after,'M')asdouble)*1024*1024      WHEN regexp_like(heap_capacity_after,'\d+\.?\d*G$') then cast(replace(heap_capacity_after,'G')asdouble)*1024*1024*1024      ELSE 1.0    END
)

没有人希望保留上面一大坨代码,只为了计算一个占比。


更多案例

在平时的数据分析工作中,我们还有很多这样的案例,比如:

由于数据单位不一,无法按大小排序...

由于数据太大,想转换成方便阅读的大小...

时间单位不一,无法进行汇总计算...


现在,麻烦解决了

现在,SLS新增了单位转换函数,用来高效解决此类问题,专心为您排忧解难。

DataSize转换函数

针对上述示例,只需如下的简洁SQL即可:

heap_used_after |select to_data_size_B(heap_used_after), to_data_size_B(heap_capacity_after)

不管heap_used_after的单位是B,是KB,是MB,还是GB,to_data_size_B()函数都可以统一转到以Byte为单位的大小。

您还可以使用以下函数,将数据对齐转换到对应的单位:

  • to_data_size_B,将任意单位的数据转换为以Byte为单位的大小
  • to_data_size_KB,将任意单位的数据转换为以KB为单位的大小
  • to_data_size_MB,将任意单位的数据转换为以MB为单位的大小
  • to_data_size_GB,将任意单位的数据转换为以GB为单位的大小
  • to_data_size_TB,将任意单位的数据转换为以TB为单位的大小
-- 将data_size转换为Byte单位select'50128371B'as data_size, to_data_size_B('50128371B'); data_size |    _col1
-----------+-------------50128371B |5.0128371E7-- 将data_size转换为KB单位select'50128371B'as data_size, to_data_size_KB('50128371B'); data_size |  _col1
-----------+----------50128371B |48953.49-- 将data_size转换为MB单位select'50128371B'as data_size, to_data_size_MB('50128371B'); data_size | _col1
-----------+-------50128371B |47.81-- 将data_size转换为GB单位select'50128371B'as data_size, to_data_size_GB('50128371B'); data_size | _col1
-----------+-------50128371B |0.05

时间间隔转换函数

时间间隔(duration)同样也是非常常见的日志和指标数据,常用于表示系统执行一个请求的耗时,它的大小往往随请求大小、系统负载等因素而变化,具体ns、us、ms、s、m、h、d等不同的单位。

针对时间间隔数据,SLS提供了相应的转换函数如下:

  • to_nanoseconds(),将任意单位的时间间隔转换为以纳秒为单位的大小
  • to_microseconds(),将任意单位的时间间隔转换为以微秒为单位的大小
  • to_milliseconds(),将任意单位的时间间隔转换为以毫秒为单位的大小
  • to_seconds(),将任意单位的时间间隔转换为以秒为单位的大小
  • to_minutes(),将任意单位的时间间隔转换为以分钟为单位的大小
  • to_hours(),将任意单位的时间间隔转换为以小时为单位的大小
  • to_days(),将任意单位的时间间隔转换为以天为单位的大小
  • to_most_succinct_time_unit(),将任意单位的时间间隔转换为方便阅读的最靠近的极简单位的大小
-- 统一对齐到微秒selecttime, to_microseconds(time);time|    _col1
-------+-------------175ns |0312us |31218ms  |1800032s   |320000001.2m  |720000000.56h |20160000000.2d  |17280000000-- 统一对齐到毫秒selecttime, to_milliseconds(time);time|  _col1
-------+----------175ns |0312us |018ms  |1832s   |320001.2m  |720000.56h |20160000.2d  |17280000-- 统一对齐到秒selecttime, to_seconds(time);time| _col1
-------+-------175ns |0312us |018ms  |032s   |321.2m  |720.56h |20160.2d  |17280-- 转换为方便阅读的极简单位selecttime, to_most_succinct_time_unit(time);time|  _col1
-------+----------175ns |175.00ns
312us |312.00us
18ms  |18.00ms
32s   |32.00s
1.2m  |1.20m
0.56h |33.60m
0.2d  |4.80h

此外,我们还专门提供了对时间间隔的解析函数:

  • parse_duration()
  • format_duration()
-- 对string类型的时间间隔进行解析,返回DAY-SECOND的表示形式selecttime, parse_duration(time);time|     _col1
-------+----------------175ns |000:00:00.000312us |000:00:00.00018ms  |000:00:00.01832s   |000:00:32.0001.2m  |000:01:12.0000.56h |000:33:36.0000.2d  |004:48:00.000-- 对double类型的秒级时间间隔进行格式化,返回可读的时间间隔字符串selecttime, format_duration(time);time|              _col1
---------+---------------------------------12.0|12 seconds
134.0|2 minutes,14 seconds
235.0|3 minutes,55 seconds
12.4|12 seconds
283.1|4 minutes,43 seconds
22415.4|6 hours,13 minutes,35 seconds


小结

在数据处理和分析过程中,数据单位或时间单位不一致,往往给分析工作带来困扰,降低了工作效率,使分析SQL变得复杂而臃肿。

SLS充分考虑到“这一点小麻烦”,为用户贴心地提供了相关的单位转换函数,可以在不同单位之间轻松地进行转换、统一单位、格式化为可读文本。

从此,您的数据转换烦恼将被消除。


进一步参考

SLS单位换算函数官方详细参考文档:点击进入

欢迎钉钉扫群加入阿里云-日志服务(SLS)技术交流, 获得第一手资料与支持

更多SLS的系列直播与培训视频会同步到B站,SLS的相关文章会同步到微信公众号与知乎敬请关注


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
7天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
113 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
1月前
|
PyTorch 算法框架/工具
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
本文介绍了PyTorch中的F.softmax()和F.log_softmax()函数的语法、参数和使用示例,解释了它们在进行归一化处理时的作用和区别。
377 1
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
|
7天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
4月前
|
SQL 运维 监控
SLS 数据加工全面升级,集成 SPL 语法
在系统开发、运维过程中,日志是最重要的信息之一,其最大的优点是简单直接。SLS 数据加工功能旨在解决非结构化的日志数据处理,当前全面升级,集成 SPL 语言、更强的数据处理性能、更优的使用成本。
18174 138
|
1月前
|
数据采集 机器学习/深度学习 存储
使用 Python 清洗日志数据
使用 Python 清洗日志数据
34 2
|
3月前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
3月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
128 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
2月前
|
SQL 人工智能 运维
在阿里云日志服务轻松落地您的AI模型服务——让您的数据更容易产生洞见和实现价值
您有大量的数据,数据的存储和管理消耗您大量的成本,您知道这些数据隐藏着巨大的价值,但是您总觉得还没有把数据的价值变现出来,对吗?来吧,我们用一系列的案例帮您轻松落地AI模型服务,实现数据价值的变现......
191 3
|
3月前
|
监控 Serverless 开发者
函数计算发布功能问题之查看函数的调用日志的问题如何解决
函数计算发布功能问题之查看函数的调用日志的问题如何解决
|
3月前
|
存储 监控 网络协议
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?
在Linux中,如何使用 tcpdump 监听主机为 192.168.1.1,tcp 端⼝为 80 的数据,并将将输出结果保存输出到tcpdump.log?