package com.baidu.disconf.web.tasks.impl; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.baidu.disconf.web.config.ApplicationPropertyConfig; import com.baidu.disconf.web.service.app.bo.App; import com.baidu.disconf.web.service.app.service.AppMgr; import com.baidu.disconf.web.service.config.form.ConfListForm; import com.baidu.disconf.web.service.config.service.ConfigMgr; import com.baidu.disconf.web.service.config.vo.ConfListVo; import com.baidu.disconf.web.service.env.bo.Env; import com.baidu.disconf.web.service.env.service.EnvMgr; import com.baidu.disconf.web.service.zookeeper.dto.ZkDisconfData.ZkDisconfDataItem; import com.baidu.disconf.web.service.zookeeper.service.ZkDeployMgr; import com.baidu.disconf.web.tasks.IConfigConsistencyMonitorService; import com.baidu.dsp.common.interceptor.session.SessionInterceptor; import com.baidu.dsp.common.utils.email.LogMailBean; import com.baidu.ub.common.db.DaoPageResult; import com.github.knightliao.apollo.utils.tool.TokenUtil; /** * http://blog.csdn.net/sd4000784/article/details/7745947 <br/> * http://blog.sina.com.cn/s/blog_6925c03c0101d1hi.html * * @author knightliao */ @Component public class ConfigConsistencyMonitorServiceImpl implements IConfigConsistencyMonitorService { protected static final Logger LOG = LoggerFactory.getLogger(ConfigConsistencyMonitorServiceImpl.class); @Autowired private ApplicationPropertyConfig applicationPropertyConfig; @Autowired private ZkDeployMgr zkDeployMgr; @Autowired private AppMgr appMgr; @Autowired private EnvMgr envMgr; @Autowired private ConfigMgr configMgr; @Autowired private LogMailBean logMailBean; // 每3分钟执行一次自动化校验 //@Scheduled(fixedDelay = 3 * 60 * 1000) @Override public void myTest() { LOG.info("task schedule just testing, every 1 min"); } /** * */ // 每30分钟执行一次自动化校验 @Scheduled(fixedDelay = 30 * 60 * 1000) @Override public void check() { MDC.put(SessionInterceptor.SESSION_KEY, TokenUtil.generateToken()); /** * */ if (!applicationPropertyConfig.isCheckConsistencyOn()) { return; } try { Thread.sleep(1000 * 10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } checkMgr(); return; } /** * 主check MGR */ private void checkMgr() { List<App> apps = appMgr.getAppList(); List<Env> envs = envMgr.getList(); // app for (App app : apps) { checkAppConfigConsistency(app, envs); } } /** * 校验APP 一致性 */ private void checkAppConfigConsistency(App app, List<Env> envs) { // env for (Env env : envs) { // version List<String> versionList = configMgr.getVersionListByAppEnv(app.getId(), env.getId()); for (String version : versionList) { checkAppEnvVersionConfigConsistency(app, env, version); } } } /** * 校验APP/ENV/VERSION 一致性 */ private void checkAppEnvVersionConfigConsistency(App app, Env env, String version) { String monitorInfo = "monitor " + app.getName() + "\t" + env.getName() + "\t" + version; LOG.info(monitorInfo); // // // ConfListForm confiConfListForm = new ConfListForm(); confiConfListForm.setAppId(app.getId()); confiConfListForm.setEnvId(env.getId()); confiConfListForm.setVersion(version); // // // DaoPageResult<ConfListVo> daoPageResult = configMgr.getConfigList(confiConfListForm, true, true); // 准备发送邮件通知 String toEmails = appMgr.getEmails(app.getId()); List<ConfListVo> confListVos = daoPageResult.getResult(); List<String> errorList = new ArrayList<String>(); for (ConfListVo confListVo : confListVos) { if (confListVo.getErrorNum() != 0) { List<ZkDisconfDataItem> zkDisconfDataItems = confListVo.getMachineList(); for (ZkDisconfDataItem zkDisconfDataItem : zkDisconfDataItems) { if (zkDisconfDataItem.getErrorList().size() != 0) { String data = zkDisconfDataItem.toString() + "<br/><br/><br/><br/><br/><br/>original:" + confListVo.getValue(); LOG.warn(data); errorList.add(data + "<br/><br/><br/>"); } } } } if (errorList.size() != 0) { logMailBean.sendHtmlEmail(toEmails, " monitor ConfigConsistency ", monitorInfo + "<br/><br/><br/>" + errorList.toString()); } } }