SLS数据加工完成Log到Metric的转换

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 简介: # 使用数据加工将Log转成Metric ## 云原生时代的可观察性 我们关注应用运行起来后的运行时数据,主要有Log、Trace和Metric 这3大类。 Log是离散的事件,Trace可以认为是带请求追踪的事件,Metric是带统计量的事件。

使用数据加工将Log转成Metric

云原生时代的可观察性

我们关注应用运行起来后的运行时数据,主要有Log、Trace和Metric 这3大类。

Log是离散的事件,Trace可以认为是带请求追踪的事件,Metric是带统计量的事件。

本质上Log、Trace、Metric都是事件,存储上满足事件存储的系统都可以用来存储这3类数据。

阿里云SLS为运行时数据提供了两种存储:Logstore和Metricstore。

  • Logstore:适合存储Log和Trace
  • Metricstore:适合存储Metric

SLS Metricstore针对时序场景做了大量优化,提供PromQL查询能力,支持Prometheus协议。

SLS Metricstore 详细介绍请参考官方链接, PromQL查询语言请参考官方链接

Log转Metric

很多应用的Log数据往往比Metric全面。 经常存在这样的场景: 把Log中的数据转换为Metric。

前面提到,Metric可以认为是特定格式的Log,因此在SLS里可以将Log转换为Metric。

常见的Log转Metric的方法可以有两种:


  • 聚合日志产生指标,类似sql做group by以后产生对应的统计值. 对应SLS ScheduleSQL功能
  • 将日志格式做格式转换,使其符合Metric格式. 对应SLS数据加工e_to_metric场景

本文主要介绍第二种的场景,即日志按行处理转化为Metric的格式

阿里云SLS 数据加工简介


数据加工服务是SLS推出的面向日志行处理的服务,主要为日志的规整、过滤、富化等场景设计

SLS数据加工DSL是专门为日志实时行处理定制的一套语言(类Python)。目前支持200+的行处理函数,可以参考官网文档

本文主要介绍Log转Metric的函数 e_to_metric

函数说明:

函数格式:

e_to_metric(names=None, labels=None, time_field='__time__', time_precision='s', ignore_none_names=True, ignore_none_labels=True)

参数说明

参数说明

参数

类型

是否必填

说明

name

String、StringList、Tuple List

时序数据的Metric名称,可以是单个字符串、多个字符串列表或者元组列表,其值为对应日志字段名称。

  • String:将一个日志字段转换为时序数据的Metric名称。包含一个字符串,例如取值为rt。返回一条包含__name__:rt的时序数据。
  • StringList:将两个日志字段转换为时序数据的Metric名称。包含多个字符串,例如取值为["rt", "qps"]。返回两条时序数据,分别包含__name__:rt__name__:qps
  • Tuple List:将多个日志字段转换为时序数据的Metric名称,并重新命名。包含多个元组,例如取值为 [("rt","max_rt"),("qps", "total_qps")] 。元组的第一个元素是原日志字段,第二个为加工后的时序数据Metric名称字段。返回两条时序数据,分别包含__name__:max_rt__name__:total_qps

labels

String、StringList、Tuple List


时序数据的labels信息字段,可以是单个字符串、多个字符串列表或者元组列表,其值为对应日志字段名称。


说明如下描述中host和app为日志字段名称,hostvalue和appvalue为日志字段的值。

  • String:将一个日志字段转换为时序数据的labels信息。包含一个字符串,例如取值为host。返回一条包含__label__:host#$#hostvalue的时序数据。
  • StringList:将两个日志字段转换为时序数据的labels信息。包含多个字符串,例如取值为["host", "app"]。返回两条时序数据,分别包含__label__:host#$#hostvalue__label__:app#$#appvalue
  • Tuple List:将多个日志字段转换为时序数据的labels信息,并重新命名。包含多个元组,例如取值[("host","hostname"),("app", "appname")] 。元组的第一个元素是原日志字段,第二个为加工后的时序数据labels信息字段。返回两条时序数据,分别包含__label__:hostname#$#hostvalue__label__:appname#$#appvalue

time_field

String

时序数据的时间字段。默认使用日志中__time__字段作为时序数据的时间字段。

time_precision

Int

原始日志数据时间字段的时间单位,支持秒、毫秒、微秒、纳秒。默认按照秒存储。例如time_field="ms"表示原日志数据时间单位为毫秒。

ignore_none_names

Boolean

日志字段不存在时,是否忽略转换为时序数据。

  • True(默认值):忽略,即不转换为时序数据。
  • False:不忽略,不存在时上报错误。

ignore_none_labels

Boolean

日志字段不存在时,是否忽略转换为时序数据。

  • True(默认值):忽略,即不转换为时序数据。
  • False:不忽略,不存在时上报错误。

返回值

返回时序数据

示例1:将m1和m2所在的日志转换为时序数据格式,并将label_a和label_b字段作为新增labels信息字段。

原始日志:

