package io.prometheus.client.hibernate;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import io.prometheus.client.CollectorRegistry;
import org.hibernate.SessionFactory;
import org.hibernate.stat.Statistics;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
public class HibernateStatisticsCollectorTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();
private SessionFactory sessionFactory;
private Statistics statistics;
private CollectorRegistry registry;
@Before
public void before() {
registry = new CollectorRegistry();
sessionFactory = mock(SessionFactory.class);
statistics = mock(Statistics.class);
when(sessionFactory.getStatistics()).thenReturn(statistics);
}
@Test
public void shouldPublishSessionMetrics() {
when(statistics.getSessionOpenCount()).thenReturn(1L);
when(statistics.getSessionCloseCount()).thenReturn(2L);
when(statistics.getFlushCount()).thenReturn(3L);
when(statistics.getConnectCount()).thenReturn(4L);
when(statistics.getOptimisticFailureCount()).thenReturn(5L);
new HibernateStatisticsCollector()
.add(sessionFactory, "factory1")
.register(registry);
assertThat(getSample("hibernate_session_opened_total", "factory1"), is(1.0));
assertThat(getSample("hibernate_session_closed_total", "factory1"), is(2.0));
assertThat(getSample("hibernate_flushed_total", "factory1"), is(3.0));
assertThat(getSample("hibernate_connect_total", "factory1"), is(4.0));
assertThat(getSample("hibernate_optimistic_failure_total", "factory1"), is(5.0));
}
@Test
public void shouldPublishConnectionMetrics() {
when(statistics.getPrepareStatementCount()).thenReturn(1L);
when(statistics.getCloseStatementCount()).thenReturn(2L);
when(statistics.getTransactionCount()).thenReturn(3L);
when(statistics.getSuccessfulTransactionCount()).thenReturn(4L);
new HibernateStatisticsCollector()
.add(sessionFactory, "factory2")
.register(registry);
assertThat(getSample("hibernate_statement_prepared_total", "factory2"), is(1.0));
assertThat(getSample("hibernate_statement_closed_total", "factory2"), is(2.0));
assertThat(getSample("hibernate_transaction_total", "factory2"), is(3.0));
assertThat(getSample("hibernate_transaction_success_total", "factory2"), is(4.0));
}
@Test
public void shouldPublishCacheMetrics() {
when(statistics.getSecondLevelCacheHitCount()).thenReturn(1L);
when(statistics.getSecondLevelCacheMissCount()).thenReturn(2L);
when(statistics.getSecondLevelCachePutCount()).thenReturn(3L);
when(statistics.getQueryCacheHitCount()).thenReturn(4L);
when(statistics.getQueryCacheMissCount()).thenReturn(5L);
when(statistics.getQueryCachePutCount()).thenReturn(6L);
when(statistics.getNaturalIdCacheHitCount()).thenReturn(7L);
when(statistics.getNaturalIdCacheMissCount()).thenReturn(8L);
when(statistics.getNaturalIdCachePutCount()).thenReturn(9L);
when(statistics.getUpdateTimestampsCacheHitCount()).thenReturn(10L);
when(statistics.getUpdateTimestampsCacheMissCount()).thenReturn(11L);
when(statistics.getUpdateTimestampsCachePutCount()).thenReturn(12L);
new HibernateStatisticsCollector()
.add(sessionFactory, "factory3")
.register(registry);
assertThat(getSample("hibernate_second_level_cache_hit_total", "factory3"), is(1.0));
assertThat(getSample("hibernate_second_level_cache_miss_total", "factory3"), is(2.0));
assertThat(getSample("hibernate_second_level_cache_put_total", "factory3"), is(3.0));
assertThat(getSample("hibernate_query_cache_hit_total", "factory3"), is(4.0));
assertThat(getSample("hibernate_query_cache_miss_total", "factory3"), is(5.0));
assertThat(getSample("hibernate_query_cache_put_total", "factory3"), is(6.0));
assertThat(getSample("hibernate_natural_id_cache_hit_total", "factory3"), is(7.0));
assertThat(getSample("hibernate_natural_id_cache_miss_total", "factory3"), is(8.0));
assertThat(getSample("hibernate_natural_id_cache_put_total", "factory3"), is(9.0));
assertThat(getSample("hibernate_update_timestamps_cache_hit_total", "factory3"), is(10.0));
assertThat(getSample("hibernate_update_timestamps_cache_miss_total", "factory3"), is(11.0));
assertThat(getSample("hibernate_update_timestamps_cache_put_total", "factory3"), is(12.0));
}
@Test
public void shouldPublishEntityMetrics() {
when(statistics.getEntityDeleteCount()).thenReturn(1L);
when(statistics.getEntityInsertCount()).thenReturn(2L);
when(statistics.getEntityLoadCount()).thenReturn(3L);
when(statistics.getEntityFetchCount()).thenReturn(4L);
when(statistics.getEntityUpdateCount()).thenReturn(5L);
when(statistics.getCollectionLoadCount()).thenReturn(6L);
when(statistics.getCollectionFetchCount()).thenReturn(7L);
when(statistics.getCollectionUpdateCount()).thenReturn(8L);
when(statistics.getCollectionRemoveCount()).thenReturn(9L);
when(statistics.getCollectionRecreateCount()).thenReturn(10L);
new HibernateStatisticsCollector()
.add(sessionFactory, "factory4")
.register(registry);
assertThat(getSample("hibernate_entity_delete_total", "factory4"), is(1.0));
assertThat(getSample("hibernate_entity_insert_total", "factory4"), is(2.0));
assertThat(getSample("hibernate_entity_load_total", "factory4"), is(3.0));
assertThat(getSample("hibernate_entity_fetch_total", "factory4"), is(4.0));
assertThat(getSample("hibernate_entity_update_total", "factory4"), is(5.0));
assertThat(getSample("hibernate_collection_load_total", "factory4"), is(6.0));
assertThat(getSample("hibernate_collection_fetch_total", "factory4"), is(7.0));
assertThat(getSample("hibernate_collection_update_total", "factory4"), is(8.0));
assertThat(getSample("hibernate_collection_remove_total", "factory4"), is(9.0));
assertThat(getSample("hibernate_collection_recreate_total", "factory4"), is(10.0));
}
@Test
public void shouldPublishQueryExecutionMetrics() {
when(statistics.getQueryExecutionCount()).thenReturn(1L);
when(statistics.getNaturalIdQueryExecutionCount()).thenReturn(3L);
new HibernateStatisticsCollector()
.add(sessionFactory, "factory5")
.register(registry);
assertThat(getSample("hibernate_query_execution_total", "factory5"), is(1.0));
assertThat(getSample("hibernate_natural_id_query_execution_total", "factory5"), is(3.0));
}
@Test
public void shouldFailIfNoSessionFactoriesAreRegistered() {
expectedException.expect(IllegalStateException.class);
expectedException.expectMessage("SessionFactory");
new HibernateStatisticsCollector().register(registry);
}
private Double getSample(String metric, String factory) {
return registry.getSampleValue(
metric, new String[]{"unit"}, new String[]{factory}
);
}
}