You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by jb...@apache.org on 2021/11/19 19:44:29 UTC

[geode] 09/16: Updated benchmark and test.

This is an automated email from the ASF dual-hosted git repository.

jbarrett pushed a commit to branch wip/oshi-multios-stats-module
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 64e2a8c1f310dc16c5c31158863c1d726dec65a3
Author: Jacob Barrett <jb...@pivotal.io>
AuthorDate: Mon Nov 15 22:55:16 2021 -0800

    Updated benchmark and test.
---
 .../OshiStatisticsBenchmark.java                   |  53 +++----
 .../oshi/OshiStatisticsProviderImpl.java           |  17 ++-
 .../oshi/OshiStatisticsProviderImplTest.java       | 160 +++++++++++++++++++++
 .../statistics/oshi/OshiStatisticsTest.java        |  92 ------------
 4 files changed, 202 insertions(+), 120 deletions(-)

diff --git a/geode-core/src/jmh/java/org/apache/geode/internal/statistics/platform/OshiStatisticsBenchmark.java b/geode-core/src/jmh/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsBenchmark.java
similarity index 87%
rename from geode-core/src/jmh/java/org/apache/geode/internal/statistics/platform/OshiStatisticsBenchmark.java
rename to geode-core/src/jmh/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsBenchmark.java
index ddf9fcf..a2f1746 100644
--- a/geode-core/src/jmh/java/org/apache/geode/internal/statistics/platform/OshiStatisticsBenchmark.java
+++ b/geode-core/src/jmh/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsBenchmark.java
@@ -13,51 +13,47 @@
  * the License.
  */
 
-package org.apache.geode.internal.statistics.platform;
+package org.apache.geode.internal.statistics.oshi;
 
 import java.util.concurrent.TimeUnit;
 import java.util.function.DoubleSupplier;
 import java.util.function.IntSupplier;
 import java.util.function.LongSupplier;
 
+import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
 import org.openjdk.jmh.annotations.Mode;
 import org.openjdk.jmh.annotations.OutputTimeUnit;
 import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
 import org.openjdk.jmh.annotations.State;
-import oshi.SystemInfo;
 
 import org.apache.geode.StatisticDescriptor;
+import org.apache.geode.Statistics;
 import org.apache.geode.StatisticsType;
 import org.apache.geode.internal.statistics.SuppliableStatistics;
