今天发现主机监控的内存采集不采集了,查看一下发现原来局方把sar的权限给取消了,导致采集方法报错,但是内存的采集是利用的vmstat 2 10 这个命令,为什么会导致内存采集不上来呢?
查看源代码发现
public Vector getMemory(HashMap params) {
logger.info("begin getMemory");
init(params);
// 得到unit_id中使用的主机名称
String neat_host_name = rpctarget.getNeat_host_name();
if (neat_host_name == null || neat_host_name.equals("")) {
// 获取主机名称
String host_name = this.getHostName();
// 得到unit_id中使用的主机名称
neat_host_name = Formater.neatenunitid(host_name);
}
// 保存采集结果,并返回值
CollBase collResult = new CollBase();
// 本方法得到的kpi值的unit_id,均以PRE_UNITID + "-12"开头
String memory_PRE_UNITID = PRE_UNITID + "-12";
// 增加采集时间指标
String pattern = "yyyy-MM-dd-HH-mm-ss";
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name + "",
"CM-00-01-001-22", dateFormat.format(new java.util.Date()));
Vector memoryout = rpctarget.getKPISet("vmstat 2 10");
String memoryrun = (String) memoryout.elementAt(memoryout.size() - 1);
try {
// PM-00-01-002-01 内存的使用率 主机内存的使用量与内存总量的比值
Vector mem_num = rpctarget
.getKPISet("prtconf |grep 'Good Memory Size:'");
String memory = (String) mem_num.elementAt(0);
int free_mem = Integer.parseInt(split(memoryrun, 3)) * 4 / 1024; // 空余内存
// 单位:M
int total_mem = Integer.parseInt(split(memory, 3)); // 总内存 单位:M
double use_per = 100.0 - (free_mem * 100.0) / total_mem; // 内存使用率
String mem_use_per = this
.getByScale(new Double(use_per).toString());
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name
+ "-memory", "PM-00-01-002-01", Formater
.formatDecimalKpivalue(mem_use_per));
// 系统内存使用率
// 用户内存使用率
String sys_user_rate = Float.parseFloat(mem_use_per) * 0.7 + "";
String sys_use_rate = Float.parseFloat(mem_use_per) * 0.3 + "";
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name
+ "-memory", "PM-00-01-002-07", Formater
.formatDecimalKpivalue(sys_user_rate));
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name
+ "-memory", "PM-00-01-002-06", Formater
.formatDecimalKpivalue(sys_use_rate));
} catch (Exception e) {
e.printStackTrace();
}
String value = "";
// M-00-01-002-02 内存交换请求数
value = split(memoryrun, 7);
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name + "-memory",
"PM-00-01-002-02", Formater.formatDecimalKpivalue(value));
// PM-00-01-002-03 内存交换页换进率
value = split(memoryrun, 5);
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name + "-memory",
"PM-00-01-002-03", Formater.formatDecimalKpivalue(value));
// PM-00-01-002-04 内存交换页换出率
value = split(memoryrun, 6);
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name + "-memory",
"PM-00-01-002-04", Formater.formatDecimalKpivalue(value));
// PM-00-01-002-05 内存队列数
value = split(memoryrun, 0);
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name + "-memory",
"PM-00-01-002-05", Formater.formatDecimalKpivalue(value));
// PM-00-01-002-08 文件系统数据缓冲命中率
// Vector filerate_result = rpctarget.getKPISet("sar -b 2 2");
// if (filerate_result != null && filerate_result.size() > 0) {
// String filerate_string = (String) filerate_result
// .elementAt(filerate_result.size() - 1);
// int r_rate = Integer.parseInt(split(filerate_string, 3));
// int w_rate = Integer.parseInt(split(filerate_string, 6));
// value = String.valueOf((r_rate + w_rate) / 2);
// collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name
// + "-memory", "PM-00-01-002-08",
// Formater.formatDecimalKpivalue(value));
// } else {
// logger.error("error when exe 'sar -b 2 2' , null or nothing return");
// }
// Vector filerate_result = rpctarget.getKPISet("sar -b 2 2");
String commond = "sh ibmaix/cachehitrate.sh";
Vector filerate_result = this.execute(commond);
if (filerate_result != null && filerate_result.size() > 0) {
String filerate_string = (String) filerate_result.elementAt(0);
float fault = Float.parseFloat(split(filerate_string, 3));
float odio = Float.parseFloat(split(filerate_string, 4));
value = Formater.formatDecimalKpivalue(String.valueOf(fault
* 100 / (fault + odio)));
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name
+ "-memory", "PM-00-01-002-08", Formater
.formatDecimalKpivalue(value));
} else {
logger
.error("error when exe 'sar -b 2 2' , null or nothing return");
}
logger.info("end getMemory");
return collResult.getKPISet();
}
出现问题的原因就是在下面的代码编程当中没有捕获异常,导致整个方法都采集不到值,真是城池失火殃及鱼池呀。做程序员一定要注意。
修改后的代码为:
public Vector getMemory(HashMap params) {
logger.info("begin getMemory");
init(params);
// 得到unit_id中使用的主机名称
String neat_host_name = rpctarget.getNeat_host_name();
if (neat_host_name == null || neat_host_name.equals("")) {
// 获取主机名称
String host_name = this.getHostName();
// 得到unit_id中使用的主机名称
neat_host_name = Formater.neatenunitid(host_name);
}
// 保存采集结果,并返回值
CollBase collResult = new CollBase();
// 本方法得到的kpi值的unit_id,均以PRE_UNITID + "-12"开头
String memory_PRE_UNITID = PRE_UNITID + "-12";
// 增加采集时间指标
String pattern = "yyyy-MM-dd-HH-mm-ss";
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name + "",
"CM-00-01-001-22", dateFormat.format(new java.util.Date()));
Vector memoryout = rpctarget.getKPISet("vmstat 2 10");
String memoryrun = (String) memoryout.elementAt(memoryout.size() - 1);
try {
// PM-00-01-002-01 内存的使用率 主机内存的使用量与内存总量的比值
Vector mem_num = rpctarget
.getKPISet("prtconf |grep 'Good Memory Size:'");
String memory = (String) mem_num.elementAt(0);
int free_mem = Integer.parseInt(split(memoryrun, 3)) * 4 / 1024; // 空余内存
// 单位:M
int total_mem = Integer.parseInt(split(memory, 3)); // 总内存 单位:M
double use_per = 100.0 - (free_mem * 100.0) / total_mem; // 内存使用率
String mem_use_per = this
.getByScale(new Double(use_per).toString());
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name
+ "-memory", "PM-00-01-002-01", Formater
.formatDecimalKpivalue(mem_use_per));
// 系统内存使用率
// 用户内存使用率
String sys_user_rate = Float.parseFloat(mem_use_per) * 0.7 + "";
String sys_use_rate = Float.parseFloat(mem_use_per) * 0.3 + "";
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name
+ "-memory", "PM-00-01-002-07", Formater
.formatDecimalKpivalue(sys_user_rate));
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name
+ "-memory", "PM-00-01-002-06", Formater
.formatDecimalKpivalue(sys_use_rate));
} catch (Exception e) {
e.printStackTrace();
}
String value = "";
// M-00-01-002-02 内存交换请求数
value = split(memoryrun, 7);
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name + "-memory",
"PM-00-01-002-02", Formater.formatDecimalKpivalue(value));
// PM-00-01-002-03 内存交换页换进率
value = split(memoryrun, 5);
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name + "-memory",
"PM-00-01-002-03", Formater.formatDecimalKpivalue(value));
// PM-00-01-002-04 内存交换页换出率
value = split(memoryrun, 6);
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name + "-memory",
"PM-00-01-002-04", Formater.formatDecimalKpivalue(value));
// PM-00-01-002-05 内存队列数
value = split(memoryrun, 0);
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name + "-memory",
"PM-00-01-002-05", Formater.formatDecimalKpivalue(value));
// PM-00-01-002-08 文件系统数据缓冲命中率
// Vector filerate_result = rpctarget.getKPISet("sar -b 2 2");
// if (filerate_result != null && filerate_result.size() > 0) {
// String filerate_string = (String) filerate_result
// .elementAt(filerate_result.size() - 1);
// int r_rate = Integer.parseInt(split(filerate_string, 3));
// int w_rate = Integer.parseInt(split(filerate_string, 6));
// value = String.valueOf((r_rate + w_rate) / 2);
// collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name
// + "-memory", "PM-00-01-002-08",
// Formater.formatDecimalKpivalue(value));
// } else {
// logger.error("error when exe 'sar -b 2 2' , null or nothing return");
// }
// Vector filerate_result = rpctarget.getKPISet("sar -b 2 2");
String commond = "sh ibmaix/cachehitrate.sh";
Vector filerate_result = this.execute(commond);
if (filerate_result != null && filerate_result.size() > 0) {
try{
String filerate_string = (String) filerate_result.elementAt(0);
float fault = Float.parseFloat(split(filerate_string, 3));
float odio = Float.parseFloat(split(filerate_string, 4));
value = Formater.formatDecimalKpivalue(String.valueOf(fault
* 100 / (fault + odio)));
collResult.addKPI(memory_PRE_UNITID + ":" + neat_host_name
+ "-memory", "PM-00-01-002-08", Formater
.formatDecimalKpivalue(value));
}catch(Exception e){
e.printStackTrace();
}
} else {
logger
.error("error when exe 'sar -b 2 2' , null or nothing return");
}
logger.info("end getMemory");
return collResult.getKPISet();
}
这样就把内存的利用率采集到了。