Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,8 @@ public static void main(String[] args) {
@Qualifier("memMultiGauge") public MultiGauge memMultiGauge(MeterRegistry meterRegistry) {
return AgentHostMonitoring.newMemMultiGauge(meterRegistry);
}
@Bean
@Qualifier("diskIOMultiGauge") public MultiGauge diskIOMultiGauge(MeterRegistry meterRegistry) {
return AgentHostMonitoring.newDiskIOMultiGauge(meterRegistry);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ public class MetricsCollector {
@Resource
@Qualifier("cpuMultiGauge") private MultiGauge cpuMultiGauge;

@Resource
@Qualifier("diskIOMultiGauge") private MultiGauge diskIOMultiGauge;

@Async
@Scheduled(cron = "*/10 * * * * ?")
public void collect() {
Expand All @@ -54,5 +57,6 @@ private void scrape() {
AgentHostMonitoring.diskMultiGaugeUpdateData(diskMultiGauge);
AgentHostMonitoring.memMultiGaugeUpdateData(memMultiGauge);
AgentHostMonitoring.cpuMultiGaugeUpdateData(cpuMultiGauge);
AgentHostMonitoring.diskIOMultiGaugeUpdateData(diskIOMultiGauge);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,14 @@
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.hardware.NetworkIF;
import oshi.hardware.*;
import oshi.software.os.NetworkParams;
import oshi.software.os.OSFileStore;
import oshi.software.os.OperatingSystem;
import oshi.util.Util;

import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.UnknownHostException;
Expand All @@ -59,10 +58,18 @@ public class AgentHostMonitoring {
public static final String DISK_NAME = "diskName";
public static final String DISK_IDLE = "diskFreeSpace";
public static final String DISK_TOTAL = "diskTotalSpace";
public static final String FILE_OPEN_DESCRIPTOR = "fileOpenDescriptor";
public static final String FILE_TOTAL_DESCRIPTOR = "fileTotalDescriptor";
public static final String CPU_LOAD_AVG_MIN_1 = "cpuLoadAvgMin_1";
public static final String CPU_LOAD_AVG_MIN_5 = "cpuLoadAvgMin_5";
public static final String CPU_LOAD_AVG_MIN_15 = "cpuLoadAvgMin_15";
public static final String CPU_USAGE = "cpuUsage";
public static final String PHYSICAL_DISK_NAME = "physicalDiskName";
public static final String DISK_READ = "diskRead";
public static final String DISK_WRITE = "diskWrite";
public static long[] previousReadBytes;
public static long[] previousWriteBytes;
public static boolean initialized = false;

private static boolean sameSubnet(String ipAddress, String subnetMask, String gateway) throws UnknownHostException {
InetAddress inetAddress = InetAddress.getByName(ipAddress);
Expand Down Expand Up @@ -90,22 +97,36 @@ public static JsonNode getHostInfo() throws UnknownHostException {
ObjectNode objectNode = json.createObjectNode();
SystemInfo si = new SystemInfo();
OperatingSystem operatingSystem = si.getOperatingSystem();
OperatingSystemMXBean osBean = ManagementFactory.getOperatingSystemMXBean();
HardwareAbstractionLayer hal = si.getHardware();

NetworkParams networkParams = operatingSystem.getNetworkParams();
String hostName = networkParams.getHostName();
String ipv4DefaultGateway = networkParams.getIpv4DefaultGateway();

// File Descriptor
OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
long maxFileDescriptors = -1L;
long openFileDescriptors = -1L;
if (operatingSystemMXBean instanceof com.sun.management.UnixOperatingSystemMXBean) {
maxFileDescriptors = ((com.sun.management.UnixOperatingSystemMXBean) operatingSystemMXBean).getMaxFileDescriptorCount();
openFileDescriptors = ((com.sun.management.UnixOperatingSystemMXBean) operatingSystemMXBean).getOpenFileDescriptorCount();
}

// Agent Host Base Info
ObjectNode hostInfoNode = json.createObjectNode();
hostInfoNode
.put("hostname", hostName)
.put("os", operatingSystem.toString())
.put("os", osBean.getName())
.put("arch",osBean.getArch())
.put("ipv4Gateway", ipv4DefaultGateway)
.put("cpu_info", hal.getProcessor().getProcessorIdentifier().getMicroarchitecture())
//.put("cpu_info", hal.getProcessor().getProcessorIdentifier().getMicroarchitecture())
.put("cpu_info", hal.getProcessor().getProcessorIdentifier().getName())
.put("logical_cores", hal.getProcessor().getLogicalProcessorCount())
.put("physical_cores", hal.getProcessor().getPhysicalProcessorCount())
.put("iPv4addr", getAgentHostIPv4addr(hal, ipv4DefaultGateway));
.put("iPv4addr", getAgentHostIPv4addr(hal, ipv4DefaultGateway))
.put(FILE_OPEN_DESCRIPTOR,openFileDescriptors)
.put(FILE_TOTAL_DESCRIPTOR,maxFileDescriptors);
objectNode.set(AGENT_BASE_INFO, hostInfoNode);

objectNode.put(BOOT_TIME, operatingSystem.getSystemBootTime());
Expand All @@ -122,12 +143,27 @@ public static JsonNode getHostInfo() throws UnknownHostException {
continue;
}
ObjectNode disk = json.createObjectNode();

disk.put(DISK_NAME, fileStore.getVolume());
disk.put(DISK_TOTAL, fileStore.getTotalSpace());
disk.put(DISK_IDLE, fileStore.getFreeSpace());

diskArrayNode.add(disk);
}
objectNode.set(DISKS_BASE_INFO, diskArrayNode);
// DISK IO init
if (!initialized) {
List<HWDiskStore> diskStores = si.getHardware().getDiskStores();
previousReadBytes = new long[diskStores.size()];
previousWriteBytes = new long[diskStores.size()];

// init 0
for (int i = 0; i < diskStores.size(); i++) {
previousReadBytes[i] = 0L;
previousWriteBytes[i] = 0L;
}
initialized = true; // tag
}
return objectNode;
}

Expand Down Expand Up @@ -173,7 +209,6 @@ public BaseAgentGauge(JsonNode agentMonitoring) {
}
}
}

public static Map<ArrayList<String>, Map<ArrayList<String>, Double>> getDiskGauge(JsonNode agentMonitoring) {
BaseAgentGauge gaugeBaseInfo = new BaseAgentGauge(agentMonitoring);
ArrayList<String> diskGaugeLabels = gaugeBaseInfo.getLabels();
Expand All @@ -192,7 +227,6 @@ public static Map<ArrayList<String>, Map<ArrayList<String>, Double>> getDiskGaug
labelValues.put(
diskIdleLabelValues,
diskJsonNode.get(AgentHostMonitoring.DISK_IDLE).asDouble());

// Disk Total
ArrayList<String> diskTotalLabelValues = new ArrayList<>(diskGaugeLabelsValues);
diskTotalLabelValues.add(
Expand All @@ -206,7 +240,51 @@ public static Map<ArrayList<String>, Map<ArrayList<String>, Double>> getDiskGaug
diskGauge.put(diskGaugeLabels, labelValues);
return diskGauge;
}
public static Map<ArrayList<String>, Map<ArrayList<String>, Double>> getDiskIOGauge(JsonNode agentMonitoring){
SystemInfo si = new SystemInfo();
BaseAgentGauge gaugeBaseInfo = new BaseAgentGauge(agentMonitoring);
ArrayList<String> diskIOGaugeLabels = gaugeBaseInfo.getLabels();
ArrayList<String> diskIOGaugeLabelsValues = gaugeBaseInfo.getLabelsValues();
diskIOGaugeLabels.add(AgentHostMonitoring.PHYSICAL_DISK_NAME);
diskIOGaugeLabels.add("diskIO");
Map<ArrayList<String>, Double> labelValues = new HashMap<>();

Util.sleep(1000);
List<HWDiskStore> upDiskStores = si.getHardware().getDiskStores();
long[] currentReadBytes = new long[upDiskStores.size()];
long[] currentWriteBytes = new long[upDiskStores.size()];

for (int i = 0; i < upDiskStores.size(); i++) {
HWDiskStore disk = upDiskStores.get(i);
currentReadBytes[i] = disk.getReadBytes();
currentWriteBytes[i] = disk.getWriteBytes();
}

for (int i = 0; i < upDiskStores.size(); i++) {
long readBytesDelta = Math.abs(currentReadBytes[i] - previousReadBytes[i]);
long writeBytesDelta = Math.abs(currentWriteBytes[i] - previousWriteBytes[i]);
double readKB = readBytesDelta / 1024.0;
double writeKB = writeBytesDelta / 1024.0; //kbs
previousReadBytes[i] = currentReadBytes[i];
previousWriteBytes[i] = currentWriteBytes[i];

// Disk Read
ArrayList<String> diskReadLabelValues = new ArrayList<>(diskIOGaugeLabelsValues);
diskReadLabelValues.add(upDiskStores.get(i).getName());
diskReadLabelValues.add(AgentHostMonitoring.DISK_READ);
labelValues.put(diskReadLabelValues,readKB);

// Disk Write
ArrayList<String> diskWriteLabelValues = new ArrayList<>(diskIOGaugeLabelsValues);
diskWriteLabelValues.add(upDiskStores.get(i).getName());
diskWriteLabelValues.add(AgentHostMonitoring.DISK_WRITE);
labelValues.put(diskWriteLabelValues, writeKB);
}

Map<ArrayList<String>, Map<ArrayList<String>, Double>> diskIOGauge = new HashMap<>();
diskIOGauge.put(diskIOGaugeLabels,labelValues);
return diskIOGauge;
}
public static Map<ArrayList<String>, Map<ArrayList<String>, Double>> getCPUGauge(JsonNode agentMonitoring) {

SystemInfo si = new SystemInfo();
Expand Down Expand Up @@ -299,6 +377,13 @@ public static MultiGauge newCPUMultiGauge(MeterRegistry registry) {
.register(registry);
}

public static MultiGauge newDiskIOMultiGauge(MeterRegistry registry) {
return MultiGauge.builder("agent_host_monitoring")
.description("BigTop Manager Agent Host Monitoring, DiskIO Monitoring")
.baseUnit("diskIO")
.register(registry);
}

public static void multiGaugeUpdateData(
MultiGauge multiGauge, Map<ArrayList<String>, Map<ArrayList<String>, Double>> gaugeData) {
ArrayList<String> tagKeys = null;
Expand Down Expand Up @@ -351,4 +436,13 @@ public static void cpuMultiGaugeUpdateData(MultiGauge cpuMultiGauge) {
throw new RuntimeException("Get agent host monitoring info failed");
}
}

public static void diskIOMultiGaugeUpdateData(MultiGauge diskIOMultiGauge) {
try {
Map<ArrayList<String>, Map<ArrayList<String>, Double>> diskGauge = getDiskIOGauge(getHostInfo());
multiGaugeUpdateData(diskIOMultiGauge, diskGauge);
} catch (UnknownHostException e) {
throw new RuntimeException("Get agent host monitoring info failed");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,19 @@ public class MonitoringController {
@Operation(summary = "agent healthy", description = "agent healthy check")
@GetMapping("agenthealthy")
public ResponseEntity<JsonNode> agentHostsHealthyStatus() {
// json for response
return ResponseEntity.success(monitoringService.queryAgentsHealthyStatus());
}

@Operation(summary = "agent Info", description = "agent info query")
@GetMapping("agentinfo")
public ResponseEntity<JsonNode> queryAgentsInfo() {
return ResponseEntity.success(monitoringService.queryAgentsInfo());
}

@Operation(summary = "agent instant info", description = "agent instant info query")
@GetMapping("agentinstinfo")
public ResponseEntity<JsonNode> queryAgentsInstStatus() {
return ResponseEntity.success(monitoringService.queryAgentsInstStatus());
}
}
Loading