/* * 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.util; import com.alibaba.csp.sentinel.cluster.ClusterStateManager; import com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterGroupEntity; import com.alibaba.csp.sentinel.dashboard.domain.cluster.ConnectionGroupVO; import com.alibaba.csp.sentinel.dashboard.domain.cluster.state.*; import com.alibaba.csp.sentinel.util.StringUtil; import java.util.*; /** * @author Eric Zhao * @since 1.4.1 */ public final class ClusterEntityUtils { public static List wrapToAppClusterServerState( List list) { if (list == null || list.isEmpty()) { return new ArrayList<>(); } Map map = new HashMap<>(); Set tokenServerSet = new HashSet<>(); // Handle token servers that belong to current app. for (ClusterUniversalStatePairVO stateVO : list) { int mode = stateVO.getState().getStateInfo().getMode(); if (mode == ClusterStateManager.CLUSTER_SERVER) { String ip = stateVO.getIp(); String serverId = ip + '@' + stateVO.getCommandPort(); ClusterServerStateVO serverStateVO = stateVO.getState().getServer(); map.computeIfAbsent(serverId, v -> new AppClusterServerStateWrapVO() .setId(serverId) .setIp(ip) .setPort(serverStateVO.getPort()) .setState(serverStateVO) .setBelongToApp(true) .setConnectedCount(serverStateVO.getConnection().stream() .mapToInt(ConnectionGroupVO::getConnectedCount) .sum() ) ); tokenServerSet.add(ip + ":" + serverStateVO.getPort()); } } // Handle token servers from other app. for (ClusterUniversalStatePairVO stateVO : list) { int mode = stateVO.getState().getStateInfo().getMode(); if (mode == ClusterStateManager.CLUSTER_CLIENT) { ClusterClientStateVO clientState = stateVO.getState().getClient(); if (clientState == null) { continue; } String serverIp = clientState.getClientConfig().getServerHost(); int serverPort = clientState.getClientConfig().getServerPort(); if (tokenServerSet.contains(serverIp + ":" + serverPort)) { continue; } // We are not able to get the commandPort of foreign token server directly. String serverId = String.format("%s:%d", serverIp, serverPort); map.computeIfAbsent(serverId, v -> new AppClusterServerStateWrapVO() .setId(serverId) .setIp(serverIp) .setPort(serverPort) .setBelongToApp(false) ); } } return new ArrayList<>(map.values()); } public static List wrapToAppClusterClientState( List list) { if (list == null || list.isEmpty()) { return new ArrayList<>(); } Map map = new HashMap<>(); for (ClusterUniversalStatePairVO stateVO : list) { int mode = stateVO.getState().getStateInfo().getMode(); if (mode == ClusterStateManager.CLUSTER_CLIENT) { String ip = stateVO.getIp(); String clientId = ip + '@' + stateVO.getCommandPort(); ClusterClientStateVO clientStateVO = stateVO.getState().getClient(); map.computeIfAbsent(clientId, v -> new AppClusterClientStateWrapVO() .setId(clientId) .setIp(ip) .setState(clientStateVO) .setCommandPort(stateVO.getCommandPort()) ); } } return new ArrayList<>(map.values()); } public static List wrapToClusterGroup(List list) { if (list == null || list.isEmpty()) { return new ArrayList<>(); } Map map = new HashMap<>(); for (ClusterUniversalStatePairVO stateVO : list) { int mode = stateVO.getState().getStateInfo().getMode(); String ip = stateVO.getIp(); if (mode == ClusterStateManager.CLUSTER_SERVER) { String serverAddress = getIp(ip); int port = stateVO.getState().getServer().getPort(); String targetAddress = serverAddress + ":" + port; map.computeIfAbsent(targetAddress, v -> new ClusterGroupEntity() .setBelongToApp(true).setMachineId(ip + '@' + stateVO.getCommandPort()) .setIp(ip).setPort(port) ); } } for (ClusterUniversalStatePairVO stateVO : list) { int mode = stateVO.getState().getStateInfo().getMode(); String ip = stateVO.getIp(); if (mode == ClusterStateManager.CLUSTER_CLIENT) { String targetServer = stateVO.getState().getClient().getClientConfig().getServerHost(); Integer targetPort = stateVO.getState().getClient().getClientConfig().getServerPort(); if (StringUtil.isBlank(targetServer) || targetPort == null || targetPort <= 0) { continue; } String targetAddress = targetServer + ":" + targetPort; ClusterGroupEntity group = map.computeIfAbsent(targetAddress, v -> new ClusterGroupEntity() .setBelongToApp(true).setMachineId(targetServer) .setIp(targetServer).setPort(targetPort) ); group.getClientSet().add(ip + '@' + stateVO.getCommandPort()); } } return new ArrayList<>(map.values()); } private static String getIp(String str) { if (str.contains(":")) { return str.split(":")[0]; } return str; } private ClusterEntityUtils() {} }