查看原文
其他

使用数据加工将 Log 转成 Metric

日志服务 日志服务 2022-08-25

   云原生时代的可观察性  


我们关注应用运行起来后的运行时数据,主要有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 详细介绍请参考

官方链接:

https://help.aliyun.com/document_detail/171723.html

 

PromQL查询语言请参考

官方链接:

https://prometheus.io/docs/prometheus/latest/querying/basics/



   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+的行处理函数,可以参考官网文档:

https://help.aliyun.com/document_detail/159702.html


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



   Log 转 Metric 实战  


Step 1 - 创建 Metricstore


首先来建一个Metricstore用于接受指标数据


  • 创建Metricstore,界面操作

  • Grafana配置访问Metricstore, 以便使用Grafana查询Metricstore数据, 进入Grafana首页


Configuration -> Data Sources -> Add Data Source, 选择Prometheus -> URL的组成格式如下

https://${Endpoint}/prometheus/${Project}/${Metricstore}/
# Endpoint、Project、 Metricstore分别做相应替换

Auth -> Basic auth要enable起来,Basic Auth Details输入阿里云AccesskeyID和AccesskeySecret


Metricstore创建好了,那么如何向Metricstore写入指标数据呢?


可以看到下面的格式来写入, 见文档 Metricstore格式:
https://help.aliyun.com/document_detail/171773.htm



可以看到,Metricstore要求数据写入必须符合一定的格式,


对于Log格式转Metric格式的场景,可以使用数据加工函数e_to_metric来实现.


接下来以Nginx日志中的request_time等指标为例,演示如何将Log转换成Metricstore的格式


Step 2 - 第一个 Log 转 Metric 任务


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


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


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


数据加工实现日志转Metric主要由 e_to_metric 来实现, 函数参数要求如下,完整帮助参考 链接

https://help.aliyun.com/document_detail/125484.html?#section-u7i-ymg-jzp
e_to_metric(names=None, labels=None, time=None)# names字段用于指定指标名称字段,指定该字段后指标的值也会取Log中该字段名的值# labels字段用于指定指标label字段# time字段不填,自动使用logstore中的__time__时


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

e_to_metric(names="request_time")


点一下快速预览,看一下效果


可以看到生成了request_time指标,并且没有Label(后面有更多样例演示如何增加Label,我们先走通最简单的)


  • 保存加工任务, 存储目标的目标库请选择刚才第一步创建的Metricstore


Step 3 - 查询 Metricstore


加工任务保存后,等几分钟后数据会写入Metricstore,然后可以在Grafana里查询Metric。


输入PromQL查询,直接输入metricname即可查询


request_time



Log 转 Metric - 更多样例


  • 带上Label

e_to_metric(names="request_time",labels="slbid")



  • 将Log中的多个值转化为指标

e_to_metric(names=["request_time","upstream_response_time"],labels="slbid")



  • 多个Label

e_to_metric(names=["request_time","upstream_response_time"],labels=["slbid","scheme"])


  • Metric重命名

e_to_metric(names=[("request_time","rt"),"upstream_response_time"],labels=["slbid","scheme"])





  • Label重命名

e_to_metric(names=[("request_time","rt"),"upstream_response_time"],labels=["slbid",("scheme","http_type")])



小结

本文通过数据加工的e_to_metric函数演示了如何将Log转化成Metric, 希望对看官的可观察性场景有帮助。


SLS提供了可观察性的整体方案,积极跟进OpenTelemetry标准,有任何问题欢迎和我们交流。






您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存