SLS 查詢新範式:使用 SPL 對日誌進行交互式探索

作者:無哲

引言

在構建現代數據和業務系統的過程中,可觀測性已經變得至關重要,日誌服務(SLS)爲 Log/Trace/Metric 數據提供了大規模、低成本、高性能的一站式平臺服務,並提供數據採集、加工、投遞、分析、告警、可視化等功能,從而全面提升企業在研發、運維、運營和安全等各種場景的數字化能力。

日誌數據天然是非結構化的

日誌(Log)數據作爲可觀測場景中最基礎的數據類型之一,其最大的特點在於,日誌數據是天然是非結構化的,具體與多種因素有關:

  • 來源多樣性:日誌數據種類繁多,不同來源的數據難以具有統一的 Schema
  • 數據隨機性:比如異常事件日誌、用戶行爲日誌,往往天然就是隨機的,難以預測的
  • 業務複雜度:不同的參與方對數據的理解不同,比如開發流程中打日誌的一般是開發者,但分析日誌的往往是運營和數據工程師,寫日誌過程中難以預見到後期具體的分析需求

這些因素導致很多情況下可能並不存在一個理想的數據模型可以用來預先處理好日誌數據,更常見的做法往往是直接存儲原始數據,這可以稱爲是一種 Schema-on-Read 的做法,或者是所謂的壽司原則(The Sushi Principle:Raw data is better than cooked, since you can cook it in as many different ways as you like)。而這種“雜亂無章”的原始日誌數據也給分析人員增加了難度,因爲往往是需要對數據模型具有一定的先驗知識,才能對數據進行比較好的結構化分析。

來自 Unix 管道的啓發:交互式探查

在各種日誌分析系統與平臺出現之前,開發運維人員最傳統的日誌分析方式,是直接登錄到日誌文件所在的機器上去 grep 日誌,並配合一系列 Unix 命令對日誌進行分析處理。

比如要查看訪問日誌中 404 的來源 host,可能就會用到這樣的命令:

grep 404 access.log | tail -n 10 | awk '{print $2}' | tr a-z A-Z

這條命令中通過 3 個管道操符,將 4 個 unix 命令行工具(關鍵詞查找、日誌截斷、字段提取、大小寫轉換)連成了一條完整的處理棧。

值得注意的是,在使用這樣的命令的時候,我們往往並不是一次性就寫出完整的命令,而是寫完一個命令之後就按下回車,觀察執行輸出的結果,然後再通過管道追加下一步的處理命令,繼續執行,如此一直進行下去。

這個過程中充分體現了 Unix 的設計哲學,通過管道將一個個小而美工具組合成強大的程序。同時從日誌分析的角度看,我們可以獲得這樣的啓發:

1)交互式、遞進式的探查,每次在上一次的基礎上疊加執行

2)探查的過程中往往不會處理全量數據,而是截取一小部分樣本數據進行分析

3)探查過程中進行的各種處理操作,隻影響本次查詢的輸出,並不改變原始數據

可以感受到,這種交互式探查的操作,對於日誌數據是一種很好的探索方式,那麼在 SLS 這樣的雲上日誌平臺,當面對海量的原始日誌數據的時候,我們期望也能使用類似 Unix 管道這樣的方式,在查詢時先通過多級管道對數據一步步遞進式的探查處理,幫助我們在雜亂無序的日誌中挖掘出數據的規律,進而就可以更加帶有目的性的去完成後續的加工清洗、消費投遞、SQL 聚合分析等操作。

SPL-日誌的統一處理語法

SPL(詳見 SPL 概覽 [ 1] ),即 SLS Processing Language,是 SLS 對日誌查詢、流式消費、數據加工、Logtail 採集、以及數據 Ingestion 等需要數據處理的場景,提供的統一的數據處理語法,這種統一性使得 SPL 可以在整個日誌處理的生命週期內,實現 "Write Once,Run Anywhere" 的效果。

SPL 基本語法如下:

<data-source> | <spl-expr> ... | <spl-expr> ...

其中< data-source >是數據源,對於日誌查詢的場景,指的就是索引查詢語句。

< spl-expr >是 SPL 指令,支持正則取值、字段分裂、字段投影、數值計算等多種操作,具體參考 SPL 指令介紹 [ 2]

從語法定義上可以看到,SPL 天然是支持多級管道的。對於日誌查詢的場景來說,在索引查詢語句之後,可以根據需要通過管道符不斷追加 SPL 指令,每一步都可以點擊查詢查看當前的處理結果,從而獲得類似 Unix 管道處理的體驗。並且相比於 Unix 指令,SPL 具備更豐富的算子和函數,可以對日誌進行更爲靈活的調試分析和探索分析。

使用 SPL 查詢日誌

在日誌查詢場景中,SPL 是工作在掃描模式下的,可以直接針對非結構化的原始數據進行處理,不受是否創建索引以及索引類型的限制。掃描的時候按照實際掃描的數據量計費,詳見掃描查詢概述 [ 3]

統一的查詢交互

掃描查詢和索引查詢雖然背後是不同的工作原理,但是在對用戶的界面(控制檯查詢、GetLogs API)上,都是完全統一的交互。

在查詢日誌的時候,當輸入索引查詢語句的時候,就是通過索引查詢。

再繼續輸入管道符和 SPL 指令,就會直接自動按照掃描模式對索引過濾的結果進行處理(無須再通過一個“掃描模式”的按鈕來額外指定),並且會提示當前處於 SPL 輸入模式。

更友好的語法提示

此外,在控制檯查詢的時候,會自動識別當前所處的語法模式,並對 SPL 相關指令和函數進行智能提示。

