Skip to content

Commit e97d371

Browse files
committed
#420: adding possibility to fine tune connection pool and their behavior on DB and sending DB metrics to Prometheus
1 parent 06bab78 commit e97d371

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

server/src/main/resources/reference.conf

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,16 @@
88
user=atum_user
99
password=changeme
1010
passwordSecretId="serviceUserSecretKey"
11-
# maximum number of connections that HikariCP will keep in the pool, including both idle and in-use connections
12-
maxPoolSize=10
11+
# Pool settings
12+
minimumIdle=4 # Min number of idle connections Hikari maintains in the pool. default = maxPoolSize
13+
maxPoolSize=10 # Max number of connections that HikariCP will keep in the pool, including both idle and in-use ones
14+
# Connection lifecycle settings
15+
idleTimeout=180000 # How long a connection can sit idle in the pool before being removed.
16+
keepaliveTime=60000 # How often Hikari sends a keep-alive query to verify the connection is still valid while it's idle in the pool.
17+
maxLifetime=600000 # Refresh connections regularly
18+
# Misc settings
19+
leakDetectionThreshold=60000 # this is disabled by default
20+
prometheusMetricsEnabled=true
1321
}
1422
aws {
1523
region = "af-south-1"

server/src/main/scala/za/co/absa/atum/server/api/database/TransactorProvider.scala

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package za.co.absa.atum.server.api.database
1818

1919
import com.zaxxer.hikari.HikariConfig
20+
import com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFactory
2021
import doobie.hikari.HikariTransactor
22+
import io.prometheus.client.CollectorRegistry
2123
import za.co.absa.atum.server.config.PostgresConfig
2224
import zio.Runtime.defaultBlockingExecutor
2325
import zio._
@@ -40,8 +42,24 @@ object TransactorProvider {
4042
val config = new HikariConfig()
4143
config.setDataSourceClassName(postgresConfig.dataSourceClass)
4244
config.setDataSourceProperties(dataSourceProperties)
43-
config.setMaximumPoolSize(postgresConfig.maxPoolSize)
45+
46+
// Pool settings, especially sizing
4447
config.setPoolName("DoobiePostgresHikariPool")
48+
config.setMinimumIdle(postgresConfig.minimumIdle)
49+
config.setMaximumPoolSize(postgresConfig.maxPoolSize)
50+
51+
// Connection lifecycle settings
52+
config.setIdleTimeout(postgresConfig.idleTimeout)
53+
config.setKeepaliveTime(postgresConfig.keepaliveTime)
54+
config.setMaxLifetime(postgresConfig.maxLifetime)
55+
56+
// Misc DB settings
57+
config.setLeakDetectionThreshold(postgresConfig.leakDetectionThreshold)
58+
59+
// Prometheus metrics integration
60+
if (postgresConfig.prometheusMetricsEnabled)
61+
config.setMetricsTrackerFactory(new PrometheusMetricsTrackerFactory(CollectorRegistry.defaultRegistry))
62+
4563
config
4664
}
4765

server/src/main/scala/za/co/absa/atum/server/config/PostgresConfig.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,14 @@ case class PostgresConfig(
2626
databaseName: String,
2727
user: String,
2828
password: String,
29+
passwordSecretId: String,
30+
minimumIdle: Int,
2931
maxPoolSize: Int,
30-
passwordSecretId: String
32+
idleTimeout: Int,
33+
keepaliveTime: Int,
34+
maxLifetime: Int,
35+
leakDetectionThreshold: Int,
36+
prometheusMetricsEnabled: Boolean
3137
)
3238

3339
object PostgresConfig {

0 commit comments

Comments
 (0)