APM 上報信息分析與應用

来源:https://www.cnblogs.com/dengbangpang/archive/2020/05/24/12945273.html
-Advertisement-
Play Games

在入正題之前我們再回顧下它的架構圖: 本文章主要分析AMP各索引的作用,與及結合1.7環境上已接入的服務數據對比後,對索引中的主要欄位進行解析。文章分為四個小章節。 1、索引類型 apm索引分為四種類型: 系統指標索引(System status metrics),索引名稱格式:apm-versio ...


在入正題之前我們再回顧下它的架構圖:

本文章主要分析AMP各索引的作用,與及結合1.7環境上已接入的服務數據對比後,對索引中的主要欄位進行解析。文章分為四個小章節。

1、索引類型

apm索引分為四種類型:

系統指標索引(System status metrics),索引名稱格式:apm-version-metric-yyyy.dd.mm,主要儲存進程資源指標,如:記憶體信息、cpu信息、gc信息等。

具體異常索引(Error-specific data),索引名稱格式:apm-version-error-yyyy.dd.mm,主要存儲進程error級別的經過json格式化後的異常信息棧。

跨度(或鏈路)索引(Span-specific data),索引名稱格式:apm-version-span-yyyy.dd.mm,主要存儲跨本進程調用鏈的信息,如:代碼執行鏈、跟蹤id,跨度id,跨度類型、跨度用時等。特別指出的是這個索引的數據是形成整個事務、鏈路的一部分。

事務索引(Transaction-specific),索引名稱格式:apm-version-transaction-yyyy.dd.mm,主要存儲事務的持續時間,單位微妙(PS:這裡的事務跟TPS同一個概念:指一個客戶機向伺服器發送請求到伺服器做出相應的過程,這裡除了客戶機請求之外,還包括內部的執行任務,如:定時任務),如:進程id,TPS值,事務類型,發生時間,請求介面。

ps:以下標紅欄位是個人認為比較有價值的欄位。

2、索引欄位說明

這些索引中,有很多欄位都是公共的,所以我在其中某個索引中提及到了,在其它索引就不再單獨做說明項了。

2.1、系統指標索引

 jvm.memory.non_heap.committed

java進程非堆的記憶體空間可用大小,單位是bytes。針對jdk8以上就是元空間大小。

jvm.memory.non_heap.max

 java進程非堆的記憶體空間最大值,單位是bytes。針對jdk8以上就是元空間最大值。由系統參數:MaxMetaspaceSize設置

jvm.memory.heap.max

java進程堆記憶體最大值,由系統參數-Xmx設置

jvm.memory.heap.used

java進程堆記憶體使用量,單位位元組

jvm.memory.heap.committed

java進程堆可用記憶體大小,它的值一般為大於或等於已使用大小,小於等於最大記憶體空間,小於是因為Xms與Xmx設置不一樣,為了系統記憶體不波動,建議設置初始值和最大值一樣。

jvm.memory.non_heap.used 

 java進程非堆已使用大小

 jvm.thread.count

JVM中當前活動線程的數量

jvm.gc.alloc

代碼中是計算java進程所有線程使用的記憶體總量(包括已死去的線程),但是字面理解是堆記憶體中分配的記憶體總量相當於heap.max,個人認為性能調優上沒什麼參考價值

process.pid

對應的終端進程id

processor.name

代表事件類型:metric
processor.event

代表事件類型:metric

process.title

jdk安裝目錄

service.name

對應的終端服務名稱,就是elastic.apm.service_name參數指定的值

service.runtime.name

運行環境,如是java進程該值就是java

service.runtime.version

jdk版本

host.ip

終端進程所有伺服器ip

jvm.gc.count

jvm垃圾收集次數

jvm.gc.time

每次GC使用時間,單位是毫秒

labels.name

GC方式:如G1 Young Generation或G1 Old Generation

@timestamp

收集時間

system.process.memory.size

進程占用的虛擬記憶體

system.process.cpu.total.norm.pct

自上次上報以來該進程占用CPU的百分比。需要乘以100%。

system.cpu.total.norm.pct

自上次上報以來終端所在的機器當前cpu的使用率,需要乘以100%

system.memory.actual.free

