返回

用现代互联网框架解析系统异常告警<#

后端

<#title>用现代互联网框架解析系统异常告警<#/title>

避免不经意间丢失系统故障警告

事情的起因:笔者在服务器中运行的 OLAP 程序有时会因意外的错误而 "悄悄" 地宕机。更糟糕的是,系统在宕机时没有任何机制提醒笔者上线进行故障排除,这导致积压在消息队列的 msg 迟迟得不到处理。为避免类似的情况再次发生,我决定开发一个告警系统,以便在系统出现故障时能够及时收到通知。

恰好最近在学习SpringBoot,于是便使用SpringBoot构建一个报警应用,使用Java mail来实现邮件发送功能。同时使用定时任务,每隔一段时间查询系统日志,一旦发现异常便会以邮件形式发出警报,这样就能第一时间知晓系统问题,以便及时采取措施。

SpringBoot 与 Java Mail 的联袂协作

SpringBoot 为我们提供了开箱即用的电子邮件发送解决方案,其中使用Java Mail API来发送电子邮件。

首先,我们需要在SpringBoot应用程序中添加Java Mail的依赖。

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>

在 SpringBoot 应用程序中,我们需要对 Java Mail 进行配置。

@Configuration
public class EmailConfiguration {

    @Value("${spring.mail.host}")
    private String host;

    @Value("${spring.mail.port}")
    private int port;

    @Value("${spring.mail.username}")
    private String username;

    @Value("${spring.mail.password}")
    private String password;

    @Bean
    public JavaMailSender javaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost(host);
        mailSender.setPort(port);
        mailSender.setUsername(username);
        mailSender.setPassword(password);

        Properties props = new Properties();
        props.put("mail.smtp.auth", true);
        props.put("mail.smtp.starttls.enable", true);
        mailSender.setJavaMailProperties(props);
        return mailSender;
    }
}

配置好 Java Mail 后,就可以使用JavaMailSender来发送电子邮件了。

@Service
public class EmailService {

    @Autowired
    private JavaMailSender javaMailSender;

    public void sendEmail(String to, String subject, String body) {
        MimeMessage message = javaMailSender.createMimeMessage();
        try {
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject(subject);
            message.setText(body);
            javaMailSender.send(message);
        } catch (MessagingException e) {
            logger.error("发送邮件失败", e);
        }
    }
}

有了电子邮件发送的功能,接下来就可以来处理系统日志,发现异常便发出警报。这部分可以利用定时任务来实现。

@Scheduled(cron = "0 0/1 * * * ?")
public void checkSystemLogs() {
    List<String> errorLogs = readSystemLogs();
    if (errorLogs.size() > 0) {
        String errorMessage = String.join("\n", errorLogs);
        sendEmail("you@example.com", "系统异常告警", errorMessage);
    }
}

如此,便可实现系统异常自动告警。若是想增加告警内容的丰富性,可以考虑引入更多日志信息。若想增强系统的可用性,也可以考虑使用消息队列来代替定时任务。