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)
使用在使用過濾器的時候,通過指定欄位名或表示式來構建欄位值的過濾條件。
表示式可以使用 and
,or
和 ()
進行組合。
操作符包含==
,!=
,>
,<
,>=
,<=
,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();
在上面的例子中,統計每個服務的呼叫數。
histogram
:熱力圖,更多詳見Heatmap in WIKI。
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必讀技術書籍。
P99
,P95
,P90
,P75
,P50
:百分位,更多詳見Percentile in WIKI。
百分位是自7.0版本引入的第一個多值度量。由於有多個值,可以通過getMultipleLinearIntValues
GraphQL查詢進行查詢。
all_percentile = from(All.latency).percentile(10);
在上面的例子中,計算了所有傳入請求的 P99
,P95
,P90
,P75
,P50
。引數是百分位計算的精度,在上例中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必讀技術書籍