You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2019/04/12 15:30:15 UTC

[ignite] branch master updated: IGNITE-11696 Add JMX metrics for PME execution time - Fixes #6420.

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

agoncharuk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 7b0f6c1  IGNITE-11696 Add JMX metrics for PME execution time - Fixes #6420.
7b0f6c1 is described below

commit 7b0f6c1641131b71232f063e3c72d616cf1694f4
Author: ezhuravl <ez...@gridgain.com>
AuthorDate: Fri Apr 12 18:28:33 2019 +0300

    IGNITE-11696 Add JMX metrics for PME execution time - Fixes #6420.
    
    Signed-off-by: Alexey Goncharuk <al...@gmail.com>
---
 .../org/apache/ignite/cluster/ClusterMetrics.java  |  7 +++++
 .../ClusterLocalNodeMetricsMXBeanImpl.java         |  5 ++++
 .../ignite/internal/ClusterMetricsMXBeanImpl.java  |  5 ++++
 .../ignite/internal/ClusterMetricsSnapshot.java    | 30 +++++++++++++++++++++-
 .../managers/discovery/ClusterMetricsImpl.java     | 11 ++++++++
 .../preloader/GridDhtPartitionsExchangeFuture.java |  7 +++++
 .../apache/ignite/mxbean/ClusterMetricsMXBean.java |  4 +++
 .../ClusterMetricsSnapshotSerializeSelfTest.java   |  4 ++-
 .../ApiParity/ClusterMetricsParityTest.cs          |  3 ++-
 9 files changed, 73 insertions(+), 3 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterMetrics.java b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterMetrics.java
index 74e98b8..751e628 100644
--- a/modules/core/src/main/java/org/apache/ignite/cluster/ClusterMetrics.java
+++ b/modules/core/src/main/java/org/apache/ignite/cluster/ClusterMetrics.java
@@ -694,4 +694,11 @@ public interface ClusterMetrics {
      * @return Total number of nodes.
      */
     public int getTotalNodes();
+
+    /**
+     * Gets execution duration for current partition map exchange in milliseconds.
+     *
+     * @return Gets execution duration for current partition map exchange in milliseconds. {@code 0} if there is no running PME.
+     */
+    public long getCurrentPmeDuration();
 }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/ClusterLocalNodeMetricsMXBeanImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/ClusterLocalNodeMetricsMXBeanImpl.java
index eed501a..c3bcf80 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/ClusterLocalNodeMetricsMXBeanImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/ClusterLocalNodeMetricsMXBeanImpl.java
@@ -335,6 +335,11 @@ public class ClusterLocalNodeMetricsMXBeanImpl implements ClusterMetricsMXBean {
     }
 
     /** {@inheritDoc} */
