Repository: aurora
Updated Branches:
  refs/heads/master a48cfc09b -> 22871c03b


Add stats for update state transitions.

Bugs closed: AURORA-1259

Reviewed at https://reviews.apache.org/r/33783/


Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/22871c03
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/22871c03
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/22871c03

Branch: refs/heads/master
Commit: 22871c03b6d9387ca2e0362530806fc74d842a53
Parents: a48cfc0
Author: Bill Farner <[email protected]>
Authored: Tue May 5 11:22:32 2015 -0700
Committer: Bill Farner <[email protected]>
Committed: Tue May 5 11:22:32 2015 -0700

----------------------------------------------------------------------
 config/legacy_untested_classes.txt              |   1 +
 .../scheduler/storage/db/DBJobUpdateStore.java  |  14 ++-
 .../aurora/scheduler/storage/db/DbUtil.java     |  30 +++++-
 .../scheduler/testing/FakeStatsProvider.java    | 106 +++++++++++++++++++
 .../storage/db/DbJobUpdateStoreTest.java        |  19 +++-
 .../storage/mem/InMemTaskStoreTest.java         |  12 ++-
 .../scheduler/testing/FakeStatsProvider.java    | 106 -------------------
 7 files changed, 175 insertions(+), 113 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/22871c03/config/legacy_untested_classes.txt
----------------------------------------------------------------------
diff --git a/config/legacy_untested_classes.txt 
b/config/legacy_untested_classes.txt
index 4d090a8..f50b812 100644
--- a/config/legacy_untested_classes.txt
+++ b/config/legacy_untested_classes.txt
@@ -59,4 +59,5 @@ 
org/apache/aurora/scheduler/stats/AsyncStatsModule$OfferAdapter$1
 org/apache/aurora/scheduler/storage/log/LogStorage$RecoveryFailedException
 org/apache/aurora/scheduler/storage/mem/Util
 org/apache/aurora/scheduler/storage/mem/Util$1
+org/apache/aurora/scheduler/testing/FakeStatsProvider$3
 org/apache/aurora/scheduler/updater/UpdateConfigurationException

http://git-wip-us.apache.org/repos/asf/aurora/blob/22871c03/src/main/java/org/apache/aurora/scheduler/storage/db/DBJobUpdateStore.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/aurora/scheduler/storage/db/DBJobUpdateStore.java 
b/src/main/java/org/apache/aurora/scheduler/storage/db/DBJobUpdateStore.java
index 94ce5c3..ea56007 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/db/DBJobUpdateStore.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/db/DBJobUpdateStore.java
@@ -18,6 +18,7 @@ import java.util.Set;
 
 import javax.inject.Inject;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.common.collect.FluentIterable;
@@ -27,7 +28,9 @@ import com.twitter.common.base.MorePreconditions;
 import org.apache.aurora.gen.JobUpdate;
 import org.apache.aurora.gen.JobUpdateInstructions;
 import org.apache.aurora.gen.JobUpdateKey;
+import org.apache.aurora.gen.JobUpdateStatus;
 import org.apache.aurora.gen.storage.StoredJobUpdateDetails;
+import org.apache.aurora.scheduler.stats.CachedCounters;
 import org.apache.aurora.scheduler.storage.JobUpdateStore;
 import org.apache.aurora.scheduler.storage.entities.IInstanceTaskConfig;
 import org.apache.aurora.scheduler.storage.entities.IJobInstanceUpdateEvent;
@@ -53,18 +56,21 @@ public class DBJobUpdateStore implements 
JobUpdateStore.Mutable {
   private final JobUpdateDetailsMapper detailsMapper;
   private final JobUpdateEventMapper jobEventMapper;
   private final JobInstanceUpdateEventMapper instanceEventMapper;
+  private final CachedCounters stats;
 
   @Inject
   DBJobUpdateStore(
       JobKeyMapper jobKeyMapper,
       JobUpdateDetailsMapper detailsMapper,
       JobUpdateEventMapper jobEventMapper,
-      JobInstanceUpdateEventMapper instanceEventMapper) {
+      JobInstanceUpdateEventMapper instanceEventMapper,
+      CachedCounters stats) {
 
     this.jobKeyMapper = requireNonNull(jobKeyMapper);
     this.detailsMapper = requireNonNull(detailsMapper);
     this.jobEventMapper = requireNonNull(jobEventMapper);
     this.instanceEventMapper = requireNonNull(instanceEventMapper);
+    this.stats = requireNonNull(stats);
   }
 
   @Timed("job_update_store_save_update")
@@ -122,9 +128,15 @@ public class DBJobUpdateStore implements 
JobUpdateStore.Mutable {
     }
   }
 
