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(); - } -}
