Search in sources :

Example 11 with AppInfo

use of com.alibaba.csp.sentinel.dashboard.discovery.AppInfo in project RuoYi-Cloud-Plus by JavaLionLi.

the class MetricFetcher method fetchOnce.

/**
 * fetch metric between [startTime, endTime], both side inclusive
 */
private void fetchOnce(String app, long startTime, long endTime, int maxWaitSeconds) {
    if (maxWaitSeconds <= 0) {
        throw new IllegalArgumentException("maxWaitSeconds must > 0, but " + maxWaitSeconds);
    }
    AppInfo appInfo = appManagement.getDetailApp(app);
    // auto remove for app
    if (appInfo.isDead()) {
        logger.info("Dead app removed: {}", app);
        appManagement.removeApp(app);
        return;
    }
    Set<MachineInfo> machines = appInfo.getMachines();
    logger.debug("enter fetchOnce(" + app + "), machines.size()=" + machines.size() + ", time intervalMs [" + startTime + ", " + endTime + "]");
    if (machines.isEmpty()) {
        return;
    }
    final String msg = "fetch";
    AtomicLong unhealthy = new AtomicLong();
    final AtomicLong success = new AtomicLong();
    final AtomicLong fail = new AtomicLong();
    long start = System.currentTimeMillis();
    /**
     * app_resource_timeSecond -> metric
     */
    final Map<String, MetricEntity> metricMap = new ConcurrentHashMap<>(16);
    final CountDownLatch latch = new CountDownLatch(machines.size());
    for (final MachineInfo machine : machines) {
        // auto remove
        if (machine.isDead()) {
            latch.countDown();
            appManagement.getDetailApp(app).removeMachine(machine.getIp(), machine.getPort());
            logger.info("Dead machine removed: {}:{} of {}", machine.getIp(), machine.getPort(), app);
            continue;
        }
        if (!machine.isHealthy()) {
            latch.countDown();
            unhealthy.incrementAndGet();
            continue;
        }
        final String url = "http://" + machine.getIp() + ":" + machine.getPort() + "/" + METRIC_URL_PATH + "?startTime=" + startTime + "&endTime=" + endTime + "&refetch=" + false;
        final HttpGet httpGet = new HttpGet(url);
        httpGet.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
        httpclient.execute(httpGet, new FutureCallback<HttpResponse>() {

            @Override
            public void completed(final HttpResponse response) {
                try {
                    handleResponse(response, machine, metricMap);
                    success.incrementAndGet();
                } catch (Exception e) {
                    logger.error(msg + " metric " + url + " error:", e);
                } finally {
                    latch.countDown();
                }
            }

            @Override
            public void failed(final Exception ex) {
                latch.countDown();
                fail.incrementAndGet();
                httpGet.abort();
                if (ex instanceof SocketTimeoutException) {
                    logger.error("Failed to fetch metric from <{}>: socket timeout", url);
                } else if (ex instanceof ConnectException) {
                    logger.error("Failed to fetch metric from <{}> (ConnectionException: {})", url, ex.getMessage());
                } else {
                    logger.error(msg + " metric " + url + " error", ex);
                }
            }

            @Override
            public void cancelled() {
                latch.countDown();
                fail.incrementAndGet();
                httpGet.abort();
            }
        });
    }
    try {
        latch.await(maxWaitSeconds, TimeUnit.SECONDS);
    } catch (Exception e) {
        logger.info(msg + " metric, wait http client error:", e);
    }
    // long cost = System.currentTimeMillis() - start;
    // logger.info("finished " + msg + " metric for " + app + ", time intervalMs [" + startTime + ", " + endTime
    // + "], total machines=" + machines.size() + ", dead=" + dead + ", fetch success="
    // + success + ", fetch fail=" + fail + ", time cost=" + cost + " ms");
    writeMetric(metricMap);
}
Also used : MetricEntity(com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity) HttpGet(org.apache.http.client.methods.HttpGet) HttpResponse(org.apache.http.HttpResponse) CountDownLatch(java.util.concurrent.CountDownLatch) SocketTimeoutException(java.net.SocketTimeoutException) ConnectException(java.net.ConnectException) AppInfo(com.alibaba.csp.sentinel.dashboard.discovery.AppInfo) MachineInfo(com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo) AtomicLong(java.util.concurrent.atomic.AtomicLong) SocketTimeoutException(java.net.SocketTimeoutException) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) ConnectException(java.net.ConnectException)

Example 12 with AppInfo

use of com.alibaba.csp.sentinel.dashboard.discovery.AppInfo in project Sentinel by alibaba.

the class ClusterConfigService method getClusterUniversalStateForAppMachine.

