/* * * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF licenses this file to You 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.apache.geode.tools.pulse.testbed; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.geode.tools.pulse.internal.data.Cluster; import org.apache.geode.tools.pulse.internal.data.Cluster.Alert; import org.apache.geode.tools.pulse.internal.data.Cluster.Client; import org.apache.geode.tools.pulse.internal.data.Cluster.GatewayReceiver; import org.apache.geode.tools.pulse.internal.data.Cluster.GatewaySender; import org.apache.geode.tools.pulse.internal.data.Cluster.Member; import org.apache.geode.tools.pulse.internal.data.Cluster.Region; import org.apache.geode.tools.pulse.internal.data.IClusterUpdater; import org.apache.geode.tools.pulse.internal.data.PulseConstants; import org.apache.geode.tools.pulse.internal.data.Repository; import org.apache.geode.tools.pulse.internal.log.PulseLogWriter; import org.apache.geode.tools.pulse.testbed.GemFireDistributedSystem.Locator; import org.apache.geode.tools.pulse.testbed.GemFireDistributedSystem.Peer; import org.apache.geode.tools.pulse.testbed.GemFireDistributedSystem.Server; 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; 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");; private final ObjectMapper mapper = new ObjectMapper(); 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); double 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<org.apache.geode.tools.pulse.testbed.GemFireDistributedSystem.Region> thisMemberRegions = testbed.getRootDs().getRegions(memberSet.getValue().getName()); int regionExists = 0; int index = 0; for (org.apache.geode.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(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(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))); double cpuUsage = r.nextDouble() * 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 ObjectNode executeQuery(String queryText, String members, int limit) { // TODO for Sushant/Sachin - Add implementation for MockUpdater for Automation return null; } }