微服务组件记事本:Skywalking的ES索引 · 收藏篇
(2021年倒計時33天)
書接上文,在上回書中,我們說到了《微服務組件記事本:Skywalking執行效果 · 多圖篇》,文章比較詳細的展示了Skywalking中的各種數據和圖表展示,有些小伙伴群里問我,這些圖表能不能控制展示或隱藏?這些圖表又是對應的什么意思?能否查看具體的數據內容么?答案都是肯定的,如果你要是使用MySql作為持久化方案,可能看起來更直觀些,畢竟我們使用數據庫都好多年了。不過官方更建議的是使用ElasticSearch(下文統稱ES)來做持久化方案,所以今天咱們就來看看ES來記錄Skywalking數據,都有哪些索引。
本文建議收藏下,方便以后即時查詢,必須在微服務中Skywalking這類的APM應用是剛需。
ES 索引概括和地址
用ES來存儲Skywalking數據,每天會生成114個索引,這個不是動態的喲,而是官方定義好的,當然你也可以自己根據需要做其他兼容,這個另說了。114個索引中,分成五大模塊,約十個小模塊,今天咱們都具體說說每個模塊都有哪些索引(注意:本文說到的是Skywalking-aop的8.3.0版本,其他版本可能有細微差別)。
那如何來尋找這些索引呢,很簡單。
1、直接頁面內查找,這種方式很簡單,其實頁面第一個banner儀表盤中的圖表,每一個都會是一個或多個索引,注意不是一對一或者唯一的喲,因為一個索引可能存在與多個圖表上,至于如何尋找,可以看左上角的那個小鎖,點一下就有驚喜。
2、直接在頁面上看,也只能看到索引名,那每個名字什么意思,或者如何計算呢,可以直接看官方配置文件。
啟動OAP服務(本文統一都是用DOCKER來啟動的,啟動過程可以看我之前寫的《微服務組件記事本:本地搭建Skywalking》文章),啟動后,進入容器,然后在config文件夾下會看到一個oal的文件夾。
進入oal文件夾,會看到有五個*.oal文件:
OAL含義是觀測分析語言(Observability Analysis Language),是Skywalking用來分析流入的數據。OAL專注于服務、服務實例以及端點的度量指標,因此OAL非常易于學習和使用,你也同時可以簡單地改變和重新啟動服務器,使其有效。OAL腳本本書是編譯語言,通過OAL運行時動態生成Java代碼。
你可以在環境變量中設置SW_OAL_ENGINE_DEBUG=Y,查看生成了哪些類。
上邊七個文件從名字上,我們就能對其功能可見一斑,瀏覽器、核心(指服務)、兩個探針(dotnet和java)和envoy相關。
瀏覽器模塊:browser.oal(33)
我們查看下browser.oal文件,可以看到很多的索引名稱和計算方式,咱們分成2個子模塊來說,打開Skywalking-ui看到儀表盤-WebBrowser欄目下,有兩個子模塊,分別是Web APP指標和Pages指標:
Web App 子模塊(6個索引)
// app的pv數 browser_app_pv = from(BrowserAppTraffic.count).filter(trafficCategory == BrowserAppTrafficCategory.NORMAL).sum(); // app的錯誤率 browser_app_error_rate = from(BrowserAppTraffic.*).rate(trafficCategory == BrowserAppTrafficCategory.FIRST_ERROR,trafficCategory == BrowserAppTrafficCategory.NORMAL); //?app的錯誤數 browser_app_error_sum = from(BrowserAppTraffic.count).filter(trafficCategory != BrowserAppTrafficCategory.NORMAL).sum();// app單一版本的pv數 browser_app_single_version_pv = from(BrowserAppSingleVersionTraffic.count).filter(trafficCategory == BrowserAppTrafficCategory.NORMAL).sum(); // app單一版本的錯誤率 browser_app_single_version_error_rate = from(BrowserAppSingleVersionTraffic.trafficCategory).rate(trafficCategory == BrowserAppTrafficCategory.FIRST_ERROR,trafficCategory == BrowserAppTrafficCategory.NORMAL); // app單一版本的錯誤總數 browser_app_single_version_error_sum = from(BrowserAppSingleVersionTraffic.count).filter(trafficCategory != BrowserAppTrafficCategory.NORMAL).sum();Pages 頁面子模塊(27個索引)
// 頁面的pv數 browser_app_page_pv = from(BrowserAppPageTraffic.count).filter(trafficCategory == BrowserAppTrafficCategory.NORMAL).sum(); // 頁面錯誤率 browser_app_page_error_rate = from(BrowserAppPageTraffic.*).rate(trafficCategory == BrowserAppTrafficCategory.FIRST_ERROR,trafficCategory == BrowserAppTrafficCategory.NORMAL); // 頁面錯誤總數 browser_app_page_error_sum = from(BrowserAppPageTraffic.count).filter(trafficCategory != BrowserAppTrafficCategory.NORMAL).sum();// 頁面ajax請求錯誤數 browser_app_page_ajax_error_sum = from(BrowserAppPageTraffic.count).filter(trafficCategory != BrowserAppTrafficCategory.NORMAL).filter(errorCategory == BrowserErrorCategory.AJAX).sum(); // 頁面資源請求錯誤數 browser_app_page_resource_error_sum = from(BrowserAppPageTraffic.count).filter(trafficCategory != BrowserAppTrafficCategory.NORMAL).filter(errorCategory == BrowserErrorCategory.RESOURCE).sum(); // 頁面js執行錯誤數 browser_app_page_js_error_sum = from(BrowserAppPageTraffic.count).filter(trafficCategory != BrowserAppTrafficCategory.NORMAL).filter(errorCategory in [BrowserErrorCategory.JS,BrowserErrorCategory.VUE,BrowserErrorCategory.PROMISE]).sum(); //?頁面未知異常錯誤數 browser_app_page_unknown_error_sum = from(BrowserAppPageTraffic.count).filter(trafficCategory != BrowserAppTrafficCategory.NORMAL).filter(errorCategory == BrowserErrorCategory.UNKNOWN).sum();//?頁面平均跳轉時間 browser_app_page_redirect_avg = from(BrowserAppPagePerf.redirectTime).longAvg(); //?頁面平均dns時間 browser_app_page_dns_avg = from(BrowserAppPagePerf.dnsTime).longAvg(); //?頁面平均響應時間 browser_app_page_ttfb_avg = from(BrowserAppPagePerf.ttfbTime).longAvg(); // 頁面平均tcp連接時間 browser_app_page_tcp_avg = from(BrowserAppPagePerf.tcpTime).longAvg(); // 頁面平均trans時間 browser_app_page_trans_avg = from(BrowserAppPagePerf.transTime).longAvg(); // 頁面平均dom分析時間 browser_app_page_dom_analysis_avg = from(BrowserAppPagePerf.domAnalysisTime).longAvg(); // 頁面平均fpt時間 browser_app_page_fpt_avg = from(BrowserAppPagePerf.fptTime).longAvg(); //?頁面平均dom準備時間 browser_app_page_dom_ready_avg?=?from(BrowserAppPagePerf.domReadyTime).longAvg(); //?頁面平均加載完成時間 browser_app_page_load_page_avg = from(BrowserAppPagePerf.loadPageTime).longAvg(); //?頁面平均響應時間 browser_app_page_res_avg = from(BrowserAppPagePerf.resTime).longAvg(); // 頁面平均ssl時間 browser_app_page_ssl_avg = from(BrowserAppPagePerf.sslTime).longAvg(); // 頁面平均生存時間 browser_app_page_ttl_avg = from(BrowserAppPagePerf.ttlTime).longAvg(); //?頁面平均首包時間 browser_app_page_first_pack_avg = from(BrowserAppPagePerf.firstPackTime).longAvg(); // 頁面平均首次繪畫完成時間 browser_app_page_fmp_avg = from(BrowserAppPagePerf.fmpTime).longAvg();//?以下均是功能指標:包括 p50, p75, p90, p95, p99 browser_app_page_fpt_percentile = from(BrowserAppPagePerf.fptTime).percentile(10); browser_app_page_ttl_percentile = from(BrowserAppPagePerf.ttlTime).percentile(10); browser_app_page_dom_ready_percentile = from(BrowserAppPagePerf.domReadyTime).percentile(10); browser_app_page_load_page_percentile = from(BrowserAppPagePerf.loadPageTime).percentile(10); browser_app_page_first_pack_percentile = from(BrowserAppPagePerf.firstPackTime).percentile(10); browser_app_page_fmp_percentile = from(BrowserAppPagePerf.fmpTime).percentile(10);核心服務模塊:core.oal(38)
服務相關的索引,基本都是在儀表盤-APM和Database菜單里,而在APM欄目里又有四個子欄目,因此分成五個部分。分別是全局指標、服務間指標、服務實例指標、終端指標、數據庫指標。
APM全局指標(7個索引)
// Multiple values including p50, p75, p90, p95, p99 all_percentile = from(All.latency).percentile(10); all_heatmap = from(All.latency).histogram(100, 20);// 服務的平均響應時間 service_resp_time = from(Service.latency).longAvg(); // 服務的請求成功率 service_sla = from(Service.*).percent(status == true); // 服務的每分鐘調用次數 service_cpm = from(Service.*).cpm(); // Multiple values including p50, p75, p90, p95, p99 service_percentile = from(Service.latency).percentile(10); // 服務的apdex應用性能指標 service_apdex = from(Service.latency).apdex(name, status);服務之間調用指標(8個索引)
//?在客戶端檢測每分鐘調用次數 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(); // Multiple values including p50, p75, p90, p95, p99 service_relation_client_percentile = from(ServiceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).percentile(10); service_relation_server_percentile?=?from(ServiceRelation.latency).filter(detectPoint?==?DetectPoint.SERVER).percentile(10);服務實例之間的調用指標(11個索引)
// 在客戶端實例檢測到的每分鐘調用次數 service_instance_relation_client_cpm = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.CLIENT).cpm(); // 在服務端實例檢測到的每分鐘調用次數 service_instance_relation_server_cpm = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.SERVER).cpm(); //?在客戶端實例檢測到的成功率 service_instance_relation_client_call_sla = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.CLIENT).percent(status == true); // 在服務端實例檢測到的成功率 service_instance_relation_server_call_sla = from(ServiceInstanceRelation.*).filter(detectPoint == DetectPoint.SERVER).percent(status == true); // 在客戶端實例檢測到的平均響應時間 service_instance_relation_client_resp_time = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).longAvg(); // 在服務端實例檢測到的平均響應時間 service_instance_relation_server_resp_time = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.SERVER).longAvg(); // Multiple values including p50, p75, p90, p95, p99 service_instance_relation_client_percentile = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.CLIENT).percentile(10); service_instance_relation_server_percentile = from(ServiceInstanceRelation.latency).filter(detectPoint == DetectPoint.SERVER).percentile(10); // 服務實例的成功率 service_instance_sla = from(ServiceInstance.*).percent(status == true); // 服務實例的平均響應時間 service_instance_resp_time= from(ServiceInstance.latency).longAvg(); // 服務實例的每分鐘調用次數 service_instance_cpm = from(ServiceInstance.*).cpm();端點指標(8個索引)
// 端點的每分鐘調用次數 endpoint_cpm?=?from(Endpoint.*).cpm(); // 端口平均響應時間 endpoint_avg = from(Endpoint.latency).longAvg(); // 端點的成功率 endpoint_sla = from(Endpoint.*).percent(status == true); // Multiple values including p50, p75, p90, p95, p99 endpoint_percentile = from(Endpoint.latency).percentile(10); // Multiple values including p50, p75, p90, p95, p99// 在服務端端點檢測到的每分鐘調用次數 endpoint_relation_cpm = from(EndpointRelation.*).filter(detectPoint == DetectPoint.SERVER).cpm(); // 在服務端檢測到的rpc調用的平均耗時 endpoint_relation_resp_time = from(EndpointRelation.rpcLatency).filter(detectPoint == DetectPoint.SERVER).longAvg(); // 在服務端檢測到的請求成功率 endpoint_relation_sla = from(EndpointRelation.*).filter(detectPoint == DetectPoint.SERVER).percent(status == true); //?Multiple?values?including?p50,?p75,?p90,?p95,?p99 endpoint_relation_percentile = from(EndpointRelation.rpcLatency).filter(detectPoint == DetectPoint.SERVER).percentile(10);數據庫性能指標(4個索引)
// 數據庫的處理平均響應時間 database_access_resp_time = from(DatabaseAccess.latency).longAvg(); // 數據庫的請求成功率 database_access_sla = from(DatabaseAccess.*).percent(status == true); // 數據庫的每分鐘調用次數 database_access_cpm = from(DatabaseAccess.*).cpm(); // Multiple values including p50, p75, p90, p95, p99 database_access_percentile = from(DatabaseAccess.latency).percentile(10);agent模塊1:java-agent.oal(12)
// jvm 平均cpu耗時百分比 instance_jvm_cpu = from(ServiceInstanceJVMCPU.usePercent).doubleAvg(); // jvm 堆空間的平均使用空間 instance_jvm_memory_heap = from(ServiceInstanceJVMMemory.used).filter(heapStatus == true).longAvg(); // jvm 非堆空間的平均使用空間 instance_jvm_memory_noheap = from(ServiceInstanceJVMMemory.used).filter(heapStatus == false).longAvg(); // jvm 最大堆內存的平均值 instance_jvm_memory_heap_max = from(ServiceInstanceJVMMemory.max).filter(heapStatus == true).longAvg(); // jvm 最大非堆內存的平均值 instance_jvm_memory_noheap_max = from(ServiceInstanceJVMMemory.max).filter(heapStatus == false).longAvg(); // 年輕代gc的耗時 instance_jvm_young_gc_time = from(ServiceInstanceJVMGC.time).filter(phrase == GCPhrase.NEW).sum(); // 老年代gc的耗時 instance_jvm_old_gc_time = from(ServiceInstanceJVMGC.time).filter(phrase == GCPhrase.OLD).sum(); // 年輕代gc的次數 instance_jvm_young_gc_count = from(ServiceInstanceJVMGC.count).filter(phrase == GCPhrase.NEW).sum(); // 老年代gc的次數 instance_jvm_old_gc_count = from(ServiceInstanceJVMGC.count).filter(phrase == GCPhrase.OLD).sum(); // 存活的線程數 instance_jvm_thread_live_count = from(ServiceInstanceJVMThread.liveCount).longAvg(); // 守護線程數 instance_jvm_thread_daemon_count = from(ServiceInstanceJVMThread.daemonCount).longAvg(); // 峰值線程數 instance_jvm_thread_peak_count = from(ServiceInstanceJVMThread.peakCount).longAvg();agent 模塊2:dotnet-agent.oal(9)
相關的內容和java的很類似,這里就不描述了。
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模塊:envoy.oal(3)
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();到了這里,應說到了五個*.oal的95個索引,剩下的19個索引主要是這些。
其他索引(19)
這些索引并沒有存在于上邊的oal文件里,但是每天都會生成的,具體在哪里執行的,待我后續研究下吧。
alarm_record browser_error_log endpoint_relation_server_side endpoint_traffic http_access_log instance_traffic jaeger_span network_address_alias profile_task profile_task_log profile_task_segment_snapshot segment service_instance_relation_client_side service_instance_relation_server_side service_relation_client_side service_relation_server_side service_traffic top_n_database_statement zipkin_span好啦,今天就暫時這樣吧,記錄了下使用ES存儲Skywalking的數據索引,如果想對數據有進一步了解,可以配置下Mysql試試喲。
點擊【閱讀原文】,查看更多持久化方案👇
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的微服务组件记事本:Skywalking的ES索引 · 收藏篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 6新特性试用 | 无需配置开发
- 下一篇: 一切为了孩子——一位IT麻麻的新西兰移民