package io.dropwizard.metrics.jdbi;
import static io.dropwizard.metrics.MetricRegistry.name;
import org.junit.Test;
import org.skife.jdbi.v2.StatementContext;
import io.dropwizard.metrics.jdbi.InstrumentedTimingCollector;
import io.dropwizard.metrics.jdbi.strategies.NameStrategies;
import io.dropwizard.metrics.jdbi.strategies.ShortNameStrategy;
import io.dropwizard.metrics.jdbi.strategies.SmartNameStrategy;
import io.dropwizard.metrics.jdbi.strategies.StatementNameStrategy;
import io.dropwizard.metrics.MetricName;
import io.dropwizard.metrics.MetricRegistry;
import io.dropwizard.metrics.Timer;
import java.util.concurrent.TimeUnit;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
public class InstrumentedTimingCollectorTest {
private final MetricRegistry registry = new MetricRegistry();
@Test
public void updatesTimerForSqlObjects() throws Exception {
final StatementNameStrategy strategy = new SmartNameStrategy();
final InstrumentedTimingCollector collector = new InstrumentedTimingCollector(registry,
strategy);
final StatementContext ctx = mock(StatementContext.class);
doReturn("SELECT 1").when(ctx).getRawSql();
doReturn(getClass()).when(ctx).getSqlObjectType();
doReturn(getClass().getMethod("updatesTimerForSqlObjects")).when(ctx).getSqlObjectMethod();
collector.collect(TimeUnit.SECONDS.toNanos(1), ctx);
final MetricName name = strategy.getStatementName(ctx);
final Timer timer = registry.timer(name);
assertThat(name)
.isEqualTo(name(getClass(), "updatesTimerForSqlObjects"));
assertThat(timer.getSnapshot().getMax())
.isEqualTo(1000000000);
}
@Test
public void updatesTimerForSqlObjectsWithoutMethod() throws Exception {
final StatementNameStrategy strategy = new SmartNameStrategy();
final InstrumentedTimingCollector collector = new InstrumentedTimingCollector(registry,
strategy);
final StatementContext ctx = mock(StatementContext.class);
doReturn("SELECT 1").when(ctx).getRawSql();
doReturn(getClass()).when(ctx).getSqlObjectType();
collector.collect(TimeUnit.SECONDS.toNanos(1), ctx);
final MetricName name = strategy.getStatementName(ctx);
final Timer timer = registry.timer(name);
assertThat(name)
.isEqualTo(name(getClass(), "SELECT 1"));
assertThat(timer.getSnapshot().getMax())
.isEqualTo(1000000000);
}
@Test
public void updatesTimerForRawSql() throws Exception {
final StatementNameStrategy strategy = new SmartNameStrategy();
final InstrumentedTimingCollector collector = new InstrumentedTimingCollector(registry,
strategy);
final StatementContext ctx = mock(StatementContext.class);
doReturn("SELECT 1").when(ctx).getRawSql();
collector.collect(TimeUnit.SECONDS.toNanos(2), ctx);
final MetricName name = strategy.getStatementName(ctx);
final Timer timer = registry.timer(name);
assertThat(name)
.isEqualTo(name("sql", "raw", "SELECT 1"));
assertThat(timer.getSnapshot().getMax())
.isEqualTo(2000000000);
}
@Test
public void updatesTimerForNoRawSql() throws Exception {
final StatementNameStrategy strategy = new SmartNameStrategy();
final InstrumentedTimingCollector collector = new InstrumentedTimingCollector(registry,
strategy);
final StatementContext ctx = mock(StatementContext.class);
collector.collect(TimeUnit.SECONDS.toNanos(2), ctx);
final MetricName name = strategy.getStatementName(ctx);
final Timer timer = registry.timer(name);
assertThat(name)
.isEqualTo(name("sql", "empty"));
assertThat(timer.getSnapshot().getMax())
.isEqualTo(2000000000);
}
@Test
public void updatesTimerForNonSqlishRawSql() throws Exception {
final StatementNameStrategy strategy = new SmartNameStrategy();
final InstrumentedTimingCollector collector = new InstrumentedTimingCollector(registry,
strategy);
final StatementContext ctx = mock(StatementContext.class);
doReturn("don't know what it is but it's not SQL").when(ctx).getRawSql();
collector.collect(TimeUnit.SECONDS.toNanos(3), ctx);
final MetricName name = strategy.getStatementName(ctx);
final Timer timer = registry.timer(name);
assertThat(name)
.isEqualTo(name("sql", "raw", "don't know what it is but it's not SQL"));
assertThat(timer.getSnapshot().getMax())
.isEqualTo(3000000000L);
}
@Test
public void updatesTimerForContextClass() throws Exception {
final StatementNameStrategy strategy = new SmartNameStrategy();
final InstrumentedTimingCollector collector = new InstrumentedTimingCollector(registry,
strategy);
final StatementContext ctx = mock(StatementContext.class);
doReturn("SELECT 1").when(ctx).getRawSql();
doReturn(getClass().getName()).when(ctx).getAttribute(NameStrategies.STATEMENT_CLASS);
doReturn("updatesTimerForContextClass").when(ctx)
.getAttribute(NameStrategies.STATEMENT_NAME);
collector.collect(TimeUnit.SECONDS.toNanos(3), ctx);
final MetricName name = strategy.getStatementName(ctx);
final Timer timer = registry.timer(name);
assertThat(name)
.isEqualTo(name(getClass(), "updatesTimerForContextClass"));
assertThat(timer.getSnapshot().getMax())
.isEqualTo(3000000000L);
}
@Test
public void updatesTimerForTemplateFile() throws Exception {
final StatementNameStrategy strategy = new SmartNameStrategy();
final InstrumentedTimingCollector collector = new InstrumentedTimingCollector(registry,
strategy);
final StatementContext ctx = mock(StatementContext.class);
doReturn("SELECT 1").when(ctx).getRawSql();
doReturn("foo/bar.stg").when(ctx).getAttribute(NameStrategies.STATEMENT_GROUP);
doReturn("updatesTimerForTemplateFile").when(ctx)
.getAttribute(NameStrategies.STATEMENT_NAME);
collector.collect(TimeUnit.SECONDS.toNanos(4), ctx);
final MetricName name = strategy.getStatementName(ctx);
final Timer timer = registry.timer(name);
assertThat(name)
.isEqualTo(name("foo", "bar", "updatesTimerForTemplateFile"));
assertThat(timer.getSnapshot().getMax())
.isEqualTo(4000000000L);
}
@Test
public void updatesTimerForContextGroupAndName() throws Exception {
final StatementNameStrategy strategy = new SmartNameStrategy();
final InstrumentedTimingCollector collector = new InstrumentedTimingCollector(registry,
strategy);
final StatementContext ctx = mock(StatementContext.class);
doReturn("SELECT 1").when(ctx).getRawSql();
doReturn("my-group").when(ctx).getAttribute(NameStrategies.STATEMENT_GROUP);
doReturn("updatesTimerForContextGroupAndName").when(ctx)
.getAttribute(NameStrategies.STATEMENT_NAME);
collector.collect(TimeUnit.SECONDS.toNanos(4), ctx);
final MetricName name = strategy.getStatementName(ctx);
final Timer timer = registry.timer(name);
assertThat(name)
.isEqualTo(name("my-group", "updatesTimerForContextGroupAndName", ""));
assertThat(timer.getSnapshot().getMax())
.isEqualTo(4000000000L);
}
@Test
public void updatesTimerForContextGroupTypeAndName() throws Exception {
final StatementNameStrategy strategy = new SmartNameStrategy();
final InstrumentedTimingCollector collector = new InstrumentedTimingCollector(registry,
strategy);
final StatementContext ctx = mock(StatementContext.class);
doReturn("SELECT 1").when(ctx).getRawSql();
doReturn("my-group").when(ctx).getAttribute(NameStrategies.STATEMENT_GROUP);
doReturn("my-type").when(ctx).getAttribute(NameStrategies.STATEMENT_TYPE);
doReturn("updatesTimerForContextGroupTypeAndName").when(ctx)
.getAttribute(NameStrategies.STATEMENT_NAME);
collector.collect(TimeUnit.SECONDS.toNanos(5), ctx);
final MetricName name = strategy.getStatementName(ctx);
final Timer timer = registry.timer(name);
assertThat(name)
.isEqualTo(name("my-group", "my-type", "updatesTimerForContextGroupTypeAndName"));
assertThat(timer.getSnapshot().getMax())
.isEqualTo(5000000000L);
}
@Test
public void updatesTimerForShortSqlObjectStrategy() throws Exception {
final StatementNameStrategy strategy = new ShortNameStrategy("jdbi");
final InstrumentedTimingCollector collector = new InstrumentedTimingCollector(registry,
strategy);
final StatementContext ctx = mock(StatementContext.class);
doReturn("SELECT 1").when(ctx).getRawSql();
doReturn(getClass()).when(ctx).getSqlObjectType();
doReturn(getClass().getMethod("updatesTimerForShortSqlObjectStrategy")).when(ctx)
.getSqlObjectMethod();
collector.collect(TimeUnit.SECONDS.toNanos(1), ctx);
final MetricName name = strategy.getStatementName(ctx);
final Timer timer = registry.timer(name);
assertThat(name)
.isEqualTo(name("jdbi",
getClass().getSimpleName(),
"updatesTimerForShortSqlObjectStrategy"));
assertThat(timer.getSnapshot().getMax())
.isEqualTo(1000000000);
}
@Test
public void updatesTimerForShortContextClassStrategy() throws Exception {
final StatementNameStrategy strategy = new ShortNameStrategy("jdbi");
final InstrumentedTimingCollector collector = new InstrumentedTimingCollector(registry,
strategy);
final StatementContext ctx = mock(StatementContext.class);
doReturn("SELECT 1").when(ctx).getRawSql();
doReturn(getClass().getName()).when(ctx).getAttribute(NameStrategies.STATEMENT_CLASS);
doReturn("updatesTimerForShortContextClassStrategy").when(ctx)
.getAttribute(NameStrategies.STATEMENT_NAME);
collector.collect(TimeUnit.SECONDS.toNanos(3), ctx);
final MetricName name = strategy.getStatementName(ctx);
final Timer timer = registry.timer(name);
assertThat(name)
.isEqualTo(name("jdbi",
getClass().getSimpleName(),
"updatesTimerForShortContextClassStrategy"));
assertThat(timer.getSnapshot().getMax())
.isEqualTo(3000000000L);
}
}