good luck! ------ 博客

beta版 tomcat 应用监控指标

指标是集合网络搜索得到的汇总并且现在在使用的,现在记录一下

数据平台: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下载

posted @ 2020-06-12 21:37  木直  阅读(1098)  评论(0编辑  收藏  举报