Skip to content

Commit 6c2ee46

Browse files
committed
Move all env lookup to one location
1 parent 2087e24 commit 6c2ee46

14 files changed

+155
-112
lines changed

gradle/libs.versions.toml

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11

22
[versions]
3-
arrow_version = "1.2.4"
3+
arrow_version = "2.0.0"
44
detekt_version = "1.23.7"
55
gradle_versions_filter_version = "0.1.16"
66
kotest-version = "6.0.0.M1"
77
kotlin-version = "2.1.0"
8-
kotlin_logging_version = "7.0.0"
9-
kotlinter_version = "5.0.0"
8+
kotlin_logging_version = "7.0.3"
9+
kotlinter_version = "5.0.1"
1010
kotlinx_serialization_version = "1.7.3"
11-
ktor-version = "3.0.1"
11+
ktor-version = "3.0.2"
1212
logback-version = "1.5.12"
1313
mockk_version = "1.13.13"
1414
node_version = "7.1.0"
15-
prometheus-version = "1.14.1"
16-
search_client_version = "2.3.2"
15+
prometheus-version = "1.14.2"
16+
search_client_version = "2.3.3"
1717

1818
[libraries]
1919
arrow-core = { group = "io.arrow-kt", name = "arrow-core", version.ref = "arrow_version" }

src/main/kotlin/no/java/conf/Application.kt

+23-6
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,44 @@
11
package no.java.conf
22

3+
import io.ktor.client.HttpClient
34
import io.ktor.server.application.Application
5+
import io.ktor.server.cio.EngineMain
46
import kotlinx.coroutines.CoroutineScope
57
import kotlinx.coroutines.Dispatchers
68
import kotlinx.coroutines.launch
9+
import no.java.conf.config.EndpointConfig
10+
import no.java.conf.config.LocalFileConfig
711
import no.java.conf.plugins.configureMonitoring
812
import no.java.conf.plugins.configureRouting
913
import no.java.conf.plugins.configureSearchRouting
1014
import no.java.conf.plugins.configureSerialization
1115
import no.java.conf.plugins.httpClient
12-
import no.java.conf.plugins.localFileService
16+
import no.java.conf.plugins.searchClient
1317
import no.java.conf.plugins.searchService
14-
import no.java.conf.plugins.sleepingPillService
18+
import no.java.conf.service.LocalFileService
19+
import no.java.conf.service.SleepingPillService
1520

1621
fun main(args: Array<String>) {
17-
io.ktor.server.cio.EngineMain
22+
EngineMain
1823
.main(args)
1924
}
2025

