JMX 是 Java Management Extensions(Java管理扩展) 的缩写,它是 Java 平台上用于管理和监控应用程序、系统和网络资源的一种标准化的管理和监控框架。JMX 提供了一种标准的方式,通过这种方式,开发人员可以暴露应用程序中的各种管理和监控信息,然后可以使用 JMX 客户端工具或应用程序来访问和操作这些信息。

网站建设哪家好,找创新互联公司!专注于网页设计、网站建设、微信开发、成都微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了廉江免费建站欢迎大家使用!
JMX 允许开发人员定义称为 MBeans(Managed Beans)的管理组件,这些组件充当被管理资源的代理,并通过 JMX 接口公开资源的操作和属性。通过 MBeans,您可以监控和管理各种 Java 应用程序和服务器的性能、状态和配置。
JMX 主要用于以下一些方面:
总之,JMX 提供了一个强大的框架,用于管理和监控 Java 应用程序,这对于确保应用程序的稳定性和性能至关重要。它广泛用于企业级应用程序和服务器,如应用程序服务器、数据库服务器和中间件。
图片
从图中我们可以看到,JMX的结构一共分为三层:
MBean 分为如下四种,我接下来主要介绍 standard MBean
| 
 类型  | 
 描述  | 
| 
 standard MBean  | 
 这种类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口。它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。  | 
| 
 dynamic MBean  | 
 必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义  | 
| 
 open MBean  | 
 此MBean的规范还不完善,正在改进中  | 
| 
 model MBean  | 
 与标准和动态MBean相比,你可以不用写MBean类,只需使用javax.management.modelmbean.RequiredModelMBean即可。RequiredModelMBean实现了ModelMBean接口,而ModelMBean扩展了DynamicMBean接口,因此与DynamicMBean相似,Model MBean的管理资源也是在运行时定义的。与DynamicMBean不同的是,DynamicMBean管理的资源一般定义在DynamicMBean中(运行时才决定管理那些资源),而model MBean管理的资源并不在MBean中,而是在外部(通常是一个类),只有在运行时,才通过set方法将其加入到model MBean中。后面的例子会有详细介绍  | 
