You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by ie...@apache.org on 2019/03/15 09:13:51 UTC

[beam] branch master updated: [BEAM-6771] MetricsContainerStepMap#equals required for Spark.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 468cafe  [BEAM-6771] MetricsContainerStepMap#equals required for Spark.
     new e51aa5f  Merge pull request #8032: [BEAM-6771] Add MetricsContainerStepMap equals method
468cafe is described below

commit 468cafed059c16e4c018ea240a04ce54edc5fd0d
Author: Kyle Winkelman <ky...@optum.com>
AuthorDate: Mon Mar 11 17:11:18 2019 -0500

    [BEAM-6771] MetricsContainerStepMap#equals required for Spark.
---
 .../beam/runners/core/metrics/CounterCell.java     | 18 +++++++++++
 .../beam/runners/core/metrics/DirtyState.java      | 16 ++++++++++
 .../runners/core/metrics/DistributionCell.java     | 18 +++++++++++
 .../beam/runners/core/metrics/GaugeCell.java       | 18 +++++++++++
 .../runners/core/metrics/MetricsContainerImpl.java | 19 ++++++++++++
 .../core/metrics/MetricsContainerStepMap.java      | 19 +++++-------
 .../beam/runners/core/metrics/MetricsMap.java      | 16 ++++++++++
 .../beam/runners/core/metrics/CounterCellTest.java | 30 +++++++++++++++++++
 .../beam/runners/core/metrics/DirtyStateTest.java  | 21 +++++++++++++
 .../runners/core/metrics/DistributionCellTest.java | 31 +++++++++++++++++++
 .../beam/runners/core/metrics/GaugeCellTest.java   | 30 +++++++++++++++++++
 .../core/metrics/MetricsContainerImplTest.java     | 35 ++++++++++++++++++++++
 .../core/metrics/MetricsContainerStepMapTest.java  | 30 +++++++++++++++++++
 .../beam/runners/core/metrics/MetricsMapTest.java  | 22 ++++++++++++++
 14 files changed, 312 insertions(+), 11 deletions(-)

diff --git a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/CounterCell.java b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/CounterCell.java
index d1abafc..9ca5cdb 100644
--- a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/CounterCell.java
+++ b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/CounterCell.java
@@ -17,6 +17,7 @@
  */
 package org.apache.beam.runners.core.metrics;
 
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.beam.sdk.annotations.Experimental;
 import org.apache.beam.sdk.annotations.Experimental.Kind;
@@ -90,4 +91,21 @@ public class CounterCell implements Counter, MetricCell<Long> {
   public MetricName getName() {
     return name;
   }
+
+  @Override
+  public boolean equals(Object object) {
+    if (object instanceof CounterCell) {
+      CounterCell counterCell = (CounterCell) object;
+      return Objects.equals(dirty, counterCell.dirty)
+          && Objects.equals(value.get(), counterCell.value.get())
+          && Objects.equals(name, counterCell.name);
+    }
+
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(dirty, value.get(), name);
+  }
 }
diff --git a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/DirtyState.java b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/DirtyState.java
index 7759d5e..2503d83 100644
--- a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/DirtyState.java
+++ b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/DirtyState.java
@@ -18,6 +18,7 @@
 package org.apache.beam.runners.core.metrics;
 
 import java.io.Serializable;
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReference;
 import org.apache.beam.sdk.annotations.Experimental;
 import org.apache.beam.sdk.annotations.Experimental.Kind;
@@ -95,4 +96,19 @@ public class DirtyState implements Serializable {
   public void afterCommit() {
     dirty.compareAndSet(State.COMMITTING, State.CLEAN);
   }
+
+  @Override
+  public boolean equals(Object object) {
+    if (object instanceof DirtyState) {
+      DirtyState dirtyState = (DirtyState) object;
+      return Objects.equals(dirty.get(), dirtyState.dirty.get());
+    }
+
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return dirty.get().hashCode();
+  }
 }