操作系統當前可用記憶體(位元組),由空閑記憶體加緩存和緩衝區組成

system.memory.total

操作系統總記憶體

欄位使用分析:

從以上索引欄位解析可以讓我們實時瞭解該進程所在機器的ip、當前cpu的使用率、記憶體使用率、被監控進程的堆、非堆記憶體分配情況、記憶體使用率、cpu使用率、GC次數、GC使用時間、GC類型。比如:生產上記憶體分配一般是4GB,如果分配低於1GB我們可以當成一項告警指標,知道了配置的總記憶體和使用記憶體,又可以算出記憶體使用率,那麼當記憶體使用率達到90%即可做出告警事件,GC使用時間、頻率。GC的用時和頻率沒有什麼標準來衡量,根據服務實際情況來優化,能滿足當前需求和體驗感能接受即可,但以我們目前服務部署的情況來分析,高發很少突破100以上的情況下,每個服務記憶體都不超過4GB的,比較合理的YGC一分鐘內不能超過10次,每次不能超過20毫秒,FGC應該0次出現。可以以這個目標來優化靠攏。(下次我會寫一篇關於G1里為什麼能讓我們指定時間內完成GC——啟髮式演算法)

2.2、異常索引

 parent.id

指向父節點的id,意思是上個服務請求的標識id,用於服務之間異常調用鏈路跟蹤

transaction.id

事務id,這裡的事務不是數據事務,代表一個完整的請求流程或一個內部任務。用於異常事件鏈路跟蹤,結合數據看與parent.id值相同,說明代表服務id並不是固定死

error

異常棧

error.exception.message

拋出的異常信息,如:xxx屬性為空、500 Server Error、The user specified as a definer ('test_seq'@'%') does not exist

error.exception.type

異常類型,如:java.lang.RuntimeException、com.segi.uhomecp.ifs.activiti.exception.WorkFlowException、java.sql.SQLException

error.culprit

異常發生的根源,就是哪個類里的哪個方法哪行代碼發生的異常。如:com.segi.uhomecp.redis.RedisUtil$18.execute(RedisUtil.java:444)

error.id

此次異常事件的標識id

error.grouping_key

異常分組id,按error.exception.type分組

processor.name、processor.event

事件類型和名稱是同個東西,就是代表span、error、還有metris

observer.hostname

apm服務的主機名

observer.type

預設都是apm-server

observer.version

apm服務版本號

observer.version_major

apm服務主版本號

trace.id

跟蹤id

host.hostname

被監控的終端服務主機名

transaction.type

此事代碼被執行的方式,意思是被http請求還是內部執行的定時任務。如:request、scheduled

transaction.sampled

 監控數據事件是否包含跨度、上下文等全部相關信息,預設是true

timestamp.us

事件發生時間,微妙

url.path

介面uri,如:/lease-stat/admin/businessSummary/list

url.scheme

url類型,如果是http.其值就是:http,非http為空

url.port

介面對應的埠

url.domain

介面對應的ip或功能變數名稱

url.full

介面完整url

http.request.method

請求方式,get或post,非http為空

http.response.status_code

http相應狀態碼,如:500

還有些一些用戶http請求的信息欄位,如:瀏覽器,用戶終端類型,http版本等。

數據結構圖:

欄位使用分析:

好了,經過我們分析了這個索引的核心相關欄位後。就可以知道這個索引能給我們解決什麼問題了,首先最有價值的是error異常棧,我們碼農級別最喜歡看的東西都這error doc里,從異常棧我們可以分析出錯的原因,error.culpri觸發異常的地方,除了這些信息我們從中還可以知道:異常介面、異常的服務進程、異常服務ip、http異常狀態碼、關連的異常鏈路。

2.3、跨度索引


span.id

跨度標識

span.stacktrace

這個是跨度調用鏈,記錄了調用的文件名,調用行,調用方式等信息

span.duration.us

跨度耗時,單位微妙,這個時間是記錄span.stacktrace內調用棧的用時。跨度是什麼意思呢? 是指除了本進程內調用之外都算是跨度調用,比如:資料庫操作、調ice等

span.type

跨度類型,資料庫就是db,http就是external,相對subtye,它細粒度大些。

