您的位置:首页 > 数据库 > Mongodb

将日志信息(系统性能参数)记录到MongoDB --- 2:写入记录

2013-04-06 20:26 573 查看
到现在我们已经安装好了MongoDB,前面也得到了虚拟机的性能参数,现在我们要把这些参数写入DB。为了以后便于查询 ,我们需要把各个参数区分开来(之前是整个是一个字符串),而这一步可以在server端进行也可以在client端进行,为了减轻server的负担,还是选择在client端进行。为了方便server 端的插入,我们就在client端用hash_map存储分开后的信息,然后将hash_map传过来写入DB,注意对象在函数间传的是引用,所以用到clone()。

还需要注意的是之前socket传递的是字符串,这里需要传递的是对象(hash_map)。

在SystemMonitor里面加一个得到hash_map的函数:

@SuppressWarnings("unchecked")
public static HashMap<String,String> getInfoHashMap() throws Exception{
HashMap<String,String> info_map = new HashMap<String,String>();
String total_info = getTotalInfo();

info_map.put(InfoMapKey.TOTAL, total_info);
info_map.put(InfoMapKey.IP, getIP());

String[] lines = total_info.split("\n");

//1
int part_num = 0;
int line_num = 0;
String[] parts = lines[line_num++].split(",");
String[] s = parts[part_num++].split("up");
String[] s2 = s[0].split(" ");
info_map.put(InfoMapKey.REPORT_TIME, s2[2]);
if(s[1].contains("day"))
{
s2 = s[1].split("day");
info_map.put(InfoMapKey.EXIST_TIME, s2[0].trim() + ":" + parts[part_num++].trim() );
}
else
info_map.put(InfoMapKey.EXIST_TIME, "0:" + s[1].trim());
s = parts[part_num++].split("u");
info_map.put(InfoMapKey.USER_NUM, s[0].trim());
s = parts[part_num++].split(":");
info_map.put(InfoMapKey.LOAD_AVERAGE_1, s[1].trim());
info_map.put(InfoMapKey.LOAD_AVERAGE_5, parts[part_num++].trim());
info_map.put(InfoMapKey.LOAD_AVERAGE_15, parts[part_num++].trim());

//2
part_num = 0;
parts = lines[line_num++].split(",");
s = parts[part_num++].split("total");
s2 = s[0].split(":");
info_map.put(InfoMapKey.TASK_TOTAL, s2[1].trim());
s = parts[part_num++].split("running");
info_map.put(InfoMapKey.TASK_RUNNING, s[0].trim());
s = parts[part_num++].split("sleeping");
info_map.put(InfoMapKey.TASK_SLEEPING, s[0].trim());
s = parts[part_num++].split("stopped");
info_map.put(InfoMapKey.TASK_STOPPED, s[0].trim());
s = parts[part_num++].split("zombie");
info_map.put(InfoMapKey.TASK_ZOMBIE, s[0].trim());

//3
part_num = 0;
parts = lines[line_num++].split(",");
s = parts[part_num++].split("%");
s2 = s[0].split(":");
info_map.put(InfoMapKey.CPU_US, s2[1].trim());
s = parts[part_num++].split("%");
info_map.put(InfoMapKey.CPU_SY, s[0].trim());
s = parts[part_num++].split("%");
info_map.put(InfoMapKey.CPU_NI, s[0].trim());
s = parts[part_num++].split("%");
info_map.put(InfoMapKey.CPU_ID, s[0].trim());
s = parts[part_num++].split("%");
info_map.put(InfoMapKey.CPU_WA, s[0].trim());
s = parts[part_num++].split("%");
info_map.put(InfoMapKey.CPU_HI, s[0].trim());
s = parts[part_num++].split("%");
info_map.put(InfoMapKey.CPU_SI, s[0].trim());
s = parts[part_num++].split("%");
info_map.put(InfoMapKey.CPU_ST, s[0].trim());

//4
part_num = 0;
parts = lines[line_num++].split(",");
s = parts[part_num++].split(":");
s2 = s[1].split("k");
info_map.put(InfoMapKey.MEM_TOTAL, s2[0].trim());
s = parts[part_num++].split("k");
info_map.put(InfoMapKey.MEM_USED, s[0].trim());
s = parts[part_num++].split("k");
info_map.put(InfoMapKey.MEM_FREE, s[0].trim());
s = parts[part_num++].split("k");
info_map.put(InfoMapKey.MEM_BUFFER, s[0].trim());

//5
part_num = 0;
parts = lines[line_num++].split(",");
s = parts[part_num++].split(":");
s2 = s[1].split("k");
info_map.put(InfoMapKey.SWAP_TOTAL, s2[0].trim());
s = parts[part_num++].split("k");
info_map.put(InfoMapKey.SWAP_USED, s[0].trim());
s = parts[part_num++].split("k");
info_map.put(InfoMapKey.SWAP_FREE, s[0].trim());
s = parts[part_num++].split("k");
info_map.put(InfoMapKey.SWAP_CACHED, s[0].trim());

return (HashMap<String, String>) info_map.clone();
}


