设为首页 收藏本站
查看: 737|回复: 0

[经验分享] Nodejs+express 实战,实现系统监控功能

[复制链接]

尚未签到

发表于 2017-2-22 12:18:29 | 显示全部楼层 |阅读模式
  nodejs是服务器端js脚本语言, express是nodejs的web框架,通过实现系统监控功能进一步学习nodejs.
主要由四个程序文件实现:server.js启动web服务;routing.js路由解析跳转到功能实现的文件和方法;sysinfo.js实现取当前系统的各项信息指标;sysinfo.html 请求及显示系统信息。
结果如下图:

server.js

/**
* User: jacky
* Date: 11-3-30
* Time: 上午11:11
* To change this template use File | Settings | File Templates.
*/
var express = require('express');
var app = express.createServer();
var path = require('path');
var fs = require('fs');
var url = require('url');
//configration
//每次启动都会执行的配置
app.configure(function(){
//console.log('in configure');
app.use(express.methodOverride());
app.use(express.bodyParser());
app.use(app.router);
app.use(express.logger({ format: ':method :uri' }));
});
//默认方式 $ node ./server.js 为开发模式
app.configure('development', function(){
//console.log('in configure with development');
app.use(express.static(__dirname + '/static'));
//console.log(__dirname + '/static');
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
//以 $NODE_ENV=production node ./server.js 方式运行,即为生产模式
app.configure('production', function(){
//console.log('in configure with production');
var oneYear = 31557600000;
app.use(express.static(__dirname + '/static', { maxAge: oneYear }));
app.use(express.errorHandler());
});
// routing settings
//重定向静态文件 html,css,js,jpg,png => /static/+req.url
app.all('/*.(html|css|js|jpg|png){1}', function(req, res, next){
//var static_file_formats = ['.html','.css','.js','.jpg','.png'];
//console.log(path.extname(req.url));
var realpath = __dirname + '/static' + url.parse(req.url).pathname;
//console.log(realpath);
if(path.existsSync(realpath)){
res.end(fs.readFileSync(realpath));
}else{
res.end('Cannot find request url: '+req.url);
}
});
//加载配置文件routing.js到变量routings. [/scripts/routing.js]
var routings = require(__dirname + '/scripts/routing.js').routings;
for(var r in routings){
var pf = require(__dirname + routings[r].file)[routings[r].processFunction];
if(routings[r].method == 'get')
app.get(r, pf,function(req, res){});
else if(routings[r].method == 'post')
app.post(r,pf);
else
app.all(r, pf,function(req, res){});
}
app.listen(8080);
console.log('Server running at http://127.0.0.1:8080/');
  routing.js

// the method:[get|post|all], default is all
exports.routings = {
'/getSysInfo':{method:'get', file:'/scripts/sysinfo.js', processFunction:'get'},
};
  sysinfo.js

var os  = require('os');
//过虑掉字符串首尾格式,替换字符串中的多个空格为一个空格
function trim(s){
return s.replace(/(^\s*)|(\s*$)/g, '').replace(/\s+/g,' ');
}
exports.get = function (req, res, next) {
//df --total |grep total
var sysinfo = {'hostname'   : os.hostname(),
'systemtype' : os.type(),
'release'    : os.release(),
'uptime'     : os.uptime(),
'loadavg'    : os.loadavg(),
'totalmem'   : os.totalmem(),
'freemem'    : os.freemem(),
'cpus'       : os.cpus(),
'disk'       : ''
};
var exec = require('child_process').exec;
exec('df --total |grep total',
function (error, stdout, stderr) {
if (error !== null) {
console.log('exec error: ' + error);
}else{
var tmp = trim(stdout).split(' ');
sysinfo.disk = {total:tmp[1],used:tmp[2],free:tmp[3]};
}
res.send(JSON.stringify(sysinfo));
});
};
  sysinfo.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>系统监控</title>
<style type="text/css">
table{
width:600px;
border-collapse:collapse;
border:solid #999;
border-width:1px 1px 1px 1px;
color:#4682B4;
}
table th,table td {border:solid #999;border-width:0 1px 1px 0;padding:2px;}
table td {text-align:center;}
span {color:#8B8989}
.tablecontent {color:#8B8989}
</style>
</head>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('jquery', '1.5.1');
google.load('visualization', '1', {'packages':['piechart']});
//google.setOnLoadCallback(drawChart);
function drawDiskChart(used,free) {
var data = new google.visualization.DataTable();
data.addColumn('string', 'Space');
data.addColumn('number', 'Space number');
data.addRows([
['未使用'+formatK2GB(free), free],
['已使用'+formatK2GB(used), used]
]);
var chart = new google.visualization.PieChart(document.getElementById('disk_chart_div'));
chart.draw(data, {width: 400, height: 240, is3D: true, title: '磁盘使用情况'});
}
function drawMemChart(used,free) {
var data = new google.visualization.DataTable();
data.addColumn('string', 'Space');
data.addColumn('number', 'Space number');
data.addRows([
['空闲'+formatB2MB(free), free],
['已使用'+formatB2MB(used), used]
]);
var chart = new google.visualization.PieChart(document.getElementById('mem_chart_div'));
chart.draw(data, {width: 400, height: 240, is3D: true, title: '内存使用情况'});
}
</script>
<!--<script type="text/javascript" src="/js/jquery-1.5.1.min.js"></script>-->
<script type="text/javascript">
//过虑掉字符串首尾格式,替换字符串中的多个空格为一个空格。
function trim(s){
return s.replace(/(^\s*)|(\s*$)/g, "").replace(/\s+/g,' ');
}
//转换从字节到兆字节
function formatB2MB(num){
return parseInt(num/(1000*1000))+' MB';
}
//转换从K字节到G字节
function formatK2GB(num){
return parseInt(num/(1000*1000))+' GB';
}
$(document).ready(function(){
//alert($.fn.jquery); //显示jquery版本号
loadSysInfo();
setInterval(loadSysInfo,5000);
});
function loadSysInfo(){
$.ajax({url:"/getSysInfo",
success:function(data){
//alert(data.systemtype);
$('#hostname').html(data.hostname);
$('#systemtype').html(data.systemtype);
$('#systemtype').html(data.systemtype);
$('#release').html(data.release);
$('#uptime').html(parseInt(data.uptime/(60*60))+' Hours');
$('#loadavg').html(data.loadavg.join(','));
$('#totalmem').html(formatB2MB(data.totalmem));
$('#freemem').html(formatB2MB(data.freemem));
$('#cpus').html(data.cpus.length);
$('#disk').html(data.disk.used + ' used,' + data.disk.free +' free');
//填充cup表格
$('.tablecontent').remove();
for(var i in data.cpus){
$('<tr class=\'tablecontent\'><td>cpu'+ i +'</td>' +
'<td>'+ data.cpus.model  +'</td>' +
'<td>'+ data.cpus.speed  +'</td>' +
'<td>'+ data.cpus.times.user  +'</td>' +
'<td>'+ data.cpus.times.nice  +'</td>' +
'<td>'+ data.cpus.times.sys  +'</td>' +
'<td>'+ data.cpus.times.idle  +'</td>' +
'<td>'+ data.cpus.times.irq  +'</td>' +
'</tr>').appendTo('#cputable');
}
//图形显示
drawDiskChart(parseInt(data.disk.used),parseInt(data.disk.free));
drawMemChart(data.totalmem - data.freemem, data.freemem);
},
cache:false,
dataType:"json"});
}
</script>
<body>
<strong>@sysinfo.html</strong><br><p>
主机名称:<span id='hostname'></span><br>
操作系统:<span id='systemtype'></span><br>
发行版本:<span id='release'></span><br>
运行时间:<span id='uptime'></span><br>
负载:   <span id='loadavg'></span><br>
内存大小:<span id='totalmem'></span><br>
空闲内存:<span id='freemem'></span><br>
CPUs:  <span id='cpus'></span><br>
硬盘空间:<span id='disk'></span><br>
<table id='cputable'>
<tr><td colspan=8>CPU使用情况</td></tr>
<tr><td>cpu</td>
<td>model</td>
<td>speed</td>
<td>user</td>
<td>nice</td>
<td>sys</td>
<td>idle</td>
<td>irq</td>
</tr>
</table>
<span id='disk_chart_div'></span>
<span id='mem_chart_div'></span>
</body>
</html>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345755-1-1.html 上篇帖子: [nodejs]国内npm安装nodejs modules失败的几个解决方案 下篇帖子: 从零开始,做一个NodeJS博客(二):实现首页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表