蛙蛙推荐:自己写个分布式监控软件玩
摘要
如果你有多台windows服务器需要监控,又不想买很贵的MOM,开源的监控软件部署配置又麻烦,咋办?.net公开了好多监控和管理方面的API,jquery有一些跨浏览器的图表插件,有了这些就可以自己做一个符合自己需求的监控软件。
思路:
1、要监控一个服务器的运行状况,可能有很多指标,比如某端口是否监听,某进程是否还存在,是否产生了某个EventID的EventLog,某些性能计数器是否达到阈值,其中性能计数器的监控是最重要的,因为服务器上运行的服务都会有一组自己独有的计数器,用于监控该服务的健康状况,比如SQLSERVER,EXCHANGE等。
2、要监控性能计数器,第一是先建立基准线,根据平时观察到的正常情况下各个关键性能计数器的值的得范围是多少,然后指定阈值,超过这个阈值就给予报警,这阈值通常和服务的负载情况有很大关系,所以阈值可能会随着业务的发展而不断调整。
3、在.NET里可以使用PerformanceCounter类来获取某个具体性能计数器的采样值,用的最多的可能就是其NextValue()方法,该方法第一次执行的值为0,只有第二次及之后的值才会是实际值,关于各种类型计数器的语义,请参考后面的参考链接。
4、默认情况下ASP.NET的运行账户没有权限读取性能计数器,更别提远程机器的性能计数器了,不过我们应该可以使用ASP.NET模拟或者指定该程序的运行标识来解决。多台服务器的管理一般都会使用域,申请一个能获取所有服务器性能计数器权限的账户来运行该ASP.NET应用就可以了。
5、为了方便监控,我们使用WEB形式来监控,而web形式下图表的生成和刷新是个问题,如果完全由服务器来生成图表的图片,性能可能会很差一些,幸亏有一些免费开源的纯客户端图表组件可以用,最后发现jquery flot能满足需求,图表类型丰富,浏览器兼容性好,IE6/7/8,FF都支持。
6、我们用一个ashx页面来专门产生计数器的数据,然后客户端用jquery每隔一秒钟访问该页面,获取性能计数器数据,并提供给flot组件,在客户端实施更新图表。
代码:
1、生成性能计数器数据
写一个专门的HttpHandler来提供性能计数器数据,返回的格式是JSON格式,因为flot自身的原因,处理时间的X轴有问题,所以得到时间后要加上8小时的毫秒数,然后客户端才能解析成正确的北京时间,另外就是时间格式上注意一下,日期的分隔符用/不能用-,否则JS不认。
context.Response.ContentType = " text/plain " ;
context.Response.Buffer = true ;
context.Response.ExpiresAbsolute = DateTime.Now.AddSeconds( - 1 );
context.Response.Expires = 0 ;
context.Response.CacheControl = " no-cache " ;
StringBuilder output = new StringBuilder();
DateTimeFormatInfo formatInfo = new DateTimeFormatInfo();
formatInfo.DateSeparator = " / " ;
output.Append( " [ " );
PerformanceCounter counter = PerfCounterFactory.Instance.GetCounter
( " Processor|% Processor Time|_Total|. " );
output.AppendFormat( " [new Date(/ " { 0 }/ " ).getTime()+28800000, {1}] " ,
DateTime.Now.ToString( " yyyy/MM/dd hh:mm:ss " ,formatInfo),
counter.NextValue().ToString( " 0.0 " ));
output.Append( " , " );
counter = PerfCounterFactory.Instance.GetCounter(
" Memory|Available Bytes||. " );
output.AppendFormat( " [new Date(/ " { 0 }/ " ).getTime()+28800000, {1}] " ,
DateTime.Now.ToString( " yyyy/MM/dd hh:mm:ss " , formatInfo),
counter.NextValue().ToString( " 0.0 " ));
output.Append( " ] " );
context.Response.Write(output);
}
浏览该页,显示应该类似如下
[[new Date("2009/06/20 02:24:43").getTime()+28800000, 70.0],[new Date("2009/06/20 02:24:43").getTime()+28800000, 615792600.0]]
2、图表的呈现
1)、图表的呈现就是纯客户端逻辑了,首先在head里引用juqery和flot的js,然后在BODY里声明用于放图表和图例的div,分别是placeholder和legend,
2)、声明两个全局数组_d1和_d2,用于保存两个计数器的数据,_chartOptions用来配置图表呈现的选项,因为我们同时显示CPU和内存情况,所以用双Y轴模式,另外把X轴设置为时间模式,还有就是默认情况下图例和图表在一个区域,但有时候图例会遮盖住曲线,所以故意使用container: $("#legend")把图例放在单独的布局块儿里,右Y轴显示可用内存数,我们用suffixFormatter函数来动态的更新右Y轴的单位。
3)、在document.read事件里每隔1秒钟去访问perfcounter.ashx页面,为了防止浏览器缓存数据,在地址后面挂了个随机数。获取到计数器数据后,把相应的数据放入_d1和_d2中,如果采集的数据点超过100,就把最前面的数据点挤出去,这样防止客户端的内存越来越大,而且我们只看最近一段时间的计数器曲线图。
4)、获取到数据后,调用$.plot方法呈现图表,并把_d1和_d2传进去,同时设置_d2使用右Y轴,呈现完后再设置1秒后执行第3步。
< head runat ="server" >
< title > 监控 </ title >
< link href ="layout.css" rel ="stylesheet" type ="text/css" ></ link >
<!-- [if IE]><script language="javascript" type="text/javascript" src="scripts/excanvas.pack.js"></script><![endif] -->
< script language ="javascript" type ="text/javascript" src ="scripts/jquery.js" ></ script >
< script language ="javascript" type ="text/javascript" src ="scripts/jquery.flot.js" ></ script >
</ head >
< body >
< form id ="form1" runat ="server" >
< h1 >
本机CPU使用率和可用内存实施监控 </ h1 >
< div >
< div id ="placeholder" style ="width: 600px; height: 300px;" >
</ div >
< div id ="legend" style ="top: 400px; width: 600px; height: 50px;" >
</ div >
< div id ="trace" >
</ div >
</ div >
< script id ="source" language ="javascript" type ="text/javascript" >
var _d1 = [];
var _d2 = [];
var _chartOptions = {
xaxis: { mode: " time " },
series: {
lines: { show: true },
points: { show: true }
},
legend: {
show: true ,
container: $( " #legend " )
},
yaxis: { min: 0 },
y2axis: { tickFormatter: suffixFormatter }
};
$( function () {
window.setTimeout( function () {
GetData()
}, 1000 );
});
function GetData() {
$.getJSON( " perfcounter.ashx? " + Math.random(), showPercounter);
}
function showPercounter(data) {
// $("#trace").html($("#trace").html()+"<br>"+data);
_d1.push(data[ 0 ]);
if (_d1.length >= 100 ) _d1.shift();
_d2.push(data[ 1 ]);
if (_d2.length >= 100 ) _d2.shift();
$.plot($( " #placeholder " ),
[{ label: " Processor//% Process Time " , data: _d1 },
{ label: " Memory//Availibel Bytes " , data: _d2, yaxis: 2 }],
_chartOptions);
window.setTimeout( function () {
GetData()
}, 1000 );
}
function suffixFormatter(val, axis) {
if (val > 1000000 )
return (val / 1000000 ).toFixed(axis.tickDecimals) + " MB " ;
else if (val > 1000 )
return (val / 1000 ).toFixed(axis.tickDecimals) + " kB " ;
else
return val.toFixed(axis.tickDecimals) + " B " ;
}
</ script >
</ form >
</ body >
</ html >
3、看看成果,如下图
图表的效果还是不错的,而且是实施的,用椭圆扩住的地方发现CPU上升,可用内存下降,是我用风雷影音打开了一个720P的电影。
4、后记
本文只是一个演示性的东西,知道原理后可以做一个功能强大,灵活可配置的web监控软件,比如采样频率的配置,是否保存到数据库,同时显示多台机器的CPU使用情况,设置某个计数器达到阈值后播放一段报警声音等等。
5、参考链接
蛙蛙推荐:创建自己的性能计数器及压力测试入门
http://www.cnblogs.com/onlytiancai/archive/2007/09/22/902310.html
蛙蛙推荐:编写一个服务监控及管理的软件
http://www.cnblogs.com/onlytiancai/archive/2008/02/17/1071409.html
.NET Framework 中的性能计数器
http://msdn.microsoft.com/zh-cn/library/w8f5kw2e(VS.80).aspx
PerfMon – Your debugging buddy
http://dotnetdebug.net/2005/06/30/perfmon-your-debugging-buddy/
使用系统监视组件
http://msdn.microsoft.com/zh-cn/library/aaaxk5bx(VS.80).aspx
jquery flot
http://code.google.com/p/flot/
代码下载地址如下
http://files.cnblogs.com/onlytiancai/WawaMointer.rar
蛙蛙推荐:自己写个分布式监控软件玩相关推荐
- 推荐 5 款数据库性能监控软件,附下载
点击蓝色"有关SQL"关注我哟 加个"星标",天天与10000人一起快乐成长 图 | L 今天要介绍的是 5 款数据库监控软件. 初听"数据库监控& ...
- 用AutoHotkey写电脑屏幕监控软件
今看到一个外包项目, 要求用VB写一个电脑屏幕监控软件, 具体要求如下: 电脑屏幕监控软件功能实现: 1.电脑非空闲(根据鼠标键盘动作判断?)时,每五秒(通过配置文件设置)截屏并按时间命名(如2010 ...
- 公司电脑监控软件如何管控员工上网行为?
大多数管理者都在思考公司的管理问题:员工每天在干什么?为什么工作完不成?完成不了的原因是什么?疫情等特殊时期,员工上班如何安排与实时管控? 这里推荐易掌公司电脑监控软件 1.对脱离公司网络的出差.远程 ...
- 企业员工电脑监控软件的实用之处
并不是所有的员工都有很好的自我控制能力,能够自觉地工作而不受其他事物的影响的员工并不是很多.因此,为了能够监控员工在网上冲浪时做什么,让他们的工作更认真,平静下来工作.许多公司选择通过安装电脑监控软件 ...
- 蛙蛙推荐:如何编写高质量的python程序
蛙蛙推荐:如何编写高质量的python程序 蛙蛙推荐:如何编写高质量的python程序 - 蛙蛙王子 - 博客园 蛙蛙推荐:如何编写高质量的python程序 如何编写高质量的python程序 目录 代 ...
- 蛙蛙推荐:蛙蛙牌网页捕捉器
蛙蛙推荐:蛙蛙牌网页捕捉器 摘要:你有没有看到一篇好文章想保存到本地,有没有想过只保存网页选中的部分而不要那些不必要的导航和广告,本贴告诉你达到这个目的的思路及主要代码. 思路:首先我们要获取到所有I ...
- 蛙蛙推荐:微软网络讲座系列教程视频下载
蛙蛙推荐:微软网络讲座系列教程视频下载(2004年1月到2005年4越) 好多都是很经典的问题解答和技巧应用,推荐大家有空看看 总体浏览地址 http://www.microsoft.com/chin ...
- 蛙蛙推荐:在c#使用IOCP(完成端口)的简单示例
蛙蛙推荐:在c#使用IOCP(完成端口)的简单示例 上次给大家发了利用winsock原生的api来做一个同步的socket服务器的例子,大致上只是贴了一些代码,相信大家这么冰雪聪明,已经研究的差不多了 ...
- 蛙蛙推荐:蛙蛙教你文本聚类 - 蛙蛙王子 - 博客园
蛙蛙推荐:蛙蛙教你文本聚类 - 蛙蛙王子 - 博客园 蛙蛙推荐:蛙蛙教你文本聚类 - 蛙蛙王子 - 博客园 蛙蛙推荐:蛙蛙教你文本聚类 摘要:文本聚类是搜索引擎和语义web的基本技术,这次本蛙和大家一 ...
最新文章
- iOS7导航栏和状态栏的定制
- python怎么做图形界面-图形界面
- 安装RRDtool 1.4.5
- mysql主要有什么问题_mysql问题
- android studio设置内存
- 正则表达式来判断Sql语句中Select到from之间使用了*而不是字段名
- mybatis case when_MyBatis 几种通用的写法
- Swing 设置无边框Frame
- TechSmith Camtasia Mac v2021屏幕录制剪辑软件
- Python人脸识别考勤打卡系统
- matlab符号函数sgn,latex 符号函数sgn
- ROS教程(三):创建程序包及节点(图文)
- lisp方格网法计算土方量_CAD计算土方方量插件
- 计算机英语2000带英标
- 基于Mono.Cecil的静态注入
- PHP开源技术大全(四)
- android各个版本的发布时间
- python爬虫源码附注解_Python爬虫遇到验证码的几种处理方式,文章末尾有源码
- LSD(Line Segment Detector)直线提取算法
- JavaWEB(项目分析用户登录发布新闻)
热门文章
- (2.2.8.10) Android多module下的构建版本区分
- win10中的“版本号”与“操作系统版本号”区别
- 阿里云挖矿./trace -r 2 -R 2 --keepalive --no-color --donate-level 1 --max-cpu-usage 10
- Widows下Faster R-CNN的MATALB配置(CPU)
- 有关苹果证书介绍(Certificates, Identifiers Profiles)
- R语言pheatmap包热图legend位置调整
- Font Manager-字体管理软件”:让您的字体管理更轻松更高效!
- NoC(Network on Chip)基础 (6):Oblivious Routing 和 Adaptive Routing
- 电脑BIOS设置图解教程
- 使用uniapp开发字节跳动小程序的微信支付和支付宝支付(后端PHP,tp5)