分布式系统监控(六)- 预警

背景

前面一章节介绍了如何使用storm将日志信息进行实时统计,并将相关信息汇总为指标模型的数据。
在实际业务场景中,这些数据都需要定时自动执行规则,判断指标有没有发生异常。
如果有异常就通过邮件,短信等方式提醒系统维护人员。
本案例中主要是监控每个物理结点所部署的组件进程,如果进程信息长时间没有更新到,有可能该进程就挂掉了。
需要发送一封邮件提醒系统维护人员。

实现方案

1.新建一个spring-boot工程,工程结构如下图所示:


分布式系统监控(六)- 预警_第1张图片
spring-boot.png

2.通过spring-schdule定时执行计划任务。

@EnableScheduling
@Configuration
@ComponentScan(basePackages="com.going.storm.monitor.schedule")
public class ScheduleConfig {
}
@Component
public class ProcessAnalyzeTask {
    
    private Logger logger = LoggerFactory.getLogger(ProcessAnalyzeTask.class);
    
    @Autowired
    private ProcessAnalyzeService processAnalyzeService;

    @Autowired
    private MailService mailService;
    
    /**
     * 每个小时的5分和35分执行一次
     * @throws Exception
     */
    @Scheduled(cron ="* 5,35 * * * *")
    public void execute() throws Exception {
        logger.info("进程分析开始...");
        String problemReport = processAnalyzeService.getProcessProblemInfo();
        if(problemReport == null || "".equals(problemReport.trim()))
            return;
        mailService.sendSimpleMail("[email protected]", null, "ab-internet预警["+DateFormatUtils.format(new Date(), "yyyy-mm-dd hh:mm")+"]", problemReport);
        
        logger.info("进程分析结束...");
    }

}

3.通过一个服务类ProcessAnalyzeService从redis中读取storm-process中写入的物理结点的进程信息。分析统计数据,根据业务规则生成预警提示信息。

public interface ProcessAnalyzeService {
    String getProcessProblemInfo();
}

4.如果预警信息不为空,则通过MailService发送邮件到指定邮箱中。

public interface MailService {
    void sendSimpleMail(String to, String[] cc, String subject, String content);
}

其中特别需要注意的是redis需要配置一下序列化对象的实现方式,否则会出现乱码。

@EnableAutoConfiguration
@SpringBootApplication
public class Application {
    @Autowired
    private RedisTemplate redisTemplate;
    @Bean
    public RedisTemplate redisTemplateInit() {
        StringRedisSerializer redisSerializer = new StringRedisSerializer();
        // 设置序列化Key的实例化对象
        redisTemplate.setKeySerializer(redisSerializer);
        // 设置序列化Value的实例化对象
        redisTemplate.setValueSerializer(redisSerializer);
        //value hashmap序列化
        redisTemplate.setHashValueSerializer(redisSerializer);
        //key haspmap序列化
        redisTemplate.setHashKeySerializer(redisSerializer);
        return redisTemplate;
    }
    public static void main(String[] args) {
        System.setProperty("user.timezone", "Etc/GMT-8");
        SpringApplication.run(Application.class, args);
    }
}

该示例虽然比较简单,但是再复杂的预警系统也是为了实现这样一个简单的功能而演化而来的。只是要做到预警系统不与业务所绑定,还有很多事情需要去做。
比如:
*定义指标模型。
*将统计数据转换为模型指标。
*配置规则对指标进行匹配。
*配置预警报告信息的处理。
这基本就是一个预警系统的全部核心功能了。

你可能感兴趣的:(分布式系统监控(六)- 预警)