public CompletableFuture<ClusterGroupEntity> getClusterUniversalStateForAppMachine(String app, String machineId) {
    if (StringUtil.isBlank(app)) {
        return AsyncUtils.newFailedFuture(new IllegalArgumentException("app cannot be empty"));
    }
    AppInfo appInfo = appManagement.getDetailApp(app);
    if (appInfo == null || appInfo.getMachines() == null) {
        return AsyncUtils.newFailedFuture(new IllegalArgumentException("app does not have machines"));
    }
    boolean machineOk = appInfo.getMachines().stream().filter(e -> e.isHealthy()).map(e -> e.getIp() + '@' + e.getPort()).anyMatch(e -> e.equals(machineId));
    if (!machineOk) {
        return AsyncUtils.newFailedFuture(new IllegalStateException("machine does not exist or disconnected"));
    }
    return getClusterUniversalState(app).thenApply(ClusterEntityUtils::wrapToClusterGroup).thenCompose(e -> e.stream().filter(e1 -> e1.getMachineId().equals(machineId)).findAny().map(CompletableFuture::completedFuture).orElse(AsyncUtils.newFailedFuture(new IllegalStateException("not a server: " + machineId))));
}
Also used : AppManagement(com.alibaba.csp.sentinel.dashboard.discovery.AppManagement) ClusterServerModifyRequest(com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterServerModifyRequest) ClusterUniversalStateVO(com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStateVO) ClusterGroupEntity(com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterGroupEntity) ClusterClientStateVO(com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterClientStateVO) Set(java.util.Set) Autowired(org.springframework.beans.factory.annotation.Autowired) CompletableFuture(java.util.concurrent.CompletableFuture) Collectors(java.util.stream.Collectors) AppInfo(com.alibaba.csp.sentinel.dashboard.discovery.AppInfo) ArrayList(java.util.ArrayList) ClusterClientModifyRequest(com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterClientModifyRequest) AsyncUtils(com.alibaba.csp.sentinel.dashboard.util.AsyncUtils) StringUtil(com.alibaba.csp.sentinel.util.StringUtil) ServerFlowConfig(com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig) List(java.util.List) ServerTransportConfig(com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig) SentinelApiClient(com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient) Service(org.springframework.stereotype.Service) ClusterUniversalStatePairVO(com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStatePairVO) ClusterEntityUtils(com.alibaba.csp.sentinel.dashboard.util.ClusterEntityUtils) ClusterClientConfig(com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig) ClusterStateManager(com.alibaba.csp.sentinel.cluster.ClusterStateManager) CompletableFuture(java.util.concurrent.CompletableFuture) AppInfo(com.alibaba.csp.sentinel.dashboard.discovery.AppInfo)

Example 13 with AppInfo

use of com.alibaba.csp.sentinel.dashboard.discovery.AppInfo in project Sentinel by alibaba.

the class MetricFetcher method fetchOnce.

/**
 * fetch metric between [startTime, endTime], both side inclusive
 */
