blob: e725fe361d7ef993b57c9944a336e2e73e106113 [file] [log] [blame]
/*
* 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.karaf.decanter.collector.oshi;
import org.apache.karaf.decanter.collector.utils.PropertiesPreparator;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import oshi.SystemInfo;
import oshi.hardware.*;
import oshi.software.os.*;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Map;
@Component(
name = "org.apache.karaf.decanter.collector.oshi",
immediate = true,
property = { "decanter.collector.name=oshi",
"scheduler.period:Long=60",
"scheduler.concurrent:Boolean=false",
"scheduler.name=decanter-collector-oshi"}
)
public class OshiCollector implements Runnable {
private final static Logger LOGGER = LoggerFactory.getLogger(OshiCollector.class);
@Reference
EventAdmin dispatcher;
private Dictionary<String, Object> properties;
long[] lastSystemCpuLoadTicks = null;
@Activate
public void activate(ComponentContext componentContext) {
activate(componentContext.getProperties());
}
public void activate(Dictionary<String, Object> properties) {
this.properties = properties;
this.lastSystemCpuLoadTicks = null;
}
@Override
public void run() {
try {
Map<String, Object> data = new HashMap<>();
data.put("type", "oshi");
SystemInfo systemInfo = new SystemInfo();
HardwareAbstractionLayer hardwareAbstractionLayer = systemInfo.getHardware();
// * computer system
boolean computerSystem = properties.get("computerSystem") != null ? Boolean.parseBoolean(properties.get("computerSystem").toString()) : true;
if (computerSystem) {
data.put("computerSystem.manufacturer", hardwareAbstractionLayer.getComputerSystem().getManufacturer());
data.put("computerSystem.model", hardwareAbstractionLayer.getComputerSystem().getModel());
data.put("computerSystem.serialNumber", hardwareAbstractionLayer.getComputerSystem().getSerialNumber());
// ** baseboard
boolean computerSystemBaseboard = properties.get("computerSystem.baseboard") != null ? Boolean.parseBoolean(properties.get("computerSystem.baseboard").toString()) : true;
if (computerSystemBaseboard) {
data.put("computerSystem.baseboard.manufacturer", hardwareAbstractionLayer.getComputerSystem().getBaseboard().getManufacturer());
data.put("computerSystem.baseboard.model", hardwareAbstractionLayer.getComputerSystem().getBaseboard().getModel());
data.put("computerSystem.baseboard.serialNumber", hardwareAbstractionLayer.getComputerSystem().getBaseboard().getSerialNumber());
data.put("computerSystem.baseboard.version", hardwareAbstractionLayer.getComputerSystem().getBaseboard().getVersion());
}
// ** firmware
boolean computerSystemFirmware = properties.get("computerSystem.firmware") != null ? Boolean.parseBoolean(properties.get("computerSystem.firmware").toString()) : true;
if (computerSystemFirmware) {
data.put("computerSystem.firmware.description", hardwareAbstractionLayer.getComputerSystem().getFirmware().getDescription());
data.put("computerSystem.firmware.manufacturer", hardwareAbstractionLayer.getComputerSystem().getFirmware().getManufacturer());
data.put("computerSystem.firmware.name", hardwareAbstractionLayer.getComputerSystem().getFirmware().getName());
data.put("computerSystem.firmware.releaseDate", hardwareAbstractionLayer.getComputerSystem().getFirmware().getReleaseDate());
data.put("computerSystem.firmware.version", hardwareAbstractionLayer.getComputerSystem().getFirmware().getVersion());
}
}
// * memory
boolean memory = properties.get("memory") != null ? Boolean.parseBoolean(properties.get("memory").toString()) : true;
if (memory) {
data.put("memory.available", hardwareAbstractionLayer.getMemory().getAvailable());
data.put("memory.pageSize", hardwareAbstractionLayer.getMemory().getPageSize());
data.put("memory.physicalMemory", hardwareAbstractionLayer.getMemory().getPhysicalMemory());
data.put("memory.total", hardwareAbstractionLayer.getMemory().getTotal());
data.put("memory.virtualMemory", hardwareAbstractionLayer.getMemory().getVirtualMemory());
}
// * processor
boolean processors = properties.get("processors") != null ? Boolean.parseBoolean(properties.get("processors").toString()) : true;
if (processors) {
data.put("processor.contextSwitched", hardwareAbstractionLayer.getProcessor().getContextSwitches());
data.put("processor.currentFreq", Arrays.toString(hardwareAbstractionLayer.getProcessor().getCurrentFreq()));
data.put("processor.interrupts", hardwareAbstractionLayer.getProcessor().getInterrupts());
data.put("processor.logicalProcessorCount", hardwareAbstractionLayer.getProcessor().getLogicalProcessorCount());
data.put("processor.maxFreq", hardwareAbstractionLayer.getProcessor().getMaxFreq());
data.put("processor.systemCpuLoadBetweenTicks", lastSystemCpuLoadTicks != null ? hardwareAbstractionLayer.getProcessor().getSystemCpuLoadBetweenTicks(lastSystemCpuLoadTicks) : null);
lastSystemCpuLoadTicks = hardwareAbstractionLayer.getProcessor().getSystemCpuLoadTicks();
boolean processorsLogical = properties.get("processors.logical") != null ? Boolean.parseBoolean(properties.get("processors.logical").toString()) : true;
if (processorsLogical) {
int i = 0;
for (CentralProcessor.LogicalProcessor processor : hardwareAbstractionLayer.getProcessor().getLogicalProcessors()) {
data.put("processor.logical." + i + ".numaNode", processor.getNumaNode());
data.put("processor.logical." + i + ".physicalPackageNumber", processor.getPhysicalPackageNumber());
data.put("processor.logical." + i + ".physicalProcessorNumber", processor.getPhysicalProcessorNumber());
data.put("processor.logical." + i + ".processorGroup", processor.getProcessorGroup());
data.put("processor.logical." + i + ".processorNumber", processor.getProcessorNumber());
i++;
}
}
}
// * displays
boolean displays = properties.get("displays") != null ? Boolean.parseBoolean(properties.get("displays").toString()) : true;
if (displays) {
int i = 0;
for (Display display : hardwareAbstractionLayer.getDisplays()) {
data.put("display." + i + ".edid", display.getEdid());
i++;
}
}
boolean disks = properties.get("disks") != null ? Boolean.parseBoolean(properties.get("disks").toString()) : true;
if (disks) {
// * disk stores
int i = 0;
for (HWDiskStore diskStore : hardwareAbstractionLayer.getDiskStores()) {
data.put("diskStore." + i + ".name", diskStore.getName());
data.put("diskStore." + i + ".model", diskStore.getModel());
data.put("diskStore." + i + ".currentQueueLength", diskStore.getCurrentQueueLength());
data.put("diskStore." + i + ".readBytes", diskStore.getReadBytes());
data.put("diskStore." + i + ".reads", diskStore.getReads());
data.put("diskStore." + i + ".serial", diskStore.getSerial());
data.put("diskStore." + i + ".size", diskStore.getSize());
data.put("diskStore." + i + ".timeStamp", diskStore.getTimeStamp());
data.put("diskStore." + i + ".transferTime", diskStore.getTransferTime());
data.put("diskStore." + i + ".writeBytes", diskStore.getWriteBytes());
data.put("diskStore." + i + ".writes", diskStore.getWrites());
// partitions
boolean disksPartitions = properties.get("disks.partitions") != null ? Boolean.parseBoolean(properties.get("disks.partitions").toString()) : true;
if (disksPartitions) {
int j = 0;
for (HWPartition partition : diskStore.getPartitions()) {
data.put("diskStore." + i + ".partition." + j + ".name", partition.getName());
data.put("diskStore." + i + ".partition." + j + ".identification", partition.getIdentification());
data.put("diskStore." + i + ".partition." + j + ".major", partition.getMajor());
data.put("diskStore." + i + ".partition." + j + ".minor", partition.getMinor());
data.put("diskStore." + i + ".partition." + j + ".mountPoint", partition.getMountPoint());
data.put("diskStore." + i + ".partition." + j + ".size", partition.getSize());
data.put("diskStore." + i + ".partition." + j + ".type", partition.getType());
data.put("diskStore." + i + ".partition." + j + ".uuid", partition.getUuid());
j++;
}
}
i++;
}
}
// * graphics cards
boolean graphicsCards = properties.get("graphicsCards") != null ? Boolean.parseBoolean(properties.get("graphicsCards").toString()) : true;
if (graphicsCards) {
int i = 0;
for (GraphicsCard graphicsCard : hardwareAbstractionLayer.getGraphicsCards()) {
data.put("graphicsCard." + i + ".deviceId", graphicsCard.getDeviceId());
data.put("graphicsCard." + i + ".name", graphicsCard.getName());
data.put("graphicsCard." + i + ".vendor", graphicsCard.getVendor());
data.put("graphicsCard." + i + ".versionInfo", graphicsCard.getVersionInfo());
data.put("graphicsCard." + i + ".vram", graphicsCard.getVRam());
i++;
}
}
boolean networkIFs = properties.get("networkIFs") != null ? Boolean.parseBoolean(properties.get("networkIFs").toString()) : true;
if (networkIFs) {
// * network interfaces
int i = 0;
for (NetworkIF networkIF : hardwareAbstractionLayer.getNetworkIFs()) {
data.put("networkIF." + i + ".bytesRecv", networkIF.getBytesRecv());
data.put("networkIF." + i + ".bytesSent", networkIF.getBytesSent());
data.put("networkIF." + i + ".collisions", networkIF.getCollisions());
data.put("networkIF." + i + ".displayName", networkIF.getDisplayName());
data.put("networkIF." + i + ".ifType", networkIF.getIfType());
data.put("networkIF." + i + ".inDrops", networkIF.getInDrops());
data.put("networkIF." + i + ".inErrors", networkIF.getInErrors());
data.put("networkIF." + i + ".IPv4addr", Arrays.toString(networkIF.getIPv4addr()));
data.put("networkIF." + i + ".IPv6addr", Arrays.toString(networkIF.getIPv6addr()));
data.put("networkIF." + i + ".MACaddr", networkIF.getMacaddr());
data.put("networkIF." + i + ".MTU", networkIF.getMTU());
data.put("networkIF." + i + ".name", networkIF.getName());
data.put("networkIF." + i + ".ndisPhysicalMediumType", networkIF.getNdisPhysicalMediumType());
data.put("networkIF." + i + ".outErrors", networkIF.getOutErrors());
data.put("networkIF." + i + ".packetsRecv", networkIF.getPacketsRecv());
data.put("networkIF." + i + ".packetsSent", networkIF.getPacketsSent());
data.put("networkIF." + i + ".speed", networkIF.getSpeed());
data.put("networkIF." + i + ".prefixLengths", Arrays.toString(networkIF.getPrefixLengths()));
data.put("networkIF." + i + ".subnetMasks", Arrays.toString(networkIF.getSubnetMasks()));
data.put("networkIF." + i + ".timeStamp", networkIF.getTimeStamp());
i++;
}
}
// * power sources
boolean powerSources = properties.get("powerSources") != null ? Boolean.parseBoolean(properties.get("powerSources").toString()) : true;
if (powerSources) {
int i = 0;
for (PowerSource powerSource : hardwareAbstractionLayer.getPowerSources()) {
data.put("powerSource." + i + ".amperage", powerSource.getAmperage());
data.put("powerSource." + i + ".capacityUnits", powerSource.getCapacityUnits());
data.put("powerSource." + i + ".chemistry", powerSource.getChemistry());
data.put("powerSource." + i + ".currentCapacity", powerSource.getCurrentCapacity());
data.put("powerSource." + i + ".cycleCount", powerSource.getCycleCount());
data.put("powerSource." + i + ".designCapacity", powerSource.getDesignCapacity());
data.put("powerSource." + i + ".deviceName", powerSource.getDeviceName());
data.put("powerSource." + i + ".manufactureDate", powerSource.getManufactureDate());
data.put("powerSource." + i + ".manufacturer", powerSource.getManufacturer());
data.put("powerSource." + i + ".maxCapacity", powerSource.getMaxCapacity());
data.put("powerSource." + i + ".name", powerSource.getName());
data.put("powerSource." + i + ".powerUsageRate", powerSource.getPowerUsageRate());
data.put("powerSource." + i + ".remainingCapacityPercent", powerSource.getRemainingCapacityPercent());
data.put("powerSource." + i + ".serialNumber", powerSource.getSerialNumber());
data.put("powerSource." + i + ".temperature", powerSource.getTemperature());
data.put("powerSource." + i + ".timeRemainingEstimated", powerSource.getTimeRemainingEstimated());
data.put("powerSource." + i + ".powerUsageRate", powerSource.getPowerUsageRate());
data.put("powerSource." + i + ".timeRemainingInstance", powerSource.getTimeRemainingInstant());
data.put("powerSource." + i + ".voltage", powerSource.getVoltage());
i++;
}
}
// * sound cards
boolean soundCards = properties.get("soundCards") != null ? Boolean.parseBoolean(properties.get("soundCards").toString()) : true;
if (soundCards) {
int i = 0;
for (SoundCard soundCard : hardwareAbstractionLayer.getSoundCards()) {
data.put("soundCard." + i + ".codec", soundCard.getCodec());
data.put("soundCard." + i + ".driverVersion", soundCard.getDriverVersion());
data.put("soundCard." + i + ".name", soundCard.getName());
i++;
}
}
// * sensors
boolean sensors = properties.get("sensors") != null ? Boolean.parseBoolean(properties.get("sensors").toString()) : true;
if (sensors) {
data.put("sensors.cpuTemperature", hardwareAbstractionLayer.getSensors().getCpuTemperature());
data.put("sensors.cpuVoltage", hardwareAbstractionLayer.getSensors().getCpuVoltage());
data.put("sensors.fanSpeeds", Arrays.toString(hardwareAbstractionLayer.getSensors().getFanSpeeds()));
}
// * USB
boolean usbDevices = properties.get("usbDevices") != null ? Boolean.parseBoolean(properties.get("usbDevices").toString()) : true;
if (usbDevices) {
int i = 0;
for (UsbDevice usbDevice : hardwareAbstractionLayer.getUsbDevices(false)) {
data.put("usbDevice." + i + ".name", usbDevice.getName());
data.put("usbDevice." + i + ".productId", usbDevice.getProductId());
data.put("usbDevice." + i + ".serialNumber", usbDevice.getSerialNumber());
data.put("usbDevice." + i + ".uniqueDeviceId", usbDevice.getUniqueDeviceId());
data.put("usbDevice." + i + ".vendor", usbDevice.getVendor());
data.put("usbDevice." + i + ".vendorId", usbDevice.getVendorId());
i++;
}
}
// OS
boolean operatingSystem = properties.get("operatingSystem") != null ? Boolean.parseBoolean(properties.get("operatingSystem").toString()) : true;
if (operatingSystem) {
OperatingSystem os = systemInfo.getOperatingSystem();
data.put("operatingSystem.bitness", os.getBitness());
data.put("operatingSystem.family", os.getFamily());
data.put("operatingSystem.manufacturer", os.getManufacturer());
data.put("operatingSystem.processCount", os.getProcessCount());
data.put("operatingSystem.processId", os.getProcessId());
data.put("operatingSystem.systemBootTime", os.getSystemBootTime());
data.put("operatingSystem.systemUptime", os.getSystemUptime());
data.put("operatingSystem.threadCount", os.getThreadCount());
data.put("operatingSystem.versionInfo", os.getVersionInfo());
data.put("operatingSystem.elevated", os.isElevated());
data.put("operatingSystem.versionInfo.codeName", os.getVersionInfo().getCodeName());
data.put("operatingSystem.versionInfo.buildNumber", os.getVersionInfo().getBuildNumber());
data.put("operatingSystem.versionInfo.version", os.getVersionInfo().getVersion());
// filesystem
boolean fileSystems = properties.get("operatingSystem.fileSystems") != null ? Boolean.parseBoolean(properties.get("operatingSystem.fileSystems").toString()) : true;
if (fileSystems) {
data.put("operatingSystem.fileSystem.maxFileDescriptors", os.getFileSystem().getMaxFileDescriptors());
data.put("operatingSystem.fileSystem.openFileDescriptors", os.getFileSystem().getOpenFileDescriptors());
int i = 0;
for (OSFileStore fileStore : os.getFileSystem().getFileStores()) {
data.put("operatingSystem.fileSystem." + i + ".description", fileStore.getDescription());
data.put("operatingSystem.fileSystem." + i + ".freeInodes", fileStore.getFreeInodes());
data.put("operatingSystem.fileSystem." + i + ".freeSpace", fileStore.getFreeSpace());
data.put("operatingSystem.fileSystem." + i + ".label", fileStore.getLabel());
data.put("operatingSystem.fileSystem." + i + ".logicalVolume", fileStore.getLogicalVolume());
data.put("operatingSystem.fileSystem." + i + ".mount", fileStore.getMount());
data.put("operatingSystem.fileSystem." + i + ".name", fileStore.getName());
data.put("operatingSystem.fileSystem." + i + ".options", fileStore.getOptions());
data.put("operatingSystem.fileSystem." + i + ".totalInodes", fileStore.getTotalInodes());
data.put("operatingSystem.fileSystem." + i + ".totalSpace", fileStore.getTotalSpace());
data.put("operatingSystem.fileSystem." + i + ".type", fileStore.getType());
data.put("operatingSystem.fileSystem." + i + ".usableSpace", fileStore.getUsableSpace());
data.put("operatingSystem.fileSystem." + i + ".uuid", fileStore.getUUID());
data.put("operatingSystem.fileSystem." + i + ".volume", fileStore.getVolume());
i++;
}
}
// network params
boolean networkParams = properties.get("operatingSystem.networkParams") != null ? Boolean.parseBoolean(properties.get("operatingSystem.networkParams").toString()) : true;
if (networkParams) {
data.put("operatingSystem.networkParams.dnsServers", Arrays.toString(os.getNetworkParams().getDnsServers()));
data.put("operatingSystem.networkParams.domainName", os.getNetworkParams().getDomainName());
data.put("operatingSystem.networkParams.hostName", os.getNetworkParams().getHostName());
data.put("operatingSystem.networkParams.IPv4DefaultGateway", os.getNetworkParams().getIpv4DefaultGateway());
data.put("operatingSystem.networkParams.IPv6DefaultGateway", os.getNetworkParams().getIpv6DefaultGateway());
}
// processes
boolean processes = properties.get("operatingSystem.processes") != null ? Boolean.parseBoolean(properties.get("operatingSystem.processes").toString()) : true;
if (processes) {
for (OSProcess process : os.getProcesses()) {
int pid = process.getProcessID();
data.put("operatingSystem.process." + pid + ".pid", pid);
data.put("operatingSystem.process." + pid + ".bitness", process.getBitness());
data.put("operatingSystem.process." + pid + ".bytesRead", process.getBytesRead());
data.put("operatingSystem.process." + pid + ".bytesWritten", process.getBytesWritten());
data.put("operatingSystem.process." + pid + ".commandLine", process.getCommandLine());
data.put("operatingSystem.process." + pid + ".currentWorkingDirectory", process.getCurrentWorkingDirectory());
data.put("operatingSystem.process." + pid + ".group", process.getGroup());
data.put("operatingSystem.process." + pid + ".groupID", process.getGroupID());
data.put("operatingSystem.process." + pid + ".kernelTime", process.getKernelTime());
data.put("operatingSystem.process." + pid + ".name", process.getName());
data.put("operatingSystem.process." + pid + ".openFiles", process.getOpenFiles());
data.put("operatingSystem.process." + pid + ".parentProcessID", process.getParentProcessID());
data.put("operatingSystem.process." + pid + ".path", process.getPath());
data.put("operatingSystem.process." + pid + ".priority", process.getPriority());
data.put("operatingSystem.process." + pid + ".processCpuLoadCumulative", process.getProcessCpuLoadCumulative());
data.put("operatingSystem.process." + pid + ".residentSetSize", process.getResidentSetSize());
data.put("operatingSystem.process." + pid + ".startTime", process.getStartTime());
data.put("operatingSystem.process." + pid + ".state", process.getState());
data.put("operatingSystem.process." + pid + ".threadCount", process.getThreadCount());
data.put("operatingSystem.process." + pid + ".upTime", process.getUpTime());
data.put("operatingSystem.process." + pid + ".user", process.getUser());
data.put("operatingSystem.process." + pid + ".userID", process.getUserID());
data.put("operatingSystem.process." + pid + ".userTime", process.getUserTime());
data.put("operatingSystem.process." + pid + ".virtualSize", process.getVirtualSize());
}
}
// services
boolean services = properties.get("operatingSystem.services") != null ? Boolean.parseBoolean(properties.get("operatingSystem.services").toString()) : true;
if (services) {
for (OSService service : os.getServices()) {
int pid = service.getProcessID();
data.put("operatingSystem.service." + pid + ".pid", pid);
data.put("operatingSystem.service." + pid + ".name", service.getName());
data.put("operatingSystem.service." + pid + ".state", service.getState());
}
}
}
PropertiesPreparator.prepare(data, properties);
dispatcher.postEvent(new Event("decanter/collect/oshi", data));
} catch (Exception e) {
LOGGER.warn("Can't get oshi system metrics", e);
}
}
/**
* Visible for testing.
*/
public void setDispatcher(EventAdmin dispatcher) {
this.dispatcher = dispatcher;
}
}