diff --git a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/DistributionCell.java b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/DistributionCell.java
index c39fee0..ca85de2 100644
--- a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/DistributionCell.java
+++ b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/DistributionCell.java
@@ -17,6 +17,7 @@
  */
 package org.apache.beam.runners.core.metrics;
 
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReference;
 import org.apache.beam.sdk.annotations.Experimental;
 import org.apache.beam.sdk.annotations.Experimental.Kind;
@@ -84,4 +85,21 @@ public class DistributionCell implements Distribution, MetricCell<DistributionDa
   public MetricName getName() {
     return name;
   }
+
+  @Override
+  public boolean equals(Object object) {
+    if (object instanceof DistributionCell) {
+      DistributionCell distributionCell = (DistributionCell) object;
+      return Objects.equals(dirty, distributionCell.dirty)
+          && Objects.equals(value.get(), distributionCell.value.get())
+          && Objects.equals(name, distributionCell.name);
+    }
+
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(dirty, value.get(), name);
+  }
 }
diff --git a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/GaugeCell.java b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/GaugeCell.java
index ac4856b..f0d9d72 100644
--- a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/GaugeCell.java
+++ b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/GaugeCell.java
@@ -17,6 +17,7 @@
  */
 package org.apache.beam.runners.core.metrics;
 
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReference;
 import org.apache.beam.sdk.annotations.Experimental;
 import org.apache.beam.sdk.annotations.Internal;
@@ -77,4 +78,21 @@ public class GaugeCell implements Gauge, MetricCell<GaugeData> {
   public MetricName getName() {
     return name;
   }
+
+  @Override
+  public boolean equals(Object object) {
+    if (object instanceof GaugeCell) {
+      GaugeCell gaugeCell = (GaugeCell) object;
+      return Objects.equals(dirty, gaugeCell.dirty)
+          && Objects.equals(gaugeValue.get(), gaugeCell.gaugeValue.get())
+          && Objects.equals(name, gaugeCell.name);
+    }
+
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(dirty, gaugeValue.get(), name);
+  }
 }
diff --git a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsContainerImpl.java b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsContainerImpl.java
index 2ba95cd..630f619 100644
--- a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsContainerImpl.java
+++ b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsContainerImpl.java
@@ -23,6 +23,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Objects;
 import javax.annotation.Nullable;
 import org.apache.beam.model.pipeline.v1.MetricsApi.MonitoringInfo;
 import org.apache.beam.runners.core.metrics.MetricUpdates.MetricUpdate;
@@ -251,4 +252,22 @@ public class MetricsContainerImpl implements Serializable, MetricsContainer {
       current.get(counter.getKey()).update(counter.getValue().getCumulative());
     }
   }
+
+  @Override
+  public boolean equals(Object object) {
+    if (object instanceof MetricsContainerImpl) {
+      MetricsContainerImpl metricsContainerImpl = (MetricsContainerImpl) object;
+      return Objects.equals(stepName, metricsContainerImpl.stepName)
+          && Objects.equals(counters, metricsContainerImpl.counters)
+          && Objects.equals(distributions, metricsContainerImpl.distributions)
+          && Objects.equals(gauges, metricsContainerImpl.gauges);
+    }
+
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(stepName, counters, distributions, gauges);
+  }
 }
diff --git a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsContainerStepMap.java b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsContainerStepMap.java
index 4f05984..febba8f 100644
--- a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsContainerStepMap.java
+++ b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsContainerStepMap.java
@@ -25,6 +25,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.BiFunction;
 import org.apache.beam.model.pipeline.v1.MetricsApi.MonitoringInfo;
@@ -84,23 +85,19 @@ public class MetricsContainerStepMap implements Serializable {
   }
 
   @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
