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

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

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

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

相关文章

图书管理系统数据字典_2. 结构化——数据字典

返回目录&#xff1a;Chilan Yuk&#xff1a;软件工程分析设计图库目录​zhuanlan.zhihu.com一、基本知识用于定义数据流和数据存储的结构&#xff0c;并给出构成所给的数据流和数据存储的各数据项的基本数据类型。数据字典中应该包括关于数据的如下信息一般信息&#xff08;名…

重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

题目描述给你一个仅由大写英文字母组成的字符串&#xff0c;你可以将任意位置上的字符替换成另外的字符&#xff0c;总共可最多替换 k 次。在执行上述操作后&#xff0c;找到包含重复字母的最长子串的长度。示例1输入&#xff1a; s "ABAB", k 2 输出&#xff1a; …

python基础(一)简单入门

一.第一个python程序 1.交互式编程 直接在命令行里面输入python即可进入python交互式命令行&#xff0c;linux下一样&#xff1a; 在 python 提示符中输入以下文本信息&#xff0c;然后按 Enter 键查看运行效果&#xff1a; 2.脚本式编程 把代码都写到文件里面&#xff0c;然后…

unbuntu 启动任务脚本_Ubuntu下服务启动脚本编写

像Nginx、MySQL等服务一样&#xff0c;在后台运行自己编写的抓取天气信息的Python脚本。1.以管理员权限新建一个服务脚本文件sudo vim /etc/init.d/weather_service2.用下列模板修改该服务脚本文件#!/bin/bash### BEGIN INIT INFO## Provides: weather_service# Required-Start…

iOS开发工具——网络封包分析工具Charles

作者 唐巧 发布于 2013年12月9日 | 1 讨论 分享到&#xff1a;微博微信FacebookTwitter有道云笔记邮件分享稍后阅读我的阅读清单简介 Charles是在Mac下常用的截取网络封包的工具&#xff0c;在做iOS开发时&#xff0c;我们为了调试与服务器端的网络通讯协议&#xff0c;常常需要…

Java Web托管选项流程图

我经常被问到的一个问题是在何处以及如何托管Java Web应用程序。 可以在带有嵌入式服务器的Eclipse中创建它很好&#xff0c;但是如何将它带给人们呢&#xff1f; 长期以来&#xff0c;对于发烧友的程序员一直没有答案。 只有昂贵和超大型的选择。 事情最近变了&#xff0c;但这…

使用Regions ADF 11g进行Master Detail CRUD操作

你好 此示例演示了如何使用Regions在表之间创建Master Detail关系。 区域的主要目的是可重用性的概念。 使用区域和有限的任务流&#xff0c;我们可以将页面重用到许多其他页面中&#xff0c;以保持相同的功能并采用更简洁的方法。 下载示例应用程序。 在此示例中&#xff0c;…

win7 mysql php apache myadmin_windows下Apache+mysql+php+phpMyAdmin的安装及配置 | 学步园

1、下载Apache ( httpd-2.2.25-win32-x86-no_ssl.msi )http://httpd.apache.org/download.cgi#apache24根据提示安装到路径(建议自定义路径)&#xff0c;NetWork Domain和Server Name都输入 localhost(访问时使用的域名);2、下载mysql (mysql-5.5.34-win32.msi )http://dev.m…

具有NetBeans,嵌入式GlassFish,JPA和MySQL数据源的Arquillian

这是一个偶然的帖子。 我一直在研究交易CDI观察者&#xff0c;并尝试使用嵌入式GlassFish对它进行一些集成测试。 但是令人惊讶的是&#xff0c;这种方法不能很好地工作&#xff0c;我仍在弄清楚&#xff0c;使用普通的嵌入式GlassFish时问题出在哪里。 同时&#xff0c;我转到…

jsp mysql 音乐网站_Maven+JSP+SSM+Mysql实现的音乐网站

项目简介本系统基于MavenJSPSSMMysql实现的音乐网站。主要实现的功能有音乐播放、下载、上传等几个模块。难度等级&#xff1a;中等技术栈编辑器Eclipse Version: 2020-03 (4.15.0)前端技术基础&#xff1a;htmlcssJavaScript框架&#xff1a;JQueryBootstrap后端技术SpringSpr…