+  @VisibleForTesting
+  static String statName(JobUpdateStatus status) {
+    return "update_transition_" + status;
+  }
+
   @Timed("job_update_store_save_event")
   @Override
   public void saveJobUpdateEvent(IJobUpdateKey key, IJobUpdateEvent event) {
+    stats.get(statName(event.getStatus())).incrementAndGet();
     jobEventMapper.insert(key, event.newBuilder());
   }
 

http://git-wip-us.apache.org/repos/asf/aurora/blob/22871c03/src/main/java/org/apache/aurora/scheduler/storage/db/DbUtil.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/storage/db/DbUtil.java 
b/src/main/java/org/apache/aurora/scheduler/storage/db/DbUtil.java
index a10a9e7..7b4067c 100644
--- a/src/main/java/org/apache/aurora/scheduler/storage/db/DbUtil.java
+++ b/src/main/java/org/apache/aurora/scheduler/storage/db/DbUtil.java
@@ -13,10 +13,13 @@
  */
 package org.apache.aurora.scheduler.storage.db;
 
+import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
+import com.twitter.common.stats.StatsProvider;
 
 import org.apache.aurora.scheduler.storage.Storage;
+import org.apache.aurora.scheduler.testing.FakeStatsProvider;
 
 /**
  * Utility class for creating ad-hoc storage instances.
@@ -28,14 +31,33 @@ public final class DbUtil {
   }
 
   /**
+   * Creates a new, empty storage system.  Identical to {@link 
#createStorage()}, except this
+   * returns the {@link Injector} that has bindings for the new storage.
+   *
+   * @return An injector with bindings necessary for a storage system.
+   */
+  public static Injector createStorageInjector() {
+    Injector injector = Guice.createInjector(
+        DbModule.testModule(),
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            FakeStatsProvider stats = new FakeStatsProvider();
+            bind(StatsProvider.class).toInstance(stats);
+            bind(FakeStatsProvider.class).toInstance(stats);
+          }
+        });
+    Storage storage = injector.getInstance(Storage.class);
+    storage.prepare();
+    return injector;
+  }
+
+  /**
    * Creates a new, empty storage system.
    *
    * @return A new storage instance.
    */
   public static Storage createStorage() {
-    Injector injector = Guice.createInjector(DbModule.testModule());
-    Storage storage = injector.getInstance(Storage.class);
-    storage.prepare();
-    return storage;
+    return createStorageInjector().getInstance(Storage.class);
   }
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/22871c03/src/main/java/org/apache/aurora/scheduler/testing/FakeStatsProvider.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/aurora/scheduler/testing/FakeStatsProvider.java 
b/src/main/java/org/apache/aurora/scheduler/testing/FakeStatsProvider.java
new file mode 100644
index 0000000..8c0a5e6
--- /dev/null
+++ b/src/main/java/org/apache/aurora/scheduler/testing/FakeStatsProvider.java
@@ -0,0 +1,106 @@
+/**
+ * Licensed 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.aurora.scheduler.testing;
+
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Maps;
+import com.twitter.common.stats.Stat;
+import com.twitter.common.stats.StatsProvider;
+
+/**
+ * A fake stats provider for use in testing.
+ */
+public class FakeStatsProvider implements StatsProvider {
+  private final Map<String, Supplier<? extends Number>> stats = 
Maps.newHashMap();
+
+  /**
+   * Gets the current value of a stat.
+   *
+   * @param statName Name of the stat to fetch.
+   * @return Current stat value.
+   */
+  public Number getValue(String statName) {
+    return stats.get(statName).get();
+  }
+
+  /**
+   * Gets the current values of all exported stats.
+   *
+   * @return All exported stat names and their associated values.
+   */
+  public Map<String, ? extends Number> getAllValues() {
+    return ImmutableMap.copyOf(Maps.transformValues(
+        stats,
+        new Function<Supplier<? extends Number>, Number>() {
+        @Override
+        public Number apply(Supplier<? extends Number> supplier) {
+          return supplier.get();
+        }
+      }));
+  }
+
+  /**
+   * Gets the value of a stat as a long.
+   *
+   * @param name Stat name.
+   * @return Value, as a long.
+   */
+  public long getLongValue(String name) {
+    return stats.get(name).get().longValue();
+  }
+
+  @Override
+  public AtomicLong makeCounter(String name) {
+    final AtomicLong counter = new AtomicLong();
+    stats.put(name, new Supplier<Long>() {
+      @Override
+      public Long get() {
+        return counter.get();
+      }
+    });
+    return counter;
+  }
+
+  @Override
+  public <T extends Number> Stat<T> makeGauge(final String name, final 
Supplier<T> gauge) {
+    stats.put(name, gauge);
+
+    return new Stat<T>() {
+      @Override
+      public String getName() {
+        return name;
+      }
+
+      @Override
+      public T read() {
+        return gauge.get();
+      }
+    };
+  }
+
+  @Override
+  public StatsProvider untracked() {
+    return this;
+  }
+
+  @Override
+  public RequestTimer makeRequestTimer(String name) {
+    throw new UnsupportedOperationException();
+  }
+}