+  public boolean equals(Object object) {
+    if (object instanceof MetricsContainerStepMap) {
+      MetricsContainerStepMap metricsContainerStepMap = (MetricsContainerStepMap) object;
+      return Objects.equals(metricsContainers, metricsContainerStepMap.metricsContainers)
+          && Objects.equals(unboundContainer, metricsContainerStepMap.unboundContainer);
     }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-
-    MetricsContainerStepMap that = (MetricsContainerStepMap) o;
 
-    // TODO(BEAM-6546): The underlying MetricContainerImpls do not implement equals().
-    return getMetricsContainers().equals(that.getMetricsContainers());
+    return false;
   }
 
   @Override
   public int hashCode() {
-    return metricsContainers.hashCode();
+    return Objects.hash(metricsContainers, unboundContainer);
   }
 
   /**
diff --git a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsMap.java b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsMap.java
index 7bf6dc1..d1b9775 100644
--- a/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsMap.java
+++ b/runners/core-java/src/main/java/org/apache/beam/runners/core/metrics/MetricsMap.java
@@ -19,6 +19,7 @@ package org.apache.beam.runners.core.metrics;
 
 import java.io.Serializable;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import javax.annotation.Nullable;
@@ -76,4 +77,19 @@ public class MetricsMap<K, T> implements Serializable {
   public Iterable<T> values() {
     return Iterables.unmodifiableIterable(metrics.values());
   }
+
+  @Override
+  public boolean equals(Object object) {
+    if (object instanceof MetricsMap) {
+      MetricsMap<?, ?> metricsMap = (MetricsMap<?, ?>) object;
+      return Objects.equals(metrics, metricsMap.metrics);
+    }
+
+    return false;
+  }
+
+  @Override
+  public int hashCode() {
+    return metrics.hashCode();
+  }
 }
diff --git a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/CounterCellTest.java b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/CounterCellTest.java
index 70193d4..fe4d986 100644
--- a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/CounterCellTest.java
+++ b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/CounterCellTest.java
@@ -21,6 +21,7 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertThat;
 
 import org.apache.beam.sdk.metrics.MetricName;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -50,4 +51,33 @@ public class CounterCellTest {
     cell.getDirty().afterCommit();
     assertThat(cell.getDirty().beforeCommit(), equalTo(false));
   }
+
+  @Test
+  public void testEquals() {
+    CounterCell counterCell = new CounterCell(MetricName.named("namespace", "name"));
+    CounterCell equal = new CounterCell(MetricName.named("namespace", "name"));
+    Assert.assertEquals(counterCell, equal);
+    Assert.assertEquals(counterCell.hashCode(), equal.hashCode());
+  }
+
+  @Test
+  public void testNotEquals() {
+    CounterCell counterCell = new CounterCell(MetricName.named("namespace", "name"));
+
+    Assert.assertNotEquals(counterCell, new Object());
+
+    CounterCell differentDirty = new CounterCell(MetricName.named("namespace", "name"));
+    differentDirty.getDirty().beforeCommit();
+    Assert.assertNotEquals(counterCell, differentDirty);
+    Assert.assertNotEquals(counterCell.hashCode(), differentDirty.hashCode());
+
+    CounterCell differentValue = new CounterCell(MetricName.named("namespace", "name"));
+    differentValue.inc();
+    Assert.assertNotEquals(counterCell, differentValue);
+    Assert.assertNotEquals(counterCell.hashCode(), differentValue.hashCode());
+
+    CounterCell differentName = new CounterCell(MetricName.named("DIFFERENT", "DIFFERENT"));
+    Assert.assertNotEquals(counterCell, differentName);
+    Assert.assertNotEquals(counterCell.hashCode(), differentName.hashCode());
+  }
 }
diff --git a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/DirtyStateTest.java b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/DirtyStateTest.java
index 6c4a9d6..b6105f5 100644
--- a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/DirtyStateTest.java
+++ b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/DirtyStateTest.java
@@ -20,6 +20,7 @@ package org.apache.beam.runners.core.metrics;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertThat;
 
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -52,4 +53,24 @@ public class DirtyStateTest {
         dirty.beforeCommit(),
         is(true));
   }
+
+  @Test
+  public void testEquals() {
+    DirtyState dirtyState = new DirtyState();
+    DirtyState equal = new DirtyState();
+    Assert.assertEquals(dirtyState, equal);
+    Assert.assertEquals(dirtyState.hashCode(), equal.hashCode());
+  }
+
+  @Test
+  public void testNotEquals() {
+    DirtyState dirtyState = new DirtyState();
+
+    Assert.assertNotEquals(dirtyState, new Object());
+
+    DirtyState differentState = new DirtyState();
+    differentState.beforeCommit();
+    Assert.assertNotEquals(dirtyState, differentState);
+    Assert.assertNotEquals(dirtyState.hashCode(), differentState.hashCode());
+  }
 }
diff --git a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/DistributionCellTest.java b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/DistributionCellTest.java
index ab56064..8bfa614 100644
--- a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/DistributionCellTest.java
+++ b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/DistributionCellTest.java
@@ -21,6 +21,7 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertThat;
 
 import org.apache.beam.sdk.metrics.MetricName;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -50,4 +51,34 @@ public class DistributionCellTest {
     assertThat(
         "Adding a new value made the cell dirty", cell.getDirty().beforeCommit(), equalTo(true));
   }
+
+  @Test
+  public void testEquals() {
+    DistributionCell distributionCell = new DistributionCell(MetricName.named("namespace", "name"));
+    DistributionCell equal = new DistributionCell(MetricName.named("namespace", "name"));
+    Assert.assertEquals(distributionCell, equal);
+    Assert.assertEquals(distributionCell.hashCode(), equal.hashCode());
+  }
+
+  @Test
+  public void testNotEquals() {
+    DistributionCell distributionCell = new DistributionCell(MetricName.named("namespace", "name"));
+
+    Assert.assertNotEquals(distributionCell, new Object());
+
+    DistributionCell differentDirty = new DistributionCell(MetricName.named("namespace", "name"));
+    differentDirty.getDirty().beforeCommit();
+    Assert.assertNotEquals(distributionCell, differentDirty);
+    Assert.assertNotEquals(distributionCell.hashCode(), differentDirty.hashCode());
+
+    DistributionCell differentValue = new DistributionCell(MetricName.named("namespace", "name"));
+    differentValue.update(DistributionData.create(1, 1, 1, 1));
+    Assert.assertNotEquals(distributionCell, differentValue);
+    Assert.assertNotEquals(distributionCell.hashCode(), differentValue.hashCode());
+
+    DistributionCell differentName =
+        new DistributionCell(MetricName.named("DIFFERENT", "DIFFERENT"));
+    Assert.assertNotEquals(distributionCell, differentName);
+    Assert.assertNotEquals(distributionCell.hashCode(), differentName.hashCode());
+  }
 }
diff --git a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/GaugeCellTest.java b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/GaugeCellTest.java
index 7681513..19d711c 100644
--- a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/GaugeCellTest.java
+++ b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/GaugeCellTest.java
@@ -21,6 +21,7 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertThat;
 
 import org.apache.beam.sdk.metrics.MetricName;
+import org.junit.Assert;
 import org.junit.Test;
 
 /** Tests for {@link GaugeCell}. */
