java实现30分钟内不重复告警工具
今天在做项目时碰到了一个需求,该项目需要监控web应用的接口调用情况,当超过设置的调用次数阈值(比如某接口一分钟调用超过100次)后进行微信告警。由于对接的是公司内部的微信告警平台,而告警平台暂时未提供一些配置,比如某报警信息30分钟不重复报送之类的。所以就在本地项目开发一个告警工具,实现30分钟内不重复报警。该工具暂不支持集群。
public class AlarmUtil {
private static final Logger logger = LoggerFactory.getLogger(AlarmUtil.class);
private static final AlarmUtil ALARMUTIL = new AlarmUtil();
private static final String PROFILE = "prod";
//30分钟内不重复告警
public static final ConcurrentHashMap<String, Date> ALARMMSG = new ConcurrentHashMap<>();
private AlarmUtil() {
}
/**
* 用于判断30分钟的内的起始时间
*/
public static Date startTime = DateUtils.addMinutes(new Date(), -1);
//告警间隔 单位分钟 默认30分钟
private static final long ALARM_TIME_INTERVAL = 1800000;
public static synchronized void alarm(AlarmParam param, String alarmUrl, String env, Date value) {
//正式环境告警
if (!PROFILE.equalsIgnoreCase(env)) {
return;
}
Long interval = value.getTime() - startTime.getTime();
String key = param.getMessage();
//如果间隔超过30分钟,先清空map
if (interval > ALARM_TIME_INTERVAL) {
ALARMMSG.clear();
//设置时段
int num = (int) (interval / ALARM_TIME_INTERVAL);
startTime = new Date(num * ALARM_TIME_INTERVAL + startTime.getTime());
} else if (interval <= ALARM_TIME_INTERVAL && interval >= 0) {
logger.info(key + "告警时间是30分钟内");
} else {
logger.error("告警起始日期出错!");
return;
}
if (!ALARMMSG.containsKey(key)) {
//调用告警接口,可以采用异步方式,自定义告警线程
}
ALARMMSG.put(key, value);
}
}
最后若是有不足的地方,希望大家指出。