本次介绍2022年AIOps国际挑战赛--热身赛数据的可视化详解,希望可以更好的帮助选手使用SLS平台进行赛题数据的理解。接下来主要介绍下,如何不写一行代码就可以在SLS平台上实现数据的可视化部分。我们提供的DEMO已经同步发不到网上(https://sls.aliyun.com/),各位可以去查阅。
操作概览
拿到03-06的赛题数据,稍微看一下,如何不写一行代码就可以完成数据的可视化。在本文中,我们会根据下图的流程进行数据的流转,在1个小时内完成数据的结构化和可视化。这里你会涉及到两种存储产品和SLS中的相关功能:
- 阿里云 OSS/SLS
- 阿里云SLS功能
- Ingestion - 数据导入
- ETL - 数据加工(行处理)
- 查询和分析 - SQL(结构化批处理)
- 可视化 - 仪表盘/过滤器/下钻(DrillDown)
赛题数据导入
在成都的OSS中将赛题数据上传到对应的Bucket中,按照不同的目录中进行存储。
这里有几个注意事项:
- 相同的Bucket目录下文件数据的结构要保持一致
我们在SLS的Logstore中使用Ingestion功能将数据导入到SLS,具体的操作如下:
具体的导入步骤可以参考【相关资料】的数据导入的相关配置。我们通过上面配置操作,将Trace/Log/Metric中的OSS数据分别导入到不同的Logstore中。
原始数据的Logstore
- iops-03-06-demo-log
- iops-03-06-demo-trace
- iops-03-06-demo-metric
通过ETL加工原始数据
接下来,我们使用ETL进行原始数据的处理,我们清晰的看下每类数据要如何处理
- 将导入数据的时间修改成事件时间
- 对Log中不同的LogName下的内容进行正则解析,提取特定的字段信息
- 对Trace数据进行格式转换,转换成OpenTelemetry协议的格式
对原始Log数据进行处理
# log_name:log_cartservice-envoy_gateway e_set("__time__", v("timestamp"), mode="overwrite")e_if( op_eq(v("log_name"),"log_cartservice-envoy_gateway"), e_regex("value",'"(?<method>[^"]*)" (?<http_code>[0-9]*) - (?<request_type>[^ ]*) - "[^"]*" [0-9]* [0-9]* [0-9]* [0-9]* "[^"]*" "(?<client>[^"]*)" "(?<request_id>[a-zA-Z0-9\-\:]*)" "(?<AUTHORITY>[a-zA-Z0-9\-\:\.]*)" "(?<UPSTREAM_HOST>[a-zA-Z0-9\-\:\.]*)" (?<UPSTREAM_CLUSTER>[^ ]*) (?<UPSTREAM_LOCAL_ADDRESS>[^ ]*) (?<DOWNSTREAM_LOCAL_ADDRESS>[^ ]*) (?<DOWNSTREAM_REMOTE_ADDRESS>[^ ]*) (?<REQUESTED_SERVER_NAME>[^ ]*) (?<ROUTE_NAME>[^ ]*)',),)
对这条数据进行测试
{"log_id":"7OWtYX8BDiVcQfZwEl7n","__time__":1647141891,"__topic__":"","__pack_meta__":"3|MTY0NzEzOTg3NDc0NDQzNTI3OA==|680|679","__tag__:__object__":"2022-03-06/log/log_filebeat-testbed-log-envoy_2022.03.06.csv","log_name":"log_cartservice-envoy_gateway","__source__":"iops2020","cmdb_id":"cartservice-0","value":"\"POST /hipstershop.CartService/GetCart HTTP/2\" 200 - via_upstream - \"-\" 43 59 1 1 \"-\" \"grpc-go/1.31.0\" \"0cfc3370-1e1a-97e2-a91b-3edbd0c284d4\" \"cartservice:7070\" \"172.20.2.167:7070\" inbound|7070|| 127.0.0.6:60737 172.20.2.167:7070 172.20.0.22:53704 outbound_.7070_._.cartservice.ts.svc.cluster.local default","timestamp":"1646611195"}
将结果存储到另外一个LogStore中(iops-03-06-demo-log-convert)
通过查询分析,可以创建特定的索引结构,这里我截图对应的索引配置内容。
PS:如果您是先写入数据后,在创建的索引,要使用【索引重建】能力进行索引重建。
对原始Metric数据进行处理
e_set("__time__", v("timestamp"), mode="overwrite")
使用上述的DSL语句,进行处理,将结果写入到两外一个logstore中去(iops-03-06-demo-metric-convert),同样我们也是需要在这个logstore中却设置对应的索引的。
对原始Trace数据进行处理
e_set("__time__", op_div_floor(v("timestamp"),1000), mode="overwrite")e_set("host", v("cmdb_id"))e_rename("operation_name","name")e_rename("parent_span","parentSpanID")e_rename("span_id","spanID")e_rename("status_code","statusCode")e_rename("trace_id","traceID")e_rename("cmdb_id","service")e_set("start", op_sub(v("timestamp"), v("duration")))e_set("end", v("timestamp"))e_set("kind","internal")e_set("resource","{}")e_set("attribute", dct_make("type", v("type")))e_drop_fields("type")
这里稍微复杂一点,需要先创建一个trace app的实例才行。具体的步骤如下:
通过这个操作,我们会在特定的Project中(iops2021)中创建特定的Logstore出来,具体如下图所示:
其中,原始的Trace数据是防止在对应的Logstore(demo-trace-0306-traces)中的,并且该logstore中的索引已经设置好了,我们需要将上述DSL任务继续配置完成就可以了。
通过仪表盘进行可视化
接下来,我们通过仪表盘将数据进行可视化。具体的可视化样式,我们可以一起来看下【SLS用户中心】,已经将对应的可视化大盘,开放出来了,供参赛选手参考。
这里不会将全部的图标都进行说明,仅仅通过几个有代表性、复杂度比较高的图标进行说明。其中会涉及到一些变量替换、过滤器、DrillDown等说明。
Trace数据的可视化部分
这部分可以参考【在SLS上进行异常点的绘制】的绘制部分。
上面的数据,具体是如何计算出来的呢?(Scheduled SQL + Trace Operator)
这里我们要进行下手动的修改,在Trace App被创建出来时,会自动的在project下面创建对应的Scheduled SQL任务,且这个任务的开始时间是从当前开始的,而我们将原始数据,通过ETL处理后,是写入到了历史数据中去了(2022-03-06 08:00:00开始的),因此自动配置的Scheduled SQL任务无法生效,需要我们进行手动回调,将任务的开始时间修改的到2022-03-06 08:00:00 开始,每分钟执行因此记好了。
Metric数据的可视化部分
这部分我们主要是要看下Drill Down的跳转操作。我们在SLS的仪表盘中进入【编辑】模式,然后去选择对应的【表格】部分,找到对应的【交互事件】,具体的内容可以参考对应的文档,这里放一张我配置的截图。通过配置可以看到,我们有一个变量 jvm_cmdb_id 这个变量表示的是【JVM指标实例】中的【cmdb_id】这个列在点击时的变量值。
我们可以看到在下面的【JVM的观测指标】中对应的Query语句如下
*and cmdb_id:"${{jvm_cmdb_id|adservice.ts:8088}}"and kpi_name:"${{jvm_kpi_name|java_lang_ClassLoading_LoadedClassCount}}"|select __time__ - __time__ %60astime, avg(value)as value from log groupbytimeorderbytimelimit10000
这里对应的变量中有如下几个:
- jvm_cmdb_id - 其中 adservice.ts:8088 是它的默认值
- jvm_kpi_name - 其中 java_lang_ClassLoading_LoadedClassCount 是它的默认值
至此,我们就完成了赛题数据的可视化大盘的构建。希望经过可视化之后,可以帮助选手更好的理解数据本身。在遇到问题时,可以翻阅我文末提供的相关文档,如果还是搞不定,可以加入【热身赛数据支持群】
相关资料
- SQL分析语法与功能 https://help.aliyun.com/document_detail/63443.html
- 机器学习语法与函数 https://help.aliyun.com/document_detail/93023.html
- Scheduled SQL https://help.aliyun.com/document_detail/215935.html
- 数据加工 ETL https://help.aliyun.com/document_detail/128469.html
- 可视化 https://help.aliyun.com/document_detail/252810.html
- 导入OSS数据 https://help.aliyun.com/document_detail/147923.html
- 仪表盘中变量替换 https://help.aliyun.com/document_detail/354822.html
- 仪表盘中交互事件 https://help.aliyun.com/document_detail/88844.htm
- 索引重建 https://help.aliyun.com/document_detail/154965.html
- SLS Trace服务 https://help.aliyun.com/document_detail/208889.html
- SLS用户中心 https://sls.aliyun.com/
- 在SLS上进行异常点的绘制 https://developer.aliyun.com/article/877974