@@ -44,4 +45,33 @@ public class GaugeCellTest {
     assertThat(
         "Adding a new value made the cell dirty", cell.getDirty().beforeCommit(), equalTo(true));
   }
+
+  @Test
+  public void testEquals() {
+    GaugeCell gaugeCell = new GaugeCell(MetricName.named("namespace", "name"));
+    GaugeCell equal = new GaugeCell(MetricName.named("namespace", "name"));
+    Assert.assertEquals(gaugeCell, equal);
+    Assert.assertEquals(gaugeCell.hashCode(), equal.hashCode());
+  }
+
+  @Test
+  public void testNotEquals() {
+    GaugeCell gaugeCell = new GaugeCell(MetricName.named("namespace", "name"));
+
+    Assert.assertNotEquals(gaugeCell, new Object());
+
+    GaugeCell differentDirty = new GaugeCell(MetricName.named("namespace", "name"));
+    differentDirty.getDirty().beforeCommit();
+    Assert.assertNotEquals(gaugeCell, differentDirty);
+    Assert.assertNotEquals(gaugeCell.hashCode(), differentDirty.hashCode());
+
+    GaugeCell differentGaugeValue = new GaugeCell(MetricName.named("namespace", "name"));
+    differentGaugeValue.update(GaugeData.create(1));
+    Assert.assertNotEquals(gaugeCell, differentGaugeValue);
+    Assert.assertNotEquals(gaugeCell.hashCode(), differentGaugeValue.hashCode());
+
+    GaugeCell differentName = new GaugeCell(MetricName.named("DIFFERENT", "DIFFERENT"));
+    Assert.assertNotEquals(gaugeCell, differentName);
+    Assert.assertNotEquals(gaugeCell.hashCode(), differentName.hashCode());
+  }
 }
diff --git a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsContainerImplTest.java b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsContainerImplTest.java
index aa74ff2..4409827 100644
--- a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsContainerImplTest.java
+++ b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsContainerImplTest.java
@@ -28,6 +28,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import org.apache.beam.model.pipeline.v1.MetricsApi.MonitoringInfo;
 import org.apache.beam.sdk.metrics.MetricName;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -199,4 +200,38 @@ public class MetricsContainerImplTest {
     }
     assertThat(actualMonitoringInfos, containsInAnyOrder(builder1.build()));
   }
+
+  @Test
+  public void testEquals() {
+    MetricsContainerImpl metricsContainerImpl = new MetricsContainerImpl("stepName");
+    MetricsContainerImpl equal = new MetricsContainerImpl("stepName");
+    Assert.assertEquals(metricsContainerImpl, equal);
+    Assert.assertEquals(metricsContainerImpl.hashCode(), equal.hashCode());
+  }
+
+  @Test
+  public void testNotEquals() {
+    MetricsContainerImpl metricsContainerImpl = new MetricsContainerImpl("stepName");
+
+    Assert.assertNotEquals(metricsContainerImpl, new Object());
+
+    MetricsContainerImpl differentStepName = new MetricsContainerImpl("DIFFERENT");
+    Assert.assertNotEquals(metricsContainerImpl, differentStepName);
+    Assert.assertNotEquals(metricsContainerImpl.hashCode(), differentStepName.hashCode());
+
+    MetricsContainerImpl differentCounters = new MetricsContainerImpl("stepName");
+    differentCounters.getCounter(MetricName.named("namespace", "name"));
+    Assert.assertNotEquals(metricsContainerImpl, differentCounters);
+    Assert.assertNotEquals(metricsContainerImpl.hashCode(), differentCounters.hashCode());
+
+    MetricsContainerImpl differentDistributions = new MetricsContainerImpl("stepName");
+    differentDistributions.getDistribution(MetricName.named("namespace", "name"));
+    Assert.assertNotEquals(metricsContainerImpl, differentDistributions);
+    Assert.assertNotEquals(metricsContainerImpl.hashCode(), differentDistributions.hashCode());
+
+    MetricsContainerImpl differentGauges = new MetricsContainerImpl("stepName");
+    differentGauges.getGauge(MetricName.named("namespace", "name"));
+    Assert.assertNotEquals(metricsContainerImpl, differentGauges);
+    Assert.assertNotEquals(metricsContainerImpl.hashCode(), differentGauges.hashCode());
+  }
 }
