Merge "Test DropWizard MetricMaker glue"

This commit is contained in:
Shawn Pearce 2015-11-12 18:40:20 +00:00 committed by Gerrit Code Review
commit eb912bb21f
5 changed files with 170 additions and 3 deletions

View File

@ -325,7 +325,8 @@ public class Daemon extends SiteProgram {
private Injector createSysInjector() {
final List<Module> modules = new ArrayList<>();
modules.add(SchemaVersionCheck.module());
modules.add(new DropWizardMetricMaker.Module());
modules.add(new DropWizardMetricMaker.ApiModule());
modules.add(new DropWizardMetricMaker.RestModule());
modules.add(new LogFileCompressor.Module());
modules.add(new WorkQueue.Module());
modules.add(new ChangeHookRunner.Module());

View File

@ -195,6 +195,7 @@ java_test(
'//lib:args4j',
'//lib:grappa',
'//lib:guava',
'//lib/dropwizard:dropwizard-core',
'//lib/guice:guice-assistedinject',
'//lib/joda:joda-time',
'//lib/prolog:runtime',

View File

@ -60,7 +60,7 @@ import java.util.concurrent.TimeUnit;
*/
@Singleton
public class DropWizardMetricMaker extends MetricMaker {
public static class Module extends RestApiModule {
public static class ApiModule extends RestApiModule {
@Override
protected void configure() {
bind(MetricRegistry.class).in(Scopes.SINGLETON);
@ -69,7 +69,12 @@ public class DropWizardMetricMaker extends MetricMaker {
install(new ProcMetricModule());
install(new JGitMetricModule());
}
}
public static class RestModule extends RestApiModule {
@Override
protected void configure() {
DynamicMap.mapOf(binder(), METRIC_KIND);
child(CONFIG_KIND, "metrics").to(MetricsCollection.class);
get(METRIC_KIND).to(GetMetric.class);

View File

@ -0,0 +1,159 @@
// Copyright (C) 2015 The Android Open Source Project
//
// 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 com.google.gerrit.metrics.proc;
import static com.google.common.truth.Truth.assertThat;
import com.google.gerrit.common.Version;
import com.google.gerrit.lifecycle.LifecycleManager;
import com.google.gerrit.metrics.CallbackMetric0;
import com.google.gerrit.metrics.Counter0;
import com.google.gerrit.metrics.Counter1;
import com.google.gerrit.metrics.Description;
import com.google.gerrit.metrics.Field;
import com.google.gerrit.metrics.MetricMaker;
import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.codahale.metrics.Counter;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricRegistry;
import org.junit.Before;
import org.junit.Test;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class ProcMetricModuleTest {
@Inject
MetricMaker metrics;
@Inject
MetricRegistry registry;
@Test
public void testConstantBuildLabel() {
Gauge<String> buildLabel = gauge("build/label");
assertThat(buildLabel.getValue()).isEqualTo(Version.getVersion());
}
@Test
public void testProcUptime() {
Gauge<Long> birth = gauge("proc/birth_timestamp");
assertThat(birth.getValue()).isLessThan(
TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis()));
Gauge<Long> uptime = gauge("proc/uptime");
assertThat(uptime.getValue()).isAtLeast(1L);
}
@Test
public void testCounter0() {
Counter0 cntr = metrics.newCounter(
"test/count",
new Description("simple test")
.setCumulative());
Counter raw = get("test/count", Counter.class);
assertThat(raw.getCount()).isEqualTo(0);
cntr.increment();
assertThat(raw.getCount()).isEqualTo(1);
cntr.incrementBy(5);
assertThat(raw.getCount()).isEqualTo(6);
}
@Test
public void testCounter1() {
Counter1<String> cntr = metrics.newCounter(
"test/count",
new Description("simple test")
.setCumulative(),
Field.ofString("action"));
Counter total = get("test/count_total", Counter.class);
assertThat(total.getCount()).isEqualTo(0);
cntr.increment("passed");
Counter passed = get("test/count/passed", Counter.class);
assertThat(total.getCount()).isEqualTo(1);
assertThat(passed.getCount()).isEqualTo(1);
cntr.incrementBy("failed", 5);
Counter failed = get("test/count/failed", Counter.class);
assertThat(total.getCount()).isEqualTo(6);
assertThat(passed.getCount()).isEqualTo(1);
assertThat(failed.getCount()).isEqualTo(5);
}
@Test
public void testCallbackMetric0() {
final CallbackMetric0<Long> cntr = metrics.newCallbackMetric(
"test/count",
Long.class,
new Description("simple test")
.setCumulative());
final AtomicInteger invocations = new AtomicInteger(0);
metrics.newTrigger(cntr, new Runnable() {
@Override
public void run() {
invocations.getAndIncrement();
cntr.set(42L);
}
});
// Triggers run immediately with DropWizard binding.
assertThat(invocations.get()).isEqualTo(1);
Gauge<Long> raw = gauge("test/count");
assertThat(raw.getValue()).isEqualTo(42);
// Triggers are debounced to avoid being fired too frequently.
assertThat(invocations.get()).isEqualTo(1);
}
@SuppressWarnings({"unchecked", "cast"})
private <V> Gauge<V> gauge(String name) {
return (Gauge<V>) get(name, Gauge.class);
}
private <M extends Metric> M get(String name, Class<M> type) {
Metric m = registry.getMetrics().get(name);
assertThat(m).named(name).isNotNull();
assertThat(m).named(name).isInstanceOf(type);
@SuppressWarnings("unchecked")
M result = (M) m;
return result;
}
@Before
public void setup() {
Injector injector =
Guice.createInjector(new DropWizardMetricMaker.ApiModule());
LifecycleManager mgr = new LifecycleManager();
mgr.add(injector);
mgr.start();
injector.injectMembers(this);
}
}

View File

@ -289,7 +289,8 @@ public class WebAppInitializer extends GuiceServletContextListener
private Injector createSysInjector() {
final List<Module> modules = new ArrayList<>();
modules.add(new DropWizardMetricMaker.Module());
modules.add(new DropWizardMetricMaker.ApiModule());
modules.add(new DropWizardMetricMaker.RestModule());
modules.add(new WorkQueue.Module());
modules.add(new ChangeHookRunner.Module());
modules.add(new ReceiveCommitsExecutorModule());