package com.alibaba.doris.admin.service.impl; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; import org.springframework.beans.BeanUtils; import com.alibaba.doris.admin.dao.NamespaceDao; import com.alibaba.doris.admin.dao.PrefLogDao; import com.alibaba.doris.admin.dataobject.NamespaceDO; import com.alibaba.doris.admin.dataobject.PrefLogDO; import com.alibaba.doris.admin.service.MonitorService; import com.alibaba.doris.admin.support.PrefQuery; import com.alibaba.doris.admin.support.PrefStatObject; public class MonitorServiceImpl implements MonitorService { private PrefLogDao prefLogDao; private NamespaceDao namespaceDao; public void setPrefLogDao(PrefLogDao prefLogDao) { this.prefLogDao = prefLogDao; } public void setNamespaceDao(NamespaceDao namespaceDao) { this.namespaceDao = namespaceDao; } public void info(String subject, String detail) { // TODO Auto-generated method stub } public void error(String subject, String detail) { // TODO Auto-generated method stub } public void savePrefReports(List<PrefLogDO> reports) { if (reports == null || reports.size() == 0) { return; } prefLogDao.batchInsert(reports); } public List<PrefStatObject> statByQuery(PrefQuery query) { if (query == null || query.getGmtStart() == null) { throw new IllegalArgumentException("invalid param"); } return convert(prefLogDao.statByQuery(query)); } public List<PrefStatObject> statWithNameSpace(PrefQuery query) { if (query == null || query.getGmtStart() == null) { throw new IllegalArgumentException("invalid param"); } return convert(prefLogDao.statWithNameSpace(query)); } public List<PrefStatObject> statWithPhysicalId(PrefQuery query) { if (query == null || query.getGmtStart() == null) { throw new IllegalArgumentException("invalid param"); } return convert(prefLogDao.statWithPhysicalId(query)); } private List<PrefStatObject> convert(List<PrefLogDO> tmplist) { if (tmplist == null || tmplist.size() == 0) { return Collections.emptyList(); } List<PrefStatObject> result = new ArrayList<PrefStatObject>(); long current = System.currentTimeMillis(); for (PrefLogDO prefLog : tmplist) { if (prefLog == null) { continue; } PrefStatObject prefStatObject = new PrefStatObject(); BeanUtils.copyProperties(prefLog, prefStatObject); //get namespace Name by namespace id try { int namespaceId = Integer.parseInt(prefStatObject.getNameSpace()); NamespaceDO ns = namespaceDao.queryNamespaceById(namespaceId); if (ns != null) { prefStatObject.setNameSpace(ns.getName()); } } catch (Exception e) { //ignore it } long op = prefLog.getTotalOperations(); long bytes = prefLog.getTotalBytes(); long latency = prefLog.getTotalLatency(); long timeUsed = (current - prefLog.getTimeStart().getTime()) / 1000; prefStatObject.setOps((double) op / timeUsed); prefStatObject.setBps((double) bytes / timeUsed); prefStatObject.setAvgLatency((double) latency / op); result.add(prefStatObject); } return result; } public void archiveWithTx(int hourBefore) { int i = 10;//循环次数控制 Calendar before = Calendar.getInstance(); before.add(Calendar.HOUR_OF_DAY, 0 - hourBefore); before.set(Calendar.MINUTE, 0); before.set(Calendar.SECOND, 0); while (--i > 0) { Date minStartDate = prefLogDao.getMinTimeStart(before.getTime()); if (minStartDate == null) { return; } Date timeStart = minStartDate; Calendar c = Calendar.getInstance(); c.setLenient(false); c.setTime(timeStart); c.add(Calendar.DATE, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); Date timeEnd = c.getTime(); List<PrefLogDO> tmplist = prefLogDao.queryNeedArchive(timeStart, timeEnd); if (tmplist != null) { prefLogDao.batchInsertToArchived(tmplist); prefLogDao.deleteRecoredByTime(timeStart, timeEnd); } } } public void deletePrefLogArchive(int dayBefore) { Calendar before = Calendar.getInstance(); before.add(Calendar.DATE, -1); before.set(Calendar.HOUR_OF_DAY, 0); before.set(Calendar.MINUTE, 0); before.set(Calendar.SECOND, 0); prefLogDao.deleteArchivedRecoredByTime(before.getTime()); } }