返回
用现代互联网框架解析系统异常告警<#
后端
2023-12-05 13:15:13
<#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);
}
}
如此,便可实现系统异常自动告警。若是想增加告警内容的丰富性,可以考虑引入更多日志信息。若想增强系统的可用性,也可以考虑使用消息队列来代替定时任务。