java实现30分钟内不重复告警工具

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);
    }
}

最后若是有不足的地方,希望大家指出。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值