Ganglia 由于其对hadoop有着良好的支持,基于不需要太复杂的配置就可以胜任对于hadoop cluster的监控工作。在部署完成以后出现了一个问题,进入某一个监控指标以后点击inspect查看详细图的时候其鼠标事件显示的日期和当前本地时间差了8 个时区。也就是鼠标事件使用的时区是utc时区,但是其它应用所使用的时区肯定是CST(中国位于 世界时区的东八区)。
基本根本原因是ganglia画图使用了jquery.flot 库,flot在处理时间的时候会将时间换化utc时间。
Google 了好多次也未能找到比较好的解决办法,后来开始对文件的运行进行分析:
1 图片的显示使用的是php
2 鼠标的显示事件使用肯定就是js了。
3 其开始调用页面为graph_all_periods.php ,根据关键字“inspect”可以得到其在里面的对应的真实的action操作
inspectGraph()这个函数;在其php文件中只有inspect_graph.php,host_view.php这两个文件调用了此函数,并没有该函数的定义。根据前面的推断,该函数及有可能是在js中定义的。
4 通过搜索js里面的关键字,在js/ganglia.js找到相关的函数。但是这个函数并未直接操作时间,该js里面另外一个functions进入了我的侦察视野。结果让人意外,这个地方也未能定义,但是却找了另外一个相关的引用页 inspect_graph.php
5 打开 inspect_graph.php之后,很快就发现了罪魁祸首 function utcTimeStr(tstamp) ,就是这个函数活生生的将时间转成了utc。解决办法很简单了,将其utc转换去掉即可
原函数:
function utcTimeStr(tstamp) {
var date = new Date(tstamp);
var month = date.getUTCMonth() + 1;
if ( month < 10 )
month = "0" + month;
var day = date.getUTCDate();
if ( day < 10 )
day = "0" + day;
var hr = date.getUTCHours();
if (hr < 10)
hr = "0" + hr;
var min = date.getUTCMinutes();
if (min < 10)
min = "0" + min;
var sec = date.getUTCSeconds();
if (sec < 10)
sec = "0" + sec;
return date.getUTCFullYear() + "-" + month + "-" + day + " " + hr + ":" + min + ":" + sec;
}
修改为:
function utcTimeStr(tstamp) {
var date = new Date(tstamp);
var month = date.getMonth() + 1;
if ( month < 10 )
month = "0" + month;
var day = date.getDate();
if ( day < 10 )
day = "0" + day;
var hr = date.getHours();
if (hr < 10)
hr = "0" + hr;
var min = date.getMinutes();
if (min < 10)
min = "0" + min;
var sec = date.getSeconds();
if (sec < 10)
sec = "0" + sec;
return date.getFullYear() + "-" + month + "-" + day + " " + hr + ":" + min + ":" + sec;
}
另外需要将js/jquery.flot.js js/jquery.flot.js.min 中的UTC去掉
重新打开ganglia的页面,点击inspect时间显示正常。
由于blog不支持附件上传,有需要修改好的inspect_graph.php的朋友可以发邮件或是留言索取。
阅读(1823) | 评论(0) | 转发(0) |