1. 程式人生 > 其它 >一篇文章快速搞懂 Apache SkyWalking 的 OAL

一篇文章快速搞懂 Apache SkyWalking 的 OAL

OAL簡介

在流模式(Streaming mode)下,SkyWalking 提供了 觀測分析語言(Observability Analysis Language,OAL) 來分析流入的資料。

OAL 聚焦於服務,服務例項以及端點的度量指標,因此 OAL 非常易於學習和使用。

6.3版本以後,OAL引擎嵌入在OAP伺服器執行時中,稱為oal-rt(OAL執行時)。
OAL指令碼現在位於/config資料夾,使用者可以簡單地改變和重新啟動伺服器,使其有效。

但是,OAL指令碼仍然是編譯語言,OAL執行時動態生成Java程式碼。
您可以在系統環境上設定SW_OAL_ENGINE_DEBUG=Y,檢視生成了哪些類。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

OAL語法

OAL 指令碼檔案應該以 .oal 為字尾。

// Declare the metrics.
METRICS_NAME = from(SCOPE.(* | [FIELD][,FIELD ...]))
[.filter(FIELD OP [INT | STRING])]
.FUNCTION([PARAM][, PARAM ...])

// Disable hard code 
disable(METRICS_NAME);

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書

」,免費獲取12本Java必讀技術書籍。

域(Scope)

域包括全域性(All)、服務(Service)、服務例項(Service Instance)、端點(Endpoint)、服務關係(Service Relation)、服務例項關係(Service Instance Relation)端點關係(Endpoint Relation)。

當然還有一些欄位,他們都屬於以上某個域。

過濾器(Filter)

使用在使用過濾器的時候,通過指定欄位名或表示式來構建欄位值的過濾條件。

表示式可以使用 andor() 進行組合。
操作符包含==!=><>=<=in [...]

like %...like ...%like %...%,他們可以基於欄位型別進行型別檢測,
如果型別不相容會在編譯/程式碼生成期間報錯。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

聚合函式(Aggregation Function)

預設的聚合函式由 SkyWalking OAP 核心實現。並可自由擴充套件更多函式。

提供的函式:

  • longAvg:某個域實體所有輸入的平均值,輸入欄位必須是 long 型別。
instance_jvm_memory_max = from(ServiceInstanceJVMMemory.max).longAvg();

在上面的例子中,輸入是 ServiceInstanceJVMMemory 域的每個請求,平均值是基於欄位 max 進行求值的。

  • doubleAvg:某個域實體的所有輸入的平均值,輸入的欄位必須是 double 型別。
instance_jvm_cpu = from(ServiceInstanceJVMCPU.usePercent).doubleAvg();

在上面的例子中,輸入是 ServiceInstanceJVMCPU 域的每個請求,平均值是基於 usePercent 欄位進行求值的。

  • percent:對於輸入中匹配指定條件的百分比數.
endpoint_percent = from(Endpoint.*).percent(status == true);

在上面的例子中,輸入是每個端點的請求,條件是 endpoint.status == true

  • rate:對於條件匹配的輸入,比率以100的分數表示。
browser_app_error_rate = from(BrowserAppTraffic.*).rate(trafficCategory == BrowserAppTrafficCategory.FIRST_ERROR, trafficCategory == BrowserAppTrafficCategory.NORMAL);

在上面的例子中,所有的輸入都是每個瀏覽器應用流量的請求,
分子的條件是trafficCategory == BrowserAppTrafficCategory.FIRST_ERROR
分母的條件是trafficCategory == BrowserAppTrafficCategory.NORMAL
其中,第一個引數是分子的條件,第二個引數是分母的條件。

  • sum:某個域實體的呼叫總數。
service_calls_sum = from(Service.*).sum();

在上面的例子中,統計每個服務的呼叫數。

all_heatmap = from(All.latency).histogram(100, 20);

在上面的例子中,計算了所有傳入請求的熱力學熱圖。
第一個引數是計算延遲的精度,在上面的例子中,在101-200ms組中,113ms和193ms被認為是相同的.
第二個引數是分組數量,在上面的例子中,一共有21組資料分別為0-100ms,101-200ms......1901-2000ms,2000ms以上.

  • apdex:應用效能指數(Application Performance Index),更多詳見Apdex in WIKI
service_apdex = from(Service.latency).apdex(name, status);

在上面的例子中,計算了所有服務的應用效能指數。
第一個引數是服務名稱,該名稱的Apdex閾值在配置檔案service-apdex-threshold.yml中定義。
第二個引數是請求狀態,狀態(成功或失敗)影響Apdex的計算。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

百分位是自7.0版本引入的第一個多值度量。由於有多個值,可以通過getMultipleLinearIntValuesGraphQL查詢進行查詢。

all_percentile = from(All.latency).percentile(10);

在上面的例子中,計算了所有傳入請求的 P99P95P90P75P50。引數是百分位計算的精度,在上例中120ms和124被認為是相同的。

度量指標名稱(Metrics Name)

儲存實現,告警以及查詢模組的度量指標名稱,SkyWalking 核心支援自動型別推斷。

組(Group)

所有度量指標資料都會使用 Scope.ID 和最小時間桶(min-level time bucket) 進行分組.

  • 在端點的域中,Scope.ID 為端點的 ID(基於服務及其端點的唯一標誌)。

文章持續更新,微信搜尋「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。

禁用(Disable)

Disable是OAL中的高階語句,只在特定情況下使用。
一些聚合和度量是通過核心硬程式碼定義的,這個Disable語句是設計用來讓它們停止活動的,
比如segment, top_n_database_statement
在預設情況下,沒有被禁用的。

示例

// 計算每個端點的響應平均時長
endpoint_avg = from(Endpoint.latency).avg()

// 計算每個端點 p50,p75,p90,p95 and p99 的延遲柱狀圖,每隔 50 毫秒一條柱
endpoint_percentile = from(Endpoint.latency).percentile(10)

// 統計每個服務響應狀態為 true 的百分比
endpoint_success = from(Endpoint.*).filter(status == true).percent()

// 計算每個服務的響應碼為[404, 500, 503]的總和
endpoint_abnormal = from(Endpoint.*).filter(responseCode in [404, 500, 503]).sum()

// 計算每個服務的請求型別為[PRC, gRPC]的總和
endpoint_rpc_calls_sum = from(Endpoint.*).filter(type in [RequestType.PRC, RequestType.gRPC]).sum()

// 計算每個端點的端點名稱為["/v1", "/v2"]的總和
endpoint_url_sum = from(Endpoint.*).filter(endpointName in ["/v1", "/v2"]).sum()

// 統計每個服務的呼叫總量
endpoint_calls = from(Endpoint.*).sum()

disable(segment);
disable(endpoint_relation_server_side);
disable(top_n_database_statement);

注:本文以SkyWalking的8.2.0版本為例進行介紹,如果版本不同會略有差異。

微信公眾號:萬貓學社

微信掃描二維碼

關注後回覆「電子書」

獲取12本Java必讀技術書籍