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