Extract database health check

This commit is contained in:
Fabian Wolter
2026-06-14 06:50:30 +00:00
parent 03b2df344b
commit 55fc27f200
2 changed files with 76 additions and 27 deletions
@@ -0,0 +1,68 @@
package de.ruvnox.tactical
import java.sql.Connection
import java.sql.DriverManager
import kotlin.system.measureTimeMillis
data class DatabaseConfig(
val host: String,
val port: Int,
val name: String,
val user: String,
val password: String
)
data class DatabaseCheckResult(
val status: String,
val host: String,
val port: Int,
val name: String,
val latencyMs: Long?
)
object Database {
fun configFromEnvironment(): DatabaseConfig {
return DatabaseConfig(
host = System.getenv("DB_HOST") ?: "unset",
port = System.getenv("DB_PORT")?.toIntOrNull() ?: 5432,
name = System.getenv("DB_NAME") ?: "unset",
user = System.getenv("DB_USER") ?: "",
password = System.getenv("DB_PASSWORD") ?: ""
)
}
fun connection(config: DatabaseConfig = configFromEnvironment()): Connection {
return DriverManager.getConnection(
"jdbc:postgresql://${config.host}:${config.port}/${config.name}",
config.user,
config.password
)
}
fun check(): DatabaseCheckResult {
val config = configFromEnvironment()
var ok = false
val latency = try {
measureTimeMillis {
connection(config).use { connection ->
connection.createStatement().use { statement ->
statement.executeQuery("select 1").use { result ->
ok = result.next()
}
}
}
}
} catch (_: Exception) {
null
}
return DatabaseCheckResult(
status = if (ok) "online" else "offline",
host = config.host,
port = config.port,
name = config.name,
latencyMs = latency
)
}
}
+8 -27
View File
@@ -13,7 +13,6 @@ import io.ktor.server.routing.routing
import io.ktor.serialization.kotlinx.json.json import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import java.sql.DriverManager
@Serializable @Serializable
data class ServiceStatusResponse( data class ServiceStatusResponse(
@@ -28,7 +27,8 @@ data class DatabaseStatusResponse(
val status: String, val status: String,
val host: String, val host: String,
val port: Int, val port: Int,
val name: String val name: String,
val latencyMs: Long?
) )
fun main() { fun main() {
@@ -83,32 +83,13 @@ fun Application.module() {
} }
fun checkDatabaseStatus(): DatabaseStatusResponse { fun checkDatabaseStatus(): DatabaseStatusResponse {
val dbHost = System.getenv("DB_HOST") ?: "unset" val result = Database.check()
val dbPort = System.getenv("DB_PORT")?.toIntOrNull() ?: 5432
val dbName = System.getenv("DB_NAME") ?: "unset"
val dbUser = System.getenv("DB_USER") ?: ""
val dbPassword = System.getenv("DB_PASSWORD") ?: ""
val status = try {
DriverManager.getConnection(
"jdbc:postgresql://$dbHost:$dbPort/$dbName",
dbUser,
dbPassword
).use { connection ->
connection.createStatement().use { statement ->
statement.executeQuery("select 1").use { result ->
if (result.next()) "online" else "error"
}
}
}
} catch (_: Exception) {
"offline"
}
return DatabaseStatusResponse( return DatabaseStatusResponse(
status = status, status = result.status,
host = dbHost, host = result.host,
port = dbPort, port = result.port,
name = dbName name = result.name,
latencyMs = result.latencyMs
) )
} }