26+
fun localFileService(config: List<LocalFileConfig>) = LocalFileService(filenames = config)
27+
28+
fun sleepingPillService(
29+
httpClient: HttpClient,
30+
endpoints: List<EndpointConfig>
31+
) = SleepingPillService(
32+
client = httpClient,
33+
endpoints = endpoints,
34+
)
35+
2136
fun Application.module() {
22-
val searchService = searchService()
23-
val sleepingPillService = sleepingPillService(httpClient())
24-
val localFileService = localFileService()
37+
val searchClient = searchClient(environment.searchClientConfig())
38+
val searchService = searchService(environment.searchServiceConfig(searchClient))
39+
40+
val sleepingPillService = sleepingPillService(httpClient(), environment.endpointConfig("javazone.sleepingpill"))
41+
val localFileService = localFileService(environment.localFileConfig("javazone.localfile"))
2542

2643
configureSerialization()
2744
configureMonitoring()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package no.java.conf
2+
3+
import com.jillesvangurp.ktsearch.SearchClient
4+
import io.ktor.server.application.ApplicationEnvironment
5+
import io.ktor.server.config.ApplicationConfig
6+
import no.java.conf.config.EndpointConfig
7+
import no.java.conf.config.LocalFileConfig
8+
import no.java.conf.config.SearchClientConfig
9+
import no.java.conf.config.SearchServiceConfig
10+
import no.java.conf.service.search.ElasticIndexer
11+
import no.java.conf.service.search.ElasticIngester
12+
import no.java.conf.service.search.ElasticSearcher
13+
14+
fun ApplicationConfig.str(key: String) = property(key).getString()
15+
16+
fun ApplicationConfig.int(key: String) = str(key).toInt()
17+
18+
fun ApplicationConfig.bool(key: String) = str(key).toBoolean()
19+
20+
fun ApplicationEnvironment.str(key: String) = config.str(key)
21+
22+
fun ApplicationEnvironment.int(key: String) = config.int(key)
23+
24+
fun ApplicationEnvironment.bool(key: String) = config.bool(key)
25+
26+
fun ApplicationEnvironment.searchClientConfig() =
27+
SearchClientConfig(
28+
host = str("elastic.host"),
29+
port = int("elastic.port"),
30+
username = str("elastic.username"),
31+
password = str("elastic.password"),
32+
)
33+
34+
fun ApplicationEnvironment.searchServiceConfig(searchClient: SearchClient) =
35+
SearchServiceConfig(
36+
indexer = ElasticIndexer(searchClient),
37+
ingester = ElasticIngester(searchClient),
38+
searcher = ElasticSearcher(searchClient),
39+
skipIndex = bool("elastic.skipindex")
40+
)
41+
42+
fun ApplicationEnvironment.endpointConfig(key: String) =
43+
config.configList(key).map {
44+
EndpointConfig(it.int("year"), it.str("endpoint"))
45+
}
46+
47+
fun ApplicationEnvironment.localFileConfig(key: String) =
48+
config.configList(key).map {
49+
LocalFileConfig(it.int("year"), it.str("LocalFileConfig"))
50+
}

src/main/kotlin/no/java/conf/model/EndpointConfig.kt src/main/kotlin/no/java/conf/config/EndpointConfig.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package no.java.conf.model
1+
package no.java.conf.config
22

33
data class EndpointConfig(
44
val year: Int,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package no.java.conf.config
2+
3+
data class LocalFileConfig(
4+
val year: Int,
5+
val filename: String
6+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package no.java.conf.config
2+
3+
data class SearchClientConfig(
4+
val host: String,
5+
val port: Int,
6+
val username: String,
7+
val password: String,
8+
) {
9+
override fun toString(): String = "Config: $host:$port $username"
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package no.java.conf.config
2+
3+
import no.java.conf.service.search.ElasticIndexer
4+
import no.java.conf.service.search.ElasticIngester
5+
import no.java.conf.service.search.ElasticSearcher
6+
7+
data class SearchServiceConfig(
8+
val indexer: ElasticIndexer,
9+
val ingester: ElasticIngester,
10+
val searcher: ElasticSearcher,
11+
val skipIndex: Boolean,
12+
)

src/main/kotlin/no/java/conf/plugins/LocalFile.kt

-18
This file was deleted.

src/main/kotlin/no/java/conf/plugins/Monitoring.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ fun Application.configureMonitoring() {
4343
}
4444
}
4545
routing {
46-
get("/metrics-micrometer") {
46+
get("/metrics") {
4747
call.respond(appMicrometerRegistry.scrape())
4848
}
4949
}

src/main/kotlin/no/java/conf/plugins/Search.kt

+14-51
Original file line numberDiff line numberDiff line change
@@ -11,71 +11,34 @@ import io.ktor.server.routing.get
1111
import io.ktor.server.routing.post
1212
import io.ktor.server.routing.route
1313
import io.ktor.server.routing.routing
14+
import no.java.conf.config.SearchClientConfig
15+
import no.java.conf.config.SearchServiceConfig
1416
import no.java.conf.model.search.TextSearchRequest
1517
import no.java.conf.service.SearchService
16-
import no.java.conf.service.search.ElasticIndexer
17-
import no.java.conf.service.search.ElasticIngester
18-
import no.java.conf.service.search.ElasticSearcher
1918

2019
private val logger = KotlinLogging.logger {}
2120

22-
fun searchClient(
23-
host: String,
24-
port: Int,
25-
username: String,
26-
password: String
27-
): SearchClient {
28-
logger.info { "Connection Info: $host:$port with $username" }
21+
fun searchClient(config: SearchClientConfig): SearchClient {
22+
logger.info { "Connection Info: $config" }
2923

3024
return SearchClient(
3125
KtorRestClient(
32-
host = host,
33-
port = port,
34-
user = username,
35-
password = password,
26+
host = config.host,
27+
port = config.port,
28+
user = config.username,
29+
password = config.password,
3630
),
3731
)
3832
}
3933

40-
fun Application.searchClient() =
41-
searchClient(
42-
host = environment.config.property("elastic.host").getString(),
43-
port =
44-
environment.config
45-
.property("elastic.port")
46-
.getString()
47-
.toInt(),
48-
username = environment.config.property("elastic.username").getString(),
49-
password = environment.config.property("elastic.password").getString(),
34+
fun searchService(config: SearchServiceConfig) =
35+
SearchService(
36+
indexer = config.indexer,
37+
ingester = config.ingester,
38+
searcher = config.searcher,
39+
skipIndex = config.skipIndex,
5040
)
5141

52-
fun searchService(
53-
indexer: ElasticIndexer,
54-
ingester: ElasticIngester,
55-
searcher: ElasticSearcher,
56-
skipIndex: Boolean
57-
) = SearchService(
58-
indexer = indexer,
59-
ingester = ingester,
60-
searcher = searcher,
61-
skipIndex = skipIndex,
62-
)
63-
64-
fun Application.searchService(): SearchService {
65-
val searchClient = searchClient()
66-
67-
return searchService(
68-
indexer = ElasticIndexer(searchClient),
69-
ingester = ElasticIngester(searchClient),
70-
searcher = ElasticSearcher(searchClient),
71-
skipIndex =
72-
environment.config
73-
.property("elastic.skipindex")
74-
.getString()
75-
.toBoolean()
76-
)
77-
}
78-
7942
fun Application.configureSearchRouting(service: SearchService) {
8043
routing {
8144
route("/api/search") {

src/main/kotlin/no/java/conf/plugins/SleepingPill.kt

-23
This file was deleted.

src/main/kotlin/no/java/conf/service/LocalFileService.kt

+1-5
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,13 @@ package no.java.conf.service
33
import io.github.oshai.kotlinlogging.KotlinLogging
44
import io.ktor.client.request.get
55
import kotlinx.serialization.json.Json
6+
import no.java.conf.config.LocalFileConfig
67
import no.java.conf.model.sessions.Session
78
import no.java.conf.model.sleepingpill.SPSessions
89
import no.java.conf.model.sleepingpill.toSession
910

1011
private val logger = KotlinLogging.logger {}
1112

12-
data class LocalFileConfig(
13-
val year: Int,
14-
val filename: String
15-
)
16-
1713
class LocalFileService(
1814
private val filenames: List<LocalFileConfig>
1915
) {

src/main/kotlin/no/java/conf/service/SleepingPillService.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import io.ktor.client.request.get
77
import kotlinx.coroutines.async
88
import kotlinx.coroutines.awaitAll
99
import kotlinx.coroutines.coroutineScope
10-
import no.java.conf.model.EndpointConfig
10+
import no.java.conf.config.EndpointConfig
1111
import no.java.conf.model.sessions.Session
1212
import no.java.conf.model.sleepingpill.SPSession
1313
import no.java.conf.model.sleepingpill.SPSessions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package no.java.conf.plugins
2+
3+
import io.kotest.core.spec.style.FunSpec
4+
import io.kotest.matchers.shouldBe
5+
import io.kotest.matchers.string.shouldContain
6+
import io.ktor.client.request.get
7+
import io.ktor.client.statement.bodyAsText
8+
import io.ktor.http.HttpStatusCode
9+
import io.ktor.server.testing.testApplication
10+
11+
class MetricsTest :
12+
FunSpec({
13+
test("Metrics are provided") {
14+
testApplication {
15+
application {
16+
configureMonitoring()
17+
}
18+
19+
client.get("/metrics").apply {
20+
status shouldBe HttpStatusCode.OK
21+
22+
val bodyText = bodyAsText()
23+
24+
bodyText shouldContain "HELP"
25+
bodyText shouldContain "TYPE"
26+
bodyText shouldContain "jvm_"
27+
}
28+
}
29+
}
30+
})

0 commit comments

Comments
 (0)