springboot-admin自定義事件通知

springboot-admin組建已經提供了不少開箱即用的通知器(例如郵件),但在有些業務場景下咱們須要作一些企業內部的通知渠道,這就須要咱們來自定義通知器。java

實現其實很簡單,只須要往spring注入一個Notifier類型的實例便可。spring

固然,咱們不會直接實現Notifier,而是選擇繼承AbstractStatusChangeNotifier。json

import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.stereotype.Service;

import com.google.gson.Gson;
import com.google.gson.JsonObject;

import de.codecentric.boot.admin.event.ClientApplicationEvent;
import de.codecentric.boot.admin.event.ClientApplicationStatusChangedEvent;
import de.codecentric.boot.admin.model.Application;
import de.codecentric.boot.admin.notify.AbstractStatusChangeNotifier;
import lombok.extern.slf4j.Slf4j;

/**
 * 自定義的事件通知者
 * @author yangzhilong
 *
 */
@Slf4j
@Service
public class CustomNotifier extends AbstractStatusChangeNotifier {
    @Override
    protected void doNotify(ClientApplicationEvent event) throws Exception {
        if (event instanceof ClientApplicationStatusChangedEvent) {
            ClientApplicationStatusChangedEvent statusChange = (ClientApplicationStatusChangedEvent) event;
            // down表示服務裏部分中間件有問題
            // offline表示服務沒法http訪問了
            //if ((statusChange.getTo().isOffline() || statusChange.getTo().isDown()) && !statusChange.getFrom().isUnknown()) {
            if (statusChange.getTo().isOffline() && !statusChange.getFrom().isUnknown()) {
                DateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Application application = event.getApplication();
                // 服務名稱
                String appName = application.getName();
                // 實例名稱(在eureka中註冊的惟一id)
                String instance = application.getId();
                // 事件發生的時間
                String time = sf.format(new Date(event.getTimestamp()));
                // 服務器的ip
                URL url = new URL(statusChange.getApplication().getServiceUrl());
                String server = url.getHost();
                
                // 封裝成自定義事件對象
                JsonObject json = new JsonObject();
                json.addProperty("appName", appName.concat(":").concat(instance));
                json.addProperty("server", server);
                json.addProperty("from", statusChange.getFrom().getStatus());
                json.addProperty("to", statusChange.getTo().getStatus());
                json.addProperty("time", time);
                // 事件的所有信息
                json.addProperty("details", new Gson().toJson(event));
                
                log.warn("warn event !!!!,content is:{}", json.toString());
            }
        }
    }

    @Override
    protected boolean shouldNotify(ClientApplicationEvent event) {
        return super.shouldNotify(event);
    }
}

須要說明的是:當調用pause或者erueka的rest來下線服務,並預留點時間後kill服務是不會被認爲是告警,直接kill 或者 shutdown是會被認爲是異常下線的。springboot

相關文章
相關標籤/搜索