持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接

在EJB 2.x中。EJB有3种类型的Bean。各自是会话Bean&#xff08;Session Bean&#xff09;、消息驱动Bean&#xff08;Message-Driven Bean&#xff09;和实体Bean&#xff08;Entity Bean&#xff09;。 随着EJB 3的推出&#xff0c;EJB2.x中的实体Bean逐渐被JPA规范所替代&…

【SAP业务模式】之ICS(四):组织单元的配置

SAP的ICS业务后台配置主要有以下几个配置点&#xff1a; 1、组织单元的配置&#xff08;公司代码、销售组织、工厂、采购组织等&#xff09;&#xff1b; 2、主数据的部分&#xff1b; 3、订单和开票的定价过程&#xff1b; 4、开票输出类型&#xff1b; 5、公司间发票的配置&a…

Twitter4j和Esper:在Twitter上跟踪用户情绪

对于复杂事件处理和Twitter API的新手&#xff0c;我希望这是一个简短的教程&#xff0c;可以帮助他们Swift起步。 管理大数据并从中挖掘有用的信息是当前技术中最热门的讨论主题。 来自Twitter&#xff0c;Facebook和Linkedin等社交网络的半结构化数据的爆炸式增长使Hadoop&am…

webase crud查看所有表_Laravel-Gii 可视化代码生成工具 CRUD +GUI

Laravel-Gii 可视化代码生成工具 CRUD GUI适用于快速B端后台开发&#xff0c;根据MySQL的表结构生成对应的Model、Observer、Controller、View、Route等相关项目文件[TOC]注意因为是解析MySQL的表结构&#xff0c;并且根据字段生成模板&#xff0c;所以目前生成的Model类时只支…

20145231第二周Java学习笔记

20145231 《Java程序设计》第2周学习总结 教材学习内容总结 本周的学习采用的依然是先看课本&#xff0c;再看视频&#xff0c;然后实践敲代码&#xff0c;最后根据学习笔记总结完成博客。 第三章&#xff1a;基础语法 知识点比较多比较零碎&#xff0c;整理的都是实际操作中可…

JavaFX 2.0和Scala,像牛奶和饼干

JavaFX 2.0和Scala都是很好的技术&#xff0c;但是一起使用时效果会更好。 JavaFX 2.0是一种功能强大的富客户端技术&#xff0c;具有先进的图形&#xff0c;动画和媒体功能。 Scala是一种简单但功能强大的语言&#xff0c;具有用于编写特定于域的语言&#xff08;DSL&#xff…

ASP.NET WebAPi之断点续传下载(上)

前言 之前一直感觉断点续传比较神秘&#xff0c;于是想去一探究竟&#xff0c;不知从何入手&#xff0c;以为就写写逻辑就行&#xff0c;结果搜索一番&#xff0c;还得了解相关http协议知识&#xff0c;又花了许久功夫去看http协议中有关断点续传知识&#xff0c;有时候发觉东西…

贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)

程序效果&#xff1a; 代码&#xff1a; //main.cpp 1 #include <iostream>2 #include<fstream>3 #include <graphics.h>4 #include <conio.h>5 #include<ctime>6 #include<windows.h>7 #include<mmsystem.h>8 #pragma comment(lib…

python中sorted的用法append_python sorted()排序详解

排序&#xff0c;在编程中经常遇到的算法&#xff0c;我也在几篇文章中介绍了一些关于排序的算法。有的高级语言内置了一些排序函数。本文讲述Python在这方面的工作。供使用内置函数sorted()/list.sort()的使用简单应用python对list有一个内置函数&#xff1a;>>> a[5…

云上的播放框架变得简单:Openshift模块

仅仅几年前&#xff0c;找到一个负担得起的Java Web应用程序托管解决方案是一项艰巨的任务&#xff0c;而寻找免费的托管解决方案是一项不可能的任务。 更不用说甚至考虑自动缩放&#xff0c;单命令部署&#xff0c;持续集成等事情&#xff0c;这都是科幻小说。 去年见证了云计…