package org.openstack.atlas.usagerefactor.snmp; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openstack.atlas.service.domain.entities.Host; import org.openstack.atlas.service.domain.entities.LoadBalancer; import org.openstack.atlas.usagerefactor.SnmpStats; import org.openstack.atlas.usagerefactor.SnmpUsage; import org.openstack.atlas.util.snmp.RawSnmpUsage; import org.openstack.atlas.util.snmp.StingraySnmpClient; import org.openstack.atlas.util.snmp.exceptions.StingraySnmpGeneralException; import org.openstack.atlas.util.snmp.exceptions.StingraySnmpObjectNotFoundException; import org.openstack.atlas.util.snmp.exceptions.StingraySnmpRetryExceededException; import org.openstack.atlas.util.snmp.exceptions.StingraySnmpSetupException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.openstack.atlas.cfg.PublicApiServiceConfigurationKeys; import org.openstack.atlas.cfg.RestApiConfiguration; public class StingrayUsageClientImpl implements StingrayUsageClient { private final Log LOG = LogFactory.getLog(StingrayUsageClientImpl.class); public static final Pattern vsPattern = Pattern.compile("^[0-9]+_([0-9]+)$"); public static final Pattern shadowPattern = Pattern.compile("^[0-9]+_([0-9]+)_S$"); @Override public Map<Integer, SnmpUsage> getHostUsage(Host host) throws StingraySnmpRetryExceededException, StingraySnmpSetupException, StingraySnmpGeneralException { RestApiConfiguration configuration = new RestApiConfiguration(); boolean log_all = configuration.hasKeys(PublicApiServiceConfigurationKeys.usage_poller_log_all_counters) && (configuration.getString(PublicApiServiceConfigurationKeys.usage_poller_log_all_counters).toLowerCase().equals("enabled")); Map<Integer, SnmpUsage> usage = new HashMap<Integer, SnmpUsage>(); String snmpIp = host.getManagementIp(); StingraySnmpClient client = new StingraySnmpClient(); client.setAddress(snmpIp); Map<String, RawSnmpUsage> rawMap = client.getSnmpUsage(); StringBuilder counterLogString = new StringBuilder(); counterLogString.append("\n"); for (RawSnmpUsage rawValue : rawMap.values()) { String vsName = rawValue.getVsName(); Matcher m; m = vsPattern.matcher(vsName); if (m.find()) { Integer loadbalancerId = Integer.valueOf(m.group(1)); if (!usage.containsKey(loadbalancerId)) { SnmpUsage newUsage = new SnmpUsage(); newUsage.setLoadbalancerId(loadbalancerId); newUsage.setHostId(host.getId()); usage.put(loadbalancerId, newUsage); } usage.get(loadbalancerId).setBytesIn(rawValue.getBytesIn()); usage.get(loadbalancerId).setBytesOut(rawValue.getBytesOut()); usage.get(loadbalancerId).setConcurrentConnections((int) rawValue.getConcurrentConnections()); if (log_all) { counterLogString.append(String.format("Host_ID: %d, VirtualServer: %s, BytesIn: %d, BytesOut: %d, ConcurrentConnections: %d\n", host.getId(), vsName, rawValue.getBytesIn(), rawValue.getBytesOut(), rawValue.getConcurrentConnections())); } } m = shadowPattern.matcher(vsName); if (m.find()) { Integer loadbalancerId = Integer.valueOf(m.group(1)); if (!usage.containsKey(loadbalancerId)) { SnmpUsage newUsage = new SnmpUsage(); newUsage.setLoadbalancerId(loadbalancerId); newUsage.setHostId(host.getId()); usage.put(loadbalancerId, newUsage); } usage.get(loadbalancerId).setBytesInSsl(rawValue.getBytesIn()); usage.get(loadbalancerId).setBytesOutSsl(rawValue.getBytesOut()); usage.get(loadbalancerId).setConcurrentConnectionsSsl((int) rawValue.getConcurrentConnections()); if (log_all) { counterLogString.append(String.format("Host_ID: %d, VirtualServer: %s, BytesInSsl: %d, BytesOutSsl: %d, ConcurrentConnectionsSsl: %d\n", host.getId(), vsName, rawValue.getBytesIn(), rawValue.getBytesOut(), rawValue.getConcurrentConnections())); } } } LOG.debug(counterLogString.toString()); return usage; } @Override public SnmpUsage getVirtualServerUsage(Host host, LoadBalancer lb) throws StingraySnmpSetupException, StingraySnmpObjectNotFoundException, StingraySnmpGeneralException { SnmpUsage usage = new SnmpUsage(); StingraySnmpClient client = new StingraySnmpClient(); client.setAddress(host.getManagementIp()); usage.setLoadbalancerId(lb.getId()); usage.setHostId(host.getId()); // Fetch Virtual Server Usage String vsName = buildVsName(lb, false); usage.setBytesIn(client.getBytesIn(vsName, false, true)); usage.setBytesOut(client.getBytesOut(vsName, false, true)); usage.setConcurrentConnections((int) client.getConcurrentConnections(vsName, false, true)); // Fetch Shadow Server Usage String shadowName = buildVsName(lb, true); usage.setBytesInSsl(client.getBytesIn(shadowName, false, true)); usage.setBytesOutSsl(client.getBytesOut(shadowName, false, true)); usage.setConcurrentConnectionsSsl((int) client.getConcurrentConnections(shadowName, false, true)); return usage; } @Override public SnmpStats getVirtualServerStats(Host host, LoadBalancer lb) throws StingraySnmpGeneralException { SnmpStats usage = new SnmpStats(); StingraySnmpClient client = new StingraySnmpClient(); client.setAddress(host.getManagementIp()); usage.setLoadbalancerId(lb.getId()); usage.setHostId(host.getId()); // Fetch Virtual Server Usage String vsName = buildVsName(lb, false); usage.setConcurrentConnections((int) client.getConcurrentConnections(vsName, true, false)); usage.setMaxConnections(client.getMaxConnections(vsName, true, false)); usage.setConnectTimedOut(client.getConnectTimedOut(vsName, true, false)); usage.setDataTimedOut(client.getDataTimedOut(vsName, true, false)); usage.setKeepaliveTimedOut(client.getKeepAliveTimedOut(vsName, true, false)); usage.setConnectionErrors(client.getConnectionErrors(vsName, true, false)); usage.setConnectionFailures(client.getConnectionFailures(vsName, true, false)); // Fetch Shadow Server Usage String shadowName = buildVsName(lb, true); usage.setConcurrentConnectionsSsl((int) client.getConcurrentConnections(shadowName, true, false)); usage.setMaxConnectionsSsl(client.getMaxConnections(shadowName, true, false)); usage.setConnectTimedOutSsl(client.getConnectTimedOut(shadowName, true, false)); usage.setDataTimedOutSsl(client.getDataTimedOut(shadowName, true, false)); usage.setKeepaliveTimedOutSsl(client.getKeepAliveTimedOut(shadowName, true, false)); usage.setConnectionErrorsSsl(client.getConnectionErrors(shadowName, true, false)); usage.setConnectionFailuresSsl(client.getConnectionFailures(shadowName, true, false)); return usage; } private static String buildVsName(LoadBalancer lb, boolean isShadowServer) { StringBuilder sb = new StringBuilder(); sb.append(lb.getAccountId()).append("_").append(lb.getId()); if (isShadowServer) { sb.append("_S"); } return sb.toString(); } @Override public List<SnmpUsage> getHostUsageList(Host host) throws StingraySnmpGeneralException { return new ArrayList<SnmpUsage>(getHostUsage(host).values()); } }