/* * TeleStax, Open Source Cloud Communications Copyright 2012. * and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.mobicents.ss7.congestion; import java.io.Serializable; /** * @author amit bhayani * @author sergey vetyutnev * */ public class MemoryCongestionMonitorImpl extends BaseCongestionMonitor implements MemoryCongestionMonitor, Serializable { private static final String SOURCE = "MEMORY"; private double maxMemory; private volatile double percentageOfMemoryUsed; private volatile int memoryAlarmLevel = 0; private double[] memoryThreshold = new double[] { 77, 87, 97 }; private double[] backToNormalMemoryThreshold = new double[] { 72, 82, 92 }; protected double calculatedAllocatedMemory; protected double calculatedFreeMemory; protected double calculatedTotalFreeMemory; public MemoryCongestionMonitorImpl() { maxMemory = Runtime.getRuntime().maxMemory() / (double) 1024; } /** * @param backToNormalPercentageOfMemoryUsed setting the Threshold 1 of alarm clearing */ public void setBackToNormalMemoryThreshold1(double backToNormalMemoryThreshold1) { if (Math.abs(this.backToNormalMemoryThreshold[0] - backToNormalMemoryThreshold1) > 0.001 && logger.isInfoEnabled()) { logger.info("MemoryCongestionMonitor: Back To Normal Memory threshold 1 set to " + backToNormalMemoryThreshold1 + "%"); } this.backToNormalMemoryThreshold[0] = backToNormalMemoryThreshold1; } /** * @param backToNormalPercentageOfMemoryUsed setting the Threshold 2 of alarm clearing */ public void setBackToNormalMemoryThreshold2(double backToNormalMemoryThreshold2) { if (Math.abs(this.backToNormalMemoryThreshold[1] - backToNormalMemoryThreshold2) > 0.001 && logger.isInfoEnabled()) { logger.info("MemoryCongestionMonitor: Back To Normal Memory threshold 2 set to " + backToNormalMemoryThreshold2 + "%"); } this.backToNormalMemoryThreshold[1] = backToNormalMemoryThreshold2; } /** * @param backToNormalPercentageOfMemoryUsed setting the Threshold 3 of alarm clearing */ public void setBackToNormalMemoryThreshold3(double backToNormalMemoryThreshold3) { if (Math.abs(this.backToNormalMemoryThreshold[2] - backToNormalMemoryThreshold3) > 0.001 && logger.isInfoEnabled()) { logger.info("MemoryCongestionMonitor: Back To Normal Memory threshold 3 set to " + backToNormalMemoryThreshold3 + "%"); } this.backToNormalMemoryThreshold[2] = backToNormalMemoryThreshold3; } /** * @return the backToNormalPercentageOfMemoryUsed Threshold 1 */ public double getBackToNormalMemoryThreshold1() { return backToNormalMemoryThreshold[0]; } /** * @return the backToNormalPercentageOfMemoryUsed Threshold 2 */ public double getBackToNormalMemoryThreshold2() { return backToNormalMemoryThreshold[1]; } /** * @return the backToNormalPercentageOfMemoryUsed Threshold 3 */ public double getBackToNormalMemoryThreshold3() { return backToNormalMemoryThreshold[2]; } /** * @param memoryThreshold the memoryThreshold the Threshold 1 to alarm set */ public void setMemoryThreshold1(double memoryThreshold1) { if (Math.abs(this.memoryThreshold[0] - memoryThreshold1) > 0.001 && logger.isInfoEnabled()) { logger.info("MemoryCongestionMonitor: Memory threshold 1 set to " + memoryThreshold1 + "%"); } this.memoryThreshold[0] = memoryThreshold1; } /** * @param memoryThreshold the memoryThreshold the Threshold 2 to alarm set */ public void setMemoryThreshold2(double memoryThreshold2) { if (Math.abs(this.memoryThreshold[1] - memoryThreshold2) > 0.001 && logger.isInfoEnabled()) { logger.info("MemoryCongestionMonitor: Memory threshold 2 set to " + memoryThreshold2 + "%"); } this.memoryThreshold[1] = memoryThreshold2; } /** * @param memoryThreshold the memoryThreshold the Threshold 3 to alarm set */ public void setMemoryThreshold3(double memoryThreshold3) { if (Math.abs(this.memoryThreshold[2] - memoryThreshold3) > 0.001 && logger.isInfoEnabled()) { logger.info("MemoryCongestionMonitor: Memory threshold 3 set to " + memoryThreshold3 + "%"); } this.memoryThreshold[2] = memoryThreshold3; } /** * @return the memoryThreshold the Threshold 1 */ public double getMemoryThreshold1() { return memoryThreshold[0]; } /** * @return the memoryThreshold the Threshold 2 */ public double getMemoryThreshold2() { return memoryThreshold[1]; } /** * @return the memoryThreshold the Threshold 3 */ public double getMemoryThreshold3() { return memoryThreshold[2]; } /* * (non-Javadoc) * * @see org.mobicents.ss7.congestion.CongestionMonitor#monitor() */ @Override public void monitor() { Runtime runtime = Runtime.getRuntime(); double allocatedMemory = runtime.totalMemory() / (double) 1024; double freeMemory = runtime.freeMemory() / (double) 1024; double totalFreeMemory = freeMemory + (maxMemory - allocatedMemory); calculatedAllocatedMemory = allocatedMemory; calculatedFreeMemory = freeMemory; calculatedTotalFreeMemory = totalFreeMemory; this.percentageOfMemoryUsed = (((double) 100) - ((totalFreeMemory / maxMemory) * ((double) 100))); super.applyNewValue(memoryAlarmLevel, percentageOfMemoryUsed, memoryThreshold, backToNormalMemoryThreshold, true); } protected CongestionTicketImpl generateTicket() { return new CongestionTicketImpl(SOURCE, memoryAlarmLevel); } /* * (non-Javadoc) * * @see org.mobicents.ss7.congestion.CongestionMonitor#getSource() */ @Override public String getSource() { return SOURCE; } @Override public int getAlarmLevel() { return memoryAlarmLevel; } @Override protected void setAlarmLevel(int val) { memoryAlarmLevel = val; } @Override public double getMemoryThreshold_1() { return memoryThreshold[0]; } @Override public double getMemoryThreshold_2() { return memoryThreshold[1]; } @Override public double getMemoryThreshold_3() { return memoryThreshold[2]; } @Override public void setMemoryThreshold_1(double value) throws Exception { memoryThreshold[0] = value; } @Override public void setMemoryThreshold_2(double value) throws Exception { memoryThreshold[1] = value; } @Override public void setMemoryThreshold_3(double value) throws Exception { memoryThreshold[2] = value; } @Override public double getBackToNormalMemoryThreshold_1() { return backToNormalMemoryThreshold[0]; } @Override public double getBackToNormalMemoryThreshold_2() { return backToNormalMemoryThreshold[1]; } @Override public double getBackToNormalMemoryThreshold_3() { return backToNormalMemoryThreshold[2]; } @Override public void setBackToNormalMemoryThreshold_1(double value) throws Exception { backToNormalMemoryThreshold[0] = value; } @Override public void setBackToNormalMemoryThreshold_2(double value) throws Exception { backToNormalMemoryThreshold[1] = value; } @Override public void setBackToNormalMemoryThreshold_3(double value) throws Exception { backToNormalMemoryThreshold[2] = value; } @Override protected String getAlarmDescription() { StringBuilder sb = new StringBuilder(); sb.append("maxMemory="); sb.append(maxMemory); sb.append(", allocatedMemory="); sb.append(calculatedAllocatedMemory); sb.append(", freeMemory="); sb.append(calculatedFreeMemory); sb.append(", totalFreeMemory="); sb.append(calculatedTotalFreeMemory); sb.append(", percentageOfMemoryUsed="); sb.append(percentageOfMemoryUsed); return sb.toString(); } }