package cn.me.fdfs.service.impl;
import cn.me.fdfs.service.BaseService;
import cn.me.fdfs.service.MonitorService;
import cn.me.fdfs.util.JsshProxy;
import cn.me.fdfs.util.Tools;
import cn.me.fdfs.vo.*;
import cn.me.fdfs.vo.StorageHour;
import com.jcraft.jsch.JSchException;
import org.csource.common.MyException;
import org.csource.fastdfs.*;
import org.hibernate.Query;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* Created with IntelliJ IDEA. User: devuser Date: 12-8-20 Time: 下午9:19 To
* change this template use File | Settings | File Templates.
*/
@Service
public class MonitorServiceImpl extends BaseService implements MonitorService {
private static final Logger logger = LoggerFactory
.getLogger(MonitorServiceImpl.class);
@Override
public List<Group> listGroupInfo() throws IOException, MyException,JSchException {
List<Group> result = new ArrayList<Group>();
// noinspection ConstantConditions
ClientGlobal.init(Tools.getClassPath() + "fdfs_client.conf");
logger.info("network_timeout=" + ClientGlobal.g_network_timeout + "ms");
logger.info("charset=" + ClientGlobal.g_charset);
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
if (trackerServer == null) {
return result;
}
StructGroupStat[] groupStats = tracker.listGroups(trackerServer);
if (groupStats == null) {
logger.error("ERROR! list groups error, error no: "
+ tracker.getErrorCode());
return result;
}
logger.info("group count: " + groupStats.length);
Date date = new Date();
for (StructGroupStat groupStat : groupStats) {
Group group = new Group();
BeanUtils.copyProperties(groupStat, group);
StructStorageStat[] storageStats = tracker.listStorages(
trackerServer, groupStat.getGroupName());
for (StructStorageStat storageStat : storageStats) {
Storage storage = new Storage();
BeanUtils.copyProperties(storageStat, storage);
storage.setCreated(date);
storage.setCurStatus(ProtoCommon
.getStorageStatusCaption(storageStat.getStatus()));
group.getStorageList().add(storage);
}
result.add(group);
}
String cmd = "ps -aux|grep fdfs";
for (Machine machine : Tools.machines) {
List<String> strList = new ArrayList<String>();
if(machine.isConfigType())
strList = Tools.exeRemoteConsole(machine.getIp(),
machine.getUsername(), machine.getPassword(), cmd);
else
strList = new JsshProxy(machine.getIp(),machine.getUsername(),machine.getPort(),machine.getSsh()).execute(cmd).getExecuteLines();
for (String str : strList) {
if (str.contains("storage.conf")) {
for (Group group : result) {
group.setCreated(date);
for (Storage storage : group.getStorageList()) {
if (machine.getIp().equalsIgnoreCase(
storage.getIpAddr())) {
String[] strArrray = str.replaceAll(" +", ",")
.split(",");
storage.setCpu(strArrray[2]);
storage.setMem(Float.parseFloat(strArrray[3]));
}
}
}
}
}
}
return result;
}
@SuppressWarnings("unchecked")
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public List<Group> listGroups() throws IOException, MyException {
List<Group> groups = new ArrayList<Group>();
Session session = getSession();
StringBuilder queryString = new StringBuilder(
"from Group as g GROUP BY groupName");
Query query = session.createQuery(queryString.toString());
groups = query.list();
return groups;
}
@SuppressWarnings("unchecked")
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public List<Storage> listStorage(String groupName) throws IOException,
MyException {
Session session = getSession();
StringBuilder queryString = new StringBuilder(
"from Storage as s where s.groupName='" + groupName
+ "' group by s.ipAddr");
Query query = session.createQuery(queryString.toString());
return query.list();
}
@SuppressWarnings("unchecked")
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public List<Storage> listStorageTop(String ipaddr) throws IOException,
MyException {
Session session = getSession();
StringBuilder queryString = new StringBuilder(
"from Storage as s where s.ipAddr='" + ipaddr
+ "' order by s.created desc");
Query query = session.createQuery(queryString.toString());
query.setMaxResults(10);
return query.list();
}
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public List<Line> getNetTrafficLines(String ip, String start, String end) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
List<Line> lines = new ArrayList<Line>();
Session session = getSession();
Date starttime, endtime;
String entity = "Storage";
try {
starttime = sdf.parse(start);
endtime = sdf.parse(end);
long second = endtime.getTime() - starttime.getTime();
if (second > 3600 * 1000 * 5 && second < 3600 * 1000 * 24 * 7) {
entity = "StorageHour";
} else if (second >= 3600 * 1000 * 24 * 7) {
entity = "StorageDay";
}
logger.info(second + "");
} catch (Exception e) {
logger.info("date parse error use default!");
Calendar calendar = Calendar.getInstance();
endtime = calendar.getTime();
calendar.add(Calendar.HOUR, -6);
starttime = calendar.getTime();
}
String hql = "from "
+ entity
+ " s where s.ipAddr=:ip and s.created between :starttime and :endtime order by s.created";
Query query = session.createQuery(hql);
List storages = query.setParameter("ip", ip)
.setParameter("starttime", starttime)
.setParameter("endtime", endtime).list();
Line uploadLine = new Line("上传流量");
Line downLoadLine = new Line("下载流量");
lines.add(uploadLine);
lines.add(downLoadLine);
for (int i = 0; i < storages.size(); i++) {
Object obj = storages.get(i);
Date created;
long upload;
long download;
if ("Storage".equals(entity)) {
Storage storage = (Storage) obj;
created = storage.getCreated();
upload = storage.getTotalUploadBytes() / (1024 * 1024);
download = storage.getTotalDownloadloadBytes() / (1024 * 1024);
} else if ("StorageHour".equals(entity)) {
StorageHour storage = (StorageHour) obj;
created = storage.getCreated();
upload = storage.getTotalUploadBytes() / (1024 * 1024);
download = storage.getTotalDownloadloadBytes() / (1024 * 1024);
} else {
StorageDay storage = (StorageDay) obj;
created = storage.getCreated();
upload = storage.getTotalUploadBytes() / (1024 * 1024);
download = storage.getTotalDownloadloadBytes() / (1024 * 1024);
}
uploadLine.getData().add(new Long[]{created.getTime(), upload});
downLoadLine.getData().add(
new Long[]{created.getTime(), download});
}
return lines;
}
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public List<Group> getAllGroups() throws IOException, MyException {
List<Group> result = new ArrayList<Group>();
Session session = getSession();
String str = "from Group as g GROUP BY groupName order by g.created desc";
Query query = session.createQuery(str);
query.setFirstResult(0);
query.setFetchSize(2);
result = query.list();
return result;
}
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public Line getListStoragesInfo(String ip, String startTime, String endTime)
throws IOException, MyException {
Line sc = new Line(ip);
sc.setName(ip);
System.out.println(startTime + "!!!!!!!!!!!!!!!!!!!" + endTime);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String start = null, end = null, d = sdf.format(new Date());
try {
start = (startTime == null || startTime.equals("")) ? "0000-00-00 00:00"
: startTime;
end = (endTime == null || endTime.equals("")) ? d : endTime;
} catch (Exception e) {
e.printStackTrace();
}
Session session = getSession();
String str = "from StorageHour as s where s.ipAddr='" + ip
+ "' and s.created between '" + start + "' and '" + end + "'"
+ " order by s.created desc";
System.out.println(str);
Query query = session.createQuery(str);
List<StorageHour> s = query.list();
for (int i = s.size() - 1; i >= 0; i--) {
Date created = s.get(i).getCreated();
if (created == null) {
continue;
}
sc.getData().add(
new Long[]{created.getTime(), s.get(i).getFreeMB()});
}
return sc;
}
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public List<Line> listStorageLines(String groupName) throws IOException,
MyException {
List<Line> lines = new ArrayList<Line>();
Session session = getSession();
List<Storage> storages = listStorage(groupName);
for (Storage s : storages) {
Query query = session
.createQuery("from Storage s where s.ipAddr=:ip order by s.created desc");
List<Storage> results = query.setParameter("ip", s.getIpAddr())
.setMaxResults(10).list();
Line line = new Line(s.getIpAddr()+"mem使用率");
Line line1 = new Line(s.getIpAddr()+"cpu使用率");
for (int i = results.size() - 1; i >= 0; i--) {
Storage ss = results.get(i);
line.getData()
.add(new Object[]{ss.getCreated().getTime(),
ss.getMem()});
line1.getData().add(new Object[]{ss.getCreated().getTime(),
Double.parseDouble(ss.getCpu())});
}
lines.add(line);
lines.add(line1);
}
return lines;
}
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public StorageHour getStorageByIp(String ip) throws IOException,
MyException {
System.out.println(ip);
StorageHour storages = new StorageHour();
Session session = getSession();
String str = "from StorageHour as s where s.ipAddr='" + ip
+ "' order by s.created desc";
Query query = session.createQuery(str);
query.setFirstResult(1);
query.setMaxResults(1);
storages = (StorageHour) query.list().get(0);
return storages;
}
@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = true)
public List<Line> getListFileCountStorage(String ip, String startTime,
String endTime) throws IOException, MyException {
List<Line> lines = new ArrayList<Line>();
Session session = getSession();
Date start = null, end = null, d1 = new Date();
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String format = sdf.format(d1);
start = (startTime == "" || startTime == null) ? sdf
.parse("0000-00-00 00:00") : sdf.parse(startTime);
end = (endTime == "" || endTime == null) ? sdf.parse(format) : sdf
.parse(endTime);
} catch (ParseException e) {
e.printStackTrace();
}
Query query = session
.createQuery("from StorageHour as s where s.ipAddr=:ip and s.created between :starttime and :endtime order by s.created");
List<StorageHour> storages = query.setString("ip", ip)
.setParameter("starttime", start).setParameter("endtime", end)
.list();
Line uploadLine = new Line("上传文件数量");
Line downLoadLine = new Line("下载文件数量");
lines.add(uploadLine);
lines.add(downLoadLine);
for (int i = 0; i <= storages.size() - 1; i++) {
long u = 0;
long d = 0;
if (i > 0) {
u = storages.get(i - 1).getSuccessUploadCount();
d = storages.get(i - 1).getSuccessDownloadCount();
}
StorageHour storage = storages.get(i);
Date created = storage.getCreated();
if (created == null) {
continue;
}
long totalUpload = storage.getSuccessUploadCount();
long totalDownload = storage.getSuccessDownloadCount();
uploadLine.getData().add(
new Long[]{created.getTime(), (totalUpload - u)});
downLoadLine.getData().add(
new Long[]{created.getTime(), (totalDownload - d)});
}
return lines;
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void saveFile(Fdfs_file f) throws IOException, MyException {
Session session = getSession();
session.save(f);
logger.info("fdfs_file sava as" + f.getFile_id());
}
@Override
@Transactional(propagation = Propagation.REQUIRED)
public List<GroupDay> getGroupsByName(String groupName) throws IOException,
MyException {
// To change body of implemented methods use File | Settings | File
// Templates.
List<GroupDay> result = new ArrayList<GroupDay>();
Session session = getSession();
String str = "from GroupDay as gd where gd.groupName=:groupName order by gd.created asc";
Query query = session.createQuery(str);
result = query.setParameter("groupName", groupName).list();
return result;
}
}