jmx jolokia_使用Jolokia和JMX进行客户端服务器监视

jmx jolokia

Java监视工具的选择非常广泛(由Google提供的随机选择和顺序):

javamelody

压力探头

JVisualVM

控制台

贾蒙

Java JMX Nagios插件不适用

此外,还有各种专用工具,例如ActiveMQ , JBoss , Quartz Scheduler , Tomcat / tcServer …那么您应该使用哪一个作为最终的监视仪表板? 好吧,它们都不提供您可能需要的即用型功能。 在某些应用程序中,您必须不断监视给定JMS队列的内容和大小。 已知其他一些存在内存或CPU问题。 我还看到过系统管理员必须不断运行一些SQL查询并检查结果甚至分析日志以确保某些基本的后台进程正在运行的软件。 可能性是无止境的,因为它确实取决于软件及其用例。 更糟糕的是,您的客户不关心GC活动,打开的JDBC连接数量以及此讨厌的批处理进程是否未挂起。 它应该工作

在本文中,我们将尝试开发简单,便宜但功能强大的管理控制台。 它将基于单个二进制结果的思想构建-无论它是否起作用。 如果单个运行状况指示器为绿色,则无需进一步说明。 但! 如果它变成红色,我们可以轻松地向下钻取。 之所以可能,是因为我们没有显示数百个不相关的指标,而是将它们分组为树状结构。 树中每个节点的健康状况与最坏的孩子一样糟糕。 这样,如果我们的应用程序发生任何不良情况,它将冒泡。

我们不会强迫系统管理员不断监视多个指标。 我们决定什么是重要的,即使最细小的软件出现故障,它也会弹出。 将其与没有绿色/红色版本和电子邮件通知的连续集成服务器进行比较。 相反,您必须每隔一个构建就去服务器,并手动检查代码是否正在编译以及所有测试是否都是绿色的。 日志和结果在那里,但是为什么要解析它们并手动汇总呢? 这就是我们试图在我们自己的监控解决方案中避免的事情。

作为基础,我选择了Jolokia JMX到HTTP桥(这不是第一次 )。 JVM已经提供了监视基础结构,那么为什么要重塑它呢? 同样由于Jolokia,整个仪表板都可以在客户端JavaScript中实现。 这具有几个优点:服务器占用空间最小,还允许我们通过添加度量标准或更改警报阈值来快速调整度量标准。

我们将从将各种JMX指标下载到客户端(浏览器)开始。 我已经开发了一些用于演示目的的小型应用程序,其中使用了尽可能多的技术(例如Tomcat,Spring,Hibernate,ActiveMQ,Quartz等)。由于我发现Jolokia有点麻烦,所以我没有使用内置的JavaScript客户端库 。 但是正如您所看到的,获取大量指标只是一个AJAX调用的问题。

function request() {var mbeans = ["java.lang:type=Memory","java.lang:type=MemoryPool,name=Code Cache","java.lang:type=MemoryPool,name=PS Eden Space","java.lang:type=MemoryPool,name=PS Old Gen","java.lang:type=MemoryPool,name=PS Perm Gen","java.lang:type=MemoryPool,name=PS Survivor Space","java.lang:type=OperatingSystem","java.lang:type=Runtime","java.lang:type=Threading",'Catalina:name="http-bio-8080",type=ThreadPool','Catalina:type=GlobalRequestProcessor,name="http-bio-8080"','Catalina:type=Manager,context=/jmx-dashboard,host=localhost','org.hibernate:type=Statistics,application=jmx-dashboard',"net.sf.ehcache:type=CacheStatistics,CacheManager=jmx-dashboard,name=org.hibernate.cache.StandardQueryCache","net.sf.ehcache:type=CacheStatistics,CacheManager=jmx-dashboard,name=org.hibernate.cache.UpdateTimestampsCache","quartz:type=QuartzScheduler,name=schedulerFactory,instance=NON_CLUSTERED",'org.apache.activemq:BrokerName=localhost,Type=Queue,Destination=requests',"com.blogspot.nurkiewicz.spring:name=dataSource,type=ManagedBasicDataSource"];return _.map(mbeans, function(mbean) {return {type:'read',mbean: mbean}});
}$.ajax({url: 'jmx?ignoreErrors=true',type: "POST",dataType: "json",data: JSON.stringify(request()),contentType: "application/json",success: function(response) {displayRawData(response);}
});