+    @Override public long getCurrentPmeDuration() {
+        return node.metrics().getCurrentPmeDuration();
+    }
+
+    /** {@inheritDoc} */
     @Override public int getTotalBaselineNodes() {
         if (!node.isClient() && !node.isDaemon()) {
             List<? extends BaselineNode> baselineNodes = discoMgr.baselineNodes(discoMgr.topologyVersionEx());
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsMXBeanImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsMXBeanImpl.java
index 1efb590..316ea71 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsMXBeanImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsMXBeanImpl.java
@@ -362,6 +362,11 @@ public class ClusterMetricsMXBeanImpl implements ClusterMetricsMXBean {
     }
 
     /** {@inheritDoc} */
+    @Override public long getCurrentPmeDuration() {
+        return metrics().getCurrentPmeDuration();
+    }
+
+    /** {@inheritDoc} */
     @Override public int getTotalBaselineNodes() {
         Collection<BaselineNode> baselineNodes = cluster.ignite().cluster().currentBaselineTopology();
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsSnapshot.java b/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsSnapshot.java
index 60f26a3..47fea3a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsSnapshot.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/ClusterMetricsSnapshot.java
@@ -92,7 +92,8 @@ public class ClusterMetricsSnapshot implements ClusterMetrics {
         8/*received bytes count*/ +
         4/*outbound messages queue size*/ +
         4/*total nodes*/ +
-        8/*total jobs execution time*/;
+        8/*total jobs execution time*/ +
+        8/*current PME time*/;
 
     /** */
     private long lastUpdateTime = -1;
@@ -256,6 +257,9 @@ public class ClusterMetricsSnapshot implements ClusterMetrics {
     /** */
     private long totalJobsExecTime = -1;
 
+    /** */
+    private long currentPmeDuration = -1;
+
     /**
      * Create empty snapshot.
      */
@@ -329,6 +333,7 @@ public class ClusterMetricsSnapshot implements ClusterMetrics {
         outMesQueueSize = 0;
         heapTotal = 0;
         totalNodes = nodes.size();
+        currentPmeDuration = 0;
 
         for (ClusterNode node : nodes) {
             ClusterMetrics m = node.metrics();
@@ -405,6 +410,8 @@ public class ClusterMetricsSnapshot implements ClusterMetrics {
             outMesQueueSize += m.getOutboundMessagesQueueSize();
 
             avgLoad += m.getCurrentCpuLoad();
+
+            currentPmeDuration = max(currentPmeDuration, m.getCurrentPmeDuration());
         }
 
         curJobExecTime /= size;
@@ -960,6 +967,11 @@ public class ClusterMetricsSnapshot implements ClusterMetrics {
         return totalNodes;
     }
 
+    /** {@inheritDoc} */
+    @Override public long getCurrentPmeDuration() {
+        return currentPmeDuration;
+    }
+
     /**
      * Sets available processors.
      *
@@ -1194,6 +1206,16 @@ public class ClusterMetricsSnapshot implements ClusterMetrics {
         this.totalNodes = totalNodes;
     }
 
+
+    /**
+     * Sets execution duration for current partition map exchange.
+     *
+     * @param currentPmeDuration Execution duration for current partition map exchange.
+     */
+    public void setCurrentPmeDuration(long currentPmeDuration) {
+        this.currentPmeDuration = currentPmeDuration;
+    }
+
     /**
      * @param neighborhood Cluster neighborhood.
      * @return CPU count.
@@ -1346,6 +1368,7 @@ public class ClusterMetricsSnapshot implements ClusterMetrics {
         buf.putInt(metrics.getOutboundMessagesQueueSize());
         buf.putInt(metrics.getTotalNodes());
         buf.putLong(metrics.getTotalJobsExecutionTime());
+        buf.putLong(metrics.getCurrentPmeDuration());
 
         assert !buf.hasRemaining() : "Invalid metrics size [expected=" + METRICS_SIZE + ", actual="
             + (buf.position() - off) + ']';
@@ -1428,6 +1451,11 @@ public class ClusterMetricsSnapshot implements ClusterMetrics {
         else
             metrics.setTotalJobsExecutionTime(0);
 
+        if (buf.remaining() >= 8)
+            metrics.setCurrentPmeDuration(buf.getLong());
+        else
+            metrics.setCurrentPmeDuration(0);
+
         return metrics;
     }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/ClusterMetricsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/ClusterMetricsImpl.java
index 4138e641..5d8138a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/ClusterMetricsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/ClusterMetricsImpl.java
@@ -18,9 +18,12 @@
 package org.apache.ignite.internal.managers.discovery;
 
 import java.util.Collection;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
 import org.apache.ignite.cluster.ClusterMetrics;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture;
 import org.apache.ignite.internal.processors.jobmetrics.GridJobMetrics;
 import org.apache.ignite.internal.util.typedef.internal.U;
 
@@ -351,6 +354,14 @@ public class ClusterMetricsImpl implements ClusterMetrics {
         return 1;
     }
 
+    /** {@inheritDoc} */
+    @Override public long getCurrentPmeDuration() {
+        GridDhtPartitionsExchangeFuture future = ctx.cache().context().exchange().lastTopologyFuture();
+        
+        return (future == null || future.isDone()) ?
+            0 : TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - future.getStartTime());
+    }
+
     /**
      * Job metrics
      */
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
index ab17e85..8837de2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
@@ -544,6 +544,13 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     }
 
     /**
+     * @return Start time in nanoseconds.
+     */
+    public long getStartTime() {
+        return startTime;
+    }
+
+    /**
      * @return {@code True}
      */
     public boolean onAdded() {
diff --git a/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java b/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java
index ffb4080..5dd5ebc 100644
--- a/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java
+++ b/modules/core/src/main/java/org/apache/ignite/mxbean/ClusterMetricsMXBean.java
@@ -257,6 +257,10 @@ public interface ClusterMetricsMXBean extends ClusterMetrics {
     @Override @MXBeanDescription("Total number of nodes.")
     public int getTotalNodes();
 
+    /** {@inheritDoc} */
+    @Override @MXBeanDescription("Current PME duration in milliseconds.")
+    public long getCurrentPmeDuration();
+
     /**
      * Get count of total baseline nodes.
      *
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeSelfTest.java
index 70379f1..6970f8e 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/discovery/ClusterMetricsSnapshotSerializeSelfTest.java
@@ -149,6 +149,7 @@ public class ClusterMetricsSnapshotSerializeSelfTest extends GridCommonAbstractT
         metrics.setHeapMemoryTotal(48);
         metrics.setTotalNodes(49);
         metrics.setTotalJobsExecutionTime(50);
+        metrics.setCurrentPmeDuration(51);
 
         return metrics;
     }
@@ -206,6 +207,7 @@ public class ClusterMetricsSnapshotSerializeSelfTest extends GridCommonAbstractT
             obj.getNonHeapMemoryTotal() == obj1.getNonHeapMemoryTotal() &&
             obj.getHeapMemoryTotal() == obj1.getHeapMemoryTotal() &&
             obj.getTotalNodes() == obj1.getTotalNodes() &&
-            obj.getTotalJobsExecutionTime() == obj1.getTotalJobsExecutionTime();
+            obj.getTotalJobsExecutionTime() == obj1.getTotalJobsExecutionTime() &&
+            obj.getCurrentPmeDuration() == obj1.getCurrentPmeDuration();
     }
 }
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterMetricsParityTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterMetricsParityTest.cs
index bb0b3cb..21160c1 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterMetricsParityTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/ApiParity/ClusterMetricsParityTest.cs
@@ -29,7 +29,8 @@ namespace Apache.Ignite.Core.Tests.ApiParity
         private static readonly string[] MissingProperties =
         {
             // IGNITE-7127
-            "TotalJobsExecutionTime"
+            "TotalJobsExecutionTime",
+            "CurrentPmeDuration"
         };
 
         /// <summary>