private void fetchOnce(String app, long startTime, long endTime, int maxWaitSeconds) {
    if (maxWaitSeconds <= 0) {
        throw new IllegalArgumentException("maxWaitSeconds must > 0, but " + maxWaitSeconds);
    }
    AppInfo appInfo = appManagement.getDetailApp(app);
    // auto remove for app
    if (appInfo.isDead()) {
        logger.info("Dead app removed: {}", app);
        appManagement.removeApp(app);
        return;
    }
    Set<MachineInfo> machines = appInfo.getMachines();
    logger.debug("enter fetchOnce(" + app + "), machines.size()=" + machines.size() + ", time intervalMs [" + startTime + ", " + endTime + "]");
    if (machines.isEmpty()) {
        return;
    }
    final String msg = "fetch";
    AtomicLong unhealthy = new AtomicLong();
    final AtomicLong success = new AtomicLong();
    final AtomicLong fail = new AtomicLong();
    long start = System.currentTimeMillis();
    /**
     * app_resource_timeSecond -> metric
     */
    final Map<String, MetricEntity> metricMap = new ConcurrentHashMap<>(16);
    final CountDownLatch latch = new CountDownLatch(machines.size());
    for (final MachineInfo machine : machines) {
        // auto remove
        if (machine.isDead()) {
            latch.countDown();
            appManagement.getDetailApp(app).removeMachine(machine.getIp(), machine.getPort());
            logger.info("Dead machine removed: {}:{} of {}", machine.getIp(), machine.getPort(), app);
            continue;
        }
        if (!machine.isHealthy()) {
            latch.countDown();
            unhealthy.incrementAndGet();
            continue;
        }
        final String url = "http://" + machine.getIp() + ":" + machine.getPort() + "/" + METRIC_URL_PATH + "?startTime=" + startTime + "&endTime=" + endTime + "&refetch=" + false;
        final HttpGet httpGet = new HttpGet(url);
        httpGet.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
        httpclient.execute(httpGet, new FutureCallback<HttpResponse>() {

            @Override
            public void completed(final HttpResponse response) {
                try {
                    handleResponse(response, machine, metricMap);
                    success.incrementAndGet();
                } catch (Exception e) {
                    logger.error(msg + " metric " + url + " error:", e);
                } finally {
                    latch.countDown();
                }
            }

            @Override
            public void failed(final Exception ex) {
                latch.countDown();
                fail.incrementAndGet();
                httpGet.abort();
                if (ex instanceof SocketTimeoutException) {
                    logger.error("Failed to fetch metric from <{}>: socket timeout", url);
                } else if (ex instanceof ConnectException) {
                    logger.error("Failed to fetch metric from <{}> (ConnectionException: {})", url, ex.getMessage());
                } else {
                    logger.error(msg + " metric " + url + " error", ex);
                }
            }

            @Override
            public void cancelled() {
                latch.countDown();
                fail.incrementAndGet();
                httpGet.abort();
            }
        });
    }
    try {
        latch.await(maxWaitSeconds, TimeUnit.SECONDS);
    } catch (Exception e) {
        logger.info(msg + " metric, wait http client error:", e);
    }
    // long cost = System.currentTimeMillis() - start;
    // logger.info("finished " + msg + " metric for " + app + ", time intervalMs [" + startTime + ", " + endTime
    // + "], total machines=" + machines.size() + ", dead=" + dead + ", fetch success="
    // + success + ", fetch fail=" + fail + ", time cost=" + cost + " ms");
    writeMetric(metricMap);
}
Also used : MetricEntity(com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity) HttpGet(org.apache.http.client.methods.HttpGet) HttpResponse(org.apache.http.HttpResponse) CountDownLatch(java.util.concurrent.CountDownLatch) SocketTimeoutException(java.net.SocketTimeoutException) ConnectException(java.net.ConnectException) AppInfo(com.alibaba.csp.sentinel.dashboard.discovery.AppInfo) MachineInfo(com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo) AtomicLong(java.util.concurrent.atomic.AtomicLong) SocketTimeoutException(java.net.SocketTimeoutException) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) ConnectException(java.net.ConnectException)

Example 14 with AppInfo

use of com.alibaba.csp.sentinel.dashboard.discovery.AppInfo in project pig by pig-mesh.

the class ClusterConfigService method getClusterUniversalStateForAppMachine.

public CompletableFuture<ClusterGroupEntity> getClusterUniversalStateForAppMachine(String app, String machineId) {
    if (StringUtil.isBlank(app)) {
        return AsyncUtils.newFailedFuture(new IllegalArgumentException("app cannot be empty"));
    }
    AppInfo appInfo = appManagement.getDetailApp(app);
    if (appInfo == null || appInfo.getMachines() == null) {
        return AsyncUtils.newFailedFuture(new IllegalArgumentException("app does not have machines"));
    }
    boolean machineOk = appInfo.getMachines().stream().filter(e -> e.isHealthy()).map(e -> e.getIp() + '@' + e.getPort()).anyMatch(e -> e.equals(machineId));
    if (!machineOk) {
        return AsyncUtils.newFailedFuture(new IllegalStateException("machine does not exist or disconnected"));
    }
    return getClusterUniversalState(app).thenApply(ClusterEntityUtils::wrapToClusterGroup).thenCompose(e -> e.stream().filter(e1 -> e1.getMachineId().equals(machineId)).findAny().map(CompletableFuture::completedFuture).orElse(AsyncUtils.newFailedFuture(new IllegalStateException("not a server: " + machineId))));
}
Also used : AppManagement(com.alibaba.csp.sentinel.dashboard.discovery.AppManagement) ClusterServerModifyRequest(com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterServerModifyRequest) ClusterUniversalStateVO(com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStateVO) ClusterGroupEntity(com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterGroupEntity) ClusterClientStateVO(com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterClientStateVO) Set(java.util.Set) Autowired(org.springframework.beans.factory.annotation.Autowired) CompletableFuture(java.util.concurrent.CompletableFuture) Collectors(java.util.stream.Collectors) AppInfo(com.alibaba.csp.sentinel.dashboard.discovery.AppInfo) ArrayList(java.util.ArrayList) ClusterClientModifyRequest(com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterClientModifyRequest) AsyncUtils(com.alibaba.csp.sentinel.dashboard.util.AsyncUtils) StringUtil(com.alibaba.csp.sentinel.util.StringUtil) ServerFlowConfig(com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig) List(java.util.List) ServerTransportConfig(com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig) SentinelApiClient(com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient) Service(org.springframework.stereotype.Service) ClusterUniversalStatePairVO(com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStatePairVO) ClusterEntityUtils(com.alibaba.csp.sentinel.dashboard.util.ClusterEntityUtils) ClusterClientConfig(com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig) ClusterStateManager(com.alibaba.csp.sentinel.cluster.ClusterStateManager) CompletableFuture(java.util.concurrent.CompletableFuture) AppInfo(com.alibaba.csp.sentinel.dashboard.discovery.AppInfo)