"__time__": "1614253519",
"m1": "1",
"m2": "2",
"label_a": "aa",
"label_b": "bb"

加工规则:e_to_metric(names=('m1', 'm2'), labels=('label_a', 'label_b')

加工结果:

'__name__': 'm1',

'__labels__': 'label_a#$#aa|label_b#$#bb',
  '__time_nano__': '1614253519000000000',

'__value__': '1.0'


'__name__': 'm2',

'__labels__': 'label_a#$#aa|label_b#$#bb',
'__time_nano__': '1614253519000000000',

'__value__': '2.0'

log转Metric实战

首先创建一个store用于接受指标的数据

1、创建store,界面操作


可以使用模拟接入,接入Nginx访问日志

2、log转Metric任务

2.1 先来看一下用于演示的Nginx日志, 我们的目标是将建立Nginx的request_time指标

2.2 点击Nginx日志的logstore,进入查询分析页面后,可以看到“数据加工”的入口,点击进去:

2.3 看到数据加工IDE界面后,在IDE里编写DSL语句实现生成request_time指标

2.4  数据加工实现日志转Metric主要由 e_to_metric 来实现, 函数参数要求如上文《函数说明》,也可参考 链接

我们只需要建立一个指标叫request_time,并且指标取值也是request_time的值,因此加工语句如下:

e_to_metric(names="request_time")

点一下高级预览,看一下效果


可以看到生成了request_time指标。

更多样例

1、还是如上Nginx访问日志,加工语句:

e_to_metric(names=[("remote_user", "remote_user1"), ("request_length", "request_length1")],labels="status")

则加工结果:



2、加上ignore_none_name参数,设置为false,且names不存在,

加工语句:e_to_metric(names=[("remote_user1", "remote_user2"), ("request_length", "request_length1")],

                            labels="status", ignore_none_names=True, ignore_none_labels=False)

则加工结果:

3、加上ignore_none_labels参数,设置为false,且labels不存在,加工语句:

e_to_metric(names=[("remote_user1", "remote_user2"), ("request_length", "request_length1")],

                            labels="status1", ignore_none_labels=False)

加工结果:

4、加上ignore_none_names和ignore_none_labels参数,ignore_none_name=True,ignore_none_labels=False且labels不存在,加工语句:

e_to_metric(names=[("remote_user1", "remote_user2"), ("request_length", "request_length1")],

                            labels="status1",ignore_none_names=True,  ignore_none_labels=False)

加工结果:

5、加上ignore_none_names和ignore_none_labels参数,ignore_none_name=True,ignore_none_labels=True且labels不存在,加工语句:

e_to_metric(names=[("remote_user1", "remote_user2"), ("request_length", "request_length1")],

                            labels="status1",ignore_none_names=True,  ignore_none_labels=True)

加工结果:

6、加上time_precision参数,设置为ms,

加工语句:e_to_metric(names="remote_user", labels="status", time_precision='ms', ignore_none_names=True,  ignore_none_labels=True)

则加工结果:

7、加上time_precision参数,设置为ns,

加工语句:e_to_metric(names="remote_user", labels="status", time_precision='ns', ignore_none_names=True,  ignore_none_labels=True)

则加工结果:

8、加上time_field参数,设置为__tag__:__receive_time__

加工语句:e_to_metric(names="remote_user", labels="status", time_field="__tag__:__receive_time__",time_precision='ns', ignore_none_names=True,  ignore_none_labels=True)

加工结果:

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
4月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
本文介绍了阿里集团A+流量分析平台的日志查询优化方案,针对万亿级日志数据的写入与查询挑战,提出基于Flink、Paimon和StarRocks的技术架构。通过Paimon存储日志数据,结合StarRocks高效计算能力,实现秒级查询性能。具体包括分桶表设计、数据缓存优化及文件大小控制等措施,解决高并发、大数据量下的查询效率问题。最终,日志查询耗时从分钟级降至秒级,显著提升业务响应速度,并为未来更低存储成本、更高性能及更多业务场景覆盖奠定基础。
|
26天前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
106 0
|
26天前
|
数据采集 运维 监控
|
5月前
|
SQL 监控 数据挖掘
SLS 重磅升级:超大规模数据实现完全精确分析
SLS 全新推出的「SQL 完全精确」模式,通过“限”与“换”的策略切换,在快速分析与精确计算之间实现平衡,满足用户对于超大数据规模分析结果精确的刚性需求。标志着其在超大规模日志数据分析领域再次迈出了重要的一步。
468 117
|
3月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
320 4
|
6月前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
426 13
|
6月前
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
565 0
|
SQL 监控
日志服务数据加工最佳实践: 从RDS-MySQL拉取数据做富化
本篇覆盖日志服务数据加工最佳实践: 从RDS-MySQL拉取数据做富化的各种场景, 包括定期刷新拉取所有, 拉取部分数据, 拉取后再过滤数据, 调整返回表格结构等
1931 0
|
10月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
2787 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板