span.subtype

跨度調用子類型,有http、mysql、tcp(占不支持)等

span.name

給這個跨度調用取的簡單名稱。如:SELECT FROM ACT_RU_EXECUTION、SELECT、POST 192.168.1.7

span.action

跨度事件類型,像資料庫查詢,類型就是query

欄位使用分析:

這個索引最有價值的調用鏈了:span.stacktrace和執行過程中所花的時間

2.4、事務索引

transaction.duration.us

整個流程的處理時間,單位微妙,這個時間包含了跨度時間在內

transaction.name

整個事務的名稱,用介面名、方法入口名來命

span_count

記錄跨度數

欄位使用分析:

transaction.duration.us是整個請求過程所使用的時間,可以根據這個時間推斷出指定該介面所在的服務,所屬的進程的性能,還有schemes類型,根據這個可以判斷是不是http請求,這個索引的數據主要是結合跨度索引一起使用。

3、實踐應用

經過了一翻上報索引數據的分析後,我們來實踐一下。

  1. 首先為每個接入服務名稱定義規範
    apm監控是以進程為目標。如果要接入多個服務的情況下,要分辯某個或哪些服務是做什麼的,比較難辨別出來了。所以需要為每個接入監控服務的名稱統一定義一個命名規範。
    所以我們統一規定服務監控名稱格式為(服務名稱必須符合此正則表達式: ^[a-zA-Z0-9 _-]+$ . 用較少的regexy術語:您的服務名稱只能包含ASCII字母,數字,短劃線,下劃線和空格中的字元):segi-環境-業務組名稱-服務名稱-服務所在的機器ip,如:segi-saas-lease-uhomecp-lease-220。

現成的界面指標分析

  1. 預設主界面(services):


    說明:第一列是被監控的服務名稱,就是對應上面我們給他命的名稱 ;第二列被代監控的環境;第三列是每個監控服務平均響應時間(對所有請求作出響應所需要的時間平均值,其接近於所有TPM總和的平均);每三列是每分鐘事務處理數;第四列是每分鐘發生異常數。
     在這順便科普下幾個衡量一個服務的性能指標:TPS、併發數、響應時間
    TPS:每秒傳輸的事物處理個數,即伺服器每秒處理的事務數。包括一條消息入和一條消息出。
    併發數: 系統同時處理的request(或事務)數
    響應時間: 對請求作出響應所需要的時間,一般取平均響應時間(響應時間:網路傳輸時間:N1+N2,應用伺服器處理時間:A1+A3,資料庫伺服器處理時間:A2,響應時間=N1+N2+N4+A1+A3+A2)
    這三者之間的關係:併發數 =  TPS*平均響應時間

    有用指標:平均響應時間:從這個直接看出服務的性能等級:毫秒級別的響應屬於非常有吸引力的用戶體驗;2秒之內給用戶是不錯的體驗;3秒之內可以接受;5秒之內遭用戶嘆氣;10秒之內60%用戶不使用;大於10秒90%以上用戶選擇離開。

    EPM:直接反映服務使用穩定性,出現error直接影響服務的使用。

  2. traces界面

    說明:這個鏈路界面跟服務界面指標差不多。展示的是所有服務的所有http介面的響應時間、TPM、介面訪問頻率
    有用指標:平均響應時間
  3. 服務界面
    圖一:

    圖二:

    圖三:

    說明:圖一,服務的事務監控,可以看出這個服務下的每個介面的事務處理平均時間、第95百分位,每分鐘處理事務數、訪問頻率、每分鐘的訪問量。有用指標:第95個百分位(是統計學的一個術語,可以理解為有5%的請求超過多少時間),通過這個值我們可以直接看出這個介面的性能,比如:95百分位數是1,560ms的,那麼意味著有5%的請求介面事務處理時間超過這個值,這個指標的意義是:反映服務(上面的波浪線圖就是整個服務的95th)或介面的穩定性,如果在不同的時間段內95百分位數的值波動不大說明介面沒有問題,如果不同時間段內波動越明顯,就越能夠放大問題,主要用於性能分析,而介面平均處理時間就可以直接反映該介面的性能,我們可以按上面的響應時間做為標準來優化
    圖二,是反映異常信息,主要有異常簡單信息、在選定的時間段內發生的異常次數(如上面的5K,就是5千次)、最後一次發生的時間,異常的指標都是有用的了。
    圖三,這個監控界面所展示的指標個人認為是最為主要的了,直接能反饋這個服務的使用性問題,服務所在機器的資源問題、服務本身的資源問題。由於上面的一些指標已經說明過,這時就只解釋CPU使用和記憶體使用,以及它的意義。
    cpu使用圖分別有這些指標:服務所在的主機cpu的最大使用率、平均使用率、服務本身占主機的最大使用率、平均使用率,這些指標都是有用指標,比如我選在一天內,這個機器的cpu使用波動很大,那麼這個機器就有問題,同理服務本身的cpu使用也是一樣;記憶體使用圖指標:服務所在機器記憶體使用最大值,和平均值。這裡我們還可以自己加入服務進程本身的jvm記憶體最大值、使用率指標,還有GC圖展示:GC次數、用時、GC類型。
  4. 鏈路界面

    說明:這個界面主要是反映我們監控的介面內部服務調用鏈(包含跨度), 介面處理總時間、和每個調用的耗時,主要作用:為開發人員調性能介面提供幫助。

