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必讀技術書籍