diff --git a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsContainerStepMapTest.java b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsContainerStepMapTest.java
index 21a361d..a761bdd 100644
--- a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsContainerStepMapTest.java
+++ b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsContainerStepMapTest.java
@@ -42,6 +42,7 @@ import org.apache.beam.sdk.metrics.MetricsEnvironment;
 import org.apache.beam.sdk.metrics.MetricsFilter;
 import org.hamcrest.collection.IsIterableWithSize;
 import org.joda.time.Instant;
+import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -295,6 +296,35 @@ public class MetricsContainerStepMapTest {
     assertIterableSize(allres.getGauges(), 2);
   }
 
+  @Test
+  public void testEquals() {
+    MetricsContainerStepMap metricsContainerStepMap = new MetricsContainerStepMap();
+    MetricsContainerStepMap equal = new MetricsContainerStepMap();
+    Assert.assertEquals(metricsContainerStepMap, equal);
+    Assert.assertEquals(metricsContainerStepMap.hashCode(), equal.hashCode());
+  }
+
+  @Test
+  public void testNotEquals() {
+    MetricsContainerStepMap metricsContainerStepMap = new MetricsContainerStepMap();
+
+    Assert.assertNotEquals(metricsContainerStepMap, new Object());
+
+    MetricsContainerStepMap differentMetricsContainers = new MetricsContainerStepMap();
+    differentMetricsContainers.getContainer("stepName");
+    Assert.assertNotEquals(metricsContainerStepMap, differentMetricsContainers);
+    Assert.assertNotEquals(
+        metricsContainerStepMap.hashCode(), differentMetricsContainers.hashCode());
+
+    MetricsContainerStepMap differentUnboundedContainer = new MetricsContainerStepMap();
+    differentUnboundedContainer
+        .getContainer(null)
+        .getCounter(MetricName.named("namespace", "name"));
+    Assert.assertNotEquals(metricsContainerStepMap, differentUnboundedContainer);
+    Assert.assertNotEquals(
+        metricsContainerStepMap.hashCode(), differentUnboundedContainer.hashCode());
+  }
+
   private <T> void assertIterableSize(Iterable<T> iterable, int size) {
     assertThat(iterable, IsIterableWithSize.iterableWithSize(size));
   }
diff --git a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsMapTest.java b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsMapTest.java
index f3a2817..f4b2b60 100644
--- a/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsMapTest.java
+++ b/runners/core-java/src/test/java/org/apache/beam/runners/core/metrics/MetricsMapTest.java
@@ -30,6 +30,7 @@ import java.util.concurrent.atomic.AtomicLong;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
 import org.hamcrest.TypeSafeMatcher;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -73,6 +74,27 @@ public class MetricsMapTest {
         metricsMap.entries(), containsInAnyOrder(hasEntry("foo", foo), hasEntry("bar", bar)));
   }
 
+  @Test
+  public void testEquals() {
+    MetricsMap<String, AtomicLong> metricsMap = new MetricsMap<>(unusedKey -> new AtomicLong());
+    MetricsMap<String, AtomicLong> equal = new MetricsMap<>(unusedKey -> new AtomicLong());
+    Assert.assertEquals(metricsMap, equal);
+    Assert.assertEquals(metricsMap.hashCode(), equal.hashCode());
+  }
+
+  @Test
+  public void testNotEquals() {
+    MetricsMap<String, AtomicLong> metricsMap = new MetricsMap<>(unusedKey -> new AtomicLong());
+
+    Assert.assertNotEquals(metricsMap, new Object());
+
+    MetricsMap<String, AtomicLong> differentMetrics =
+        new MetricsMap<>(unusedKey -> new AtomicLong());
+    differentMetrics.get("key");
+    Assert.assertNotEquals(metricsMap, differentMetrics);
+    Assert.assertNotEquals(metricsMap.hashCode(), differentMetrics.hashCode());
+  }
+
   private static Matcher<Map.Entry<String, AtomicLong>> hasEntry(
       final String key, final AtomicLong value) {
     return new TypeSafeMatcher<Entry<String, AtomicLong>>() {