一篇文章快速搞懂 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必讀技術書籍


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM