背景: 在大型系统中,线上异常出现是必然的结果,那么我们该如何尽可能在早期就发现应用运行有问题并及时的处理以免扩大影响范围呢?
答案是 给应用加监控并告警错误信息。
本文借助SpringBoot +钉钉来实现应用的监控告警,当然也可以借助企业微信、短信通知等等
看了一下钉钉的文档,可发现通过调用Webhook地址可将告警消息发送到群聊里来实现消息通知的功能
实现步骤
获取调用地址
- 先创建一个钉钉群,并创建自定义机器人
选择其中一项安全设置,可加强安全性,防止Webhook地址泄密被乱发消息
- 创建成功,复制Webhook地址,等下需要用到
创建SpringBoot应用
- 项目结构
WarnService
定义上报错误信息的接口
错误信息会添加到队列里MonitorMessageQueue
interface WarnService {
fun reportErrorMsg(moduleName: String, msg: String)
}
@Service
class WarnServiceImpl : WarnService {
@Autowired
private lateinit var monitorMessageQueue: MonitorMessageQueue
override fun reportErrorMsg(moduleName: String, msg: String) {
monitorMessageQueue.add(MessageDto().apply {
this.moduleName = moduleName
this.content = msg
this.timestamp = System.currentTimeMillis()
})
}
MonitorMessageQueue队列
队列提供的方法
- start:启动守护线程
- drain:等待超时返回队列元素,这里设置30秒超时返回
- add:添加元素到队列里
@Component
@Scope("singleton")
class MonitorMessageQueue {
private val queue: BlockingQueue<MessageDto> = LinkedBlockingQueue()
private val logger = LoggerFactory.getLogger(MonitorMessageQueue::class.java)
@Autowired
private lateinit var sendService: DataSendService
@PostConstruct
private fun start() {
logger.info("MonitorMessageQueue start")
val thread = Thread(