在client端送hash_map:

public class MClient {

public static void main(String[] args) throws Exception {
int count = 0;

Socket socket = new Socket(SocketSetting.SERVER_IP, SocketSetting.SERVER_PORT);
ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());

while (true) {
//           HashFunction.printMap(MySystemMonitor.getInfoHashMap());
os.writeObject(MySystemMonitor.getInfoHashMap());
os.flush();

TimeUnit.MINUTES.sleep(1);
if(count ++ > 10)
break;
}
socket.close();
}

}


在server端收has_map:

private static void invoke(final Socket client) throws IOException {
new Thread(new Runnable() {
public void run() {
ObjectInputStream in = null;
try {
MongoClient mongoClient = null;
mongoClient = new MongoClient();
SysInfoRecord info_record = new SysInfoRecord(mongoClient);
in = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));

while (true) {
Object obj = in.readObject();
@SuppressWarnings("unchecked")
HashMap<String,String> info_map = (HashMap<String,String>)obj;
//	                    HashFunction.printMap(info_map);
info_record.insertByMap(info_map);
}
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
} finally {
try {
in.close();
} catch (Exception e) {
}
try {
client.close();
} catch (Exception e) {
}
}
}
}).start();
}


MongoDB部分:

public class SysInfoRecord {
String db_name = DbSetting.SYS_INFO_DB;
String coll_name = DbSetting.SYS_INFO_RECORD;
private DBCollection coll;

public SysInfoRecord(MongoClient mongoClient){
DB db = mongoClient.getDB(db_name);
this.coll = db.getCollection(coll_name);
}

public boolean insertByMap(HashMap<String,String> map){
BasicDBObject info_record = new BasicDBObject(InfoMapKey.IP, map.get(InfoMapKey.IP)).
append(InfoMapKey.REPORT_TIME, map.get(InfoMapKey.REPORT_TIME)).
append(InfoMapKey.EXIST_TIME, map.get(InfoMapKey.EXIST_TIME)).
append(InfoMapKey.USER_NUM, Integer.parseInt(map.get(InfoMapKey.USER_NUM))).
append(InfoMapKey.LOAD_AVERAGE, new BasicDBObject("1 min", Float.parseFloat(map.get(InfoMapKey.LOAD_AVERAGE_1))).
append("5 min",Float.parseFloat(map.get(InfoMapKey.LOAD_AVERAGE_5))).
append("15 min",Float.parseFloat(map.get(InfoMapKey.LOAD_AVERAGE_15)))).
append(InfoMapKey.TASK, new BasicDBObject("total", Integer.parseInt(map.get(InfoMapKey.TASK_TOTAL))).
append("running",Integer.parseInt(map.get(InfoMapKey.TASK_RUNNING))).
append("sleeping",Integer.parseInt(map.get(InfoMapKey.TASK_SLEEPING))).
append("stopped",Integer.parseInt(map.get(InfoMapKey.TASK_STOPPED))).
append("zombie",Integer.parseInt(map.get(InfoMapKey.TASK_ZOMBIE)))).
append(InfoMapKey.CPU, new BasicDBObject("us", Float.parseFloat(map.get(InfoMapKey.CPU_US))).
append("sy",Float.parseFloat(map.get(InfoMapKey.CPU_SY))).
append("ni",Float.parseFloat(map.get(InfoMapKey.CPU_NI))).
append("id",Float.parseFloat(map.get(InfoMapKey.CPU_ID))).
append("wa",Float.parseFloat(map.get(InfoMapKey.CPU_WA))).
append("hi",Float.parseFloat(map.get(InfoMapKey.CPU_HI))).
append("si",Float.parseFloat(map.get(InfoMapKey.CPU_SI))).
append("st",Float.parseFloat(map.get(InfoMapKey.CPU_ST)))).
append(InfoMapKey.MEM, new BasicDBObject("total", Integer.parseInt(map.get(InfoMapKey.MEM_TOTAL))).
append("used",Integer.parseInt(map.get(InfoMapKey.MEM_USED))).
append("free",Integer.parseInt(map.get(InfoMapKey.MEM_FREE))).
append("buffer",Integer.parseInt(map.get(InfoMapKey.MEM_BUFFER)))).
append(InfoMapKey.SWAP, new BasicDBObject("total", Integer.parseInt(map.get(InfoMapKey.SWAP_TOTAL))).
append("used",Integer.parseInt(map.get(InfoMapKey.SWAP_USED))).
append("free",Integer.parseInt(map.get(InfoMapKey.SWAP_FREE))).
append("cached",Integer.parseInt(map.get(InfoMapKey.SWAP_CACHED))));

coll.insert(info_record);

return true;
}
}


一些用于设置的就省略了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: