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的
beta版 tomcat 应用监控指标的更多相关文章
- 【巨杉数据库SequoiaDB】巨杉数据库 v5.0 Beta版 正式发布
2020年疫情的出现对众多企业运营造成了严重的影响.面对突发状况,巨杉利用长期积累的远程研发协作体系,仍然坚持进行技术创新,按照已有规划推进研发工作,正式推出了巨杉数据库(SequoiaDB) v ...
- [App Store Connect帮助]六、测试 Beta 版本(1)TestFlight Beta 版测试概述(iOS、Apple TVOS、watchOS)
TestFlight Beta 版测试让您可以分发您 App 的 Beta 版构建版本给测试员并收集反馈.您可以在您的 App Store Connect 帐户中一次为至多 100 个 App 启用 ...
- 无意间做了个 web 版的 JVM 监控端(前后端分离 React+Spring Boot)
之前写了JConsole.VisualVM 依赖的 JMX 技术,然后放出了一个用纯 JMX 实现的 web 版本的 JConsole 的截图,今天源码来了. 本来就是为了更多的了解 JMX,第一步就 ...
- Home 安转beta版软件
今天想装测试版的cocoapods,用 brew install cocoapods 后,总是安装稳定版,就是1.1.0,不是最新的beta版,发现用下面这个命令可以装最新beta版 brew ins ...
- “我爱背单词”beta版发布与使用说明
我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院 拒 ...
- alpha版、beta版、rc版的意思
很多软件在正式发布前都会发布一些预览版或者测试版,一般都叫“beta版”或者 “rc版”,特别是开源软件,甚至有“alpha版”,下面来解释一下各个版本的意思. alpha版:内部测试版.α是希腊字母 ...
- Beta版
Beta版使用说明 各文件介绍:本软件是基于visual studio 2010 平台,使用C#语言开发的windows窗体游戏.该游戏共有七个界面,分别是开始界面,游戏说明界面,模式选择界面,经典模 ...
- 一起买beta版本文档报告汇总
一起买beta版本文档报告汇总 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 一.Beta版本冲 ...
- 解压版Tomcat配置
解压版Tomcat配置(本例Tomcat6): 一 配置Tomcat 1 下载Tomcat Zip压缩包,解压. 如果增加tomcat的用户名和密码,则修改/conf/tomcat-us ...
随机推荐
- 在php文件中xml格式
本人是小白,有错误的地方请指正,勿喷! 在写一个调查问卷的过程中用到了xml文件,如想要了解,可以通过以下链接简单学习:http://www.w3school.com.cn/xml/ 所用工具:php ...
- mysql小白系列_08 zabbix添加自定义监控项items和触发器
监控mysql存活 1.配置agent自定义参数 vi /usr/local/zabbix/etc/zabbix_agentd.conf Include=/usr/local/zabbix/etc/z ...
- GYM101635E Ingredients
题目链接:https://vjudge.net/problem/Gym-101635E 题目大意: 给定一个有 \(N\) 条边的有向无环图(有多个起点),每条边都有其费用和收益,现要从一个或多个起点 ...
- SQL——SELECT、UPDATE、DELETE和INSERT INTO
SQL是一种ANSI的标准计算机语言.ANSI:美国国家标准化组织.除SQL标准外,大部分SQL数据库都拥有私有的扩展.SQL对大小写不敏感.某些数据库系统要求在SQL命令末端使用分号,这样可以执行一 ...
- 关于 Git 拉取GitLab工程报错:Repository not found的问题
[root@localhost xscan]# git pull fatal: repository 'http://gitlab.***.com/***.git/' not found 原因1: 可 ...
- java链接redis
创建maven项目 2.导入jar包 <dependencies> <dependency> <groupId>redis.clients</groupId& ...
- vue项目中使用bpmn-番外篇(留言问题总结)
前情提要 “vue项目中使用bpmn-xxxx”系列的七篇文章在上周已经更新完成,发表后,有小伙伴在使用时提出了一些文章中没有讲到的问题,此篇作为番外篇,将大家提出的共性问题解答一下,欢迎大家支持原创 ...
- 对 eval 命令的理解
eval 格式:eval [argument...] 可以二次迭代参数中的引用变量,然后将参数作为命令,在shell中执行 如果是多个参数,那么变量替换之后必须符合某个命令的格式,否则eval会报错& ...
- PIC单片机的定时器
PIC单片机的定时器有3个 timer0 timer1 timer2 定时器的计算方法 256*k*Tcy=定时时间 (256-Init-value)*k*Tcy=定时时间
- [Firefox附加组件]0002.添加菜单项
Add-onSDK 还不能为火狐浏览器提供一个API添加新的菜单项.但它是可扩展的设计,所以任何人都可以建立和发布模块,使用插件开发者.大牛埃里克沃尔德写的MenuItems模块,能够使我们很方便的添 ...