使用数据加工将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名称,可以是单个字符串、多个字符串列表或者元组列表,其值为对应日志字段名称。
|
labels |
String、StringList、Tuple List |
否 |
时序数据的labels信息字段,可以是单个字符串、多个字符串列表或者元组列表,其值为对应日志字段名称。 说明如下描述中host和app为日志字段名称,hostvalue和appvalue为日志字段的值。
|
time_field |
String |
否 |
时序数据的时间字段。默认使用日志中 |
time_precision |
Int |
否 |
原始日志数据时间字段的时间单位,支持秒、毫秒、微秒、纳秒。默认按照秒存储。例如 |
ignore_none_names |
Boolean |
否 |
日志字段不存在时,是否忽略转换为时序数据。
|
ignore_none_labels |
Boolean |
否 |
日志字段不存在时,是否忽略转换为时序数据。
|
返回值
返回时序数据
示例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)
加工结果: