/* * Copyright 1999-2018 Alibaba Group Holding Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.csp.sentinel.dashboard.discovery; import com.alibaba.csp.sentinel.dashboard.config.DashboardConfig; import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class AppInfo { private String app = ""; private Integer appType = 0; private Set machines = ConcurrentHashMap.newKeySet(); public AppInfo() {} public AppInfo(String app) { this.app = app; } public AppInfo(String app, Integer appType) { this.app = app; this.appType = appType; } public String getApp() { return app; } public void setApp(String app) { this.app = app; } public Integer getAppType() { return appType; } public void setAppType(Integer appType) { this.appType = appType; } /** * Get the current machines. * * @return a new copy of the current machines. */ public Set getMachines() { return new HashSet<>(machines); } @Override public String toString() { return "AppInfo{" + "app='" + app + ", machines=" + machines + '}'; } public boolean addMachine(MachineInfo machineInfo) { machines.remove(machineInfo); return machines.add(machineInfo); } public synchronized boolean removeMachine(String ip, int port) { Iterator it = machines.iterator(); while (it.hasNext()) { MachineInfo machine = it.next(); if (machine.getIp().equals(ip) && machine.getPort() == port) { it.remove(); return true; } } return false; } public Optional getMachine(String ip, int port) { return machines.stream() .filter(e -> e.getIp().equals(ip) && e.getPort().equals(port)) .findFirst(); } public Optional getMachine(String ip) { return machines.stream() .filter(e -> e.getIp().equals(ip)) .findFirst(); } private boolean heartbeatJudge(final int threshold) { if (machines.size() == 0) { return false; } if (threshold > 0) { long healthyCount = machines.stream() .filter(MachineInfo::isHealthy) .count(); if (healthyCount == 0) { // No healthy machines. return machines.stream() .max(Comparator.comparingLong(MachineInfo::getLastHeartbeat)) .map(e -> System.currentTimeMillis() - e.getLastHeartbeat() < threshold) .orElse(false); } } return true; } /** * Check whether current application has no healthy machines and should not be displayed. * * @return true if the application should be displayed in the sidebar, otherwise false */ public boolean isShown() { return heartbeatJudge(DashboardConfig.getHideAppNoMachineMillis()); } /** * Check whether current application has no healthy machines and should be removed. * * @return true if the application is dead and should be removed, otherwise false */ public boolean isDead() { return !heartbeatJudge(DashboardConfig.getRemoveAppNoMachineMillis()); } }