/*
* Copyright (c) 2010-2012 Grid Dynamics Consulting Services, Inc, All Rights Reserved
* http://www.griddynamics.com
*
* This library is free software; you can redistribute it and/or modify it under the terms of
* the Apache License; either
* version 2.0 of the License, or any later version.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.griddynamics.jagger.agent.impl;
import com.google.common.collect.Maps;
import com.griddynamics.jagger.agent.model.*;
import com.griddynamics.jagger.dbapi.parameter.DefaultMonitoringParameters;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.snmp4j.smi.OID;
import java.util.Collections;
import java.util.Map;
import static com.griddynamics.jagger.util.Units.bytesToMiB;
import static com.griddynamics.jagger.dbapi.parameter.DefaultMonitoringParameters.*;
/**
* User: dkotlyarov
*/
public class SNMPJVMSystemUnderTestImpl implements SystemUnderTestService {
private final static Logger log = LoggerFactory.getLogger(SNMPJVMSystemUnderTestImpl.class);
// systemIdentifier -> SNMPProvider
private Map<String, SNMPProvider> snmpProviders;
// Parameter -> OID
private Map<DefaultMonitoringParameters, String> snmpOIDs;
public SNMPJVMSystemUnderTestImpl() {
}
@Override
public Map<String, SystemUnderTestInfo> getInfo() {
Map<String, SystemUnderTestInfo> result = Maps.newHashMap();
for (String systemIdentifier : snmpProviders.keySet()) {
result.put(systemIdentifier, pollSystem(systemIdentifier));
}
return result;
}
@Override
public void setContext(AgentContext context) {
//nothing to do...
}
public void setSnmpProviders(Map<String, SNMPProvider> snmpProviders) {
this.snmpProviders = snmpProviders;
}
public void setSnmpOIDs(Map<DefaultMonitoringParameters, String> snmpOIDs) {
this.snmpOIDs = snmpOIDs;
}
private SystemUnderTestInfo pollSystem(String systemIdentifier) {
SystemUnderTestInfo result = new SystemUnderTestInfo(systemIdentifier);
SNMPProvider snmpProvider = snmpProviders.get(systemIdentifier);
try {
pollJVMMetric(result, snmpProvider, HEAP_MEMORY_MAX, true);
pollJVMMetric(result, snmpProvider, HEAP_MEMORY_COMMITTED, true);
pollJVMMetric(result, snmpProvider, HEAP_MEMORY_USED, true);
pollJVMMetric(result, snmpProvider, HEAP_MEMORY_INIT, true);
pollJVMMetric(result, snmpProvider, NON_HEAP_MEMORY_MAX, true);
pollJVMMetric(result, snmpProvider, NON_HEAP_MEMORY_COMMITTED, true);
pollJVMMetric(result, snmpProvider, NON_HEAP_MEMORY_USED, true);
pollJVMMetric(result, snmpProvider, NON_HEAP_MEMORY_INIT, true);
pollJVMMetric(result, snmpProvider, JMX_GC_MAJOR_TIME, false);
pollJVMMetric(result, snmpProvider, JMX_GC_MAJOR_UNIT, false);
pollJVMMetric(result, snmpProvider, JMX_GC_MINOR_TIME, false);
pollJVMMetric(result, snmpProvider, JMX_GC_MINOR_UNIT, false);
} catch (Exception e) {
log.error("Failed to collect metrics from " + systemIdentifier, e);
}
return result;
}
private void pollJVMMetric(SystemUnderTestInfo result, SNMPProvider snmpProvider, DefaultMonitoringParameters key, boolean castToMB) {
try {
long metric = snmpProvider.getAsLong(new OID(snmpOIDs.get(key)));
result.putSysUTEntry(key, castToMB ? bytesToMiB(metric) : (double)metric);
} catch(Exception e) {
log.error("Failed to collect metrics from " + snmpProvider.getAddress(), e);
}
}
@Override
public Map<String, Map<String, String>> getSystemProperties() {
log.warn("System properties a not available for SNMP");
return Collections.EMPTY_MAP;
}
}