Skip to content

DengQin/warn-util

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 

Repository files navigation

warn-util

一个报警器工具:只是实现了报警池部分,报警池可以将数据异步输出到其他系统,由其他专门的报警系统来进行警报的管理和统计 即:
// 报警接口,将搜集的报警推送到某个系统,由某个系统继续具体的报警发放(需要自己实现)
static final String WARN_URL = "http://warn.xxx.com/ws/receive/receive.do";
// 消息发送接口,将报警发送到某个地方,比如发送QQ、邮件等(需要自己实现)
static final String SEND_MSG_URL = "http://warn.yyy.com/msg/send.do";
这2个接口需要自行构造系统实现

1、作用:
    1.1、可以监控业务和系统的运行情况
    2.1、在日志中加入报警输出源,可以监控上报系统中的异常情况

2、使用:
    2.1配置
    Warner.init(sysCode, heartbeatCode);
    2.2警报上报
    调用类com.dengqin.warn.Warner的 warn方法
    2.3收集异常数据
    	增加以下apperder
    logback:
    <!--异常收集 -->
    <appender name="gwarn" class="com.dengqin.warn.GwarnLogbackAppender">
    	<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    		<level>ERROR</level>
    	</filter>
    </appender>
    <root>
    	<level value="INFO" />
    	<appender-ref ref="gwarn" />
    </root>

    log4j:
    log4j.rootLogger=INFO,gwarn
    log4j.appender.gwarn=com.dengqin.warn.GwarnLog4jAppender
    log4j.appender.gwarn.Threshold = ERROR

    log4j2:
    <configuration packages="com.dengqin.warn">
    	<appenders>
    		<Gwarn name="gwarn">
    			<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
    		</Gwarn>
    	</appenders>
    	<loggers>
    		<root level="info">
    			<appender-ref ref="gwarn" />
    		</root>
    	</loggers>
    </configuration>
    ------------------------------------------------------------------------------------------------------
    2.4日志框架配置
    这种方式不能配置心跳监控
    logback:
    <appender name="gwarn" class="com.dengqin.warn.GwarnLogbackAppender">
    	<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    		<level>ERROR</level>
    	</filter>
    	<sysCode> ${sysCode}</sysCode>
    	<period>60</period>
    </appender>
    <root>
    	<level value="INFO" />
    	<appender-ref ref="gwarn" />
    </root>

    log4j:
    log4j.rootLogger=INFO,gwarn
    log4j.appender.gwarn=com.dengqin.warn.GwarnLog4jAppender
    log4j.appender.gwarn.Threshold = ERROR
    log4j.appender.gwarn.sysCode= ${sysCode}
    log4j.appender.gwarn.period=60

    log4j2:
    <configuration status="OFF" packages="com.dengqin.warn">
    	<appenders>
    		<Gwarn name="gwarn" sysCode="${sysCode}" period="60">
    			<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
    		</Gwarn>
    	</appenders>
    	<loggers>
    		<root level="info">
    			<appender-ref ref="gwarn" />
    		</root>
    	</loggers>
    </configuration>
    ------------------------------------------------------------------------------------------------------
    2.5监控线程是否运行正常
        2.5.1自己new线程或者用quartz 的情况
            使用这种方式要注意线程执行时的for循环操作,要及时更新线程信息。推荐用2.5.2的方法。
            1.初始化:Warner.initThreadMonitor(threadName, periodMs);
            2.每次运行线程:Warner.updateThreadRunInfo(threadName);
        2.5.2使用线程池的情况
            public class AppInitTables extends WarnThread {

            	@Override
            	public void doRun(long startTimeStamp) {
            		//业务处理
            	}

            	@Override
            	public long getPeriod() {
            		return AbstractCMD.THOUSAND * 3600 * 24;
            	}
            }

            main方法,该类继承AbstractCMD:
            WarnThread appInitTables = new AppInitTables(...);
            ScheduledThreadPoolExecutor exector = createScheduledThreadPoolExecutor(8);
            scheduleAtFixedRate(exector, appInitTables);

            AbstractCMD.java:
            public final static long THOUSAND = 1000L;
            static void scheduleAtFixedRate(ScheduledThreadPoolExecutor exector, WarnThread warnThread) {
            	exector.scheduleAtFixedRate(warnThread, THOUSAND, warnThread.getPeriod(), TimeUnit.MILLISECONDS);
            }

            protected static final ScheduledThreadPoolExecutor createScheduledThreadPoolExecutor(int workThreadNum) {
            		final ScheduledThreadPoolExecutor poolExecutor = new ScheduledThreadPoolExecutor(workThreadNum);
            		// 设置有关在此执行程序已 shutdown 的情况下是否继续执行现有定期任务的策略。
            		poolExecutor.setContinueExistingPeriodicTasksAfterShutdownPolicy(true);
            		// 设置有关在此执行程序已 shutdown 的情况下是否继续执行现有延迟任务的策略。
            		poolExecutor.setExecuteExistingDelayedTasksAfterShutdownPolicy(true);
            		return poolExecutor;
            }

        2.5.3 needUpdateHeartbeat方法使用
        该方法作用:判断是否需要中断运行,for循环的任务,执行时间可能超过运行周期,这会产生误报,所以需要判断是否超了周期,跳出循环。
        	@Override
        	public void doRun(long startTimeStamp) {
        		List<OrderQueue> list = orderService.list(10000);
        		for (OrderQueue orderQueue : list) {
        			if (needUpdateHeartbeat (startTimeStamp)) {
        				break;或者 Warner.updateThreadRunInfo(getThreadName());
        			}
        			orderService.move(orderQueue);
        		}
        	}

About

报警工具,一个报警器

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages