beta版 tomcat 應用監控指標

木直發表於2020-06-12

指標是集合網路搜尋得到的彙總並且現在在使用的,現在記錄一下

資料平臺:Prometheus v2.18.1
展示平臺:Grafana
指標來源: 日誌類的是mtail
其他都是通過jmx_exporter採集的
couter 指的是Prometheus 的指標型別之一,詳情請看官網
使用jmx——exporter 版本0.13.0 當前最新版
使用的mtail 版本是mtail_v3.0.0-rc35_linux_amd64
使用的Grafana 版本是6.2.0
使用的tomcat-jmx.yml

---   
lowercaseOutputLabelNames: true
lowercaseOutputName: true
rules:
- pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+):'
  name: tomcat_$3_total
  labels:
    port: "$2"
    protocol: "$1"
  help: Tomcat global $3
  type: COUNTER
- pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount):'
  name: tomcat_servlet_$3_total
  labels:
    module: "$1"
    servlet: "$2"
  help: Tomcat servlet $3 total
  type: COUNTER
- pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount):'
  name: tomcat_threadpool_$3
  labels:
    port: "$2"
    protocol: "$1"
  help: Tomcat threadpool $3
  type: GAUGE
- pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions):'
  name: tomcat_session_$3_total
  labels:
    context: "$2"
    host: "$1"
  help: Tomcat session $3 total
  type: COUNTER
- pattern: 'java.lang<type=GarbageCollector, name=PS \w+><>CollectionCount'
- pattern: 'Catalina<type=Connector, port=\d+><>acceptCount'
- pattern: 'java.lang<type=Runtime><>Uptime‘
#- pattern: ".*"  #讓所有的jmx metrics全部暴露出來

tomcat 總覽頁面指標

錯誤型別指標

topk(5,sum (apache_http_requests_total{status_code=~"4.*"})by (app,customer,env,infra)/sum (apache_http_requests_total)by (app,customer,env,infra)*100)
Legend:4xx百分比
topk(5,sum (apache_http_requests_total{status_code=~"5.*"})by (app,customer,env,infra)/sum (apache_http_requests_total)by (app,customer,env,infra)*100)
Legend:5xx百分比

說明 就是拿到錯誤程式碼(4xx,5xx)的counter 算一下比值,如果佔比很大的話,那就要關注了

topk(5,tomcat_errorcount_total{protocol=~"http.*"})

說明 tomcat後臺本身記錄的一個錯誤總數,需要配合accesslog 看下後臺的5xx錯誤數量僅錯誤計數指標無法深入瞭解 Tomcat 正在生成的錯誤型別,但它可以提供需要調查的潛在問題的高階別檢視。您需要通過訪問日誌中的其他資訊來補充此指標,以便更清楚地瞭解使用者遇到的錯誤型別

請求和吞吐量

topk(5,sum(apache_http_request_time_millseconds_bucket_sum{status_code=~"2.*"}) by (app,customer,env,infra) /sum(apache_http_request_time_millseconds_bucket_count{status_code=~"2.*"}) by  (app,customer,env,infra))
by (app,customer,env,infra) 解釋一下 這是用於我在grafana 過濾的label 可以修改為自己適配的

說明 平均響應時間,總的響應時間/總的請求次數 只要訪問成功的 過濾了一下 返回的狀態碼2xx開頭的

topk(5,rate(tomcat_processingtime_total{protocol=~"http.*"}[5m]))

說明 tomcat處理請求的響應時間累加值 counter型別

topk(5,rate(tomcat_maxtime_total{protocol=~"http.*"}[5m]))

說明 最大處理時間表示伺服器處理一個請求所需的最長時間(從可用執行緒開始處理請求到返回響應為止)。每當伺服器檢測到比當前maxTime更長的請求處理時間時,其值就會更新。該指標不包含有關請求,其狀態或URL路徑的詳細資訊,因此,為了更好地理解單個請求和特定型別請求的最大處理時間,您需要分析訪問日誌。單個請求的處理時間激增可能表明JSP頁面未載入或相關的程式(例如資料庫查詢)花費的時間太長而無法完成。由於其中一些問題可能是由於Tomcat之外的操作引起的,因此,與組成基礎結構的所有其他服務一起監視Tomcat伺服器非常重要。這有助於確保您不會忽略其他對執行應用程式也至關重要的操作或過程