隨着輸入,下拉框自動提示相應的語法關鍵詞、函數。

如果你一時忘記了某個語法怎麼寫,不用離開當前界面再去查找文檔。直接移動光標放在某個關鍵詞上,就會彈出詳細的幫助信息。

篩選字段獲得更精簡的視圖

在打日誌的時候,爲了將來潛在的分析需求,我們一般會盡量多打一些相關信息到日誌裏,因此往往會發現最終單條日誌中會存在比較多的字段。

這種情況下,在 SLS 控制檯查詢的時候,一條日誌佔據的空間太多,即使將頂部的柱狀圖和側邊的快速分析欄都摺疊起來,在日誌原文區域也只能同時看到一兩條日誌,要不斷地滾動鼠標翻頁才能看其他日誌,使用起來較爲不便。

然而實際上我們在查詢日誌的時候,往往是帶着某個目的去檢索,這個時候一般是隻關心其中的部分字段。這時就可以使用 SPL 中的 project 指令,只保留自己關心的字段(或者使用 project-away 指令,移除不需要看到的字段。這樣不僅可以移除干擾,將注意力集中在當前要關注的字段上,而且由於字段精簡了,也可以同時預覽到更多條的日誌。)

實時計算出新的字段

前面提到過,由於寫入日誌的時候無法完全預見分析的需求,因此分析日誌的時候,常常會需要對已有字段加工提取出新的字段,這可以通過 SPL 的 Extend 指令實現。

使用 Extend 指令,可以調用豐富的函數(這些大部分是和 SQL 語法通用的)進行標量處理。

Status:200 | extend urlParam=split_part(Uri, '/', 3)

同時也可以根據多個字段計算出新的字段,比如計算兩個數字字段的差值。(注意字段默認是被視爲 varchar,進行數字類型計算的時候要先通過 cast 轉換類型)

Status:200 | extend timeRange = cast(BeginTime as bigint) - cast(EndTime as bigint

靈活的進行多維度過濾

索引查詢只能根據進行關鍵詞、多個關鍵詞組成的短語、關鍵詞末尾模糊等搜索方式,在掃描模式下,可以通過 where 質量可以按照各種條件過濾,這個是當前掃描查詢已經具備的能力,在升級到 SPL 之後,where 可以放在任意一級管道,對計算出的新字段進行過濾,從而具備更靈活更強大的過濾能力。

比如,根據 BeginTime 和 EndTime 計算出 TimeRange 之後,可以再對這個計算後的值進行判斷過濾。

Status:200 
| where UserAgent like '%Chrome%'
| extend timeRange = cast(BeginTime as bigint) - cast(EndTime as bigint)
| where timeRange > 86400

自由的展開半結構化數據

我們的日誌中有的時候會存在某個字段本身是 json、csv 這種半結構化數據的情況,我們可以使用 extend 指令去提取其中某個子字段,但是如果要分析的子字段比較多,就會需要寫大量的 json_extract_scalar 或者 regexp_extract 這樣的字段提取函數,較爲不便。

SPL 提供了 parse-json、parse-csv 這樣的指令,可以將 json、csv 類型的字段,直接完全展開出爲獨立的字段,之後就可以直接對這些字段進行操作。省去了書寫字段提取函數的開銷,在交互式查詢場景中這種寫法是更爲便捷的。

所思即所見的沉浸式探索體驗

讓我們再通過一張動圖來感受下,在探索日誌的過程中,通過管道隨着 SPL 指令的不斷輸入,對數據進行抽絲剝繭的逐級處理,每一步都可以將腦海中思考的處理步驟,物化在查詢結果頁面視圖上,所思即所見,所見即所得,在一步步的交互式探索中,最終提取出我們需要分析的結構化信息。

總結

由於數據來源的多樣性和分析需求的不確定性,日誌數據往往是直接以非結構化的原始數據存儲,這爲查詢分析帶來了一定挑戰。

SLS 推出日誌統一處理語言 SPL,在日誌查詢場景下,可以通過多級管道對數據進行交互式、遞進式的探索,從而更便捷的發現數據特徵,並更好的進行後續的結構化分析和加工消費等處理流程。

目前查詢支持 SPL 的功能已經在各個地域上線,歡迎大家使用。如果有任何問題和需求,可以通過工單和支持羣反饋給我們。SLS 將持續不斷努力,打造一個更易用、更穩定、更強大的可觀測分析平臺。

相關鏈接:

[1] SPL 概覽

https://help.aliyun.com/zh/sls/user-guide/spl-overview

[2] SPL 指令介紹

https://help.aliyun.com/zh/sls/user-guide/spl-instruction?spm=a2c4g.11186623.0.0.197c59d4pRrjml

[3] 掃描查詢概述

https://help.aliyun.com/zh/sls/user-guide/scan-based-query-overview

參考鏈接:

[1] The Sushi Principle

https://www.datasapiens.co.uk/blog/the-sushi-principle

[2] Unix Commands, Pipes, and Processes

https://itnext.io/unix-commands-pipes-and-processes-6e22a5fbf749

[3] SPL 概述

https://help.aliyun.com/zh/sls/user-guide/spl-overview

[4] 掃描查詢概述

https://help.aliyun.com/zh/sls/user-guide/scan-based-query-overview

[5] SLS 架構升級-更低成本、更高性能、更穩定和易用

https://login.alibaba-inc.com/ssoLogin.htm?APP_NAME=ata&BACK_URL=https%3A%2F%2Fata.atatech.org%2Farticles%2F11020158038&CONTEXT_PATH=%2F

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章