ReformInstance.java 8.26 KB
package com.taover.heartbeat.bean;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.taover.util.UtilEmail;
import com.taover.util.UtilLog;
import com.taover.util.UtilWeixinMsg;

public class ReformInstance {	
	private List<String> emailToList;
	private List<String> weixinWxidList;
	private List<String> mobileList;
	
	public ReformInstance() {}
	
	public void doReform(Instance instance) {
		if(instance == null) {
			return;
		}
		if(this.emailToList != null && !this.emailToList.isEmpty()) {
			this.sendEmail(instance);
		}
		if(this.weixinWxidList != null && !this.weixinWxidList.isEmpty()) {
			this.sendWeixin(instance);
		}		
	}
	
	private void sendWeixin(Instance instance) {
		String weixinContent = "报警--项目可用性监控\n";
		if(instance instanceof ClientInstance) {
			weixinContent += this.formatWeixin((ClientInstance)instance);
		}else if(instance instanceof ServerInstance) {
			weixinContent += this.formatWeixin((ServerInstance)instance);
		}else {
			try {
				weixinContent += "  JSON序列化:"+JSONObject.toJSONString(instance);	
			}catch (Exception e) {
				weixinContent += "  对象无法序列化打印,instance.toString() ==>> "+instance.toString();
			}
		}
		try {
			for(String weixinWxid: this.weixinWxidList) {
				if(weixinWxid != null && !weixinWxid.trim().equals("")) {
					UtilWeixinMsg.sendTextMessage(weixinWxid, weixinContent);	
				}					
			}			
		} catch (Exception e) {
			UtilLog.infoForMessage("发送微信消息失败,消息内容:"+weixinContent, this.getClass());
			UtilLog.errorForException(e, this.getClass());			
		}
	}

