Extract database health check
This commit is contained in:
@@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user