只是为了向您概述客户端可访问的信息种类,我们将首先转储所有内容并将其显示在jQuery UI手风琴上 :

function displayRawData(fullResponse) {_(fullResponse).each(function (response) {var content = $('<pre/>').append(JSON.stringify(response.value, null, '\t'));var header = $('<h3/>').append($("<a/>", {href:'#'}).append(response.request.mbean));$('#rawDataPanel').append(header).append($('<div/>').append(content));});$('#rawDataPanel').accordion({autoHeight: false, collapsible: true});
}

请记住,这只是出于参考和调试目的,我们的目的并不是要显示无尽的JMX属性列表。

如您所见,实际上有可能在浏览器中使用Jolokia和JavaScript来实现完整的jconsole端口……也许是下次(有人愿意提供帮助吗?)。 回到我们的项目,让我们选择一些基本指标并将它们显示在列表中:

该列表本身看起来很有希望。 我没有显示图表或值,而是为每个指标分配了一个图标(稍后会详细介绍)。 但是我不想一直浏览整个列表。 为什么我不能只拥有一个汇总多个指标的指标? 由于我们已经在使用jsTree ,因此转换相对简单:

在第一个屏幕截图中,您可以看到一个健康的系统。 由于“ 总体”指标为绿色,因此实际上没有必要进行深入分析。 但是,第二个屏幕截图的情况更糟。 系统负载惊人地高,交换空间也需要注意,但重要性不高。 如您所见,前一个指标一直上升到总体最高指标。 通过这种方式,我们可以轻松地发现系统中发生的错误。 您可能想知道,当我们一开始只有原始的JMX数据时,我们是如何获得这棵漂亮的树的? 这里没有魔术,看看我如何构造树:

