Skip to content

Commit 62b9e06

Browse files
authored
Oshi optimization (#2126)
1 parent 6d7d5a4 commit 62b9e06

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/perfcounter/OshiPerformanceCounter.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.microsoft.applicationinsights.agent.internal.exporter.models.TelemetryItem;
2525
import com.microsoft.applicationinsights.agent.internal.telemetry.TelemetryClient;
2626
import com.microsoft.applicationinsights.agent.internal.telemetry.TelemetryUtil;
27+
import java.util.Map;
2728
import java.util.concurrent.atomic.AtomicBoolean;
2829
import org.slf4j.Logger;
2930
import org.slf4j.LoggerFactory;
@@ -32,6 +33,10 @@
3233
import oshi.hardware.CentralProcessor.TickType;
3334
import oshi.software.os.OSProcess;
3435
import oshi.software.os.OperatingSystem;
36+
import oshi.software.os.linux.LinuxOSProcess;
37+
import oshi.util.FileUtil;
38+
import oshi.util.ParseUtil;
39+
import oshi.util.platform.linux.ProcPath;
3540

3641
public class OshiPerformanceCounter implements PerformanceCounter {
3742

@@ -79,8 +84,12 @@ public void report(TelemetryClient telemetryClient) {
7984
long currCollectionTimeMillis = System.currentTimeMillis();
8085
long currProcessBytes = 0L;
8186
if (processInfo != null) {
82-
updateAttributes(processInfo);
83-
currProcessBytes = getProcessBytes(processInfo);
87+
if (processInfo instanceof LinuxOSProcess) {
88+
currProcessBytes = getProcessBytesLinux(processInfo.getProcessID());
89+
} else {
90+
updateAttributes(processInfo);
91+
currProcessBytes = getProcessBytes(processInfo);
92+
}
8493
}
8594

8695
long currTotalProcessorMillis = getTotalProcessorMillis(processor);
@@ -124,6 +133,21 @@ private static long getProcessBytes(OSProcess processInfo) {
124133
return processInfo.getBytesRead() + processInfo.getBytesWritten();
125134
}
126135

136+
// oshi.software.os.linux.LinuxOSProcess.updateAttributes() captures too much stuff each time,
137+
// including groupId which calls "getent group", which having the machine connected to active
138+
// directory, scans its entire structure
139+
// (https://portal.microsofticm.com/imp/v3/incidents/details/289056966/home)
140+
//
141+
// so this method copies what LinuxOSProcess.updateAttributes() does for just the metrics that we
142+
// use for calculating I/O bytes
143+
private static long getProcessBytesLinux(int processId) {
144+
Map<String, String> io =
145+
FileUtil.getKeyValueMapFromFile(String.format(ProcPath.PID_IO, processId), ":");
146+
long bytesRead = ParseUtil.parseLongOrDefault(io.getOrDefault("read_bytes", ""), 0L);
147+
long bytesWritten = ParseUtil.parseLongOrDefault(io.getOrDefault("write_bytes", ""), 0L);
148+
return bytesRead + bytesWritten;
149+
}
150+
127151
private static long getTotalProcessorMillis(CentralProcessor processor) {
128152
long[] systemCpuLoadTicks = processor.getSystemCpuLoadTicks();
129153
return systemCpuLoadTicks[TickType.USER.getIndex()]

0 commit comments

Comments
 (0)