使用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.pswp.cn/news/373483.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373483.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373483.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖書管理系統數據字典_2. 結構化——數據字典

返回目錄&#xff1a;Chilan Yuk&#xff1a;軟件工程分析設計圖庫目錄?zhuanlan.zhihu.com一、基本知識用于定義數據流和數據存儲的結構&#xff0c;并給出構成所給的數據流和數據存儲的各數據項的基本數據類型。數據字典中應該包括關于數據的如下信息一般信息&#xff08;名…

HDOJ 5184 Brackets 卡特蘭數擴展

既求從點(0,0)僅僅能向上或者向右而且不穿越yx到達點(a,b)有多少總走法... 有公式: C(ab,min(a,b))-C(ab,min(a,b)-1) /// 折紙法證明卡特蘭數: http://blog.sina.com.cn/s/blog_6917f47301010cno.html Brackets Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65…

010-python基礎-數據類型-字符串操作

1、移除空白 1 username.strip() 2、分割 1 names "alex,jack,rain" 2 names_1 names.split(",") #  字符串分割之后變成列表 3 print(names_1) 4 #輸出 5 [alex, jack, rain] 3、合并列表各元素成為字符串 1 names_1 [alex, jack, rain]2 names_2…

重復次數最多的 子串_每日算法系列【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;然后…

VS2015 python

http://pgqlife.info/2015/05/05/VS-Python/ 配置文檔轉載于:https://www.cnblogs.com/itdef/p/5262712.html

了解Java弱引用

我最近沒來得及關注該博客&#xff0c;最重要的是&#xff0c;我沒有為與技術界的所有人保持聯系而致歉。 我最近偶然發現了Java 1.2以來提供的java.lang.ref包&#xff0c;但具有諷刺意味的是&#xff0c;幾天前我才知道它。 在瀏覽了幾篇有關各種引用類型和java doc的文章時&…

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;但這…

查找出系統中大于50k 且小于100k 的文件并刪除。

查找出系統中大于50k 且小于100k 的文件并刪除。 [rootxusx xxx]# ll -lhtotal 624K-rw-r--r-- 1 root root 576K Nov 30 21:39 1.txt-rw-r--r-- 1 root root 48K Nov 30 21:40 2.txt [rootxusx xxx]# find ./ -type f -size 1k -a -size -100k ./2.txt 轉載于:https://www.cnb…

vb.net mysql存儲圖片_怎么讓VB.NET 上傳圖片到SQL 數據庫只保存路徑,圖片保存到文件...

我的前臺代碼dimCoonAsSqlClient.SqlConnectiondimRsAsNewSqlClient.SqlCommandRs.ConnectionCoonRsNewSqlClient.SqlCommand("上傳圖片",Coon)Rs.CommandTypeCommandType.StoredPr...我的前臺代碼 dim Coon As SqlClient.SqlConnection dim Rs As New SqlClient.Sql…

[國嵌攻略][132][串口驅動實現]

如何開發Linux驅動程序 一般情況下都會有現成的驅動程序&#xff0c;不需要從零開始開發驅動程序。所以Linux驅動開發主要分為兩個步驟&#xff1a;1.讀得懂驅動程序&#xff1b;2.寫的了核心功能。 發送中斷處理程序 發送中斷處理函數在/drivers/serial/samsung.c的s3c24xx_se…

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

你好 此示例演示了如何使用Regions在表之間創建Master Detail關系。 區域的主要目的是可重用性的概念。 使用區域和有限的任務流&#xff0c;我們可以將頁面重用到許多其他頁面中&#xff0c;以保持相同的功能并采用更簡潔的方法。 下載示例應用程序。 在此示例中&#xff0c;…

[轉] vim自定義配置 和 在ubnetu中安裝vim

Ubuntu 12.04安裝vim和配置 問題&#xff1a; ubuntu默認沒有安裝vim&#xff0c;出現&#xff1a; jygubuntu:~$ vim test.cThe program vim can be found in the following packages: * vim * vim-gnome * vim-tiny * vim-athena * vim-gtk * vim-noxTry: sudo apt-get insta…

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…

(15) PHP 隨筆---LAMP Linux基本操作 對文件、目錄的操作

◇對目錄的操作&#xff1a; ◇創建目錄&#xff1a; mkdir Xmu //在當前目錄下創建一個名為Xmu的目錄 ◇創建多個級別目錄關系&#xff1a; mkdir -p newdir/newdir/newdir //在當前目錄下創建多個連續目錄&#xff0c;-p的意思是以遞歸的方式 ◇移動目錄(也可以針對…

具有NetBeans,嵌入式GlassFish,JPA和MySQL數據源的Arquillian

這是一個偶然的帖子。 我一直在研究交易CDI觀察者&#xff0c;并嘗試使用嵌入式GlassFish對它進行一些集成測試。 但是令人驚訝的是&#xff0c;這種方法不能很好地工作&#xff0c;我仍在弄清楚&#xff0c;使用普通的嵌入式GlassFish時問題出在哪里。 同時&#xff0c;我轉到…

hmcl手機版下載_最新HMCL下載地址

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓[16:49:27][AWT-EventQueue-0/ERROR]---- Hello Minecraft! Crash Report ----Version: 2.3.1Time: 2016-7-14Thread: Thread[AWT-EventQueue-0,6,main]Advice:無建議。Content:java.lang.IllegalStateException: Buffers have not…

為什么我會在2012年的新企業Java項目中使用Java EE而不是Spring

這個問題經常出現。 我的新項目也在2011年11月發布。 在這個新的Enterprise Java項目中&#xff0c;我將使用Java EE&#xff08;JEE&#xff09;代替Spring框架。 我知道&#xff1a;關于此主題的文章&#xff0c;博客和論壇討論都可以找到。 為什么還需要一個&#xff1f; 因…