	private String formatWeixin(ServerInstance instance) {
		String htmlContent = "";
		if(instance.getLatestServerResponse() == null) {
			htmlContent += "  未收到服务器响应\n";
		}else {
			if(instance.getLatestServerResponse().isOverdue()) {
				htmlContent += "  向服务器接口["+instance.getUrl()+"]发送请求,响应超时["+instance.getMaxWaitSec()+"s],请及时确认服务器是否正常运行\n";
			}else if(!instance.getLatestServerResponse().isCodeOk()) {
				htmlContent += "  向服务器接口["+instance.getUrl()+"]发送请求,响应数据不正常(详细请查看邮件),请及时确认服务器是否正常运行\n";
			}else {
				htmlContent += "  向服务器接口["+instance.getUrl()+"]发送请求,未知异常,请及时确认服务器是否正常运行\n";
			}
		}		
		htmlContent += "  最后一次请求时间: "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(instance.getLatestRequestUnixtime()*1000));
		return htmlContent;
	}

	private String formatWeixin(ClientInstance instance) {
		String htmlContent = "  超过"+instance.getFixRateSec()+"秒未收到请求,请确认CODE["+instance.getCode()+"]对应的客户端是否运行正常\n";
		htmlContent += "  客户端最后一次请求时间: "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(instance.getUnixtime()*1000));
		htmlContent += "  客户端IP:"+instance.getIp();
		return htmlContent;
	}

	private void sendEmail(Instance instance) {
		String subject = "报警-项目可用性监控--监控ID["+instance.getIdentity()+"]";
		String htmlContent = "<h2>监控ID:"+instance.getIdentity()+"</h2>";		
		if(instance instanceof ClientInstance) {
			htmlContent += this.formatHtml((ClientInstance)instance);
		}else if(instance instanceof ServerInstance) {
			htmlContent += this.formatHtml((ServerInstance)instance);
		}else {
			try {
				htmlContent += "<p>"+JSONObject.toJSONString(instance)+"</p>";	
			}catch (Exception e) {
				htmlContent += "<span style=\"color:red;\">对象无法序列化打印,instance.toString() ==>> "+instance.toString()+"</span>";
			}
		}
		try {
			UtilEmail.sendHtmlMail(emailToList, subject, htmlContent);
		} catch (Exception e) {
			UtilLog.infoForMessage("发送邮件失败,消息内容:[标题:"+subject+"],[正文:"+htmlContent+"]", this.getClass());
			UtilLog.errorForException(e, this.getClass());			
		}
	}

	private String formatHtml(ServerInstance instance) {
		String htmlContent = "";
		htmlContent += "<h4 style=\"color:red;\">";
		if(instance.getLatestServerResponse() != null) {
			if(instance.getLatestServerResponse().isOverdue()) {
				htmlContent += "  向服务器接口["+instance.getUrl()+"]发送请求,响应超时["+instance.getMaxWaitSec()+"s],请及时确认服务器是否正常运行";
			}else if(!instance.getLatestServerResponse().isCodeOk()) {
				htmlContent += "  向服务器接口["+instance.getUrl()+"]发送请求,响应数据不正常(详细请查看邮件),请及时确认服务器是否正常运行";
			}else {
				htmlContent += "未知异常";	
			}
		}else {
			htmlContent += "未记录最后一次响应记录";
		}
		htmlContent += "</h4>";
		htmlContent += "<ul>";
		htmlContent += "<li>CODE: "+instance.getCode()+"</li>";
		htmlContent += "<li>URL: "+instance.getUrl()+"</li>";
		htmlContent += "<li>请求频率: "+instance.getFixRateSec()+"秒/次</li>";
		htmlContent += "<li>请求最大等待时间: "+instance.getMaxWaitSec()+"秒</li>";
		htmlContent += "<li>客户端请求时间戳: "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(instance.getLatestRequestUnixtime()*1000))+"</li>";
		htmlContent += "<li>最后一次收到的响应包: <span style=\"color:gray;\">"+JSON.toJSONString(instance.getLatestServerResponse())+"</span></li>";
		htmlContent += "</ul>";
		return htmlContent;
	}

	private String formatHtml(ClientInstance instance) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String htmlContent = "";
		htmlContent += "<h4 style=\"color:red;\">";
		htmlContent += "超过"+instance.getFixRateSec()+"秒未收到请求,请确认CODE["+instance.getCode()+"]对应的客户端是否运行正常<br />";
		htmlContent += "客户端最后一次请求时间: "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(instance.getUnixtime()*1000));
		htmlContent += "</h4>";
		htmlContent += "<ul>";
		htmlContent += "<li>CODE: "+instance.getCode()+"</li>";
		htmlContent += "<li>IP: "+instance.getIp()+"</li>";
		htmlContent += "<li>请求频率: "+instance.getFixRateSec()+"秒/次</li>";
		htmlContent += "<li>请求最大等待时间: "+instance.getMaxWaitSec()+"秒</li>";
		htmlContent += "<li>客户端请求时间戳: "+sdf.format(new Date(instance.getUnixtime()*1000))+"</li>";
		htmlContent += "<li>服务器接收时间: "+sdf.format(new Date(instance.getLastestServerUnixtime()*1000))+"</li>";
		htmlContent += "<li>最后一次收到的请求包: <span style=\"color:gray;\">"+JSON.toJSONString(instance.getLastestClientRequest())+"</span></li>";
		htmlContent += "</ul>";
		return htmlContent;
	}

	public void loadConfig(String emailTo, String weixinWxid, String mobile) {
		if(strNotBlank(emailTo)) {
			this.emailToList = Arrays.asList(emailTo.split(","));
		}
		if(strNotBlank(weixinWxid)) {
			this.weixinWxidList = Arrays.asList(weixinWxid.split(","));
		}
		if(strNotBlank(mobile)) {
			this.mobileList = Arrays.asList(mobile.split(","));
		}
	}

	public void loadConfig(Map<String, String> data) {
		Object emailTo = data.get("emailTo");
		if(emailTo != null && strNotBlank(emailTo.toString())) {
			this.emailToList = Arrays.asList(emailTo.toString().split(","));
		}
		Object weixinWxid = data.get("weixinWxid");
		if(weixinWxid != null && strNotBlank(weixinWxid.toString())) {
			this.weixinWxidList = Arrays.asList(weixinWxid.toString().split(","));
		}
		Object mobile = data.get("mobile");
		if(mobile != null && strNotBlank(mobile.toString())) {
			this.mobileList = Arrays.asList(mobile.toString().split(","));
		}
	}
	
	private boolean strNotBlank(String data) {
		return !(data == null || data.trim().equals(""));
	}

	public List<String> getEmailToList() {
		return emailToList;
	}

	public void setEmailToList(List<String> emailToList) {
		this.emailToList = emailToList;
	}

	public List<String> getWeixinWxidList() {
		return weixinWxidList;
	}

	public void setWeixinWxidList(List<String> weixinWxidList) {
		this.weixinWxidList = weixinWxidList;
	}

	public List<String> getMobileList() {
		return mobileList;
	}

	public void setMobileList(List<String> mobileList) {
		this.mobileList = mobileList;
	}
}