/* * Copyright 2013-2015 the original author or authors. * * 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 org.springframework.cloud.netflix.turbine; import java.util.ArrayList; import java.util.Collection; import java.util.List; import com.netflix.config.DynamicPropertyFactory; import com.netflix.config.DynamicStringProperty; import com.netflix.turbine.data.AggDataFromCluster; import com.netflix.turbine.discovery.Instance; import com.netflix.turbine.handler.PerformanceCriteria; import com.netflix.turbine.handler.TurbineDataHandler; import com.netflix.turbine.monitor.TurbineDataMonitor; import com.netflix.turbine.monitor.cluster.AggregateClusterMonitor; import com.netflix.turbine.monitor.cluster.ClusterMonitor; import com.netflix.turbine.monitor.cluster.ClusterMonitorFactory; import lombok.extern.apachecommons.CommonsLog; import static com.netflix.turbine.monitor.cluster.AggregateClusterMonitor.AggregatorClusterMonitorConsole; /** * @author Spencer Gibb */ @CommonsLog public class SpringAggregatorFactory implements ClusterMonitorFactory<AggDataFromCluster> { private static final DynamicStringProperty aggClusters = DynamicPropertyFactory .getInstance().getStringProperty("turbine.aggregator.clusterConfig", null); /** * @return {@link com.netflix.turbine.monitor.cluster.ClusterMonitor}< * {@link com.netflix.turbine.data.AggDataFromCluster}> */ @Override public ClusterMonitor<AggDataFromCluster> getClusterMonitor(String name) { TurbineDataMonitor<AggDataFromCluster> clusterMonitor = AggregateClusterMonitor.AggregatorClusterMonitorConsole .findMonitor(name + "_agg"); return (ClusterMonitor<AggDataFromCluster>) clusterMonitor; } public static TurbineDataMonitor<AggDataFromCluster> findOrRegisterAggregateMonitor( String clusterName) { TurbineDataMonitor<AggDataFromCluster> clusterMonitor = AggregatorClusterMonitorConsole .findMonitor(clusterName + "_agg"); if (clusterMonitor == null) { log.info("Could not find monitors: " + AggregatorClusterMonitorConsole.toString()); clusterMonitor = new SpringClusterMonitor(clusterName + "_agg", clusterName); clusterMonitor = AggregatorClusterMonitorConsole .findOrRegisterMonitor(clusterMonitor); } return clusterMonitor; } @Override public void initClusterMonitors() { for (String clusterName : getClusterNames()) { ClusterMonitor<AggDataFromCluster> clusterMonitor = (ClusterMonitor<AggDataFromCluster>) findOrRegisterAggregateMonitor(clusterName); clusterMonitor.registerListenertoClusterMonitor(this.StaticListener); try { clusterMonitor.startMonitor(); } catch (Exception ex) { log.warn("Could not init cluster monitor for: " + clusterName); clusterMonitor.stopMonitor(); clusterMonitor.getDispatcher().stopDispatcher(); } } } private List<String> getClusterNames() { List<String> clusters = new ArrayList<String>(); String clusterNames = aggClusters.get(); if (clusterNames == null || clusterNames.trim().length() == 0) { clusters.add("default"); } else { String[] parts = aggClusters.get().split(","); for (String s : parts) { clusters.add(s); } } return clusters; } /** * shutdown all configured cluster monitors */ @Override public void shutdownClusterMonitors() { for (String clusterName : getClusterNames()) { ClusterMonitor<AggDataFromCluster> clusterMonitor = (ClusterMonitor<AggDataFromCluster>) AggregateClusterMonitor .findOrRegisterAggregateMonitor(clusterName); clusterMonitor.stopMonitor(); clusterMonitor.getDispatcher().stopDispatcher(); } } private TurbineDataHandler<AggDataFromCluster> StaticListener = new TurbineDataHandler<AggDataFromCluster>() { @Override public String getName() { return "StaticListener_For_Aggregator"; } @Override public void handleData(Collection<AggDataFromCluster> stats) { } @Override public void handleHostLost(Instance host) { } @Override public PerformanceCriteria getCriteria() { return SpringAggregatorFactory.this.NonCriticalCriteria; } }; private PerformanceCriteria NonCriticalCriteria = new PerformanceCriteria() { @Override public boolean isCritical() { return false; } @Override public int getMaxQueueSize() { return 0; } @Override public int numThreads() { return 0; } }; }