| /*========================================================================= |
| * Copyright (c) 2012-2014 Pivotal Software, Inc. All Rights Reserved. |
| * This product is protected by U.S. and international copyright |
| * and intellectual property laws. Pivotal products are covered by |
| * one or more patents listed at http://www.pivotal.io/patents. |
| *========================================================================= |
| */ |
| package com.vmware.gemfire.tools.pulse.testbed; |
| |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Date; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Map.Entry; |
| import java.util.Random; |
| import java.util.ResourceBundle; |
| |
| import com.vmware.gemfire.tools.pulse.internal.data.Cluster; |
| import com.vmware.gemfire.tools.pulse.internal.data.Cluster.Alert; |
| import com.vmware.gemfire.tools.pulse.internal.data.Cluster.Client; |
| import com.vmware.gemfire.tools.pulse.internal.data.Cluster.GatewayReceiver; |
| import com.vmware.gemfire.tools.pulse.internal.data.Cluster.GatewaySender; |
| import com.vmware.gemfire.tools.pulse.internal.data.Cluster.Member; |
| import com.vmware.gemfire.tools.pulse.internal.data.Cluster.Region; |
| import com.vmware.gemfire.tools.pulse.internal.data.IClusterUpdater; |
| import com.vmware.gemfire.tools.pulse.internal.data.PulseConstants; |
| import com.vmware.gemfire.tools.pulse.internal.data.Repository; |
| import com.vmware.gemfire.tools.pulse.internal.json.JSONException; |
| import com.vmware.gemfire.tools.pulse.internal.json.JSONObject; |
| import com.vmware.gemfire.tools.pulse.internal.log.PulseLogWriter; |
| import com.vmware.gemfire.tools.pulse.testbed.GemFireDistributedSystem.Locator; |
| import com.vmware.gemfire.tools.pulse.testbed.GemFireDistributedSystem.Peer; |
| import com.vmware.gemfire.tools.pulse.testbed.GemFireDistributedSystem.Server; |
| |
| |
| public class PropMockDataUpdater implements IClusterUpdater { |
| private static final int MAX_HOSTS = 40; |
| private static final PulseLogWriter LOGGER = PulseLogWriter.getLogger(); |
| private final ResourceBundle resourceBundle = Repository.get().getResourceBundle(); |
| private static final int POLL_INTERVAL = 5000; |
| public static final int MAX_SAMPLE_SIZE = 180; |
| public static final int ALERTS_MAX_SIZE = 1000; |
| public static final int PAGE_ALERTS_MAX_SIZE = 100; |
| |
| private Cluster cluster= null; |
| private TestBed testbed; |
| private final String testbedFile = System.getProperty("pulse.propMockDataUpdaterFile");; |
| |
| public PropMockDataUpdater(Cluster cluster) { |
| this.cluster = cluster; |
| try { |
| loadPropertiesFile(); |
| } catch (FileNotFoundException e) { |
| throw new RuntimeException(e); |
| } catch (IOException e) { |
| throw new RuntimeException(e); |
| } |
| } |
| |
| private void loadPropertiesFile() throws FileNotFoundException, IOException{ |
| this.testbed = new TestBed(testbedFile,true); |
| } |
| |
| /** |
| * function used for updating Cluster data |
| * for Mock |
| */ |
| @Override |
| public boolean updateData() { |
| cluster.setConnectedFlag(true); |
| Random r = new Random(System.currentTimeMillis()); |
| long totalHeapSize = Math.abs(r.nextInt(3200 - 2048) + 2048); |
| cluster.setTotalHeapSize(totalHeapSize); |
| long usedHeapSize = Math.abs(r.nextInt(2048)); |
| cluster.setUsedHeapSize(usedHeapSize); |
| float writePerSec = Math.abs(r.nextInt(100)); |
| cluster.setWritePerSec(writePerSec); |
| |
| //propfile |
| cluster.setSubscriptionCount(testbed.getRootDs().getClients().size()); |
| cluster.setRegisteredCQCount((long) testbed.getRootDs().getCQs().size()); |
| cluster.setRunningFunctionCount(testbed.getRootDs().getFunction().size()); |
| |
| |
| cluster.setClusterId( Math.abs(r.nextInt(100))); |
| cluster.getWritePerSecTrend().add(writePerSec); |
| cluster.setDiskWritesRate(writePerSec); |
| |
| long garbageCollectionCount = Math.abs(r.nextInt(100)); |
| cluster.setGarbageCollectionCount(garbageCollectionCount); |
| cluster.getGarbageCollectionTrend().add(garbageCollectionCount); |
| |
| long readPerSec = Math.abs(r.nextInt(100)); |
| cluster.setReadPerSec(readPerSec); |
| cluster.getReadPerSecTrend().add(readPerSec); |
| |
| long diskReadsRate = readPerSec;cluster.setDiskReadsRate(diskReadsRate); |
| cluster.setDiskReadsRate(readPerSec); |
| long queriesPerSec = Math.abs(r.nextInt(100)); |
| cluster.setQueriesPerSec(queriesPerSec); |
| cluster.getQueriesPerSecTrend().add(queriesPerSec); |
| |
| long loadPerSec = Math.abs(r.nextInt(100)); |
| cluster.setLoadPerSec(loadPerSec); |
| cluster.setTotalHeapSize(totalHeapSize); |
| long totalBytesOnDisk = totalHeapSize; |
| cluster.setTotalBytesOnDisk(totalBytesOnDisk); |
| |
| cluster.getTotalBytesOnDiskTrend().add(totalBytesOnDisk); |
| |
| cluster.getMemoryUsageTrend().add(usedHeapSize); |
| cluster.getThroughoutWritesTrend().add(writePerSec); |
| |
| cluster.setMemberCount(0); |
| |
| Map<String,Cluster.Member> membersHMap = cluster.getMembersHMap(); |
| List<Cluster.Region> regionsList = (List<Cluster.Region>)cluster.getClusterRegions().values(); |
| Map<String, Boolean> wanInformation = cluster.getWanInformation(); |
| |
| // Create 3 members first time around |
| int locatorCount=0; |
| if (membersHMap.size() == 0) { |
| for(Locator locator : testbed.getRootDs().getLocators()){ |
| String id = "(Launcher_Locator-1099-13-40-24-5368)-"+locatorCount++; |
| String name = locator.getName(); |
| membersHMap.put(id+name, initializeMember(id,name, true, true, true, false, locator.getHost())); |
| } |
| cluster.setLocatorCount(testbed.getRootDs().getLocators().size()); |
| |
| int serverCount=0; |
| for(Server server : testbed.getRootDs().getServers()){ |
| String id = "(Launcher_Server-1099-13-40-24-5368)-"+serverCount++; |
| String name = server.getName(); |
| membersHMap.put(id+name, initializeMember(id,name, false, true, false, true, server.getHost())); |
| } |
| cluster.setServerCount(testbed.getRootDs().getServers().size()); |
| |
| int peerCount=0; |
| for(Peer peer : testbed.getRootDs().getPeers()){ |
| String id = "(Launcher_Peer-1099-13-40-24-5368)-"+peerCount++; |
| String name = peer.getName(); |
| membersHMap.put( id+name, initializeMember(id,name, false, true, false, false, peer.getHost())); |
| } |
| |
| for(Entry<String, Member> memberSet : membersHMap.entrySet()) |
| { |
| HashMap<String,Cluster.Region> memberRegions = new HashMap<String,Cluster.Region>(); |
| HashMap<String,Cluster.Client> memberClientsHM = new HashMap<String,Cluster.Client>(); |
| |
| Random randomGenerator = new Random(); |
| |
| //Read from property file |
| int randomInt = (randomGenerator.nextInt(5)) + 1; |
| List<com.vmware.gemfire.tools.pulse.testbed.GemFireDistributedSystem.Region> thisMemberRegions = testbed.getRootDs().getRegions(memberSet.getValue().getName()); |
| |
| int regionExists = 0; |
| int index=0; |
| for (com.vmware.gemfire.tools.pulse.testbed.GemFireDistributedSystem.Region thisMemberRegion : thisMemberRegions) { |
| Region region = initMemberRegion(index++,thisMemberRegion.getName(),memberSet.getValue().getName(), |
| thisMemberRegion.getEntryCount(),thisMemberRegion.getType(), thisMemberRegion.getMembers().size()); //read from property file |
| if (regionsList.size() > 0) { |
| for (Region clusterRegion : regionsList) { |
| if ((region.getName()).equals(clusterRegion.getName())) { |
| clusterRegion.getMemberName().add(memberSet.getValue().getName()); |
| //clusterRegion.memberCount = clusterRegion.memberCount + 1; |
| //int mcount = clusterRegion.getMemberCount() + 1; |
| //clusterRegion.setMemberCount(mcount); |
| regionExists = 1; |
| break; |
| } |
| } |
| if (regionExists == 0){ |
| regionsList.add(region); |
| } |
| } else{ |
| regionsList.add(region); |
| } |
| memberRegions.put(region.getFullPath(),region); |
| //totalRegionCount = regionsList.size(); |
| cluster.setTotalRegionCount(regionsList.size()); |
| } |
| membersHMap.get(memberSet.getKey()).setMemberRegions(memberRegions); |
| |
| if (memberSet.getValue().isCache()) { |
| Client client = initMemberClient(0, memberSet.getValue().getHost()); //read from prop File |
| memberClientsHM.put(client.getId(), client); |
| randomInt = randomGenerator.nextInt(10); |
| for (int y = 1; y < randomInt; y++) { |
| Client newClient = initMemberClient(y, memberSet.getValue() |
| .getHost()); |
| memberClientsHM.put(newClient.getId(), newClient); |
| } |
| membersHMap.get(memberSet.getKey()).updateMemberClientsHMap(memberClientsHM); |
| /*clientConnectionCount = clientConnectionCount |
| + membersHMap.get(memberSet.getKey()).getMemberClientsHMap().size();*/ |
| long clientConnectionCount = cluster.getClientConnectionCount() + membersHMap.get(memberSet.getKey()).getMemberClientsHMap().size(); |
| cluster.setClientConnectionCount(clientConnectionCount); |
| } |
| |
| } |
| } |
| wanInformation.clear(); //read from property file |
| int wanInfoSize = Math.abs(r.nextInt(10)); |
| wanInfoSize++; |
| for (int i = 0; i < wanInfoSize; i++) { |
| String name = "Mock Cluster" + i; |
| Boolean value = false; |
| if (i % 2 == 0){ |
| value = true; |
| } |
| wanInformation.put(name, value); |
| } |
| //memberCount = membersHMap.size(); |
| cluster.setMemberCount(membersHMap.size()); |
| |
| totalHeapSize = 0; |
| for(Entry<String, Member> memberSet : membersHMap.entrySet()) |
| { |
| refresh(membersHMap.get(memberSet.getKey())); |
| Member member = membersHMap.get(memberSet.getKey()); |
| totalHeapSize += member.getCurrentHeapSize(); |
| } |
| |
| for (Region region : regionsList) { |
| region.setGetsRate((Math.abs(r.nextInt(100))) + 1); |
| region.setPutsRate((Math.abs(r.nextInt(100))) +1); |
| region.getGetsPerSecTrend().add(region.getGetsRate()); |
| region.getPutsPerSecTrend().add(region.getPutsRate()); |
| } |
| |
| return true; |
| } |
| |
| |
| private Region initMemberRegion(int count, String regionName, String memName, int entryCount, String type, int memberCount) { |
| Region memberRegion = new Region(); |
| memberRegion.setName(regionName); |
| memberRegion.setFullPath("/"+regionName); |
| Random randomGenerator = new Random(); |
| memberRegion.setSystemRegionEntryCount(entryCount); |
| // memberRegion.setEntrySize("N/A"); |
| memberRegion.setEntrySize(Math.abs(randomGenerator.nextInt(10))); |
| memberRegion.setDiskStoreName("ABC"); |
| memberRegion.setScope("DISTRIBUTED_NO_ACK"); |
| memberRegion.setDiskSynchronous(true); |
| memberRegion.setRegionType(type); |
| if(type.contains("PERSISTENT")) |
| memberRegion.setPersistentEnabled(true); |
| else |
| memberRegion.setPersistentEnabled(false); |
| if (count % 2 == 0){ |
| memberRegion.setWanEnabled(true); |
| } |
| else{ |
| memberRegion.setWanEnabled(false); |
| } |
| memberRegion.setWanEnabled(true); |
| /*memberRegion.setSystemRegionEntryCount(Long.valueOf(String.valueOf(Math |
| .abs(randomGenerator.nextInt(100)))));*/ |
| memberRegion.getMemberName().add(memName); |
| memberRegion.setMemberCount(memberCount); |
| return memberRegion; |
| } |
| |
| |
| private Client initMemberClient(int count, String host) { |
| |
| Client memberClient = new Client(); |
| Random r = new Random(System.currentTimeMillis()); |
| memberClient.setName("Name_" + count); |
| long processCpuTime = (long) (r.nextDouble() * 100); |
| memberClient.setProcessCpuTime(processCpuTime); |
| memberClient.setCpuUsage(0); |
| memberClient.setGets(Math.abs(r.nextInt(100))); |
| memberClient.setHost(host); |
| memberClient.setId(String.valueOf(1000 + count)); |
| memberClient.setPuts(Math.abs(r.nextInt(100))); |
| memberClient.setCpus(Math.abs(r.nextInt(20))); |
| memberClient.setQueueSize(Math.abs(r.nextInt(100))); |
| if ((count % 2) == 0){ |
| memberClient.setStatus("up"); |
| } |
| else{ |
| memberClient.setStatus("down"); |
| } |
| memberClient.setThreads(Math.abs(r.nextInt(100))); |
| memberClient |
| .setUptime(Math.abs(System.currentTimeMillis() - r.nextLong())); |
| |
| return memberClient; |
| } |
| |
| private Member initializeMember(String id, String name, boolean manager, |
| boolean isCache, boolean isLocator, boolean isServer, String host) { |
| Member m = new Member(); |
| |
| m.setId(id); |
| m.setName(name); |
| |
| //m.setHost(getHostName(System.currentTimeMillis())); |
| m.setHost(host); |
| |
| m.setMaxHeapSize(247); |
| |
| Random r = new Random(System.currentTimeMillis()); |
| |
| m.setCache(isCache); |
| m.setLocator(isLocator); |
| m.setServer(isServer); |
| m.setManager(manager); |
| |
| m.setLoadAverage((double) Math.abs(r.nextInt(100))); |
| m.setNumThreads(Math.abs(r.nextInt(100))); |
| m.setGarbageCollectionCount((long) Math.abs(r.nextInt(100))); |
| m.getGarbageCollectionSamples().add(m.getGarbageCollectionCount()); |
| |
| m.setTotalFileDescriptorOpen((long) Math.abs(r.nextInt(100))); |
| m.setTotalDiskUsage(Math.abs(r.nextInt(100))); |
| |
| |
| m.setThroughputWrites(Math.abs(r.nextInt(10))); |
| m.getThroughputWritesTrend().add(m.getThroughputWrites()); |
| |
| GatewayReceiver gatewayReceiver = m.getGatewayReceiver(); |
| String port = cluster.getPort(); |
| if(port==null || "".equals(port)) |
| port = "1099"; |
| gatewayReceiver.setListeningPort(Integer.parseInt(port)); |
| gatewayReceiver.setLinkThroughput((float) Math.abs(r.nextInt(10))); |
| gatewayReceiver.setAvgBatchProcessingTime((long) Math.abs(r.nextInt(10))); |
| gatewayReceiver.setId(String.valueOf(Math.abs(r.nextInt(10)))); |
| gatewayReceiver.setQueueSize(Math.abs(r.nextInt(10))); |
| gatewayReceiver.setStatus(true); |
| gatewayReceiver.setBatchSize(Math.abs(r.nextInt(10))); |
| |
| |
| int gatewaySenderCount = Math.abs(r.nextInt(10)); |
| |
| List<GatewaySender> list = m.getGatewaySenderList(); |
| |
| for (int i = 0; i < gatewaySenderCount; i++) { |
| list.add(createGatewaySenderCount(r)); |
| } |
| |
| |
| Map<String, List<Member>> physicalToMember = cluster.getPhysicalToMember(); |
| |
| List<Cluster.Member> memberArrList = physicalToMember.get(m.getHost()); |
| if (memberArrList != null){ |
| memberArrList.add(m); |
| } |
| else { |
| ArrayList<Cluster.Member> memberList = new ArrayList<Cluster.Member>(); |
| memberList.add(m); |
| physicalToMember.put(m.getHost(), memberList); |
| } |
| int memberCount = cluster.getMemberCount();memberCount++;cluster.setMemberCount(memberCount); |
| return m; |
| } |
| |
| private GatewaySender createGatewaySenderCount(Random r) { |
| |
| GatewaySender gatewaySender = new GatewaySender(); |
| |
| gatewaySender.setBatchSize(Math.abs(r.nextInt(10))); |
| gatewaySender.setId(String.valueOf(Math.abs(r.nextInt(10)))); |
| gatewaySender.setLinkThroughput((float) Math.abs(r.nextInt(10))); |
| gatewaySender.setPersistenceEnabled(true); |
| gatewaySender.setPrimary(true); |
| gatewaySender.setQueueSize(Math.abs(r.nextInt(10))); |
| gatewaySender.setSenderType(false); |
| gatewaySender.setStatus(true); |
| |
| return gatewaySender; |
| } |
| |
| /* |
| private String getHostName(long rndSeed) { |
| Random rnd = new Random(rndSeed); |
| String hName = null; |
| |
| int index = Math.abs(rnd.nextInt(MAX_HOSTS)); |
| |
| ArrayList<String> hostNames = cluster.getHostNames(); |
| |
| if (hostNames.size() <= index) { |
| hName = "host" + hostNames.size(); |
| hostNames.add(hName); |
| } else { |
| hName = hostNames.get(index); |
| } |
| |
| Map<String, ArrayList<Member>> physicalToMember = cluster.getPhysicalToMember(); |
| |
| ArrayList<Member> memberArrList = physicalToMember.get(hName); |
| if (memberArrList != null) { |
| if (memberArrList.size() > 4){ |
| hName = getHostName(rndSeed + rnd.nextLong()); |
| } |
| } |
| return hName; |
| }*/ |
| |
| private void refresh(Member m) { |
| if(LOGGER.infoEnabled()){ |
| LOGGER.info(resourceBundle.getString("LOG_MSG_REFRESHING_MEMBER_DATA")+" : " + m.getName()); |
| } |
| |
| Random r = new Random(System.currentTimeMillis()); |
| |
| m.setUptime(System.currentTimeMillis()); |
| m.setQueueBacklog("" + Math.abs(r.nextInt(500))); |
| m.setCurrentHeapSize(Math.abs(r.nextInt(Math.abs((int) m.getMaxHeapSize())))); |
| m.setTotalDiskUsage(Math.abs(r.nextInt(100))); |
| |
| Float cpuUsage = r.nextFloat() * 100; |
| m.getCpuUsageSamples().add(cpuUsage); |
| m.setCpuUsage(cpuUsage); |
| |
| m.getHeapUsageSamples().add(m.getCurrentHeapSize()); |
| m.setLoadAverage((double) Math.abs(r.nextInt(100))); |
| m.setNumThreads(Math.abs(r.nextInt(100))); |
| m.setGarbageCollectionCount((long) Math.abs(r.nextInt(100))); |
| m.getGarbageCollectionSamples().add(m.getGarbageCollectionCount()); |
| |
| m.setTotalFileDescriptorOpen((long) Math.abs(r.nextInt(100))); |
| |
| m.setThroughputWrites(Math.abs(r.nextInt(10))); |
| m.getThroughputWritesTrend().add(m.getThroughputWrites()); |
| |
| m.setGetsRate(Math.abs(r.nextInt(5000))); |
| m.getGetsPerSecond().add(m.getGetsRate()); |
| |
| m.setPutsRate(Math.abs(r.nextInt(5000))); |
| m.getPutsPerSecond().add(m.getPutsRate()); |
| |
| Alert[] alerts = cluster.getAlertsList(); |
| List<Alert> alertsList = Arrays.asList(alerts); |
| |
| if (r.nextBoolean()) { |
| // Generate alerts |
| if (r.nextBoolean()) { |
| if (r.nextInt(10) > 5) { |
| alertsList.add(createAlert(Alert.SEVERE, m.getName(), alertsList.size())); |
| if(alertsList.size() > ALERTS_MAX_SIZE){ |
| alertsList.remove(0); |
| } |
| } |
| } |
| |
| if (r.nextBoolean()) { |
| if (r.nextInt(10) > 5) { |
| alertsList.add(createAlert(Alert.ERROR, m.getName(), alertsList.size())); |
| if(alertsList.size() > ALERTS_MAX_SIZE){ |
| alertsList.remove(0); |
| } |
| } |
| } |
| |
| if (r.nextBoolean()) { |
| if (r.nextInt(10) > 5) { |
| alertsList.add(createAlert(Alert.WARNING, m.getName(), alertsList.size())); |
| if(alertsList.size() > ALERTS_MAX_SIZE){ |
| alertsList.remove(0); |
| } |
| } |
| } |
| } |
| } |
| |
| private Alert createAlert(int sev, String memberName, int index) { |
| |
| Alert alert = new Alert(); |
| alert.setSeverity(sev); |
| alert.setId(index); |
| alert.setMemberName(memberName); |
| alert.setTimestamp(new Date()); |
| |
| switch (sev) { |
| case Alert.SEVERE: |
| alert.setDescription(PulseConstants.ALERT_DESC_SEVERE); |
| break; |
| case Alert.ERROR: |
| alert.setDescription(PulseConstants.ALERT_DESC_ERROR); |
| break; |
| case Alert.WARNING: |
| alert.setDescription(PulseConstants.ALERT_DESC_WARNING); |
| break; |
| } |
| return alert; |
| } |
| |
| @Override |
| public JSONObject executeQuery(String queryText, String members, int limit) |
| throws JSONException { |
| // TODO for Sushant/Sachin - Add implementation for MockUpdater for Automation |
| return null; |
| } |
| |
| } |