topk(5,rate(tomcat_requestcount_total{protocol=~"http.*"}[5m]))

說明 訪問請求總數對其進行rate計算,得到平秒每秒變化率
這裡解釋rate函式的原理

topk(5,rate(tomcat_bytesreceived_total{protocol=~"http.*"}[5m]))
topk(5,rate(tomcat_bytessent_total{protocol=~"http.*"}[5m]))

說明 tomcat 例項傳送和接收的流量

執行緒池

topk(5,rate(tomcat_threadpool_currentthreadsbusy{protocol=~"http.*"}[5m]))

說明 currentThreadsBusy(ThreadPool)和activeCount(Executor)指標可以告訴您當前聯結器池中有多少個執行緒正在處理請求。當您的伺服器收到請求時,如果現有執行緒不足以覆蓋工作負載,則Tomcat將啟動更多工作執行緒,直到達到您為池設定的最大執行緒數為止。這是由代表maxThreads為聯結器的執行緒池和maximumPoolSize為遺囑執行人。任何後續請求都將放入佇列,直到執行緒可用。
如果佇列已滿,則伺服器將拒絕任何新請求,直到執行緒可用為止。重要的是要注意繁忙執行緒的數量,以確保未達到為maxThreads設定的值,因為如果持續達到此上限,則可能需要調整為聯結器分配的最大執行緒數。
使用監視工具,可以通過將當前執行緒數與繁忙執行緒數進行比較來計算空閒執行緒數。空閒執行緒數與忙碌執行緒數是微調伺服器的好方法。如果伺服器的空閒執行緒過多,則可能無法有效地管理執行緒池。在這種情況下,您可以降低minSpareThreads聯結器的值,該值設定池中應始終可用的最小執行緒數(活動或空閒)。根據應用程式的流量調整此值將確保繁忙執行緒和空閒執行緒之間有適當的平衡

topk(5,sum(tomcat_threadpool_currentthreadcount{protocol=~"http.*"}-tomcat_threadpool_currentthreadsbusy{protocol=~"http.*"})by (instance,port,infra,env,customer,app))

說明 現有執行緒減去忙碌執行緒=空閒執行緒,此值設定要是看當前設定的sparethread 預設值是否合適

topk(5,jvm_memory_bytes_init{area="heap"})
topk(5,jvm_memory_bytes_max{area="heap"})
jvm  堆記憶體初始化值和最大值 放在總覽主要是想看每個tomcat 分配的初始值和最大值
topk(5,rate(jvm_memory_bytes_committed{area="heap"}[5m]))
保證可用於JVM的記憶體量。此數量根據記憶體使用量而變化,並增加到為JVM設定的最大值
此值為5分鐘內的變化的值
topk(5,jvm_memory_bytes_used{area="heap"})
JVM當前使用的記憶體量(例如,應用程式,垃圾回收)

Ok 總覽頁面的指標就到這裡,如果其他的補充請幫忙在評論補充,多謝

下鑽的指標

每個tomcat應用的dashboard

process_max_fds{infra="$infra",env="$env",customer="$customer",app="$app",job="tomcat"}
infra="$infra",env="$env",customer="$customer",app="$app"這些是我為了區分每個tomcat應用設定的label
實際可以去掉

說明 系統最大的檔案描述符

process_open_fds{infra="$infra",env="$env",customer="$customer",app="$app",job="$job"}

說明 使用的檔案描述符,用完了會報錯的,系統每開啟一個檔案或者建立一個連線都會耗一個fd,按照道理應該能判斷併發高低。沒壓過,到時看看

rate(process_cpu_seconds_total{infra="$infra",env="$env",customer="$customer",app="$app"}[5m])

說明 平均增長速率 of process cpu seconds total in 5 min