Trino官方文档:https://trino.io/docs/current/
这里为了快速部署就选择docke-compose部署了。
git clone https://gitee.com/hadoop-bigdata/docker-compose-presto.git
cd docker-compose-presto
# 启动服务
docker-compose -f docker-compose.yaml up -d
# 查看
docker-compose -f docker-compose.yaml ps官方文档:https://trino.io/docs/current/admin/jmx.html
jmx.rmiregistry.port=9080
jmx.rmiserver.port=9081参数解释:
-Dcom.sun.management.jmxremote.rmi.port=9081jmx.rmiregistry.port、jmx.rmiserver.port 和 -Dcom.sun.management.jmxremote.rmi.port 这三者都涉及到 Java Management Extensions (JMX)和远程管理的端口配置,但它们各自在不同的上下文中起作用:
这三者之间的关系是:
jmx.rmiregistry.port 和 jmx.rmiserver.port 分别指定 RMI 注册表和 JMX 服务的端口号。-Dcom.sun.management.jmxremote.rmi.port 可以用来指定客户端连接到 JMX 服务时所使用的 RMI 端口号,它通常设置为与 jmx.rmiserver.port 相同的端口号,但你也可以根据需要将其设置为不同的端口号。
docker-compose -f docker-compose.yaml up -d
docker-compose -f docker-compose.yaml pscurl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean图片
通过jmx 接口就可以获取监控数据了/v1/jmx/mbean,但是数据很多,其实我们可以拿一些我们需要的指标数据即可。接下来我们通过jq 拿到各项监控的子接口。jq 命令的使用可以参考我这篇文章:Linux jq 命令讲解与实战操作(json字符串解析工具)
# coodinator
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean|jq '.[].objectName'图片
访问具体接口指标
# 内存指标接口
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean|jq '.[].objectName'|grep -i memory
# 指标名称
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean/java.lang:type=Memory|jq '.attributes[].name'
# 指标值
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean/java.lang:type=Memory|jq '.attributes[].value'
# 指标名称
curl -s -H "X-Trino-User:admin"  http://192.168.182.110:30080/v1/jmx/mbean/trino.memory:type=MemoryPool,name=general|jq '.attributes[].name'
# 指标值
curl -s -H "X-Trino-User:admin"  http://192.168.182.110:30080/v1/jmx/mbean/trino.memory:type=MemoryPool,name=general|jq '.attributes[].value'图片
# worker 节点,coodinator与worker节点的指标会有些不一样
curl -s -H "X-Trino-User:admin" http://192.168.182.110:49153/v1/jmx/mbean|jq '.[].objectName'
# 获取内存接口
curl -s -H "X-Trino-User:admin" http://192.168.182.110:49153/v1/jmx/mbean|jq '.[].objectName'|grep -i memory
# 指标名称
curl -s -H "X-Trino-User:admin"  http://192.168.182.110:30080/v1/jmx/mbean/trino.memory:type=MemoryPool,name=general|jq '.attributes[].name'
# 指标值
curl -s -H "X-Trino-User:admin"  http://192.168.182.110:30080/v1/jmx/mbean/trino.memory:type=MemoryPool,name=general|jq '.attributes[].value'图片
JConsole 是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动。如果要把一个应用以可管理的形式启动,可以在启动是设置 com.sun.management.jmxremote。
找到java安装bin目录,目录下有个jconsole可执行文件,双击点击打开。
图片
也可以通过 VisualVM 连接 JMX 查看数据
图片
查询所有jmx子接口:
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean|jq '.[].objectName'
# 查询指标名称和值,示例如下:
# 指标名称
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean/java.lang:type=Memory|jq '.attributes[].name'
# 指标值
curl -s -H "X-Trino-User:admin" http://192.168.182.110:30080/v1/jmx/mbean/java.lang:type=Memory|jq '.attributes[].value'以下就是常用的指标接口和指标说明:
| 
 指标接口  | 
 指标  | 
 说明  | 
 指标范围  | 
| 
 java.lang:type=Memory  | 
 HeapMemoryUsage  | 
 JVM内存使用量。  | 
 Worker 和 Coodinator  | 
| 
 java.lang:type=Memory  | 
 NonHeapMemoryUsage  | 
 非堆内存使用量。  | 
 worker 和 Coodinator  | 
| 
 trino.execution:name=QueryManager  | 
 QueuedQueries  | 
 排队数  | 
 Coodinator  | 
| 
 trino.execution:name=QueryManager  | 
 RunningQueries  | 
 正在运行的查询总数  | 
 Coodinator  | 
| 
 trino.execution:name=QueryManager  | 
 ExternalFailures.OneMinute.Count  | 
 每分钟外部异常导致的失败查询数。  | 
 Coodinator  | 
| 
 trino.execution:name=QueryManager  | 
 SubmittedQueries.OneMinute.Count  | 
 每分钟提交的查询总数。  | 
 Coodinator  | 
| 
 trino.execution:name=QueryManager  | 
 CanceledQueries.OneMinute.Count  | 
 已取消查询的数。  | 
 Coodinator  | 
| 
 trino.execution:name=QueryManager  | 
 InsufficientResourcesFailures.OneMinute.Count  | 
 每分钟资源不足导致的失败查询数。  | 
 Coodinator  | 
| 
 trino.execution:name=QueryManager  | 
 UserErrorFailures.OneMinute.Count  | 
 每分钟异常导致的失败查询数。  | 
 Coodinator  | 
| 
 trino.execution:name=QueryManager  | 
 CompletedQueries.OneMinute.Count  | 
 已完成查询的总数。  | 
 Coodinator  | 