+import org.apache.geode.internal.statistics.platform.OsStatisticsFactory;
 
 @State(Scope.Benchmark)
 @BenchmarkMode(Mode.SampleTime)
 @OutputTimeUnit(TimeUnit.MILLISECONDS)
 public class OshiStatisticsBenchmark {
 
-  private final int pid = new SystemInfo().getOperatingSystem().getProcessId();
-  private final SuppliableStatistics noopStatistics = new NoopStatistics();
-
-  // @Setup
-  // public void setup() {
-  // OshiStatistics.init();
-  // }
-  //
-  // @Benchmark
-  // public void noop() {
-  //
-  // }
-  //
-  // @Benchmark
-  // public void refreshProcess() {
-  // OshiStatistics.refreshProcess(pid, noopStatistics);
-  // }
-  //
-  // @Benchmark
-  // public void refreshSystem() {
-  // OshiStatistics.refreshSystem(noopStatistics);
-  // }
+  private final OshiStatisticsProviderImpl oshiStatisticsProvider =
+      new OshiStatisticsProviderImpl();
+
+  @Setup
+  public void setup() throws OshiStatisticsProviderException {
+    oshiStatisticsProvider.init(new NoopStatisticsProvider(), 0);
+  }
+
+//  @Benchmark
+//  public void noop() {}
+
+  @Benchmark
+  public void sampleProcess() {
+    oshiStatisticsProvider.sampleProcess();
+  }
 
   private static class NoopStatistics implements SuppliableStatistics {
     @Override
@@ -313,4 +309,13 @@ public class OshiStatisticsBenchmark {
       return null;
     }
   }
+
+  private static class NoopStatisticsProvider implements OsStatisticsFactory {
+    @Override
+    public Statistics createOsStatistics(final StatisticsType type, final String textId,
+        final long numericId,
+        final int osStatFlags) {
+      return new NoopStatistics();
+    }
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsProviderImpl.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsProviderImpl.java
index 8054881..71201fc 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsProviderImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsProviderImpl.java
@@ -26,7 +26,7 @@ import org.apache.geode.logging.internal.log4j.api.LogService;
 public class OshiStatisticsProviderImpl implements OshiStatisticsProvider {
   private static final Logger log = LogService.getLogger();
 
-  final SystemInfo systemInfo = new SystemInfo();
+  final SystemInfo systemInfo;
 
   private int processId;
   private CentralProcessor processor;
@@ -43,6 +43,14 @@ public class OshiStatisticsProviderImpl implements OshiStatisticsProvider {
   private Statistics[] processorStats;
   private Statistics[] networkInterfaceStats;
 
+  public OshiStatisticsProviderImpl() {
+    this(new SystemInfo());
+  }
+
+  OshiStatisticsProviderImpl(final SystemInfo systemInfo) {
+    this.systemInfo = systemInfo;
+  }
+
   @Override
   public void init(final @NotNull OsStatisticsFactory osStatisticsFactory,
       final long id) throws OshiStatisticsProviderException {
@@ -77,10 +85,11 @@ public class OshiStatisticsProviderImpl implements OshiStatisticsProvider {
     networkInterfaceStats = new Statistics[networkIFs.size()];
     for (int i = 0, size = networkIFs.size(); i < size; i++) {
       final NetworkIF networkIF = networkIFs.get(i);
-      log.info("Creating network interfaces stats for {}", networkIF.getDisplayName());
+      final String displayName = networkIF.getDisplayName();
+      log.info("Creating network interfaces stats for {}", displayName);
       networkInterfaceStats[i] =
           osStatisticsFactory.createOsStatistics(NetworkInterfaceStats.getType(),
-              networkIF.getDisplayName(), id, 0);
+              displayName, id, 0);
     }
   }
 
@@ -95,7 +104,7 @@ public class OshiStatisticsProviderImpl implements OshiStatisticsProvider {
   @Override
   public void destroy() {}
 
-  private void sampleProcess() {
+  void sampleProcess() {
     final OSProcess process = operatingSystem.getProcess(processId);
 
     final double processCpuLoadBetweenTicks = process.getProcessCpuLoadBetweenTicks(this.process);
diff --git a/geode-core/src/test/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsProviderImplTest.java b/geode-core/src/test/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsProviderImplTest.java
new file mode 100644
index 0000000..c5244f3
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsProviderImplTest.java
@@ -0,0 +1,160 @@
+/*
+ * 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.geode.internal.statistics.oshi;
+
+import static java.util.Arrays.asList;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import org.junit.jupiter.api.Test;
+import oshi.SystemInfo;
+import oshi.hardware.CentralProcessor;
+import oshi.hardware.HardwareAbstractionLayer;
+import oshi.hardware.NetworkIF;
+import oshi.software.os.OSProcess;
+import oshi.software.os.OperatingSystem;
+
+import org.apache.geode.Statistics;
+import org.apache.geode.internal.statistics.platform.OsStatisticsFactory;
+
+public class OshiStatisticsProviderImplTest {
+
+  private static final String SYSTEM_IDENTITY = "mock-operating-system";
+  private static final String PROCESS_IDENTITY = "mock-process";
+  private static final String LOGICAL_PROCESSOR_0_IDENTITY = "mock-processor-0";
+  private static final String LOGICAL_PROCESSOR_1_IDENTITY = "mock-processor-1";
+  private static final String NETWORK_IF_0_DISPLAY_NAME = "mock-if0";
+  private static final String NETWORK_IF_1_DISPLAY_NAME = "mock-if1";
+
+  private final OshiStatisticsProviderImpl oshiStatisticsProvider;
+  private final OSProcess osProcess;
+
+  public OshiStatisticsProviderImplTest() {
+    SystemInfo systemInfo = mock(SystemInfo.class);
+    oshiStatisticsProvider = new OshiStatisticsProviderImpl(systemInfo);
+
+    final OperatingSystem operatingSystem = mock(OperatingSystem.class);
+    when(systemInfo.getOperatingSystem()).thenReturn(operatingSystem);
+
+    final int processId = 42;
+    when(operatingSystem.getProcessId()).thenReturn(processId);
+
+    final HardwareAbstractionLayer hardwareAbstractionLayer = mock(HardwareAbstractionLayer.class);
+    when(systemInfo.getHardware()).thenReturn(hardwareAbstractionLayer);
+
+    final CentralProcessor centralProcessor = mock(CentralProcessor.class);
+    when(hardwareAbstractionLayer.getProcessor()).thenReturn(centralProcessor);
+
+    osProcess = mock(OSProcess.class);
+    when(operatingSystem.getProcess(eq(processId))).thenReturn(osProcess);
+
+    when(osProcess.toString()).thenReturn(PROCESS_IDENTITY);
+
+    when(operatingSystem.toString()).thenReturn(SYSTEM_IDENTITY);
+
+    final CentralProcessor.LogicalProcessor logicalProcessor0 =
+        mock(CentralProcessor.LogicalProcessor.class);
+    when(logicalProcessor0.toString()).thenReturn(LOGICAL_PROCESSOR_0_IDENTITY);
+    final CentralProcessor.LogicalProcessor logicalProcessor1 =
+        mock(CentralProcessor.LogicalProcessor.class);
+    when(logicalProcessor1.toString()).thenReturn(LOGICAL_PROCESSOR_1_IDENTITY);
+    when(centralProcessor.getLogicalProcessors())
+        .thenReturn(asList(logicalProcessor0, logicalProcessor1));
+
+    final NetworkIF networkIf0 = mock(NetworkIF.class);
+    when(networkIf0.getDisplayName()).thenReturn(NETWORK_IF_0_DISPLAY_NAME);
+    final NetworkIF networkIf1 = mock(NetworkIF.class);
+    when(networkIf1.getDisplayName()).thenReturn(NETWORK_IF_1_DISPLAY_NAME);
+    when(hardwareAbstractionLayer.getNetworkIFs()).thenReturn(asList(networkIf0, networkIf1));
+
+  }
+
+  @Test
+  public void initCreatesOsStatistics() throws OshiStatisticsProviderException {
+    final OsStatisticsFactory osStatisticsFactory = mock(OsStatisticsFactory.class);
+    final long id = 13;
+    oshiStatisticsProvider.init(osStatisticsFactory, id);
+
+    verify(osStatisticsFactory).createOsStatistics(eq(ProcessStats.getType()), eq(PROCESS_IDENTITY),
+        eq(id),
+        eq(0));
+    verify(osStatisticsFactory).createOsStatistics(eq(OperatingSystemStats.getType()),
+        eq(SYSTEM_IDENTITY),
+        eq(id), eq(0));
+    verify(osStatisticsFactory)
+        .createOsStatistics(eq(ProcessorStats.getType()), eq(LOGICAL_PROCESSOR_0_IDENTITY), eq(id),
+            eq(0));
+    verify(osStatisticsFactory)
+        .createOsStatistics(eq(ProcessorStats.getType()), eq(LOGICAL_PROCESSOR_1_IDENTITY), eq(id),
+            eq(0));
+    verify(osStatisticsFactory)
+        .createOsStatistics(eq(NetworkInterfaceStats.getType()), eq(NETWORK_IF_0_DISPLAY_NAME),
+            eq(id), eq(0));
+    verify(osStatisticsFactory)
+        .createOsStatistics(eq(NetworkInterfaceStats.getType()), eq(NETWORK_IF_1_DISPLAY_NAME),
+            eq(id), eq(0));
+
+    verifyNoMoreInteractions(osStatisticsFactory);
+  }
+
+  @Test
+  public void sampleProcessUpdatesStats() throws OshiStatisticsProviderException {
+    final OsStatisticsFactory osStatisticsFactory = mock(OsStatisticsFactory.class);
+    final Statistics statistics = mock(Statistics.class);
+    when(osStatisticsFactory.createOsStatistics(eq(ProcessStats.getType()), eq(PROCESS_IDENTITY),
+        anyLong(),
+        anyInt())).thenReturn(statistics);
+
+    when(osProcess.getProcessCpuLoadBetweenTicks(any())).thenReturn(0.123D);
+    when(osProcess.getVirtualSize()).thenReturn(456L);
+    when(osProcess.getResidentSetSize()).thenReturn(789L);
+    when(osProcess.getThreadCount()).thenReturn(321);
+    when(osProcess.getKernelTime()).thenReturn(654L);
+    when(osProcess.getUserTime()).thenReturn(987L);
+    when(osProcess.getBytesRead()).thenReturn(1234L);
+    when(osProcess.getBytesWritten()).thenReturn(5678L);
+    when(osProcess.getOpenFiles()).thenReturn(9L);
+    when(osProcess.getProcessCpuLoadCumulative()).thenReturn(123.456D);
+    when(osProcess.getMinorFaults()).thenReturn(2L);
+    when(osProcess.getMajorFaults()).thenReturn(3L);
+    when(osProcess.getContextSwitches()).thenReturn(42L);
+
+    oshiStatisticsProvider.init(osStatisticsFactory, 0);
+    oshiStatisticsProvider.sampleProcess();
+
+    verify(statistics).setDouble(eq(ProcessStats.cpuLoad), eq(0.123D));
+    verify(statistics).setLong(eq(ProcessStats.virtualSize), eq(456L));
+    verify(statistics).setLong(eq(ProcessStats.residentSetSize), eq(789L));
+    verify(statistics).setLong(eq(ProcessStats.threadCount), eq(321L));
+    verify(statistics).setLong(eq(ProcessStats.kernelTime), eq(654L));
+    verify(statistics).setLong(eq(ProcessStats.userTime), eq(987L));
+    verify(statistics).setLong(eq(ProcessStats.bytesRead), eq(1234L));
+    verify(statistics).setLong(eq(ProcessStats.bytesWritten), eq(5678L));
+    verify(statistics).setLong(eq(ProcessStats.openFiles), eq(9L));
+    verify(statistics).setDouble(eq(ProcessStats.cpuLoadCumulative), eq(123.456D));
+    verify(statistics).setLong(eq(ProcessStats.minorFaults), eq(2L));
+    verify(statistics).setLong(eq(ProcessStats.majorFaults), eq(3L));
+    verify(statistics).setLong(eq(ProcessStats.contextSwitches), eq(42L));
+
+    verifyNoMoreInteractions(statistics);
+  }
+}
diff --git a/geode-core/src/test/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsTest.java b/geode-core/src/test/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsTest.java
deleted file mode 100644
index e87ae72..0000000
--- a/geode-core/src/test/java/org/apache/geode/internal/statistics/oshi/OshiStatisticsTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * 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.geode.internal.statistics.oshi;
-
-
-
-public class OshiStatisticsTest {
-
-  // private final OSProcess process = mock(OSProcess.class);
-  // private final OperatingSystem operatingSystem = mock(OperatingSystem.class);
-  // private final HardwareAbstractionLayer hardwareAbstractionLayer =
-  // mock(HardwareAbstractionLayer.class);
-  // private final OshiStatistics
-  // oshiStatistics = new OshiStatistics(operatingSystem, hardwareAbstractionLayer);
-  //
-  //
-  // private final SuppliableStatistics stats = mock(SuppliableStatistics.class);
-  //
-  // public OshiStatisticsTest() {
-  // when(operatingSystem.getProcess(eq(1))).thenReturn(process);
-  // }
-  //
-  // @Test
-  // public void testInit() {
-  // assertThat(OshiStatistics.init()).isEqualTo(0);
-  // }
-  //
-  // @Test
-  // public void updateProcessStats() {
-  // when(process.getVirtualSize()).thenReturn(42L);
-  // when(process.getResidentSetSize()).thenReturn(420L);
-  // when(process.getThreadCount()).thenReturn(4200);
-  // when(process.getKernelTime()).thenReturn(42000L);
-  // when(process.getUserTime()).thenReturn(420000L);
-  //
-  // oshiStatistics.updateProcessStats(1, stats);
-  //
-  // verify(stats).setLong(eq(ProcessStats.virtualSize), eq(42L));
-  // verify(stats).setLong(eq(ProcessStats.residentSetSize), eq(420L));
-  // verify(stats).setLong(eq(ProcessStats.threadCount), eq(4200L));
-  // verify(stats).setLong(eq(ProcessStats.kernelTime), eq(42000L));
-  // verify(stats).setLong(eq(ProcessStats.userTime), eq(420000L));
-  // }
-  //
-  // @Test
-  // public void updateSystemStats() {
-  // when(operatingSystem.getProcessCount()).thenReturn(1);
-  // when(operatingSystem.getThreadCount()).thenReturn(2);
-  // final CentralProcessor centralProcessor = mock(CentralProcessor.class);
-  // when(centralProcessor.getContextSwitches()).thenReturn(3L);
-  // when(centralProcessor.getInterrupts()).thenReturn(4L);
-  // when(centralProcessor.getPhysicalProcessorCount()).thenReturn(5);
-  // when(centralProcessor.getLogicalProcessorCount()).thenReturn(6);
-  // when(centralProcessor.getSystemLoadAverage(eq(3))).thenReturn(new double[]{1.0, 2.0, 3.0});
-  // when(centralProcessor.getSystemCpuLoadTicks()).thenReturn(new long[]{1, 2, 3, 4, 5, 6, 7, 8});
-  // when(hardwareAbstractionLayer.getProcessor()).thenReturn(centralProcessor);
-  //
-  // oshiStatistics.updateSystemStats(stats);
-  //
-  // verify(stats).setLong(eq(OperatingSystemStats.processCount), eq(1L));
-  // verify(stats).setLong(eq(OperatingSystemStats.threadCount), eq(2L));
-  // verify(stats).setLong(eq(OperatingSystemStats.contextSwitches), eq(3L));
-  // verify(stats).setLong(eq(OperatingSystemStats.interrupts), eq(4L));
-  // verify(stats).setLong(eq(OperatingSystemStats.physicalProcessorCount), eq(5L));
-  // verify(stats).setLong(eq(OperatingSystemStats.logicalProcessorCount), eq(6L));
-  // verify(stats).setDouble(eq(OperatingSystemStats.systemLoadAverage1), eq(1.0));
-  // verify(stats).setDouble(eq(OperatingSystemStats.systemLoadAverage5), eq(2.0));
-  // verify(stats).setDouble(eq(OperatingSystemStats.systemLoadAverage15), eq(3.0));
-  // verify(stats).setLong(eq(OperatingSystemStats.systemCpuLoadTicksUSER), eq(1L));
-  // verify(stats).setLong(eq(OperatingSystemStats.systemCpuLoadTicksNICE), eq(2L));
-  // verify(stats).setLong(eq(OperatingSystemStats.systemCpuLoadTicksSYSTEM), eq(3L));
-  // verify(stats).setLong(eq(OperatingSystemStats.systemCpuLoadTicksIDLE), eq(4L));
-  // verify(stats).setLong(eq(OperatingSystemStats.systemCpuLoadTicksIOWAIT), eq(5L));
-  // verify(stats).setLong(eq(OperatingSystemStats.systemCpuLoadTicksIRQ), eq(6L));
-  // verify(stats).setLong(eq(OperatingSystemStats.systemCpuLoadTicksSOFTIRQ), eq(7L));
-  // verify(stats).setLong(eq(OperatingSystemStats.systemCpuLoadTicksSTEAL), eq(8L));
-  // }
-
-}