/** * Copyright 2012 Comcast Corporation * * 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.comcast.cns.util; import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.List; import javax.management.JMX; import javax.management.MBeanServer; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import org.apache.log4j.Logger; import com.comcast.cmb.common.persistence.AbstractDurablePersistence; import com.comcast.cmb.common.persistence.AbstractDurablePersistence.CMB_SERIALIZER; import com.comcast.cmb.common.persistence.AbstractDurablePersistence.CmbRow; import com.comcast.cmb.common.persistence.DurablePersistenceFactory; import com.comcast.cmb.common.util.CMBErrorCodes; import com.comcast.cmb.common.util.CMBException; import com.comcast.cmb.common.util.PersistenceException; import com.comcast.cns.model.CNSWorkerStats; import com.comcast.cns.tools.CNSWorkerMonitor; import com.comcast.cns.tools.CNSWorkerMonitorMBean; public class CNSWorkerStatWrapper { private static Logger logger = Logger.getLogger(CNSWorkerStatWrapper.class); private static AbstractDurablePersistence cassandraHandler = DurablePersistenceFactory.getInstance(); private static final String CNS_WORKERS = "CNSWorkers"; public static List<CNSWorkerStats> getCassandraWorkerStats() throws PersistenceException { List<CmbRow<String, String, String>> rows = cassandraHandler.readAllRows(AbstractDurablePersistence.CNS_KEYSPACE, CNS_WORKERS, 1000, 10, CMB_SERIALIZER.STRING_SERIALIZER, CMB_SERIALIZER.STRING_SERIALIZER, CMB_SERIALIZER.STRING_SERIALIZER); List<CNSWorkerStats> statsList = new ArrayList<CNSWorkerStats>(); if (rows != null) { for (CmbRow<String, String, String> row : rows) { CNSWorkerStats stats = new CNSWorkerStats(); stats.setIpAddress(row.getKey()); if (row.getColumnSlice().getColumnByName("producerTimestamp") != null) { stats.setProducerTimestamp(Long.parseLong(row.getColumnSlice().getColumnByName("producerTimestamp").getValue())); } if (row.getColumnSlice().getColumnByName("consumerTimestamp") != null) { stats.setConsumerTimestamp(Long.parseLong(row.getColumnSlice().getColumnByName("consumerTimestamp").getValue())); } if (row.getColumnSlice().getColumnByName("jmxport") != null) { stats.setJmxPort(Long.parseLong(row.getColumnSlice().getColumnByName("jmxport").getValue())); } if (row.getColumnSlice().getColumnByName("mode") != null) { stats.setMode(row.getColumnSlice().getColumnByName("mode").getValue()); } if (row.getColumnSlice().getColumnByName("dataCenter") != null) { stats.setDataCenter(row.getColumnSlice().getColumnByName("dataCenter").getValue()); } statsList.add(stats); } } return statsList; } public static List<CNSWorkerStats> getCassandraWorkerStatsByDataCenter(String dataCenter) throws PersistenceException { List<CNSWorkerStats> cnsWorkerStatsList = getCassandraWorkerStats(); List<CNSWorkerStats> cnsWorkerStatsByDataCenterList = new ArrayList<CNSWorkerStats>(); for (CNSWorkerStats currentWorkerStats: cnsWorkerStatsList) { if (currentWorkerStats.getDataCenter().equals(dataCenter)) { cnsWorkerStatsByDataCenterList.add(currentWorkerStats); } } return cnsWorkerStatsByDataCenterList; } private static void callOperation(String operation, List<CNSWorkerStats> cnsWorkerStats) throws Exception{ //register JMX Bean MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("com.comcast.cns.tools:type=CNSWorkerMonitorMBean"); if (!mbs.isRegistered(name)) { mbs.registerMBean(CNSWorkerMonitor.getInstance(), name); } if ((operation!=null)&&(operation.equals("startWorker")||operation.equals("stopWorker"))) { JMXConnector jmxConnector = null; String url = null; String host = null; long port = 0; for (CNSWorkerStats stats:cnsWorkerStats) { try { host = stats.getIpAddress(); port = stats.getJmxPort(); url = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi"; JMXServiceURL serviceUrl = new JMXServiceURL(url); jmxConnector = JMXConnectorFactory.connect(serviceUrl, null); MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection(); ObjectName cnsWorkerMonitor = new ObjectName("com.comcast.cns.tools:type=CNSWorkerMonitorMBean"); CNSWorkerMonitorMBean mbeanProxy = JMX.newMBeanProxy(mbeanConn, cnsWorkerMonitor, CNSWorkerMonitorMBean.class, false); if (operation.equals("startWorker")) { mbeanProxy.startCNSWorkers(); } else { mbeanProxy.stopCNSWorkers(); } } catch (Exception e) { logger.error("event=error_in_"+operation+" Hose:"+host+" port:"+port+"Exception: "+e); String operationString = null; if(operation.equals("startWorker")){ operationString = "start"; } else { operationString = "stop"; } throw new CMBException(CMBErrorCodes.InternalError, "Cannot " + operationString + " CNS workers"); } finally { if (jmxConnector != null) { jmxConnector.close(); } } } } } public static void stopWorkers(List<CNSWorkerStats> cnsWorkersList) throws Exception{ callOperation("stopWorker", cnsWorkersList); } public static void startWorkers(List<CNSWorkerStats> cnsWorkersList)throws Exception{ callOperation("startWorker", cnsWorkersList); } public static void startWorkers(String dataCenter) throws Exception{ List<CNSWorkerStats> cnsWorkerStarts = getCassandraWorkerStatsByDataCenter(dataCenter); callOperation("startWorker", cnsWorkerStarts); } public static void stopWorkers(String dataCenter) throws Exception{ List<CNSWorkerStats> cnsWorkerStarts = getCassandraWorkerStatsByDataCenter(dataCenter); callOperation("stopWorker", cnsWorkerStarts); } }