tomcat_requestcount_total{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app"}

說明 請求總計數

jvm相關

jvm_threads_state{infra="$infra",env="$env",customer="$customer",app="$app"}

說明 執行緒狀態

rate(jvm_gc_collection_seconds_count{infra="$infra",env="$env",customer="$customer",app="$app"}[5m])

說明 rate gc 次數變化 for 5min

jvm_threads_deadlocked{infra="$infra",env="$env",customer="$customer",app="$app"}
jvm_threads_deadlocked_monitor{infra="$infra",env="$env",customer="$customer",app="$app"}
jvm_threads_current		JVM當前活躍執行緒數
jvm_threads_peak		從JVM啟動開始曾經活著的最大執行緒數
jvm_threads_started_total 		從JVM啟動開始總共啟動過的執行緒次數
jvm_threads_daemon		JVM當前活躍的守護執行緒數
jvm_threads_deadlocked		等待獲取物件監視器或可擁有的同步器處於死鎖狀態的 JVM 執行緒的週期
jvm_threads_deadlocked_monitor		等待獲取物件監視器的 JVM 執行緒處於死鎖狀態的迴圈

說明 看上面

rate(jvm_gc_collection_seconds_sum{infra="$infra",env="$env",customer="$customer",app="$app"}[5m])/rate(jvm_gc_collection_seconds_count{infra="$infra",env="$env",customer="$customer",app="$app"}[5m])

說明 rate for 平均gc使用時間 5min

jvm_memory_bytes_init{area="heap",infra="$infra",env="$env",customer="$customer",app="$app"}
jvm_memory_bytes_max{area="heap",infra="$infra",env="$env",customer="$customer",app="$app"}
jvm_memory_bytes_used{area="heap",infra="$infra",env="$env",customer="$customer",app="$app"}
jvm_memory_bytes_committed{area="heap",infra="$infra",env="$env",customer="$customer",app="$app"}

說明 commited保證可用於JVM的記憶體量。此數量根據記憶體使用量而變化,並增加到為JVM設定的最大值usedJVM當前使用的記憶體量(例如,應用程式,垃圾回收)
還有一個參考的dashboard 到時驗證看看 哪個比較有效 指標就如下

tomcat_serverinfo{infra="$infra",env="$env",customer="$customer",app="$app"}

說明 版本資訊

tomcat_threadpool_maxthreads{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}

說明 tomcat 可用的最大執行緒數 理論上的併發最大值

tomcat_threadpool_minsparethreads{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}

說明 最小空閒執行緒,此值太大會影響效能,因為不用,也建立執行緒會使用系統資源

catalina_connector_acceptcount{infra="$infra",env="$env",customer="$customer",app="$app"}

說明 socket 獲取連線的佇列最大長度 參考linux 核心的backlog去理解,此值優先順序未確認,是否會覆蓋核心的設定backlog值??有待補充

tomcat_threadpool_acceptorthreadcount{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}

說明 用於接收連線的執行緒的數量,預設值是1。一般這個指需要改動的時候是因為該伺服器是一個多核CPU,如果是多核 CPU 一般配置為 2。

tomcat_threadpool_pollerthreadcount{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}

說明 表示用於polling IO事件的執行緒個數,預設為1。在多核CPU架構下,我們可以設定為2來提高polling的能力,官方不建議設定大於2的值,因為鎖的競爭會導致效能下降,事實上一個執行緒也足夠快速

increase(tomcat_bytesreceived_total{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}[$__interval])
increase(tomcat_bytessent_total{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}[$__interval])

說明 流量傳送和接受的位元組數

increase(tomcat_requestcount_total{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}[$__interval])
increase(tomcat_errorcount_total{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}[$__interval])

說明 請求吞吐量和錯誤數指標判斷請求激增的情況下與錯誤數量的對比

tomcat_threadpool_currentthreadcount{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}
tomcat_threadpool_currentthreadsbusy{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}
tomcat_threadpool_connectioncount{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}
tomcat_threadpool_keepalivecount{protocol=~"http.*",infra="$infra",env="$env",customer="$customer",app="$app",protocol="$protocol"}

說明 tomcat 的各種執行緒狀態數量

sum(increase(tomcat_session_expiredsessions_total{infra="$infra",env="$env",customer="$customer",app="$app"}[$__interval])) by (instance)
sum(increase(tomcat_session_rejectedsessions_total{infra="$infra",env="$env",customer="$customer",app="$app"}[$__interval])) by (instance)

說明 session 相關

topk(5,rate(tomcat_servlet_requestcount_total{infra="$infra",env="$env",customer="$customer",app="$app"}[$__interval]))

說明 Top 5 servlet request count

topk(5, increase(tomcat_servlet_errorcount_total{infra="$infra",env="$env",customer="$customer",app="$app"}[$__interval]))

說明 Top 5 servlet error count

topk(5, rate(tomcat_servlet_processingtime_total{infra="$infra",env="$env",customer="$customer",app="$app"}[$__interval]) / rate(tomcat_servlet_requestcount_total{infra="$infra",env="$env",customer="$customer",app="$app"}[$__interval]))

說明 Top 5 servlets average processing time per request in last 5 minutes

下鑽子頁面JVMdashboard

up{infra="$infra",env="$env",customer="$customer",app="$app",job="$job"}

說明 判斷採集任務是否存話

time() - process_start_time_seconds{infra="$infra",env="$env",customer="$customer",app="$app",job="$job"}

說明 已啟動時間

java_lang_operatingsystem_availableprocessors{infra="$infra",env="$env",customer="$customer",app="$app"}

說明 CPU數量

java_lang_operatingsystem_systemloadaverage{infra="$infra",env="$env",customer="$customer",app="$app"}

說明 系統負載

java_lang_operatingsystem_openfiledescriptorcount{infra="$infra",env="$env",customer="$customer",app="$app"}

說明

process_start_time_seconds{infra="$infra",env="$env",customer="$customer",app="$app",job="$job"}*1000

說明

java_lang_operatingsystem_freephysicalmemorysize{infra="$infra",env="$env",customer="$customer",app="$app"}

說明

label_join(jvm_info{infra="$infra",env="$env",customer="$customer",app="$app"}, "jdk", ", ", "vendor", "runtime", "version")

說明

java_lang_operatingsystem_systemcpuload{infra="$infra",env="$env",customer="$customer",app="$app"}
java_lang_operatingsystem_processcpuload{infra="$infra",env="$env",customer="$customer",app="$app"}

說明 程式和系統使用的cpu負載

jvm_memory_bytes_max{area="$memarea",infra="$infra",env="$env",customer="$customer",app="$app"}
jvm_memory_bytes_used{area="$memarea",infra="$infra",env="$env",customer="$customer",app="$app"} / jvm_memory_bytes_max >= 0
area="$memarea" 用於repeat功能使用的,參考我那篇grafana複製的博文吧[點選這裡](https://www.cnblogs.com/muzhifei/p/13109639.html)

說明

jvm_memory_pool_bytes_used{pool="$mempool",infra="$infra",env="$env",customer="$customer",app="$app"}
jvm_memory_pool_bytes_committed{pool="$mempool",infra="$infra",env="$env",customer="$customer",app="$app"}
同樣的是複製

說明 記憶體池的使用情況

jvm_classes_loaded{infra="$infra",env="$env",customer="$customer",app="$app"}

說明 已載入的類

rate(jvm_gc_collection_seconds_sum{infra="$infra",env="$env",customer="$customer",app="$app"}[$__interval])

說明 gc耗時的平均每秒增長值

rate(jvm_gc_collection_seconds_count{infra="$infra",env="$env",customer="$customer",app="$app"}[5m])

說明 gc垃圾回收次數的平均每秒增長值

jvm_threads_deadlocked{infra="$infra",env="$env",customer="$customer",app="$app"}
jvm_threads_peak{infra="$infra",env="$env",customer="$customer",app="$app"}
jvm_threads_current{infra="$infra",env="$env",customer="$customer",app="$app"}
jvm_threads_daemon{infra="$infra",env="$env",customer="$customer",app="$app"}

說明 jvm thread 資訊

java_lang_operatingsystem_committedvirtualmemorysize{infra="$infra",env="$env",customer="$customer",app="$app"}
java_lang_operatingsystem_freephysicalmemorysize{infra="$infra",env="$env",customer="$customer",app="$app"}

說明 Committed virtual memory 等同於/proc/$pid/status/vmsizeFree physical memory 就是系統的剩餘記憶體grafana 單位計算不正確估計是直接除以1000的

最後附上配套的dashboard來自網路和自己整理
grafana-dashboard下載

相關文章