solution: monitoring config
This commit is contained in:
@@ -33,6 +33,7 @@ class MainConfigReader(
|
|||||||
private val upstreamsConfigReader = UpstreamsConfigReader(fileResolver)
|
private val upstreamsConfigReader = UpstreamsConfigReader(fileResolver)
|
||||||
private val cacheConfigReader = CacheConfigReader()
|
private val cacheConfigReader = CacheConfigReader()
|
||||||
private val tokensConfigReader = TokensConfigReader()
|
private val tokensConfigReader = TokensConfigReader()
|
||||||
|
private val monitoringConfigReader = MonitoringConfigReader()
|
||||||
|
|
||||||
fun read(input: InputStream): MainConfig? {
|
fun read(input: InputStream): MainConfig? {
|
||||||
val configNode = readNode(input)
|
val configNode = readNode(input)
|
||||||
@@ -63,6 +64,9 @@ class MainConfigReader(
|
|||||||
tokensConfigReader.read(input)?.let {
|
tokensConfigReader.read(input)?.let {
|
||||||
config.tokens = it
|
config.tokens = it
|
||||||
}
|
}
|
||||||
|
monitoringConfigReader.read(input).let {
|
||||||
|
config.monitoring = it
|
||||||
|
}
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,17 +24,24 @@ class MonitoringConfig(
|
|||||||
fun default(): MonitoringConfig {
|
fun default(): MonitoringConfig {
|
||||||
return MonitoringConfig(true, PrometheusConfig.default())
|
return MonitoringConfig(true, PrometheusConfig.default())
|
||||||
}
|
}
|
||||||
|
fun disabled(): MonitoringConfig {
|
||||||
|
return MonitoringConfig(false, PrometheusConfig.disabled())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
data class PrometheusConfig(
|
data class PrometheusConfig(
|
||||||
val enabled: Boolean,
|
val enabled: Boolean,
|
||||||
val path: String,
|
val path: String,
|
||||||
|
val host: String,
|
||||||
val port: Int
|
val port: Int
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
||||||
fun default(): PrometheusConfig {
|
fun default(): PrometheusConfig {
|
||||||
return PrometheusConfig(true, "/prometheus", 8081)
|
return PrometheusConfig(true, "/metrics", "127.0.0.1", 8081)
|
||||||
|
}
|
||||||
|
fun disabled(): PrometheusConfig {
|
||||||
|
return PrometheusConfig(false, "/", "127.0.0.1", 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2021 EmeraldPay, Inc
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package io.emeraldpay.dshackle.config
|
||||||
|
|
||||||
|
import org.slf4j.LoggerFactory
|
||||||
|
import org.yaml.snakeyaml.nodes.MappingNode
|
||||||
|
import java.io.InputStream
|
||||||
|
|
||||||
|
class MonitoringConfigReader: YamlConfigReader(), ConfigReader<MonitoringConfig> {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val log = LoggerFactory.getLogger(MonitoringConfigReader::class.java)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun read(input: InputStream): MonitoringConfig {
|
||||||
|
val configNode = readNode(input)
|
||||||
|
return read(configNode)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun read(input: MappingNode?): MonitoringConfig {
|
||||||
|
return readInternal(getMapping(input, "monitoring"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fun readInternal(input: MappingNode?): MonitoringConfig {
|
||||||
|
if (input == null) {
|
||||||
|
return MonitoringConfig.default()
|
||||||
|
}
|
||||||
|
val enabled = getValueAsBool(input, "enabled") ?: false
|
||||||
|
if (!enabled) {
|
||||||
|
return MonitoringConfig.disabled()
|
||||||
|
}
|
||||||
|
val prometheus = readPrometheus(getMapping(input, "prometheus"))
|
||||||
|
return MonitoringConfig(enabled, prometheus)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun readPrometheus(input: MappingNode?): MonitoringConfig.PrometheusConfig {
|
||||||
|
if (input == null) {
|
||||||
|
return MonitoringConfig.PrometheusConfig.default()
|
||||||
|
}
|
||||||
|
val enabled = getValueAsBool(input, "enabled") ?: true
|
||||||
|
if (!enabled) {
|
||||||
|
return MonitoringConfig.PrometheusConfig.disabled()
|
||||||
|
}
|
||||||
|
val default = MonitoringConfig.PrometheusConfig.default()
|
||||||
|
val path = getValueAsString(input, "path") ?: default.path
|
||||||
|
val host = getValueAsString(input, "bind") ?: getValueAsString(input, "host") ?: default.host
|
||||||
|
val port = getValueAsInt(input, "port") ?: default.port
|
||||||
|
return MonitoringConfig.PrometheusConfig(enabled, path, host, port)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -57,7 +57,7 @@ class MonitoringSetup(
|
|||||||
// use standard JVM server with a single thread blocking processing
|
// use standard JVM server with a single thread blocking processing
|
||||||
// prometheus is a single thread periodic call, no reason to setup anything complex
|
// prometheus is a single thread periodic call, no reason to setup anything complex
|
||||||
try {
|
try {
|
||||||
val server = HttpServer.create(InetSocketAddress(monitoringConfig.prometheus.port), 0);
|
val server = HttpServer.create(InetSocketAddress(monitoringConfig.prometheus.host, monitoringConfig.prometheus.port), 0);
|
||||||
server.createContext(monitoringConfig.prometheus.path) { httpExchange ->
|
server.createContext(monitoringConfig.prometheus.path) { httpExchange ->
|
||||||
val response = prometheusRegistry.scrape()
|
val response = prometheusRegistry.scrape()
|
||||||
httpExchange.sendResponseHeaders(200, response.toByteArray().size.toLong());
|
httpExchange.sendResponseHeaders(200, response.toByteArray().size.toLong());
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2021 EmeraldPay, Inc
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package io.emeraldpay.dshackle.config
|
||||||
|
|
||||||
|
import spock.lang.Specification
|
||||||
|
|
||||||
|
class MonitoringConfigReaderSpec extends Specification {
|
||||||
|
|
||||||
|
MonitoringConfigReader reader = new MonitoringConfigReader()
|
||||||
|
|
||||||
|
def "Read basic monitoring config"() {
|
||||||
|
setup:
|
||||||
|
def config = this.class.getClassLoader().getResourceAsStream("dshackle-monitoring-basic.yaml")
|
||||||
|
when:
|
||||||
|
def act = reader.read(config)
|
||||||
|
|
||||||
|
then:
|
||||||
|
act.enabled
|
||||||
|
act.prometheus != null
|
||||||
|
with(act.prometheus) {
|
||||||
|
enabled
|
||||||
|
port == 8000
|
||||||
|
host == "192.168.0.1"
|
||||||
|
path == "/status/prometheus"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
7
src/test/resources/dshackle-monitoring-basic.yaml
Normal file
7
src/test/resources/dshackle-monitoring-basic.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
monitoring:
|
||||||
|
enabled: true
|
||||||
|
prometheus:
|
||||||
|
enabled: true
|
||||||
|
bind: 192.168.0.1
|
||||||
|
port: 8000
|
||||||
|
path: /status/prometheus
|
||||||
Reference in New Issue
Block a user