Example 15 with AppInfo

use of com.alibaba.csp.sentinel.dashboard.discovery.AppInfo in project pig by pig-mesh.

the class ClusterConfigService method getClusterUniversalState.

/**
 * Get cluster state list of all available machines of provided application.
 * @param app application name
 * @return cluster state list of all available machines of the application
 * @since 1.4.1
 */
public CompletableFuture<List<ClusterUniversalStatePairVO>> getClusterUniversalState(String app) {
    if (StringUtil.isBlank(app)) {
        return AsyncUtils.newFailedFuture(new IllegalArgumentException("app cannot be empty"));
    }
    AppInfo appInfo = appManagement.getDetailApp(app);
    if (appInfo == null || appInfo.getMachines() == null) {
        return CompletableFuture.completedFuture(new ArrayList<>());
    }
    List<CompletableFuture<ClusterUniversalStatePairVO>> futures = appInfo.getMachines().stream().filter(e -> e.isHealthy()).map(machine -> getClusterUniversalState(app, machine.getIp(), machine.getPort()).thenApply(e -> new ClusterUniversalStatePairVO(machine.getIp(), machine.getPort(), e))).collect(Collectors.toList());
    return AsyncUtils.sequenceSuccessFuture(futures);
}
Also used : AppManagement(com.alibaba.csp.sentinel.dashboard.discovery.AppManagement) ClusterServerModifyRequest(com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterServerModifyRequest) ClusterUniversalStateVO(com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStateVO) ClusterGroupEntity(com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterGroupEntity) ClusterClientStateVO(com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterClientStateVO) Set(java.util.Set) Autowired(org.springframework.beans.factory.annotation.Autowired) CompletableFuture(java.util.concurrent.CompletableFuture) Collectors(java.util.stream.Collectors) AppInfo(com.alibaba.csp.sentinel.dashboard.discovery.AppInfo) ArrayList(java.util.ArrayList) ClusterClientModifyRequest(com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterClientModifyRequest) AsyncUtils(com.alibaba.csp.sentinel.dashboard.util.AsyncUtils) StringUtil(com.alibaba.csp.sentinel.util.StringUtil) ServerFlowConfig(com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig) List(java.util.List) ServerTransportConfig(com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig) SentinelApiClient(com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient) Service(org.springframework.stereotype.Service) ClusterUniversalStatePairVO(com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStatePairVO) ClusterEntityUtils(com.alibaba.csp.sentinel.dashboard.util.ClusterEntityUtils) ClusterClientConfig(com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig) ClusterStateManager(com.alibaba.csp.sentinel.cluster.ClusterStateManager) CompletableFuture(java.util.concurrent.CompletableFuture) ClusterUniversalStatePairVO(com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStatePairVO) AppInfo(com.alibaba.csp.sentinel.dashboard.discovery.AppInfo)

Aggregations

AppInfo (com.alibaba.csp.sentinel.dashboard.discovery.AppInfo)20 ArrayList (java.util.ArrayList)15 ClusterStateManager (com.alibaba.csp.sentinel.cluster.ClusterStateManager)10 SentinelApiClient (com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient)10 AppManagement (com.alibaba.csp.sentinel.dashboard.discovery.AppManagement)10 MachineInfo (com.alibaba.csp.sentinel.dashboard.discovery.MachineInfo)10 ClusterGroupEntity (com.alibaba.csp.sentinel.dashboard.domain.cluster.ClusterGroupEntity)10 ClusterClientConfig (com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ClusterClientConfig)10 ServerFlowConfig (com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerFlowConfig)10 ServerTransportConfig (com.alibaba.csp.sentinel.dashboard.domain.cluster.config.ServerTransportConfig)10 ClusterClientModifyRequest (com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterClientModifyRequest)10 ClusterServerModifyRequest (com.alibaba.csp.sentinel.dashboard.domain.cluster.request.ClusterServerModifyRequest)10 ClusterClientStateVO (com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterClientStateVO)10 ClusterUniversalStatePairVO (com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStatePairVO)10 ClusterUniversalStateVO (com.alibaba.csp.sentinel.dashboard.domain.cluster.state.ClusterUniversalStateVO)10 AsyncUtils (com.alibaba.csp.sentinel.dashboard.util.AsyncUtils)10 ClusterEntityUtils (com.alibaba.csp.sentinel.dashboard.util.ClusterEntityUtils)10 StringUtil (com.alibaba.csp.sentinel.util.StringUtil)10 List (java.util.List)10 Set (java.util.Set)10