4、高級應用 

製作我們的儀錶板:

通知告警:

      

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JavaScript箭頭函數 語法 基礎語法 高級語法 描述 引入箭頭函數有兩個方面的作用:更簡短的函數並且不綁定 this 。 更短的函數 不綁定 this 在箭頭函數出現之前,每個新定義的函數都有它自己的 this 值(在構造函數的情況下是一個新對象,在嚴格模式的函數調用中為underfined ...
  • 前言 文章只記錄理解以及容易遺忘的知識點。 詞法作用域、塊作用域 詞法作用域 詞法作用域:簡單的說,詞法作用域就是定義在詞法階段的作用域。換句話說,詞法作用域就是在你寫代碼時將變數和塊作用域寫在哪裡來決定的,因此在詞法分析器處理代碼時會保持作用域不變(大部分情況是這樣的)。 當然有一些欺騙詞法作用域 ...
  • # 5.盒模型 - box-sizing:content-box | border-box; 預設content-box 一個盒模型的功能強弱,直接決定了佈局是否簡潔,決定了編程的複雜度。 正常盒子: boxWidth = width + border*2 + padding*2; IE6混雜模式的 ...
  • 表單一點擊提交按鈕(submit)必然跳轉頁面,如果表單的action為空也會跳轉到自己的頁面,即效果為刷新當前頁。 如下,可以看到一點擊提交按鈕,瀏覽器的刷新按鈕閃了一下: 如果想要阻止表單的預設提交事件,有以下幾種方法: 1.將<input>標簽內按鈕類型從type="submit"修改為typ ...
  • 什麼是前端? 前端即網站前臺部分,也叫前端開發,運行在PC端,移動端等瀏覽器上展現給用戶瀏覽的網頁。隨著互聯網的發展,HTML5,CSS3,前端框架的應用,跨平臺響應式網頁設計能夠適應各種屏幕解析度,完美的動效設計,給用戶帶來極高的用戶體驗。 (核心技術:HTML、CSS、JavaScript) 核 ...
  • 前言 從最開始的小公司做小網站,到現在進入現在的公司做項目,發現小公司里很多很多工作都是重覆的勞動(增刪改查),不過想想也是,業務軟體最基礎的東西不就是增刪改查嗎。 但是很多時候,這種業務邏輯其實沒有必要挨個重寫。總不能說你的增刪改查比我的高級很多。很大程度上,複雜的問題只是數據太多了怎麼優化。 簡 ...
  • 解釋器是一種不常使用的設計模式,它用於描述如何構成一個簡單的語言解釋器,主要應用於使用面向對象語言開發的編譯器和解釋器設計。當我們需要開發一個新的語言時,可以考慮使用解釋器模式 模式動機 如果在系統中某一特定類型的問題發生的頻率很高,此時可以考慮將這些問題的實例表述為一個語言中的句子。再構建一個解釋 ...
  • 使用請註明出處 整理不易 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...