| 
 trino.execution:name=SqlTaskManager  | 
 FailedTasks.OneMinute.Count  | 
 每分钟失败的Task数目。  | 
 Coodinator  | 
| 
 trino.execution:name=SqlTaskManager  | 
 InputDataSize.OneMinute.Count  | 
 每分钟Task输入数据量。  | 
 Coodinator  | 
| 
 trino.execution:name=SqlTaskManager  | 
 InputPositions.OneMinute.Count  | 
 每分钟Task输入数据行数。  | 
 Coodinator  | 
| 
 trino.execution:name=SqlTaskManager  | 
 OutputDataSize.OneMinute.Count  | 
 每分钟Task输出数据量。  | 
 Coodinator  | 
| 
 trino.execution:name=SqlTaskManager  | 
 OutputPositions.OneMinute.Count  | 
 每分钟Task输出数据行数。  | 
 Coodinator  | 
| 
 trino.memory:type=MemoryPool,name=general  | 
 FreeBytes  | 
 节点内存池可用内存。  | 
 worker 和 Coodinator  | 
| 
 trino.memory:type=MemoryPool,name=general  | 
 MaxBytes  | 
 节点内存池最大内存(JVM*70%)。  | 
 worker 和 Coodinator  | 
| 
 trino.memory:type=MemoryPool,name=general  | 
 ReservedBytes  | 
 节点内存池reserved内存。  | 
 worker 和 Coodinator  | 
| 
 trino.memory:type=MemoryPool,name=general  | 
 ReservedRevocableBytes  | 
 节点内存池revocable reserved内存。  | 
 worker 和 Coodinator  | 
| 
 trino.memory:type=ClusterMemoryPool,name=general  | 
 ReservedRevocableDistributedBytes  | 
 集群内存池revocable reserved内存。  | 
 Coodinator  | 
| 
 trino.memory:name=ClusterMemoryManager  | 
 QueriesKilledDueToOutOfMemory  | 
 oom killed的查询总数。  | 
 Coodinator  | 
| 
 trino.memory:type=ClusterMemoryPool,name=general  | 
 TotalDistributedBytes  | 
 集群内存池总内存。  | 
 Coodinator  | 
| 
 trino.memory:type=ClusterMemoryPool,name=general  | 
 ReservedDistributedBytes  | 
 集群内存池reserved内存。  | 
 Coodinator  | 
| 
 trino.memory:name=ClusterMemoryManager  | 
 ClusterUserMemoryReservation  | 
 集群reserved user memory。  | 
 Coodinator  | 
| 
 trino.memory:name=ClusterMemoryManager  | 
 ClusterTotalMemoryReservation  | 
 集群reserved内存。  | 
 Coodinator  | 
| 
 trino.memory:name=ClusterMemoryManager  | 
 NumberOfLeakedQueries  | 
 集群内存泄漏的查询总数。  | 
 Coodinator  | 
| 
 trino.memory:name=ClusterMemoryManager  | 
 ClusterMemoryBytes  | 
 集群总内存。  | 
 Coodinator  | 
| 
 trino.execution.executor:name=TaskExecutor  | 
 WaitingSplits  | 
 任务执行器上等待的splits数。  | 
 Coodinator  | 
| 
 trino.execution.executor:name=TaskExecutor  | 
 RunningSplits  | 
 任务执行器运行的splits数。  | 
 Coodinator  | 
| 
 trino.execution.executor:name=TaskExecutor  | 
 RunningSplits  | 
 任务执行器总splits数。  | 
 Coodinator  | 
上面只是开启了 Trino JMX,指标数据也采集了,怎么展示呢?下一篇文章重点讲解通过 JMX-Exporter 采集数据,然后通过 Prometheus 拉取JMX采集的数据,最后通过Grafana展示。
                当前题目:什么是JMX?(TrinoJMX实战讲解)
                
                分享URL:http://www.csdahua.cn/qtweb/news5/166505.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网