定義了上面的字段之后,為了計算數據,skywalking定義了一種OAL腳本來進行聚合運算
skywalking的所有的oal定義在文件official_analysis.oal中
文件的內容如下
// All scope metrics
all_p99 = from(All.latency).p99(10);
all_p95 = from(All.latency).p95(10);
all_p90 = from(All.latency).p90(10);
all_p75 = from(All.latency).p75(10);
all_p50 = from(All.latency).p50(10);
all_heatmap = from(All.latency).thermodynamic(100, 20);
// Service scope metrics
service_resp_time = from(Service.latency).longAvg();
service_sla = from(Service.*).percent(status == true);
service_cpm = from(Service.*).cpm();
service_p99 = from(Service.latency).p99(10);
service_p95 = from(Service.latency).p95(10);
service_p90 = from(Service.latency).p90(10);
service_p75 = from(Service.latency).p75(10);
service_p50 = from(Service.latency).p50(10);
// Service relation scope metrics for topology
service_relation_client_cpm = from(ServiceRelation.*).filter(detectPoint == DetectPoint.CLIENT).cpm();
service_relation_server_cpm = from(ServiceRelation.*).filter(detectPoint == DetectPoint.SERVER).cpm();
service_relation_client_call_sla = from(ServiceRelation.*).filter(detectPoint == DetectPoint.CLIENT).percent(status == true);
service_relation_server_call_sla = from(ServiceRelation.*).filter(detectPoint == DetectPoint.SERVER).percent(status == true);
service_relation_client_resp_time = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).longAvg();
service_relation_server_resp_time = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.SERVER).longAvg();
service_relation_client_p99 = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).p99(10);
service_relation_server_p99 = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.SERVER).p99(10);
service_relation_client_p95 = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).p95(10);
service_relation_server_p95 = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.SERVER).p95(10);
service_relation_client_p90 = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).p90(10);
service_relation_server_p90 = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.SERVER).p90(10);
service_relation_client_p75 = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).p75(10);
service_relation_server_p75 = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.SERVER).p75(10);
service_relation_client_p50 = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).p50(10);
service_relation_server_p50 = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.SERVER).p50(10);
// Service Instance Scope metrics
service_instance_sla = from(ServiceInstance.*).percent(status == true);
service_instance_resp_time= from(ServiceInstance.latency).longAvg();
service_instance_cpm = from(ServiceInstance.*).cpm();
// Endpoint scope metrics
endpoint_cpm = from(Endpoint.*).cpm();
endpoint_avg = from(Endpoint.latency).longAvg();
endpoint_sla = from(Endpoint.*).percent(status == true);
endpoint_p99 = from(Endpoint.latency).p99(10);
endpoint_p95 = from(Endpoint.latency).p95(10);
endpoint_p90 = from(Endpoint.latency).p90(10);
endpoint_p75 = from(Endpoint.latency).p75(10);
endpoint_p50 = from(Endpoint.latency).p50(10);
// Endpoint relation scope metrics
endpoint_relation_cpm = from(EndpointRelation.*).filter(detectPoint == DetectPoint.SERVER).cpm();
endpoint_relation_resp_time = from(EndpointRelation.rpcLatency).filter(detectPoint == DetectPoint.SERVER).longAvg();
// JVM instance metrics
instance_jvm_cpu = from(ServiceInstanceJVMCPU.usePercent).doubleAvg();
instance_jvm_memory_heap = from(ServiceInstanceJVMMemory.used).filter(heapStatus == true).longAvg();
instance_jvm_memory_noheap = from(ServiceInstanceJVMMemory.used).filter(heapStatus == false).longAvg();
instance_jvm_memory_heap_max = from(ServiceInstanceJVMMemory.max).filter(heapStatus == true).longAvg();
instance_jvm_memory_noheap_max = from(ServiceInstanceJVMMemory.max).filter(heapStatus == false).longAvg();
instance_jvm_young_gc_time = from(ServiceInstanceJVMGC.time).filter(phrase == GCPhrase.NEW).sum();
instance_jvm_old_gc_time = from(ServiceInstanceJVMGC.time).filter(phrase == GCPhrase.OLD).sum();
instance_jvm_young_gc_count = from(ServiceInstanceJVMGC.count).filter(phrase == GCPhrase.NEW).sum();
instance_jvm_old_gc_count = from(ServiceInstanceJVMGC.count).filter(phrase == GCPhrase.OLD).sum();
database_access_resp_time = from(DatabaseAccess.latency).longAvg();
database_access_sla = from(DatabaseAccess.*).percent(status == true);
database_access_cpm = from(DatabaseAccess.*).cpm();
database_access_p99 = from(DatabaseAccess.latency).p99(10);
database_access_p95 = from(DatabaseAccess.latency).p95(10);
database_access_p90 = from(DatabaseAccess.latency).p90(10);
database_access_p75 = from(DatabaseAccess.latency).p75(10);
database_access_p50 = from(DatabaseAccess.latency).p50(10);
// CLR instance metrics
instance_clr_cpu = from(ServiceInstanceCLRCPU.usePercent).doubleAvg();
instance_clr_gen0_collect_count = from(ServiceInstanceCLRGC.gen0CollectCount).sum();
instance_clr_gen1_collect_count = from(ServiceInstanceCLRGC.gen1CollectCount).sum();
instance_clr_gen2_collect_count = from(ServiceInstanceCLRGC.gen2CollectCount).sum();
instance_clr_heap_memory = from(ServiceInstanceCLRGC.heapMemory).longAvg();
instance_clr_available_completion_port_threads = from(ServiceInstanceCLRThread.availableCompletionPortThreads).max();
instance_clr_available_worker_threads = from(ServiceInstanceCLRThread.availableWorkerThreads).max();
instance_clr_max_completion_port_threads = from(ServiceInstanceCLRThread.maxCompletionPortThreads).max();
instance_clr_max_worker_threads = from(ServiceInstanceCLRThread.maxWorkerThreads).max();
// Envoy instance metrics
envoy_heap_memory_max_used = from(EnvoyInstanceMetric.value).filter(metricName == "server.memory_heap_size").maxDouble();
envoy_total_connections_used = from(EnvoyInstanceMetric.value).filter(metricName == "server.total_connections").maxDouble();
envoy_parent_connections_used = from(EnvoyInstanceMetric.value).filter(metricName == "server.parent_connections").maxDouble();
// Disable unnecessary hard core sources
/////////
// disable(segment);
// disable(endpoint_relation_server_side);
// disable(top_n_database_statement);
// disable(zipkin_span);
// disable(jaeger_span);
定義的指標值如下
全局指標
all_p99, 所有服務響應時間的 p99 值
all_p95
all_p90
all_p75
all_p70
all_heatmap, 所有服務響應時間的熱點圖
服務指標
service_resp_time, 服務的平均響應時間
service_sla, 服務的成功率
service_cpm, 服務每分鍾調用次數
service_p99, 服務響應時間的 p99 值
service_p95
service_p90
service_p75
service_p50
服務實例指標
service_instance_sla, 服務實例的成功率
service_instance_resp_time, 服務實例的平均響應時間
service_instance_cpm, 服務實例每分鍾調用次數
端點指標
endpoint_cpm, 端點每分鍾調用次數
endpoint_avg, 端點平均響應時間
endpoint_sla, 端點成功率
endpoint_p99, 端點響應時間的 p99 值
endpoint_p95
endpoint_p90
endpoint_p75
endpoint_p50
JVM 指標, JVM 相關的指標, 只有當 javaagent 啟用時才有效
instance_jvm_cpu
instance_jvm_memory_heap
instance_jvm_memory_noheap
instance_jvm_memory_heap_max
instance_jvm_memory_noheap_max
instance_jvm_young_gc_time
instance_jvm_old_gc_time
instance_jvm_young_gc_count
instance_jvm_old_gc_count
服務關系指標, 代表服務之間調用的指標 指標的 ID 只能在拓撲圖查詢中獲取
service_relation_client_cpm, 在客戶端每分鍾檢測到的調用次數
service_relation_server_cpm, 在服務端每分鍾檢測到的調用次數
service_relation_client_call_sla, 在客戶端檢測到的成功率
service_relation_server_call_sla, 在服務端檢測到的成功率
service_relation_client_resp_time, 在客戶端檢測到的平均響應時間
service_relation_server_resp_time, 在服務端檢測到的平均響應時間
端點關系指標, 代表相互依賴的端點之間的指標. 只有在追蹤代理啟用時有效. 指標 ID 只能在拓撲查詢中獲得.
endpoint_relation_cpm
endpoint_relation_resp_time
我們來看看skywalking中頁面框圖的意思
上面對於的計算指標是
首先看latency表示的意思是服務下每個請求的耗時
all_p99 = from(All.latency).p99(10);all表示所有的服務,服務就是應用的意思當前系統下面有三個應用,三個應用下面一共存在1000次請求,這里指的就是所有1000次請求中99%的請求響應時間都是在某個范圍內
global Top Throughput中表示當前所有的應用中的方法中,那個請求的數量最多
global Top slow Endpoint表示當前所有應用下面的那個請求最耗時
這里的Global heatmap實際上調用的是
當前的請求在熱力圖上的分布情況,每一次請求在熱力圖上面對應一個點
表示當前應用下的全部請求耗時在20毫秒和100毫秒
service_resp_time = from(Service.latency).longAvg();
表示當前應用下每個請求的耗時的平均值,所以存在不准的情況,應該不應該把當前應用向注冊中心那個請求時間算在內,這里要注意
service_sla = from(Service.*).percent(status == true);
表示當前應用下sla:請求的成功率是多少
上面表表示應用spring-user在20點34分到21點04分這半個小時內,應用這段時間內每分鍾的請求數目是1.33次,這個1.33次是如何算出來的了
應用在20點43分,發送了一次請求,在20點44分發送了一次請求,在20點45分發生了2次請求,所有20點43 20點44分 20點45分,三分鍾之內發送了4請請求,每一分鍾的平均請求時間為4除以3等於1.33.,這里要注意雖然選擇的查詢時間從20點11到21點11一共30分鍾,這里面大部分時間沒有請求產生,平均請求次數不能是4/30,而是統計真正發送請求的時間
對於的信息在數據庫的表service_cpm中可以看到,entity_id表示當前應用的編號,3對於的就是spring-user應用,service_cpm記錄的是當前一個小時之內應用的訪問數據
如果當前應用選擇查詢的時間超過一個小時,選擇最近一天,如下圖所示,我們看到cpm為0,因為查詢的是
我們可以看到選擇最近一天查詢的時間間隔是小時,查詢的是service_cpm_hour這張表
從上面分析我們已經知道應用在20點43分,發送了一次請求,在20點44分發送了一次請求,在20點45分發生了2次請求,所有20點43 20點44分 20點45分,所以在20 內發送了4次請求,所有表中service_cpm_hour對於的2020010420這個時間點的值是4,頁面上從1月3號21點到1月4號21點內沒有任何請求,所以cpm為0
同理,選擇最近一周,查詢的是service_cpm_day這張表
在表service_cpm_day中時間是按照天進行統計的,在20200104 在1月4號這天發生了4次請求
同理應用的平均響應時間類似,這里為啥是74264.67ms了
應用在20點43分的這一分鍾內發送了請求應用的平均響應時間123851,在20點44分應用在這一分鍾內發生了請求對於的平均響應時間是76455,在20點45分發生了請求對於的平均響應時間是22488,所以在20點00到21點這段時間內,只有3分鍾內發送了請求,其余時間沒有發送請求,平均響應時間為(123851+76455+22488)/3=74264.67ms
應用的平均響應時間,是依據應用下的每個應用的實例響應時間計算出來的,查詢的表如下
應用下面的p99 p50如下,查詢的是service_p50相關的表
表示當前應用下面那個請求最慢,當前應用存在哪些實例
對於方法的操作
首先要選擇那個應用,然后選擇該應用下對於的端點
調用的統計信息為
// Endpoint scope metrics
endpoint_cpm = from(Endpoint.*).cpm();
endpoint_avg = from(Endpoint.latency).longAvg();
endpoint_sla = from(Endpoint.*).percent(status == true);
endpoint_p99 = from(Endpoint.latency).p99(10);
endpoint_p95 = from(Endpoint.latency).p95(10);
endpoint_p90 = from(Endpoint.latency).p90(10);
endpoint_p75 = from(Endpoint.latency).p75(10);
endpoint_p50 = from(Endpoint.latency).p50(10);
表示該端點對於的平均響應時間,平均請求信息,平均每分鍾的請求數目燈
表示應用spring-user的方法/user/5在20點45分,這一分鍾內的平均響應時間是25577毫秒
這里表示的是應用spring-user的方法/user/5在20點32分到21點02分內,方法的平均響應時間是74714毫秒