http://git-wip-us.apache.org/repos/asf/aurora/blob/22871c03/src/test/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStoreTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStoreTest.java
 
b/src/test/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStoreTest.java
index 219676f..be57c5e 100644
--- 
a/src/test/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStoreTest.java
+++ 
b/src/test/java/org/apache/aurora/scheduler/storage/db/DbJobUpdateStoreTest.java
@@ -15,12 +15,16 @@
 package org.apache.aurora.scheduler.storage.db;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+import com.google.inject.Injector;
 
 import org.apache.aurora.gen.InstanceTaskConfig;
 import org.apache.aurora.gen.JobInstanceUpdateEvent;
@@ -58,6 +62,7 @@ import 
org.apache.aurora.scheduler.storage.entities.IJobUpdateQuery;
 import org.apache.aurora.scheduler.storage.entities.IJobUpdateSummary;
 import org.apache.aurora.scheduler.storage.entities.ILock;
 import org.apache.aurora.scheduler.storage.testing.StorageEntityUtil;
+import org.apache.aurora.scheduler.testing.FakeStatsProvider;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -90,10 +95,13 @@ public class DbJobUpdateStoreTest {
       makeJobUpdateEvent(ROLLING_FORWARD, CREATED_MS);
 
   private Storage storage;
+  private FakeStatsProvider stats;
 
   @Before
   public void setUp() throws Exception {
-    storage = DbUtil.createStorage();
+    Injector injector = DbUtil.createStorageInjector();
+    storage = injector.getInstance(Storage.class);
+    stats = injector.getInstance(FakeStatsProvider.class);
   }
 
   @After
@@ -264,6 +272,15 @@ public class DbJobUpdateStoreTest {
         getUpdateDetails(updateId).get().getUpdate());
     assertEquals(event1, 
getUpdateDetails(updateId).get().getUpdateEvents().get(1));
     assertEquals(event2, 
getUpdateDetails(updateId).get().getUpdateEvents().get(2));
+    assertStats(ImmutableMap.of(ROLL_FORWARD_PAUSED, 1, ROLLING_FORWARD, 2));
+  }
+
+  private <T extends Number> void assertStats(Map<JobUpdateStatus, T> 
expected) {
+    Map<String, Long> statValues = Maps.newHashMap();
+    for (Map.Entry<JobUpdateStatus, T> entry : expected.entrySet()) {
+      statValues.put(DBJobUpdateStore.statName(entry.getKey()), 
entry.getValue().longValue());
+    }
+    assertEquals(statValues , stats.getAllValues());
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/aurora/blob/22871c03/src/test/java/org/apache/aurora/scheduler/storage/mem/InMemTaskStoreTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/aurora/scheduler/storage/mem/InMemTaskStoreTest.java 
b/src/test/java/org/apache/aurora/scheduler/storage/mem/InMemTaskStoreTest.java
index f18619a..d1f4026 100644
--- 
a/src/test/java/org/apache/aurora/scheduler/storage/mem/InMemTaskStoreTest.java
+++ 
b/src/test/java/org/apache/aurora/scheduler/storage/mem/InMemTaskStoreTest.java
@@ -13,15 +13,25 @@
  */
 package org.apache.aurora.scheduler.storage.mem;
 
+import com.google.inject.AbstractModule;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
+import com.twitter.common.stats.StatsProvider;
 
 import org.apache.aurora.scheduler.storage.AbstractTaskStoreTest;
 import org.apache.aurora.scheduler.storage.db.DbModule;
+import org.apache.aurora.scheduler.testing.FakeStatsProvider;
 
 public class InMemTaskStoreTest extends AbstractTaskStoreTest {
   @Override
   protected Module getStorageModule() {
-    return Modules.combine(DbModule.testModule());
+    return Modules.combine(
+        DbModule.testModule(),
+        new AbstractModule() {
+          @Override
+          protected void configure() {
+            bind(StatsProvider.class).toInstance(new FakeStatsProvider());
+          }
+        });
   }
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/22871c03/src/test/java/org/apache/aurora/scheduler/testing/FakeStatsProvider.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/aurora/scheduler/testing/FakeStatsProvider.java 
b/src/test/java/org/apache/aurora/scheduler/testing/FakeStatsProvider.java
deleted file mode 100644
index 8c0a5e6..0000000
--- a/src/test/java/org/apache/aurora/scheduler/testing/FakeStatsProvider.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Licensed 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.aurora.scheduler.testing;
-
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-import com.google.common.base.Function;
-import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Maps;
-import com.twitter.common.stats.Stat;
-import com.twitter.common.stats.StatsProvider;
-
-/**
- * A fake stats provider for use in testing.
- */
-public class FakeStatsProvider implements StatsProvider {
-  private final Map<String, Supplier<? extends Number>> stats = 
Maps.newHashMap();
-
-  /**
-   * Gets the current value of a stat.
-   *
-   * @param statName Name of the stat to fetch.
-   * @return Current stat value.
-   */
-  public Number getValue(String statName) {
-    return stats.get(statName).get();
-  }
-
-  /**
-   * Gets the current values of all exported stats.
-   *
-   * @return All exported stat names and their associated values.
-   */
-  public Map<String, ? extends Number> getAllValues() {
-    return ImmutableMap.copyOf(Maps.transformValues(
-        stats,
-        new Function<Supplier<? extends Number>, Number>() {
-        @Override
-        public Number apply(Supplier<? extends Number> supplier) {
-          return supplier.get();
-        }
-      }));
-  }
-
-  /**
-   * Gets the value of a stat as a long.
-   *
-   * @param name Stat name.
-   * @return Value, as a long.
-   */
-  public long getLongValue(String name) {
-    return stats.get(name).get().longValue();
-  }
-
-  @Override
-  public AtomicLong makeCounter(String name) {
-    final AtomicLong counter = new AtomicLong();
-    stats.put(name, new Supplier<Long>() {
-      @Override
-      public Long get() {
-        return counter.get();
-      }
-    });
-    return counter;
-  }
-
-  @Override
-  public <T extends Number> Stat<T> makeGauge(final String name, final 
Supplier<T> gauge) {
-    stats.put(name, gauge);
-
-    return new Stat<T>() {
-      @Override
-      public String getName() {
-        return name;
-      }
-
-      @Override
-      public T read() {
-        return gauge.get();
-      }
-    };
-  }
-
-  @Override
-  public StatsProvider untracked() {
-    return this;
-  }
-
-  @Override
-  public RequestTimer makeRequestTimer(String name) {
-    throw new UnsupportedOperationException();
-  }
-}

Reply via email to