blob: ea89ae9d920ddc748237ffb7f239ede30554d3dd [file] [log] [blame]
// 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 static com.google.common.truth.Truth.assertWithMessage;
import static com.google.gerrit.testing.GerritJUnit.assertThrows;
import static org.mockito.Mockito.mock;
import com.codahale.metrics.Counter;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricRegistry;
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.Description.FieldOrdering;
import com.google.gerrit.metrics.Field;
import com.google.gerrit.metrics.MetricMaker;
import com.google.gerrit.metrics.MetricsReservoirConfig;
import com.google.gerrit.metrics.dropwizard.DropWizardMetricMaker;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Before;
import org.junit.Test;
public class ProcMetricModuleTest {
@Inject MetricMaker metrics;
@Inject MetricRegistry registry;
@Test
public void constantBuildLabel() {
Gauge<String> buildLabel = gauge("build/label");
assertThat(buildLabel.getValue()).isEqualTo(Version.getVersion());
}
@Test
public void procUptime() {
Gauge<Long> birth = gauge("proc/birth_timestamp");
assertThat(birth.getValue())
.isAtMost(TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis()));
Gauge<Long> uptime = gauge("proc/uptime");
assertThat(uptime.getValue()).isAtLeast(1L);
}
@Test
public void counter0() {
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 counter1() {
Counter1<String> cntr =
metrics.newCounter(
"test/count",
new Description("simple test").setCumulative(),
Field.ofString("action", Field.ignoreMetadata()).build());
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 counterPrefixFields() {
Counter1<String> cntr =
metrics.newCounter(
"test/count",
new Description("simple test")
.setCumulative()
.setFieldOrdering(FieldOrdering.PREFIX_FIELDS_BASENAME),
Field.ofString("action", Field.ignoreMetadata()).build());
Counter total = get("test/count_total", Counter.class);
assertThat(total.getCount()).isEqualTo(0);
cntr.increment("passed");
Counter passed = get("test/passed/count", Counter.class);
assertThat(total.getCount()).isEqualTo(1);
assertThat(passed.getCount()).isEqualTo(1);
cntr.incrementBy("failed", 5);
Counter failed = get("test/failed/count", Counter.class);
assertThat(total.getCount()).isEqualTo(6);
assertThat(passed.getCount()).isEqualTo(1);
assertThat(failed.getCount()).isEqualTo(5);
}
@Test
public void callbackMetric0() {
CallbackMetric0<Long> cntr =
metrics.newCallbackMetric(
"test/count", Long.class, new Description("simple test").setCumulative());
AtomicInteger invocations = new AtomicInteger(0);
metrics.newTrigger(
cntr,
() -> {
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);
}
@Test
public void invalidName1() {
assertThrows(
IllegalArgumentException.class,
() -> metrics.newCounter("invalid name", new Description("fail")));
}
@Test
public void invalidName2() {
assertThrows(
IllegalArgumentException.class,
() -> metrics.newCounter("invalid/ name", new Description("fail")));
}
@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);
assertWithMessage(name).that(m).isNotNull();
assertWithMessage(name).that(m).isInstanceOf(type);
@SuppressWarnings("unchecked")
M result = (M) m;
return result;
}
@Before
public void setup() {
Injector injector =
Guice.createInjector(
new AbstractModule() {
@Override
protected void configure() {
install(new DropWizardMetricMaker.ApiModule(mock(MetricsReservoirConfig.class)));
}
});
LifecycleManager mgr = new LifecycleManager();
mgr.add(injector);
mgr.start();
injector.injectMembers(this);
}
}