2011-01-13 23:06:31 +00:00
/ * *
* Global variables
* /
2011-08-09 09:10:51 +00:00
//save grid summary data, update every one minute
var gridData ;
//save nodes path, used for getting detail from rrd file
var nodePath = new Object ( ) ;
//save nodes current status,
//unknown-> -2, error->-1, warning->0 ,normal->1 which is used for sorting
var nodeStatus = new Object ( ) ;
//update timer
var gangliaTimer ;
2011-12-07 08:09:16 +00:00
//global frame hash
var framehash ;
//global cec hash
var cechash ;
//global blade hash
var bladehash ;
//global x rack hash
var rackhash ;
2011-12-31 08:43:58 +00:00
//global other type node hash
var otherhash ;
2010-11-05 22:53:47 +00:00
/ * *
* Load Ganglia monitoring tool
*
* @ return Nothing
* /
function loadGangliaMon ( ) {
// Get Ganglia tab
2011-09-12 16:10:53 +00:00
$ ( '#gangliamon' ) . append ( createInfoBar ( 'Checking RPMs' ) ) ;
2011-08-09 09:10:51 +00:00
//should get the groups first
2011-09-12 16:10:53 +00:00
if ( ! $ . cookie ( 'groups' ) ) {
2011-08-09 09:10:51 +00:00
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'extnoderange' ,
tgt : '/.*' ,
args : 'subgroups' ,
msg : ''
} ,
2010-11-17 18:53:40 +00:00
2011-08-09 09:10:51 +00:00
success : setGroupsCookies
} ) ;
}
2010-11-05 22:53:47 +00:00
// Check whether Ganglia RPMs are installed on the xCAT MN
2011-01-14 05:05:06 +00:00
$ . ajax ( {
2010-09-17 08:39:17 +00:00
url : 'lib/systemcmd.php' ,
dataType : 'json' ,
data : {
2011-08-09 09:10:51 +00:00
cmd : 'rpm -q rrdtool ganglia-gmetad ganglia-gmond'
2010-09-17 08:39:17 +00:00
} ,
2010-11-05 22:53:47 +00:00
success : checkGangliaRPMs
2010-09-17 08:39:17 +00:00
} ) ;
2010-11-05 22:53:47 +00:00
return ;
2010-09-17 08:39:17 +00:00
}
2010-11-05 22:53:47 +00:00
/ * *
* Check whether Ganglia RPMs are installed
*
* @ param data
* Data returned from HTTP request
* @ return Nothing
* /
function checkGangliaRPMs ( data ) {
var gangliaTab = $ ( '#gangliamon' ) ;
2011-08-09 09:10:51 +00:00
gangliaTab . empty ( ) ;
2011-09-12 16:10:53 +00:00
2010-11-05 22:53:47 +00:00
// Get the list of Ganglia RPMs installed
var status = data . rsp . split ( /\n/ ) ;
2011-08-09 09:10:51 +00:00
var gangliaRPMs = [ "rrdtool" , "ganglia-gmetad" , "ganglia-gmond" ] ;
2010-11-05 22:53:47 +00:00
var warningMsg = 'Before continuing, please install the following packages: ' ;
var missingRPMs = false ;
2011-09-12 16:10:53 +00:00
for ( var i in status ) {
2010-11-05 22:53:47 +00:00
if ( status [ i ] . indexOf ( "not installed" ) > - 1 ) {
warningMsg += gangliaRPMs [ i ] + ' ' ;
missingRPMs = true ;
}
}
2010-11-17 18:53:40 +00:00
2010-11-05 22:53:47 +00:00
// Append Ganglia PDF
if ( missingRPMs ) {
warningMsg += ". Refer to <a href='http://xcat.svn.sourceforge.net/viewvc/xcat/xcat-core/trunk/xCAT-client/share/doc/xCAT2-Monitoring.pdf'>xCAT2-Monitoring.pdf</a> for more information." ;
2010-11-17 18:53:40 +00:00
2010-11-05 22:53:47 +00:00
var warningBar = createWarnBar ( warningMsg ) ;
warningBar . css ( 'margin-bottom' , '10px' ) ;
warningBar . prependTo ( gangliaTab ) ;
2010-11-06 00:15:13 +00:00
} else {
2011-09-12 16:10:53 +00:00
gangliaTab . append ( createInfoBar ( 'Checking running status' ) ) ;
// Check if ganglia is running on the xCAT MN
2010-11-06 00:15:13 +00:00
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'monls' ,
tgt : '' ,
args : 'gangliamon' ,
msg : ''
} ,
2011-08-09 09:10:51 +00:00
success : checkGangliaRunning
2010-11-17 18:53:40 +00:00
} ) ;
2010-11-06 00:15:13 +00:00
}
2011-08-09 09:10:51 +00:00
2010-11-05 22:53:47 +00:00
return ;
}
/ * *
2011-08-09 09:10:51 +00:00
* Check whether Ganglia is running
2010-11-05 22:53:47 +00:00
*
* @ param data
* Data returned from HTTP request
2011-08-09 09:10:51 +00:00
* @ return Nothing
2010-11-05 22:53:47 +00:00
* /
2011-08-09 09:10:51 +00:00
function checkGangliaRunning ( data ) {
var gangliaTab = $ ( '#gangliamon' ) ;
var groupsSelectStr = '' ;
var groupsArray = $ . cookie ( 'groups' ) . split ( ',' ) ;
gangliaTab . empty ( ) ;
if ( data . rsp [ 0 ] . indexOf ( "not-monitored" ) > - 1 ) {
// Create link to start Ganglia
var startLnk = $ ( '<a href="#">Click here</a>' ) ;
startLnk . css ( {
'color' : 'blue' ,
'text-decoration' : 'none'
} ) ;
startLnk . click ( function ( ) {
// Turn on Ganglia for all nodes
monitorNode ( '' , 'on' ) ;
} ) ;
2010-11-05 22:53:47 +00:00
2011-08-09 09:10:51 +00:00
// Create warning bar
var warningBar = $ ( '<div class="ui-state-error ui-corner-all"></div>' ) ;
2011-08-24 19:28:24 +00:00
var msg = $ ( '<p></p>' ) . css ( {
'display' : 'inline-block' ,
'width' : '90%'
} ) ;
var icon = $ ( '<span class="ui-icon ui-icon-alert"></span>' ) . css ( {
'display' : 'inline-block' ,
'margin' : '10px 5px'
} ) ;
warningBar . append ( icon ) ;
msg . append ( 'Please start Ganglia on xCAT. ' ) ;
2011-08-09 09:10:51 +00:00
msg . append ( startLnk ) ;
2011-08-24 19:28:24 +00:00
msg . append ( ' to start Ganglia.' ) ;
2011-08-09 09:10:51 +00:00
warningBar . append ( msg ) ;
warningBar . css ( 'margin-bottom' , '10px' ) ;
2010-11-05 22:53:47 +00:00
2011-08-09 09:10:51 +00:00
// If there are any warning messages, append this warning after it
var curWarnings = $ ( '#gangliamon' ) . find ( '.ui-state-error' ) ;
if ( curWarnings . length ) {
curWarnings . after ( warningBar ) ;
} else {
warningBar . prependTo ( gangliaTab ) ;
}
return ;
}
2011-01-14 05:05:06 +00:00
2011-08-09 09:10:51 +00:00
//help info
2011-08-19 07:31:20 +00:00
var helpStr = '<table style="float:right"><tr>' +
'<td style="background:#66CD00;width:16px;padding:0px;"> </td><td style="padding:0px;border:0px">Normal</td>' +
'<td style="background:#FFD700;width:16px;padding:0px;"> </td><td style="padding:0px;">Heavy Load</td>' +
'<td style="background:#FF3030;width:16px;padding:0px;"> </td><td style="padding:0px;">Error</td>' +
'<td style="background:#8B8B7A;width:16px;padding:0px;"> </td><td style="padding:0px;">Unknown</td>' +
'</tr></table>' ;
2011-08-09 09:10:51 +00:00
//pass checking
2011-08-19 07:31:20 +00:00
var showStr = '<div><h3 style="display:inline;">Grid Overview</h3>' +
'<sup id="hidesup" style="cursor: pointer;color:blue;float:right">[Hide]</sup></div><hr>' +
2011-08-09 09:10:51 +00:00
'<div id="gangliaGridSummary"></div>' +
2011-12-07 08:09:16 +00:00
'<div><h3 style="display:inline;">Nodes Current Status</h3>' + helpStr + '</div><hr>' +
'<div id="zoomDiv" style="padding:0px 0px 12px 0px;"><span name="ALL">All Nodes</span></div>' +
2011-08-09 09:10:51 +00:00
'<div id="gangliaNodes"></div>' ;
//ganglia help information
gangliaTab . append ( showStr ) ;
//get summary data and draw on the page
2011-09-12 16:10:53 +00:00
$ ( '#gangliaGridSummary' ) . append ( 'Getting grid summary data <img src="images/loader.gif"></img>' ) ;
2011-08-09 09:10:51 +00:00
sendGridSummaryAjax ( ) ;
2011-12-07 08:09:16 +00:00
//get all nodes location data which can support the zoom monitor
$ ( '#gangliaNodes' ) . append ( 'Getting all nodes status <img src="images/loader.gif"></img>' ) ;
sendLocationAjax ( ) ;
2011-08-09 09:10:51 +00:00
2011-08-11 09:42:23 +00:00
//bind the hide/show buttion event
$ ( '#gangliamon #hidesup' ) . bind ( 'click' , function ( ) {
var a = $ ( this ) . text ( ) ;
if ( '[Hide]' == $ ( this ) . text ( ) ) {
$ ( this ) . html ( '[Show]' ) ;
}
else {
$ ( this ) . html ( '[Hide]' ) ;
}
$ ( '#gangliaGridSummary' ) . toggle ( ) ;
} ) ;
2010-09-17 08:39:17 +00:00
}
2010-09-24 02:27:04 +00:00
2011-12-07 08:09:16 +00:00
/ * *
* Send AJAX request to get all nodes parent and
* position to create hardware hierarchy hash
*
* retrn : nothing
* /
function sendLocationAjax ( ) {
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
args : 'graph' ,
msg : ''
} ,
success : function ( data ) {
if ( ! data . rsp [ 0 ] ) {
return ;
}
extractLocationlData ( data . rsp [ 0 ] ) ;
//get nodes current status and draw on the page
sendNodeCurrentAjax ( ) ;
//start the timer to update page per minute.
gangliaTimer = window . setTimeout ( 'updateGangliaPage()' , 60000 ) ;
}
} ) ;
}
2010-11-05 22:53:47 +00:00
/ * *
2011-09-12 16:10:53 +00:00
* Send AJAX request to get grid summary information
*
2010-11-05 22:53:47 +00:00
* @ return Nothing
* /
2011-08-09 09:10:51 +00:00
function sendGridSummaryAjax ( ) {
2011-09-12 16:10:53 +00:00
//get the summary data
2011-08-09 09:10:51 +00:00
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
args : 'gangliashow;_grid_;hour;_summary_' ,
msg : ''
} ,
success : function ( data ) {
createGridSummaryData ( data . rsp [ 0 ] ) ;
drawGridSummary ( ) ;
}
} ) ;
}
2010-11-05 22:53:47 +00:00
2011-08-09 09:10:51 +00:00
/ * *
2011-09-12 16:10:53 +00:00
* Send AJAX request to get nodes current load information
2011-08-09 09:10:51 +00:00
*
* @ return Nothing
* /
function sendNodeCurrentAjax ( ) {
2011-09-12 16:10:53 +00:00
//get all nodes current status
2011-08-09 09:10:51 +00:00
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
2011-12-07 08:09:16 +00:00
args : 'gangliacurrent;node;' ,
2011-08-09 09:10:51 +00:00
msg : ''
} ,
success : function ( data ) {
createNodeStatusData ( data . rsp [ 0 ] ) ;
drawGangliaNodesArea ( $ ( '#gangliaorder' ) . val ( ) ) ;
}
} ) ;
2010-11-05 22:53:47 +00:00
}
/ * *
2011-09-12 16:10:53 +00:00
* Send AJAX request to get grid current summary information for update the page
*
2011-08-09 09:10:51 +00:00
* @ return Nothing
* /
function sendGridCurrentAjax ( ) {
//get the summary data
$ . ajax ( {
url : 'lib/cmd.php' ,
dataType : 'json' ,
data : {
cmd : 'webrun' ,
tgt : '' ,
args : 'gangliacurrent;grid' ,
msg : ''
} ,
success : function ( data ) {
updateGridSummaryData ( data . rsp [ 0 ] ) ;
drawGridSummary ( ) ;
}
} ) ;
}
/ * *
2011-09-12 16:10:53 +00:00
* Save the grid summary data to local global variable
2011-08-09 09:10:51 +00:00
*
* @ param data structure
* metric1 : time11 , val11 , time12 , val12 ... . ; metric2 : time21 , val21 , time22 , val22 , ... ; ... .
* @ return Nothing
* /
function createGridSummaryData ( summaryString ) {
//empty the global data
gridData = new Object ( ) ;
var metricArray = summaryString . split ( ';' ) ;
var metricname = '' ;
var valueArray = '' ;
var position = 0 ;
var tempLength = 0 ;
for ( var index = 0 ; index < metricArray . length ; index ++ ) {
position = metricArray [ index ] . indexOf ( ':' ) ;
//get the metric name and init its global array to save timestamp and value pair
metricname = metricArray [ index ] . substr ( 0 , position ) ;
gridData [ metricname ] = new Array ( ) ;
valueArray = metricArray [ index ] . substr ( position + 1 ) . split ( ',' ) ;
tempLength = valueArray . length ;
//save timestamp and value into global array
for ( var i = 0 ; i < tempLength ; i ++ ) {
gridData [ metricname ] . push ( Number ( valueArray [ i ] ) ) ;
}
}
}
/ * *
2011-09-12 16:10:53 +00:00
* Update the grid summary data to local global variable
2011-08-09 09:10:51 +00:00
*
* @ param data structure
* metric1 : time11 , val11 ; metric2 : time21 , val21 , time22 ; ... .
* @ return Nothing
* /
function updateGridSummaryData ( currentString ) {
var metricArray = currentString . split ( ';' ) ;
var metricname = '' ;
var position = 0 ;
var tempLength = 0 ;
var index = 0 ;
var tempArray ;
tempLength = metricArray . length ;
2011-09-12 16:10:53 +00:00
for ( index = 0 ; index < tempLength ; index ++ ) {
2011-08-09 09:10:51 +00:00
position = metricArray [ index ] . indexOf ( ':' ) ;
metricname = metricArray [ index ] . substr ( 0 , position ) ;
tempArray = metricArray [ index ] . substr ( position + 1 ) . split ( ',' ) ;
2011-09-12 16:10:53 +00:00
if ( gridData [ metricname ] ) {
2011-08-09 09:10:51 +00:00
gridData [ metricname ] . shift ( ) ;
gridData [ metricname ] . shift ( ) ;
gridData [ metricname ] . push ( Number ( tempArray [ 0 ] ) ) ;
gridData [ metricname ] . push ( Number ( tempArray [ 1 ] ) ) ;
}
}
}
/ * *
2011-09-12 16:10:53 +00:00
* Draw the grid summay area by global data
2010-11-05 22:53:47 +00:00
*
* @ return Nothing
* /
2011-08-09 09:10:51 +00:00
function drawGridSummary ( ) {
var gridDrawArea = $ ( '#gangliaGridSummary' ) ;
var showStr = '' ;
var tempStr = $ ( '#gangliamon' ) . attr ( 'class' ) ;
//jqflot only draw on the area visiable, if the tab is hide, return directly
2011-09-12 16:10:53 +00:00
if ( tempStr . indexOf ( 'hide' ) != - 1 ) {
2011-08-09 09:10:51 +00:00
return ;
2011-09-12 16:10:53 +00:00
}
2011-08-11 09:42:23 +00:00
2011-09-12 16:10:53 +00:00
if ( $ ( '#gangliamon #hidesup' ) . text ( ) == '[Show]' ) {
2011-08-11 09:42:23 +00:00
return ;
}
2011-09-12 16:10:53 +00:00
2011-08-09 09:10:51 +00:00
gridDrawArea . empty ( ) ;
showStr = '<table style="border-style:none;"><tr><td style="padding:0;border-style:none;"><div id="gangliasummaryload" class="monitorsumdiv"></div></td>' +
'<td style="padding:0;border-style:none;"><div id="gangliasummarycpu" class="monitorsumdiv"></div></td>' +
2011-08-11 09:42:23 +00:00
'<td style="padding:0;border-style:none;"><div id="gangliasummarymem" class="monitorsumdiv"></div></td></tr>' +
'<tr><td style="padding:0;border-style:none;"><div id="gangliasummarydisk" class="monitorsumdiv"></div></td>' +
'<td style="padding:0;border-style:none;"><div id="gangliasummarynetwork" class="monitorsumdiv"></div></td>' +
'<td style="padding:0;border-style:none;"></td></tr></table>' ;
2011-08-09 09:10:51 +00:00
gridDrawArea . append ( showStr ) ;
drawLoadFlot ( 'gangliasummaryload' , 'Grid' , gridData [ 'load_one' ] , gridData [ 'cpu_num' ] ) ;
drawCpuFlot ( 'gangliasummarycpu' , 'Grid' , gridData [ 'cpu_idle' ] ) ;
drawMemFlot ( 'gangliasummarymem' , 'Grid' , gridData [ 'mem_free' ] , gridData [ 'mem_total' ] ) ;
2011-08-11 09:42:23 +00:00
drawDiskFlot ( 'gangliasummarydisk' , 'Grid' , gridData [ 'disk_free' ] , gridData [ 'disk_total' ] ) ;
drawNetworkFlot ( 'gangliasummarynetwork' , 'Grid' , gridData [ 'bytes_in' ] , gridData [ 'bytes_out' ] ) ;
2011-08-09 09:10:51 +00:00
}
2010-11-05 22:53:47 +00:00
2011-08-09 09:10:51 +00:00
/ * *
2011-09-12 16:10:53 +00:00
* Draw the load flot by data ( summary data , or one node ' s data )
2011-08-09 09:10:51 +00:00
*
2011-09-12 16:10:53 +00:00
* @ param areaid
* Which DIV draw this flot
* @ param loadpair
* The load timestamp and value pair
* @ param cpupair
* The CPU number and value pair
2011-08-09 09:10:51 +00:00
* @ return Nothing
* /
function drawLoadFlot ( areaid , titleprefix , loadpair , cpupair ) {
var load = new Array ( ) ;
var cpunum = new Array ( ) ;
var index = 0 ;
var yaxismax = 0 ;
var interval = 1 ;
$ ( '#' + areaid ) . empty ( ) ;
//parse load pair, the timestamp must mutiply 1000, javascript time stamp is millisecond
2011-09-12 16:10:53 +00:00
for ( index = 0 ; index < loadpair . length ; index += 2 ) {
2011-08-09 09:10:51 +00:00
load . push ( [ loadpair [ index ] * 1000 , loadpair [ index + 1 ] ] ) ;
if ( loadpair [ index + 1 ] > yaxismax ) {
yaxismax = loadpair [ index + 1 ] ;
}
}
//parse cpu pair
2011-09-12 16:10:53 +00:00
for ( index = 0 ; index < cpupair . length ; index += 2 ) {
2011-08-09 09:10:51 +00:00
cpunum . push ( [ cpupair [ index ] * 1000 , cpupair [ index + 1 ] ] ) ;
if ( cpupair [ index + 1 ] > yaxismax ) {
yaxismax = cpupair [ index + 1 ] ;
}
}
interval = parseInt ( yaxismax / 3 ) ;
if ( interval < 1 ) {
interval = 1 ;
}
2011-09-12 16:10:53 +00:00
2011-08-09 09:10:51 +00:00
$ . jqplot ( areaid , [ load , cpunum ] , {
title : titleprefix + ' Loads/Procs Last Hour' ,
axes : {
xaxis : {
renderer : $ . jqplot . DateAxisRenderer ,
numberTicks : 4 ,
tickOptions : {
formatString : '%R' ,
show : true
}
2011-07-20 21:13:09 +00:00
} ,
2011-08-09 09:10:51 +00:00
yaxis : {
min : 0 ,
tickInterval : interval
2011-07-20 21:13:09 +00:00
}
2011-08-09 09:10:51 +00:00
} ,
legend : {
show : true ,
location : 'nw'
} ,
series : [ { label : 'Load' } , { label : 'CPU Number' } ] ,
seriesDefaults : { showMarker : false }
}
) ;
}
2011-07-20 21:13:09 +00:00
2011-08-09 09:10:51 +00:00
/ * *
2011-09-12 16:10:53 +00:00
* Draw the CPU usage flot by data ( maybe summary data , or one node ' s data )
2011-08-09 09:10:51 +00:00
*
2011-09-12 16:10:53 +00:00
* @ param areaid
* Which DIV draw this flot
* @ param titleprefix
* Title used name
* @ param cpupair
* The CPU timestamp and value pair
2011-08-09 09:10:51 +00:00
* @ return Nothing
* /
function drawCpuFlot ( areaid , titleprefix , cpupair ) {
var cpu = new Array ( ) ;
var index = 0 ;
$ ( '#' + areaid ) . empty ( ) ;
2011-09-12 16:10:53 +00:00
2011-08-09 09:10:51 +00:00
// time stamp should mutiply 1000
2011-09-12 16:10:53 +00:00
// we get the CPU idle from server, we should use 1 subtract the idle
for ( index = 0 ; index < cpupair . length ; index += 2 ) {
2011-08-09 09:10:51 +00:00
cpu . push ( [ ( cpupair [ index ] * 1000 ) , ( 100 - cpupair [ index + 1 ] ) ] ) ;
}
$ . jqplot ( areaid , [ cpu ] , {
title : titleprefix + ' Cpu Use Last Hour' ,
axes : {
xaxis : {
renderer : $ . jqplot . DateAxisRenderer ,
numberTicks : 4 ,
tickOptions : {
formatString : '%R' ,
show : true
}
} ,
yaxis : {
min : 0 ,
max : 100 ,
tickOptions : { formatString : '%d\%' }
}
} ,
seriesDefaults : { showMarker : false }
}
) ;
}
/ * *
2011-09-12 16:10:53 +00:00
* Draw the memory usage flot by data ( summary data , or one node ' s data )
2011-08-09 09:10:51 +00:00
*
2011-09-12 16:10:53 +00:00
* @ param areaid
* Which DIV draw this flot
* @ param titleprefix
* Title used name
* @ param cpupair
* The CPU timestamp and value pair
2011-08-09 09:10:51 +00:00
* @ return Nothing
* /
function drawMemFlot ( areaid , titleprefix , freepair , totalpair ) {
var use = new Array ( ) ;
var total = new Array ( ) ;
var tempsize = 0 ;
var index = 0 ;
$ ( '#' + areaid ) . empty ( ) ;
2011-09-12 16:10:53 +00:00
if ( freepair . length < totalpair . length ) {
2011-08-09 09:10:51 +00:00
tempsize = freepair . length ;
2011-09-12 16:10:53 +00:00
} else {
2011-08-09 09:10:51 +00:00
tempsize = freepair . length ;
}
2011-09-12 16:10:53 +00:00
for ( index = 0 ; index < tempsize ; index += 2 ) {
2011-08-09 09:10:51 +00:00
var temptotal = totalpair [ index + 1 ] ;
var tempuse = temptotal - freepair [ index + 1 ] ;
temptotal = temptotal / 1000000 ;
tempuse = tempuse / 1000000 ;
total . push ( [ totalpair [ index ] * 1000 , temptotal ] ) ;
use . push ( [ freepair [ index ] * 1000 , tempuse ] ) ;
}
$ . jqplot ( areaid , [ use , total ] , {
title : titleprefix + ' Memory Use Last Hour' ,
axes : {
xaxis : {
renderer : $ . jqplot . DateAxisRenderer ,
numberTicks : 4 ,
tickOptions : {
formatString : '%R' ,
show : true
}
} ,
yaxis : {
min : 0 ,
tickOptions : { formatString : '%.2fG' }
}
} ,
legend : {
show : true ,
location : 'nw'
} ,
series : [ { label : 'Used' } , { label : 'Total' } ] ,
seriesDefaults : { showMarker : false }
}
) ;
}
2011-08-11 09:42:23 +00:00
/ * *
2011-09-12 16:10:53 +00:00
* Draw the disk usage flot by data ( summary data , or one node ' s data )
2011-08-11 09:42:23 +00:00
*
2011-09-12 16:10:53 +00:00
* @ param areaid
* Which div draw this flot
* @ param titleprefix
* Title used name
* @ param freepair
* The free disk number , Ganglia only logs the free data
* @ param totalpair
* The total disk number
2011-08-11 09:42:23 +00:00
* @ return Nothing
* /
function drawDiskFlot ( areaid , titleprefix , freepair , totalpair ) {
var use = new Array ( ) ;
var total = new Array ( ) ;
var tempsize = 0 ;
var index = 0 ;
$ ( '#' + areaid ) . empty ( ) ;
if ( freepair . length < totalpair . length ) {
tempsize = freepair . length ;
}
else {
tempsize = freepair . length ;
}
for ( index = 0 ; index < tempsize ; index += 2 ) {
var temptotal = totalpair [ index + 1 ] ;
var tempuse = temptotal - freepair [ index + 1 ] ;
total . push ( [ totalpair [ index ] * 1000 , temptotal ] ) ;
use . push ( [ freepair [ index ] * 1000 , tempuse ] ) ;
}
$ . jqplot ( areaid , [ use , total ] , {
title : titleprefix + ' Disk Use Last Hour' ,
axes : {
xaxis : {
renderer : $ . jqplot . DateAxisRenderer ,
numberTicks : 4 ,
tickOptions : {
formatString : '%R' ,
show : true
}
} ,
yaxis : {
min : 0 ,
tickOptions : { formatString : '%.2fG' }
}
} ,
legend : {
show : true ,
location : 'nw'
} ,
series : [ { label : 'Used' } , { label : 'Total' } ] ,
seriesDefaults : { showMarker : false }
}
) ;
}
2011-09-12 16:10:53 +00:00
/ * *
* Draw the network load flot by data ( summary data , or one node ' s data )
*
* @ param areaid
* Which div draw this flot
* @ param titleprefix
* Title used name
* @ param inpair
* The timestamp and value pair for download
* @ param outpair
* The timestamp and value pair for upload
* @ return Nothing
* /
2011-08-11 09:42:23 +00:00
function drawNetworkFlot ( areaid , titleprefix , inpair , outpair ) {
var inArray = new Array ( ) ;
var outArray = new Array ( ) ;
var index = 0 ;
var maxvalue = 0 ;
var unitname = 'B' ;
var divisor = 1 ;
2011-09-12 16:10:53 +00:00
for ( index = 0 ; index < inpair . length ; index += 2 ) {
if ( inpair [ index + 1 ] > maxvalue ) {
2011-08-11 09:42:23 +00:00
maxvalue = inpair [ index + 1 ] ;
}
}
2011-09-12 16:10:53 +00:00
for ( index = 0 ; index < outpair . length ; index += 2 ) {
if ( outpair [ index + 1 ] > maxvalue ) {
2011-08-11 09:42:23 +00:00
maxvalue = outpair [ index + 1 ] ;
}
}
2011-09-12 16:10:53 +00:00
if ( maxvalue > 3000000 ) {
2011-08-11 09:42:23 +00:00
divisor = 1000000 ;
unitname = 'GB' ;
2011-09-12 16:10:53 +00:00
} else if ( maxvalue >= 3000 ) {
2011-08-11 09:42:23 +00:00
divisor = 1000 ;
unitname = 'MB' ;
2011-09-12 16:10:53 +00:00
} else {
2011-08-11 09:42:23 +00:00
//do nothing
}
2011-09-12 16:10:53 +00:00
for ( index = 0 ; index < inpair . length ; index += 2 ) {
2011-08-11 09:42:23 +00:00
inArray . push ( [ ( inpair [ index ] * 1000 ) , ( inpair [ index + 1 ] / divisor ) ] ) ;
}
2011-09-12 16:10:53 +00:00
for ( index = 0 ; index < outpair . length ; index += 2 ) {
2011-08-11 09:42:23 +00:00
outArray . push ( [ ( outpair [ index ] * 1000 ) , ( outpair [ index + 1 ] / divisor ) ] ) ;
}
2011-09-12 16:10:53 +00:00
$ . jqplot ( areaid , [ inArray , outArray ] , {
2011-08-11 09:42:23 +00:00
title : titleprefix + ' Network Last Hour' ,
axes : {
xaxis : {
renderer : $ . jqplot . DateAxisRenderer ,
numberTicks : 4 ,
tickOptions : {
formatString : '%R' ,
show : true
}
} ,
yaxis : {
min : 0 ,
tickOptions : { formatString : '%d' + unitname }
}
} ,
legend : {
show : true ,
location : 'nw'
} ,
series : [ { label : 'In' } , { label : 'Out' } ] ,
seriesDefaults : { showMarker : false }
2011-09-12 16:10:53 +00:00
} ) ;
2011-08-11 09:42:23 +00:00
}
2011-09-12 16:10:53 +00:00
/ * *
* Create node status data
*
* @ param nodesStatus
* Node status
* @ return Nothing
* /
2011-08-09 09:10:51 +00:00
function createNodeStatusData ( nodesStatus ) {
var index ;
var nodesArray = nodesStatus . split ( ';' ) ;
var position = 0 ;
var nodename = '' ;
var index = 0 ;
var tempArray ;
var tempStr = '' ;
2011-09-12 16:10:53 +00:00
for ( index in nodePath ) {
2011-08-09 09:10:51 +00:00
delete ( nodePath [ index ] ) ;
}
2011-09-12 16:10:53 +00:00
for ( index in nodeStatus ) {
2011-08-09 09:10:51 +00:00
delete ( nodeStatus [ index ] ) ;
}
2011-09-12 16:10:53 +00:00
for ( index = 0 ; index < nodesArray . length ; index ++ ) {
2011-08-09 09:10:51 +00:00
tempStr = nodesArray [ index ] ;
position = tempStr . indexOf ( ':' ) ;
nodename = tempStr . substring ( 0 , position ) ;
tempArray = tempStr . substring ( position + 1 ) . split ( ',' ) ;
2011-12-07 08:09:16 +00:00
nodeStatus [ nodename ] = tempArray [ 0 ] ;
if ( ( 'WARNING' == tempArray [ 0 ] ) || ( 'NORMAL' == tempArray [ 0 ] ) ) {
nodePath [ nodename ] = tempArray [ 1 ] ;
2011-08-09 09:10:51 +00:00
}
}
}
2011-09-12 16:10:53 +00:00
2011-08-09 09:10:51 +00:00
/ * *
2011-09-12 16:10:53 +00:00
* Draw nodes current status , there are four type :
2011-08-09 09:10:51 +00:00
* a . unknown ( gray ) : can not find save data for this node
* b . error ( red ) : get status sometime early , but can not get now
* c . warning ( orange ) : node are heavy load
* d . normal ( green ) :
*
2011-12-07 08:09:16 +00:00
* @ param
2011-08-09 09:10:51 +00:00
* @ return Nothing
* /
2011-12-07 08:09:16 +00:00
function drawGangliaNodesArea ( ) {
var position = 0 ;
// find out the last child's type and name
var currentobj = $ ( '#zoomDiv span:last' ) ;
var type = currentobj . attr ( 'name' ) . toLowerCase ( ) ;
var name = currentobj . text ( ) ;
position = name . indexOf ( '(' ) ;
if ( position > - 1 ) {
name = name . substr ( 3 , position - 3 ) ;
}
$ ( '#gangliaNodes' ) . empty ( ) ;
switch ( type ) {
//these type draw the node current status
case 'blade' :
case 'cec' :
case 'rack' :
2011-12-31 08:43:58 +00:00
case 'other' :
2011-12-07 08:09:16 +00:00
{
drawGangliaNodesAreaPic ( type , name ) ;
}
break ;
//these type draw a summary table
case 'all' :
case 'frame' :
{
drawGangliaNodesAreaTab ( type , name ) ;
}
break ;
default :
break ;
}
}
function drawGangliaNodesAreaPic ( type , name ) {
var index = 0 ;
var arraypoint ;
2011-08-09 09:10:51 +00:00
var templength = 0 ;
var showStr = '' ;
var nodename = '' ;
2011-09-12 16:10:53 +00:00
2011-12-07 08:09:16 +00:00
switch ( type ) {
case 'blade' :
{
arraypoint = bladehash [ name ] ;
}
break ;
case 'cec' :
{
arraypoint = cechash [ name ] ;
}
break ;
case 'rack' :
{
arraypoint = rackhash [ name ] ;
}
break ;
2011-12-31 08:43:58 +00:00
case 'other' :
{
arraypoint = otherhash [ 1 ] ;
}
2011-12-07 08:09:16 +00:00
default :
break ;
2011-08-09 09:10:51 +00:00
}
2011-12-07 08:09:16 +00:00
$ ( '#gangliaNodes' ) . html ( '<ul style="margin:0px;padding:0px;"></ul>' ) ;
2011-08-09 09:10:51 +00:00
2011-12-07 08:09:16 +00:00
templength = arraypoint . length ;
2011-08-09 09:10:51 +00:00
2011-09-12 16:10:53 +00:00
for ( index = 0 ; index < templength ; index ++ ) {
2011-12-07 08:09:16 +00:00
nodename = arraypoint [ index ] ;
switch ( nodeStatus [ nodename ] ) {
case 'ERROR' :
2011-09-12 16:10:53 +00:00
showStr = '<li class="monitorerror ui-corner-all monitornodeli" title="' + nodename + '"></li>' ;
break ;
2011-12-07 08:09:16 +00:00
case 'WARNING' :
2011-09-12 16:10:53 +00:00
showStr = '<li class="mornitorwarning ui-corner-all monitornodeli" title="' + nodename + '"></li>' ;
break ;
2011-12-07 08:09:16 +00:00
case 'NORMAL' :
2011-09-12 16:10:53 +00:00
showStr = '<li class="monitornormal ui-corner-all monitornodeli" title="' + nodename + '"></li>' ;
break ;
2011-12-07 08:09:16 +00:00
default :
showStr = '<li class="monitorunknown ui-corner-all monitornodeli" title="' + nodename + '"></li>' ;
break ;
2011-08-09 09:10:51 +00:00
}
$ ( '#gangliaNodes ul' ) . append ( showStr ) ;
}
//bind all normal and warning nodes' click event
2011-09-12 16:10:53 +00:00
$ ( '.monitornormal,.monitorwarning' ) . bind ( 'click' , function ( ) {
2011-08-09 09:10:51 +00:00
var nodename = $ ( this ) . attr ( 'title' ) ;
window . open ( 'ganglianode.php?n=' + nodename + '&p=' + nodePath [ nodename ] ,
2011-08-11 09:42:23 +00:00
'nodedetail' , 'height=430,width=950,scrollbars=yes,status =no' ) ;
2011-08-09 09:10:51 +00:00
} ) ;
2011-12-07 08:09:16 +00:00
}
function drawGangliaNodesAreaTab ( type , name ) {
var tabobj = $ ( '<table></table>' ) ;
var rowstr = '' ;
var usedcec = new Object ( ) ;
tabobj . append ( '<tr><th>Name</th><th>Type</th><th>Normal</th><th>Heavy Load</th><th>Error</th><th>Unknown</th></tr>' ) ;
if ( 'all' == type ) {
for ( var i in framehash ) {
var framename = i ;
rowstr = '<tr><td><a href="#" onclick="addZoomDiv(this)" name="frame">' + framename + '</a></td><td>Frame</td>' +
monitorStatAgg ( 'frame' , framehash [ i ] ) + '</tr>' ;
tabobj . append ( rowstr ) ;
for ( var j in framehash [ i ] ) {
usedcec [ framehash [ i ] [ j ] ] = 1 ;
}
}
for ( var i in cechash ) {
if ( usedcec [ i ] ) {
continue ;
}
var cecname = i ;
rowstr = '<tr><td><a href="#" onclick="addZoomDiv(this)" name="cec">' + cecname + '</a></td><td>CEC</td>' +
monitorStatAgg ( 'cec' , cechash [ i ] ) + '</tr>' ;
tabobj . append ( rowstr ) ;
}
for ( var i in bladehash ) {
var bladename = i ;
rowstr = '<tr><td><a href="#" onclick="addZoomDiv(this)" name="blade">' + bladename + '</a></td><td>Blade</td>' +
monitorStatAgg ( 'blade' , bladehash [ i ] ) + '</tr>' ;
tabobj . append ( rowstr ) ;
}
for ( var i in rackhash ) {
var rackname = i ;
rowstr = '<tr><td><a href="#" onclick="addZoomDiv(this)" name="rack">' + rackname + '</a></td><td>Rack</td>' +
monitorStatAgg ( 'rack' , rackhash [ i ] ) + '</tr>' ;
tabobj . append ( rowstr ) ;
}
2011-12-31 08:43:58 +00:00
if ( otherhash [ 1 ] . length > 0 )
{
rowstr = '<tr><td><a href="#" onclick="addZoomDiv(this)" name="other">Other</a></td><td>Other</td>' +
monitorStatAgg ( 'other' , otherhash [ 1 ] ) + '</tr>' ;
tabobj . append ( rowstr ) ;
}
2011-12-07 08:09:16 +00:00
}
else {
for ( var i in framehash [ name ] ) {
var cecname = framehash [ name ] [ i ] ;
rowstr = '<tr><td><a href="#" onclick="addZoomDiv(this)" name="cec">' + cecname + '</a></td>' +
'<td>CEC</td>' + monitorStatAgg ( 'cec' , cechash [ cecname ] ) + '</tr>' ;
tabobj . append ( rowstr ) ;
}
}
$ ( '#gangliaNodes' ) . append ( tabobj ) ;
}
/ * *
* Update all tab per minute .
*
* @ return Nothing
* /
function monitorStatAgg ( type , inputarray ) {
var normalnum = 0 ;
var warningnum = 0 ;
var errornum = 0 ;
var nuknownnum = 0 ;
var tempArray ;
var tempname ;
switch ( type ) {
case 'blade' :
case 'cec' :
case 'rack' :
2011-12-31 08:43:58 +00:00
case 'other' :
2011-12-07 08:09:16 +00:00
{
tempArray = inputarray ;
}
break ;
case 'frame' :
{
tempArray = new Array ( ) ;
for ( var i in inputarray ) {
tempname = inputarray [ i ] ;
for ( var j in cechash [ tempname ] ) {
tempArray . push ( cechash [ tempname ] [ j ] ) ;
}
}
}
break ;
default :
return ;
break ;
}
for ( var i in tempArray ) {
tempname = tempArray [ i ] ;
switch ( nodeStatus [ tempname ] ) {
case 'NORMAL' :
normalnum ++ ;
break ;
case 'WARNING' :
warningnum ++ ;
break ;
case 'ERROR' :
errornum ++ ;
break ;
default :
nuknownnum ++ ;
break ;
}
}
normalnum = normalnum ? normalnum : '-' ;
warningnum = warningnum ? warningnum : '-' ;
errornum = errornum ? errornum : '-' ;
nuknownnum = nuknownnum ? nuknownnum : '-' ;
return ( '<td>' + normalnum + '</td><td>' + warningnum + '</td><td>' + errornum + '</td><td>' + nuknownnum + '</td>' ) ;
2011-08-09 09:10:51 +00:00
}
/ * *
2011-09-12 16:10:53 +00:00
* Update all tab per minute .
2011-08-09 09:10:51 +00:00
*
* @ return Nothing
* /
function updateGangliaPage ( ) {
2011-09-12 16:10:53 +00:00
if ( $ ( '#gangliaNodes' ) . size ( ) < 1 ) {
2011-08-09 09:10:51 +00:00
return ;
}
sendGridCurrentAjax ( ) ;
sendNodeCurrentAjax ( ) ;
gangliaTimer = window . setTimeout ( 'updateGangliaPage()' , 60000 ) ;
}
2011-12-07 08:09:16 +00:00
/ * *
* extract the location query data , saved in global varible .
*
* @ return Nothing
* /
function extractLocationlData ( locationData ) {
framehash = new Object ( ) ;
cechash = new Object ( ) ;
bladehash = new Object ( ) ;
rackhash = new Object ( ) ;
2011-12-31 08:43:58 +00:00
//other unknown nodes only have one parent, use number 1 as there parent
otherhash = new Object ( ) ;
otherhash [ 1 ] = new Array ( ) ;
2011-12-07 08:09:16 +00:00
var allnodearray = locationData . split ( ';' ) ;
var temparray ;
var parent = '' ;
var name = '' ;
for ( var i in allnodearray ) {
temparray = allnodearray [ i ] . split ( ':' ) ;
name = temparray [ 0 ] ;
//there is not parent(or mpa, or rack) information, jump this node
parent = temparray [ 2 ] ;
if ( ! parent ) {
continue ;
}
switch ( temparray [ 1 ] . toLowerCase ( ) ) {
case 'blade' :
{
if ( ! bladehash [ parent ] ) {
bladehash [ parent ] = new Array ( ) ;
}
bladehash [ parent ] . push ( name ) ;
}
break ;
case 'systemx' :
{
if ( ! rackhash [ parent ] ) {
rackhash [ parent ] = new Array ( ) ;
}
rackhash [ parent ] . push ( name ) ;
}
break ;
2011-12-31 08:43:58 +00:00
case 'frame' :
{
if ( ! framehash [ name ] )
{
framehash [ name ] = new Array ( ) ;
}
}
break ;
2011-12-07 08:09:16 +00:00
case 'cec' :
{
if ( ! framehash [ parent ] ) {
framehash [ parent ] = new Array ( ) ;
}
framehash [ parent ] . push ( name ) ;
}
break ;
2011-12-31 08:43:58 +00:00
2011-12-07 08:09:16 +00:00
case 'lpar' :
2011-12-31 08:43:58 +00:00
case 'lpar,osi' :
case 'osi,lpar' :
2011-12-07 08:09:16 +00:00
{
if ( ! cechash [ parent ] ) {
cechash [ parent ] = new Array ( ) ;
}
cechash [ parent ] . push ( name ) ;
}
break ;
default :
2011-12-31 08:43:58 +00:00
{
otherhash [ 1 ] . push ( name ) ;
}
2011-12-07 08:09:16 +00:00
break ;
}
}
}
/ * *
* change the zoom area when click the zoom button
*
* @ return Nothing
* /
function updateZoom ( obj ) {
var type = $ ( obj ) . attr ( 'name' ) ;
//delete all next cusion
while ( $ ( '#zoomDiv span:last' ) . attr ( 'name' ) != type ) {
$ ( '#zoomDiv span:last' ) . remove ( ) ;
}
$ ( obj ) . removeClass ( 'monitorzoomlinkli' ) ;
$ ( obj ) . unbind ( 'click' ) ;
drawGangliaNodesArea ( ) ;
2011-08-09 09:10:51 +00:00
}
2011-12-07 08:09:16 +00:00
/ * *
* add the zoom level when click the group link in the summary table
*
* @ return Nothing
* /
function addZoomDiv ( obj ) {
var name = $ ( obj ) . text ( ) ;
var type = $ ( obj ) . attr ( 'name' ) ;
var lastzoomobj = $ ( '#zoomDiv span:last' ) ;
2011-12-07 09:16:21 +00:00
lastzoomobj . addClass ( 'monitorzoomlink' ) ;
2011-12-07 08:09:16 +00:00
lastzoomobj . bind ( 'click' , function ( ) {
updateZoom ( this ) ;
} ) ;
var newcontent = ' > ' + name + '(' + type . toUpperCase ( ) + ')' ;
var newli = '<span name="' + type + '">' + newcontent + '</span>' ;
$ ( '#zoomDiv' ) . append ( newli ) ;
drawGangliaNodesArea ( ) ;
2010-09-17 08:39:17 +00:00
}