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

suvasude pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-gobblin.git


The following commit(s) were added to refs/heads/master by this push:
     new 3e21a1b  [GOBBLIN-1029] Maintain the last GC stats to accurately 
report the difference in each interval[]
3e21a1b is described below

commit 3e21a1b6b7a846e09f0d8cd6dd20297c178bf5b6
Author: sv2000 <sudarsh...@gmail.com>
AuthorDate: Thu Jan 16 11:15:42 2020 -0800

    [GOBBLIN-1029] Maintain the last GC stats to accurately report the 
difference in each interval[]
    
    Closes #2871 from sv2000/gcStatsBug
---
 .../cluster/ContainerHealthMetricsService.java     | 28 +++++++++++++++-------
 .../cluster/ContainerHealthMetricsServiceTest.java |  5 ++++
 2 files changed, 25 insertions(+), 8 deletions(-)

diff --git 
a/gobblin-cluster/src/main/java/org/apache/gobblin/cluster/ContainerHealthMetricsService.java
 
b/gobblin-cluster/src/main/java/org/apache/gobblin/cluster/ContainerHealthMetricsService.java
index d603bae..ecd6224 100644
--- 
a/gobblin-cluster/src/main/java/org/apache/gobblin/cluster/ContainerHealthMetricsService.java
+++ 
b/gobblin-cluster/src/main/java/org/apache/gobblin/cluster/ContainerHealthMetricsService.java
@@ -32,6 +32,7 @@ import com.sun.management.OperatingSystemMXBean;
 import com.typesafe.config.Config;
 
 import lombok.Data;
+import lombok.Getter;
 
 import org.apache.gobblin.metrics.ContextAwareGauge;
 import org.apache.gobblin.metrics.RootMetricContext;
@@ -72,6 +73,11 @@ public class ContainerHealthMetricsService extends 
AbstractScheduledService {
   private final MemoryMXBean memoryMXBean;
   private final List<GarbageCollectorMXBean> garbageCollectorMXBeans;
 
+  @Getter
+  private GcStats lastGcStats;
+  @Getter
+  private GcStats currentGcStats;
+
   //Heap stats
   AtomicDouble processCpuLoad = new AtomicDouble(0);
   AtomicDouble systemCpuLoad = new AtomicDouble(0);
@@ -98,6 +104,8 @@ public class ContainerHealthMetricsService extends 
AbstractScheduledService {
     this.operatingSystemMXBean = 
ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
     this.memoryMXBean = ManagementFactory.getMemoryMXBean();
     this.garbageCollectorMXBeans = 
ManagementFactory.getGarbageCollectorMXBeans();
+    this.lastGcStats = new GcStats();
+    this.currentGcStats = new GcStats();
 
     //Build all the gauges and register them with the metrics registry.
     List<ContextAwareGauge<Double>> systemMetrics = buildGaugeList();
@@ -133,15 +141,19 @@ public class ContainerHealthMetricsService extends 
AbstractScheduledService {
     
this.freePhysicalMemSize.set(this.operatingSystemMXBean.getFreePhysicalMemorySize());
     
this.processHeapUsedSize.set(this.memoryMXBean.getHeapMemoryUsage().getUsed());
 
-    GcStats gcStats = collectGcStats();
-    //Since GC Beans report accumulated counts/durations, we need to subtract 
the previous values to obtain the counts/durations
+    //Get the new GC stats
+    this.currentGcStats = collectGcStats();
+    // Since GC Beans report accumulated counts/durations, we need to subtract 
the previous values to obtain the counts/durations
     // since the last measurement time.
-    this.minorGcCount.set(gcStats.getMinorCount() - this.minorGcCount.get());
-    this.minorGcDuration.set(gcStats.getMinorDuration() - 
this.minorGcDuration.get());
-    this.majorGcCount.set(gcStats.getMajorCount() - this.majorGcCount.get());
-    this.majorGcDuration.set(gcStats.getMajorDuration() - 
this.majorGcDuration.get());
-    this.unknownGcCount.set(gcStats.getUnknownCount() - 
this.unknownGcCount.get());
-    this.unknownGcDuration.set(gcStats.getUnknownDuration() - 
this.unknownGcDuration.get());
+    this.minorGcCount.set(this.currentGcStats.getMinorCount() - 
this.lastGcStats.getMinorCount());
+    this.minorGcDuration.set(this.currentGcStats.getMinorDuration() - 
this.lastGcStats.getMinorDuration());
+    this.majorGcCount.set(this.currentGcStats.getMajorCount() - 
this.lastGcStats.getMajorCount());
+    this.majorGcDuration.set(this.currentGcStats.getMajorDuration() - 
this.lastGcStats.getMajorDuration());
+    this.unknownGcCount.set(this.currentGcStats.getUnknownCount() - 
this.lastGcStats.getUnknownCount());
+    this.unknownGcDuration.set(this.currentGcStats.getUnknownDuration() - 
this.lastGcStats.getUnknownDuration());
+
+    //Update last collected stats
+    this.lastGcStats = this.currentGcStats;
   }
 
   protected List<ContextAwareGauge<Double>> buildGaugeList() {
diff --git 
a/gobblin-cluster/src/test/java/org/apache/gobblin/cluster/ContainerHealthMetricsServiceTest.java
 
b/gobblin-cluster/src/test/java/org/apache/gobblin/cluster/ContainerHealthMetricsServiceTest.java
index 66efe74..2181c4c 100644
--- 
a/gobblin-cluster/src/test/java/org/apache/gobblin/cluster/ContainerHealthMetricsServiceTest.java
+++ 
b/gobblin-cluster/src/test/java/org/apache/gobblin/cluster/ContainerHealthMetricsServiceTest.java
@@ -30,6 +30,9 @@ public class ContainerHealthMetricsServiceTest {
     Config config = ConfigFactory.empty();
     ContainerHealthMetricsService service = new 
ContainerHealthMetricsService(config);
     service.runOneIteration();
+    //Ensure lastGcStats updated after each iteration
+    Assert.assertTrue(service.getCurrentGcStats() == service.getLastGcStats());
+    ContainerHealthMetricsService.GcStats previousLastGcStats = 
service.getLastGcStats();
     Assert.assertTrue( service.minorGcCount.get() >= 0);
     Assert.assertTrue( service.minorGcDuration.get() >= 0);
     Assert.assertTrue( service.majorGcCount.get() >= 0);
@@ -39,6 +42,8 @@ public class ContainerHealthMetricsServiceTest {
     double processCpuTime1 = service.processCpuTime.get();
     Thread.sleep(10);
     service.runOneIteration();
+    Assert.assertTrue(service.getCurrentGcStats() == service.getLastGcStats());
+    Assert.assertTrue(service.getLastGcStats() != previousLastGcStats);
     double processCpuTime2 = service.processCpuTime.get();
     Assert.assertTrue( processCpuTime1 <= processCpuTime2);
     Assert.assertTrue( service.minorGcCount.get() >= 0);

Reply via email to