/*
* Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.tsdr.collectors.cmc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.math.BigDecimal;
import org.opendaylight.controller.config.yang.config.tsdr.controller.metrics.collector.TSDRCMCModule;
import org.opendaylight.yang.gen.v1.opendaylight.tsdr.rev150219.DataCategory;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.tsdr.collector.spi.rev150915.InsertTSDRMetricRecordInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.tsdr.collector.spi.rev150915.inserttsdrmetricrecord.input.TSDRMetricRecord;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.tsdr.collector.spi.rev150915.inserttsdrmetricrecord.input.TSDRMetricRecordBuilder;
/**
* @author Sharon Aicler(saichler@gmail.com)
**/
public class ControllerMetricCollector extends Thread {
private static final Logger logger = LoggerFactory.getLogger(ControllerMetricCollector.class);
private static final String COLLECTOR_CODE_NAME = ControllerMetricCollector.class.getSimpleName();
private final Optional<CpuDataCollector> cpuDataCollector;
private final TSDRCMCModule module;
public ControllerMetricCollector(final TSDRCMCModule module, final Optional<CpuDataCollector> cpuDataCollector) {
this.module = module;
this.cpuDataCollector = cpuDataCollector;
this.setDaemon(true);
this.start();
}
@Override
public void run() {
try {
while (!interrupted()) {
logger.debug("inserting new set of TSDR records");
insertMemorySample();
insertControllerCPUSample();
insertMachineCPUSample();
Thread.sleep(5000);
}
} catch (final InterruptedException err) {
logger.info("ControllerMetricCollector thread has been interrupted and is now exiting");
Thread.currentThread().interrupt();
}
}
public Optional<Double> getControllerCPU() {
logger.debug("Getting controller CPU data");
if (cpuDataCollector.isPresent()) {
return cpuDataCollector.get().getControllerCpu();
} else {
// unable to get controller CPU data, user has already been warned
logger.info("Unable to get controller CPU data, data collector is not present");
return Optional.empty();
}
}
public Optional<Double> getMachineCPU() {
logger.debug("Getting machine CPU data");
if (cpuDataCollector.isPresent()) {
return cpuDataCollector.get().getMachineCpu();
} else {
// unable to get machine CPU data, user has already been warned
logger.info("Unable to get machine CPU data, data collector is not present");
return Optional.empty();
}
}
protected void insertMemorySample() {
TSDRMetricRecordBuilder b = new TSDRMetricRecordBuilder();
b.setMetricName("Heap:Memory:Usage");
b.setTSDRDataCategory(DataCategory.EXTERNAL);
b.setNodeID("Controller");
b.setRecordKeys(new ArrayList<>());
b.setTimeStamp(System.currentTimeMillis());
b.setMetricValue(new BigDecimal(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
InsertTSDRMetricRecordInputBuilder input = new InsertTSDRMetricRecordInputBuilder();
List<TSDRMetricRecord> list = new LinkedList<>();
list.add(b.build());
input.setTSDRMetricRecord(list);
input.setCollectorCodeName(COLLECTOR_CODE_NAME);
module.getTSDRCollectorSPIService().insertTSDRMetricRecord(input.build());
}
protected void insertControllerCPUSample() {
final Optional<Double> cpuValue = getControllerCPU();
if (!cpuValue.isPresent()) {
return;
}
TSDRMetricRecordBuilder b = new TSDRMetricRecordBuilder();
b.setMetricName("CPU:Usage");
b.setTSDRDataCategory(DataCategory.EXTERNAL);
b.setNodeID("Controller");
b.setRecordKeys(new ArrayList<>());
b.setTimeStamp(System.currentTimeMillis());
b.setMetricValue(new BigDecimal(cpuValue.get()));
InsertTSDRMetricRecordInputBuilder input = new InsertTSDRMetricRecordInputBuilder();
List<TSDRMetricRecord> list = new LinkedList<>();
list.add(b.build());
input.setTSDRMetricRecord(list);
input.setCollectorCodeName(COLLECTOR_CODE_NAME);
module.getTSDRCollectorSPIService().insertTSDRMetricRecord(input.build());
}
protected void insertMachineCPUSample() {
final Optional<Double> cpuValue = getMachineCPU();
if (!cpuValue.isPresent()) {
return;
}
TSDRMetricRecordBuilder b = new TSDRMetricRecordBuilder();
b.setMetricName("CPU:Usage");
b.setTSDRDataCategory(DataCategory.EXTERNAL);
b.setNodeID("Machine");
b.setRecordKeys(new ArrayList<>());
b.setTimeStamp(System.currentTimeMillis());
b.setMetricValue(new BigDecimal(cpuValue.get()));
InsertTSDRMetricRecordInputBuilder input = new InsertTSDRMetricRecordInputBuilder();
List<TSDRMetricRecord> list = new LinkedList<>();
list.add(b.build());
input.setTSDRMetricRecord(list);
input.setCollectorCodeName(COLLECTOR_CODE_NAME);
module.getTSDRCollectorSPIService().insertTSDRMetricRecord(input.build());
}
}