function buildTreeModel(jmx) {return new CompositeNode('Overall', [new CompositeNode('Servlet container', [new Node('Active HTTP sessions',jmx['Catalina:context=/jmx-dashboard,host=localhost,type=Manager'].activeSessions,Node.threshold(200, 300, 500)),new Node('HTTP sessions create rate',jmx['Catalina:context=/jmx-dashboard,host=localhost,type=Manager'].sessionCreateRate,Node.threshold(5, 10, 50)),new Node('Rejected HTTP sessions',jmx['Catalina:context=/jmx-dashboard,host=localhost,type=Manager'].rejectedSessions,Node.threshold(1, 5, 10)),new Node('Busy worker threads count',jmx['Catalina:name="http-bio-8080",type=ThreadPool'].currentThreadsBusy,Node.relativeThreshold(0.85, 0.9, 0.95, jmx['Catalina:name="http-bio-8080",type=ThreadPool'].maxThreads))]),//...new CompositeNode('External systems', [new CompositeNode('Persistence', [new Node('Active database connections',jmx['com.blogspot.nurkiewicz.spring:name=dataSource,type=ManagedBasicDataSource'].NumActive,Node.relativeThreshold(0.75, 0.85, 0.95, jmx['com.blogspot.nurkiewicz.spring:name=dataSource,type=ManagedBasicDataSource'].MaxActive))]),new CompositeNode('JMS messaging broker', [new Node('Waiting in "requests" queue',jmx['org.apache.activemq:BrokerName=localhost,Destination=requests,Type=Queue'].QueueSize,Node.threshold(2, 5, 10)),new Node('Number of consumers',jmx['org.apache.activemq:BrokerName=localhost,Destination=requests,Type=Queue'].ConsumerCount,Node.threshold(0.2, 0.1, 0))])])]);
}

树模型非常简单。 根节点可以具有子节点列表。 每个子节点可以是代表单个评估的JMX度量的叶子,也可以是代表孙子集的复合节点。 每个孙子可以依次是叶或另一个复合节点。 是的,这是Composite设计模式的简单示例! 但是,使用策略模式并不明显。 仔细观察,每个叶节点对象都具有三个属性:标签(在屏幕上看到的内容),值(单个JMX度量)和一个奇数函数Node.threshold(200,300,500)…这是什么? 实际上,它是稍后用于解释JMX度量标准的高阶函数(函数返回一个函数)。 请记住,原始值是没有意义的,必须将其解释并转换为美观的图标指示符。 此实现的工作方式如下:

Node.threshold = function(attention, warning, fatal) {if(attention > warning && warning > fatal) {return function(value) {if(value > attention) { return 1.0; }if(value > warning) { return 0.5; }if(value > fatal) { return 0.0; } else { return -1.0; }}}if(attention < warning && warning < fatal) {return function(value) {if(value < attention) { return 1.0; }if(value < warning) { return 0.5; }if(value < fatal) { return 0.0; } else { return -1.0; }}}throw new Error("All thresholds should either be increasing or decreasing: " + attention + ", " + warning + ", " + fatal);}

现在变得清楚了。 该函数接收级别阈值,并返回将其转换为-1:1范围内的数字的函数。 我本可以直接返回图标,但是我想从GUI表示中抽象树模型。 如果现在返回活动HTTP会话指标的Node.threshold(200,300,500)示例,那么最终结果很明显:如果活动HTTP会话数超过200,请显示注意图标,而不是“确定”。 如果超过300,则会出现警告 。 出现500以上的致命图标。 此功能是一种了解输入并以某种方式处理它的策略

当然,这些值/函数仅是示例,但这是真正艰苦工作的体现-对于每个JMX指标,您都必须定义一组理智的阈值。 500个HTTP会话是灾难还是我们只能处理的高负载? 90%的CPU负载是否有问题,或者如果它真的很低,我们应该开始担心吗? 一旦微调了这些级别,就不再需要同时监视所有内容。 只需查看顶级单一指标即可 。 如果是绿色,休息一下。 如果不是,请在几秒钟内向下钻取以查找真正的问题所在。 简单有效。 我是否提到了它不需要在服务器端进行任何更改(除了添加Jolokia并将其映射到某个URL)?

显然,这只是一个小的概念验证,而不是完整的监视解决方案。 但是,如果您有兴趣尝试和改进它,则可以像从我的GitHub 帐户一样获得整个源代码。

参考:来自JCG合作伙伴的 Jolokia和JMX的客户端服务器监视   Java和社区博客中的Tomasz Nurkiewicz。


翻译自: https://www.javacodegeeks.com/2012/02/client-side-server-monitoring-with.html

jmx jolokia

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用 %20 替换 空格

将字符串中的空格都替换为 %20 &#xff08; 时间复杂度为O&#xff08;N&#xff09;的解法 &#xff09; void ReplaceBlankSpace(char* arr){if (arr){int count 0;int lenth strlen(arr);for (int i 0; i < lenth;i)if (arr[i] )count;char*before arrlenth, *beh…

Node.js 官方文档中文版

这目录也是醉了 。 列出跟没列出没两样 转载于:https://www.cnblogs.com/ganmk--jy/p/5646860.html

Smaug Coverage

转载于:https://www.cnblogs.com/edisonxiang/p/5650656.html

图谱(学习地图)系列总结,持续更新中

目录 1.2022年最新前端学习路线图 2.2022年最新大数据学习路线图 3.2022年最新javaEE学习路线图 4.2022年最新UI/UE学习路线图 5.2022年java学习路线指南 6.JavaScript学习总结&#xff08;思维导图篇&#xff09; 7.思维脑图——数据分析实战&#xff08;最新版&#…

ccxt k线数据_寻找相似的历史k线

有网友提问应该用什么样的数据库/数据结构/算法来计算某支股票的相似K线? 具体的问题描述是&#xff0c;假设给出某股某段行情K线&#xff08;单位/日&#xff09;&#xff0c;从任何其他股票历史中匹配出与之最为相似的某段历史K线&#xff0c;并给出相似度值&#xff08;单位…

k均值例子 数据挖掘_数据挖掘的技术有很多种,常用的数据挖掘技术就这13种...

数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的数据中&#xff0c;提取隐含在其中的、人们事先不知道的但又是潜在有用的信息和知识的过程。数据挖掘的任务是从数据集中发现模式&#xff0c;可以发现的模式有很多种&#xff0c;按功能可以分为两大类&#xff1a;预…

【TypeScript系列教程05】保留关键字

目录 TypeScript 保留关键字 TypeScript 保留关键字 TypeScript 保留关键字如下表所示&#xff1a;

中国剩余定理 互质与非互质版本

中国剩余定理互质版 设m1&#xff0c;m2&#xff0c;m3&#xff0c;...&#xff0c;mk是两两互素的正整数&#xff0c;即gcd(mi,mj)1&#xff0c;i!j&#xff0c;i,j1,2,3,...,k. 则同余方程组&#xff1a; x a1 (mod n1) x a2 (mod n2) ... x ak (mod nk) 模[n1,n2,...nk]有…

aix 的c库为什么都是静态库_卢卡库:若梅罗、莱万都在努力突破极限,为什么我不能做到呢...

直播吧12月8日讯 北京时间周四凌晨的欧冠小组赛末轮比赛&#xff0c;国米将在主场迎战顿涅茨克矿工。目前&#xff0c;蓝黑军团依然保留着些许出线希望。在这场比赛之前&#xff0c;国米射手卢卡库接受了《法国足球》的采访&#xff0c;他谈论了和孔蒂的关系、和劳塔罗的搭档以…

便携式不锈钢管道焊接机器人_304不锈钢管居然可以发黑?

大家好&#xff0c;我是圣联达不锈钢管材管件孙立成。今天有伙伴们问我&#xff0c;自己使用的304不锈钢管表面怎么发黑了。带着这个问题&#xff0c;今天我特意去梳理了有关304发黑的缘故及其解决方法。304不锈钢管实际上按照正常生产流程&#xff0c;好的304不锈钢管加工制做…

jrockit_Java堆空间– JRockit和IBM VM

jrockit本文将为您提供JRockit Java堆空间与HotSpot VM的概述。 它还将为您提供有关JRockit和HotSpot的Oracle未来计划的一些背景知识。 Oracle JRockit VM Java堆&#xff1a;2个不同的内存空间 -Java堆&#xff08;YoungGen和OldGen&#xff09; -本机内存空间&#xff08;…

检验例题_高考必考|化学工艺流程之物质的分离提纯及检验鉴别,轻松拿分

嗨&#xff0c;小器来喽&#xff01;今天给大家带来的资料依旧是化学的工艺流程的相关知识&#xff0c;因为小器知道在这部分内容中大家是很容易丢分的&#xff0c;都是基础知识不扎实的原因&#xff0c;所以给大家的资料都是从易到难的安排还有专属高考相关例题&#xff0c;简…

三态门三个状态vhdl_温故知新,高阻态和三态门

欢迎FPGA工程师加入官方微信技术群高阻态高阻态这是一个数字电路里常见的术语&#xff0c;指的是电路的一种输出状态&#xff0c;既不是高电平也不是低电平&#xff0c;如果高阻态再输入下一级电路的话&#xff0c;对下级电路无任何影响&#xff0c;和没接一样&#xff0c;如果…

口译员设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

「Unity」UGUI的Text实现首行缩进的办法

我的Unity版本&#xff1a;5.3.5f1 直接说正事 Unity的Text组件&#xff0c;想实现代码拿到一段话&#xff0c;在前面加个缩进&#xff0c;让之后的字符依次后移。 有人觉得很简单&#xff0c;然后就这样写了&#xff1a; 但是尝试过的人就会发现&#xff0c;如果用代码在最前…

在Eclipse中配置Tomcat7.0

为了在Eclipse中进行struts2的测试,才发现自己机器上的Eclipse没有集成Tomcat,在网上找了半天&#xff0c;不是这个插件没有下载地址&#xff0c;就是那个有好多注意事项或者版本问题。结果&#xff0c;自己到tomcatforEclipse的插件的网上直接下载了一个&#xff0c;按照提供的…

Datepicker

本文翻译自官网&#xff1a; https://angular-ui.github.io/bootstrap 目录&#xff1a; 1. DatePicker 2. DatePicker popup 一、DatePicker https://angular-ui.github.io/bootstrap/#/datepicker 1. 三种模式 Datepicker是灵活&#xff0c;完全可定制的。它有3种模式&#…

cobertura 使用_使用Cobertura,JUnit,HSQLDB,JPA涵盖您的测试

cobertura 使用你好&#xff01;你好吗&#xff1f; 今天让我们谈谈一个非常有用的工具&#xff0c;名为“ Cobertura”。 该框架与我们在另一篇文章中看到的Emma框架具有相同的功能。 Cobertura和Emma之间的主要区别在于Cobertura显示带有图形的简历页面。 如果要查看有关此…

摇杆控制方向原理_图文全面讲解多种方向控制阀的原理和区别....

液压阀是用来控制液压系统中油液的流动方向或调节其流量和压力的。方向控制阀作为液压阀的一种&#xff0c;利用流道的更换控制着油液的流动方向单向型方向控制阀是只允许气流沿一个方向流动的方向控制阀&#xff0c;如单向阀、梭阀、双压阀等换向型方向控制阀是可以改变气流流…

原型设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …