Skip to content

Commit

Permalink
Update HibernateModule to allow skipping Hibernate and JDBC
Browse files Browse the repository at this point in the history
HealthChecks.

GitOrigin-RevId: 622685271e477b7a9dceecaf9644d8aee622c051
  • Loading branch information
AmitGoenka authored and svc-squareup-copybara committed Feb 4, 2025
1 parent d22212a commit 2e2ea45
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 17 deletions.
5 changes: 4 additions & 1 deletion misk-hibernate/api/misk-hibernate.api
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,14 @@ public final class misk/hibernate/HibernateExceptionLogLevelConfig : wisp/config
public final class misk/hibernate/HibernateModule : misk/inject/KAbstractModule {
public fun <init> (Lkotlin/reflect/KClass;Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceClusterConfig;Lmisk/jdbc/DatabasePool;)V
public synthetic fun <init> (Lkotlin/reflect/KClass;Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceClusterConfig;Lmisk/jdbc/DatabasePool;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Lkotlin/reflect/KClass;Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceClusterConfig;Lmisk/jdbc/DatabasePool;Z)V
public synthetic fun <init> (Lkotlin/reflect/KClass;Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceClusterConfig;Lmisk/jdbc/DatabasePool;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;)V
public fun <init> (Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lmisk/jdbc/DatabasePool;)V
public fun <init> (Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lmisk/jdbc/DatabasePool;Lmisk/hibernate/HibernateExceptionLogLevelConfig;)V
public fun <init> (Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lmisk/jdbc/DatabasePool;Lmisk/hibernate/HibernateExceptionLogLevelConfig;Z)V
public synthetic fun <init> (Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lmisk/jdbc/DatabasePool;Lmisk/hibernate/HibernateExceptionLogLevelConfig;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lmisk/jdbc/DatabasePool;Lmisk/hibernate/HibernateExceptionLogLevelConfig;ZZ)V
public synthetic fun <init> (Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lmisk/jdbc/DatabasePool;Lmisk/hibernate/HibernateExceptionLogLevelConfig;ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lmisk/jdbc/DatabasePool;)V
public synthetic fun <init> (Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lmisk/jdbc/DatabasePool;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Lkotlin/reflect/KClass;Lmisk/jdbc/DataSourceConfig;Lmisk/jdbc/DatabasePool;Lmisk/hibernate/HibernateExceptionLogLevelConfig;)V
Expand Down
54 changes: 40 additions & 14 deletions misk-hibernate/src/main/kotlin/misk/hibernate/HibernateModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class HibernateModule @JvmOverloads constructor(
val databasePool: DatabasePool = RealDatabasePool,
private val logLevelConfig: HibernateExceptionLogLevelConfig = HibernateExceptionLogLevelConfig(),
private val jdbcModuleAlreadySetup: Boolean = false,
private val installHealthChecks: Boolean = true,
) : KAbstractModule() {

// Make sure Hibernate logs use slf4j. Otherwise, it will base its decision on the classpath and
Expand Down Expand Up @@ -89,14 +90,29 @@ class HibernateModule @JvmOverloads constructor(
databasePool: DatabasePool = RealDatabasePool,
) : this(qualifier, cluster.writer, readerQualifier, cluster.reader, databasePool)

constructor(
qualifier: KClass<out Annotation>,
readerQualifier: KClass<out Annotation>,
cluster: DataSourceClusterConfig,
databasePool: DatabasePool = RealDatabasePool,
installHealthChecks: Boolean = true,
) : this(
qualifier = qualifier,
config = cluster.writer,
readerQualifier = readerQualifier,
readerConfig = cluster.reader,
databasePool = databasePool,
installHealthChecks = installHealthChecks
)

constructor(
qualifier: KClass<out Annotation>,
config: DataSourceConfig,
databasePool: DatabasePool = RealDatabasePool,
jdbcModuleAlreadySetup: Boolean,
) : this(
qualifier = qualifier,
config = config,
config = config,
readerQualifier = null,
readerConfig = null,
databasePool = databasePool,
Expand All @@ -111,17 +127,26 @@ class HibernateModule @JvmOverloads constructor(
}

if (!jdbcModuleAlreadySetup) {
install(JdbcModule(qualifier, config, readerQualifier, readerConfig, databasePool))
install(
JdbcModule(
qualifier = qualifier,
config = config,
readerQualifier = readerQualifier,
readerConfig = readerConfig,
databasePool = databasePool,
installHealthCheck = installHealthChecks
)
)
}

bind<Query.Factory>().to<ReflectionQuery.Factory>()
bind<QueryLimitsConfig>()
.toInstance(QueryLimitsConfig(MAX_MAX_ROWS, ROW_COUNT_ERROR_LIMIT, ROW_COUNT_WARNING_LIMIT))
bind<HibernateExceptionLogLevelConfig>().toInstance(logLevelConfig)

bindDataSource(qualifier, config, true)
if (readerQualifier != null && readerConfig != null) {
bindDataSource(readerQualifier, readerConfig, false)
bindDataSource(qualifier, true)
if (readerQualifier != null) {
bindDataSource(readerQualifier, false)
}

newMultibinder<DataSourceDecorator>(qualifier)
Expand Down Expand Up @@ -210,7 +235,6 @@ class HibernateModule @JvmOverloads constructor(

private fun bindDataSource(
qualifier: KClass<out Annotation>,
config: DataSourceConfig,
isWriter: Boolean,
) {
// These items are configured on the writer qualifier only
Expand Down Expand Up @@ -251,14 +275,16 @@ class HibernateModule @JvmOverloads constructor(
)
}

val healthCheckKey = keyOf<HealthCheck>(qualifier)
bind(healthCheckKey)
.toProvider(object : Provider<HibernateHealthCheck> {
@Inject lateinit var clock: Clock
if (this.installHealthChecks) {
val healthCheckKey = keyOf<HealthCheck>(qualifier)
bind(healthCheckKey)
.toProvider(object : Provider<HibernateHealthCheck> {
@Inject lateinit var clock: Clock

override fun get() = HibernateHealthCheck(qualifier, sessionFactoryServiceProvider, clock)
})
.asSingleton()
multibind<HealthCheck>().to(healthCheckKey)
override fun get() = HibernateHealthCheck(qualifier, sessionFactoryServiceProvider, clock)
})
.asSingleton()
multibind<HealthCheck>().to(healthCheckKey)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package misk.hibernate

import com.google.inject.Provider
import jakarta.inject.Inject
import misk.healthchecks.HealthCheck
import misk.jdbc.SchemaMigratorService
import misk.testing.MiskTest
import misk.testing.MiskTestModule
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import wisp.logging.getLogger
import wisp.time.FakeClock
import java.sql.Timestamp

@MiskTest(startService = true)
class DisabledHealthCheckTest {
@MiskTestModule
val module = MoviesTestModule(installHealthChecks = false)

@Inject @Movies private lateinit var sessionFactoryService: Provider<SessionFactoryService>
@Inject private lateinit var fakeClock: FakeClock
@Inject private lateinit var healthChecks: List<HealthCheck>

@Test
fun isNotInjected() {
assertThat(healthChecks).noneMatch { it is HibernateHealthCheck }
assertThat(healthChecks).noneMatch { it is SchemaMigratorService }
}

@Test
fun isStillConnectedToDb() {
val databaseInstant = try {
val sessionFactory = sessionFactoryService.get().sessionFactory
sessionFactory.openSession().use { session ->
session.createNativeQuery("SELECT NOW()").uniqueResult() as Timestamp
}.toInstant()
} catch (e: Exception) {
logger.error(e) { "error performing hibernate health check" }
null
}

assertThat(databaseInstant).isNotNull()
assertThat(databaseInstant).isAfterOrEqualTo(fakeClock.instant())
}

companion object {
val logger = getLogger<DisabledHealthCheckTest>()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ class MoviesTestModule(
addEntities(DbMovie::class, DbActor::class, DbCharacter::class)
}
},
private val installHealthChecks: Boolean = true,
) : KAbstractModule() {
override fun configure() {
install(LogCollectorModule())
Expand All @@ -45,8 +46,10 @@ class MoviesTestModule(
)
install(
HibernateModule(
Movies::class, MoviesReader::class,
DataSourceClusterConfig(writer = dataSourceConfig, reader = dataSourceConfig)
qualifier = Movies::class,
readerQualifier = MoviesReader::class,
cluster = DataSourceClusterConfig(writer = dataSourceConfig, reader = dataSourceConfig),
installHealthChecks = installHealthChecks
)
)
install(entitiesModule)
Expand Down

0 comments on commit 2e2ea45

Please sign in to comment.