SLS 查詢新正規化:使用 SPL 對日誌進行互動式探索

阿里云云原生發表於2024-04-22

作者:無哲

引言

在構建現代資料和業務系統的過程中,可觀測性已經變得至關重要,日誌服務(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

相關文章