pinpoint源码分析之告警机制

告警规则

pinpoint源码分析之告警机制_第1张图片

页面中可以选择的告警规则保存在枚举类CheckerCategory中,每一种告警规则都有自己的createChecker方法创建自己的checker检测器。

告警检测

通过定时任务进行定时的检测是否有满足设置的告警规则的告警记录,有则按照配置的告警方式进行发出告警。

1.定时任务入口

 src/main/resources/batch/applicationContext-batch-schedule.xml

batchJobLauncher  alarmJob

2.批处理任务入口

src/main/resources/batch/applicationContext-alarmJob.xml

    
        
            
                
            
        
        
        	
        
    

    
        
            
        
    
    
    
    
    
    

每个步骤有三个操作,读取数据(对应reader),处理数据(对应processor),回写数据(对应writer)。这三者中的参数是按照顺序传递的。

3:AlarmReader源码分析

主要获取已有的应用以及配置的告警名称,通过实现read()方法然后将checker传递给process.

   // Checker出队,供processor使用,
    public AlarmChecker read() {
        return checkers.poll();
    }

    // 批处理之前,将应用的报警规则加入Checker之中
    @Override
    public void beforeStep(StepExecution stepExecution) {
        // 查询所有的应用
        List applicationList = applicationIndexDao.selectAllApplicationNames();
        // 根据应用用户配置的规则,添加Checker到队列当中
        for (Application application : applicationList) {
            addChecker(application);
        }
    }

    private void addChecker(Application application) {
        // 根据应用名称获取所有的规则,应用名称就是配置agent的时候,指定的applicationName
        List rules = alarmService.selectRuleByApplicationId(application.getName());
        long timeSlotEndTime = System.currentTimeMillis();
        Map collectorMap = new HashMap<>();
        // 遍历规则
        for (Rule rule : rules) {
            // CheckerCategory是一个枚举类,预置了所有的报警规则模版,比如失败请求次数、慢请求次数等
            com.navercorp.pinpoint.web.alarm.CheckerCategory checkerCategory = com.navercorp.pinpoint.web.alarm.CheckerCategory.getValue(rule.getCheckerName());
            // 数据收集器是为检验规则准备的,例如Rule是失败请求次数,但是次数从哪里来,就是从这个收集器来的
            DataCollector collector = collectorMap.get(checkerCategory.getDataCollectorCategory());
            if (collector == null) {
                collector = dataCollectorFactory.createDataCollector(checkerCategory, application, timeSlotEndTime);
                collectorMap.put(collector.getDataCollectorCategory(), collector);
            }

            //根据告警规则创建自己的checker
            AlarmChecker checker = checkerCategory.createChecker(collector, rule);
             // 加入队列
            checkers.add(checker);
        }

    }

4:AlarmProcessor

AlarmChecker是个抽象类,根据不同的告警规则实现的check()方法,进行检验是否满足检测器规则。
   public AlarmChecker process(AlarmChecker checker) {
        checker.check();
        return checker;
    }

5:AlarmWriter

主要是获得peocess检测后的结果,然后根据结果和告警发送方式进行发送告警。

    @Override
    public void write(List checkers) throws Exception {
        Map beforeCheckerResults = alarmService.selectBeforeCheckerResults(checkers.get(0).getRule().getApplicationId());

        // 遍历上面传递的Checker
        for (AlarmChecker checker : checkers) {
            CheckerResult beforeCheckerResult = beforeCheckerResults.get(checker.getRule().getRuleId());

            if (beforeCheckerResult == null) {
                beforeCheckerResult = new CheckerResult(checker.getRule().getRuleId(), checker.getRule().getApplicationId(), checker.getRule().getCheckerName(), false, 0, 1);
            }

            // 对上面的Processor标记的detected值进行检查
            if (checker.isDetected()) {
                sendAlarmMessage(beforeCheckerResult, checker);
            }

            // 记录报警历史
            alarmService.updateBeforeCheckerResult(beforeCheckerResult, checker);
        }
    }

    private void sendAlarmMessage(CheckerResult beforeCheckerResult, AlarmChecker checker) {
        if (isTurnToSendAlarm(beforeCheckerResult)) {
            // 是否配置了发送报警短信
            if (checker.isSMSSend()) {
                alarmMessageSender.sendSms(checker, beforeCheckerResult.getSequenceCount() + 1, stepExecution);
            }
            // 是否配置了发送报警邮件
            if (checker.isEmailSend()) {
                alarmMessageSender.sendEmail(checker, beforeCheckerResult.getSequenceCount() + 1, stepExecution);
            }
        }

    }

 

你可能感兴趣的:(coding,pinpoint,告警机制,源码分析)