From a97b59990811a1b050daecd829ce3749dfd2085b Mon Sep 17 00:00:00 2001 From: Igor Artamonov Date: Mon, 15 Feb 2021 23:39:09 -0500 Subject: [PATCH] solution: jvm monitoring --- .../dshackle/config/MonitoringConfig.kt | 1 + .../dshackle/config/MonitoringConfigReader.kt | 4 +++- .../dshackle/monitoring/MonitoringSetup.kt | 19 ++++++++++++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfig.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfig.kt index b8b4a7b3..be76c87b 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfig.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfig.kt @@ -29,6 +29,7 @@ class MonitoringConfig( } } + var enableJvm: Boolean = true data class PrometheusConfig( val enabled: Boolean, diff --git a/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfigReader.kt b/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfigReader.kt index da1dbc16..09947852 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfigReader.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/config/MonitoringConfigReader.kt @@ -43,7 +43,9 @@ class MonitoringConfigReader: YamlConfigReader(), ConfigReader return MonitoringConfig.disabled() } val prometheus = readPrometheus(getMapping(input, "prometheus")) - return MonitoringConfig(enabled, prometheus) + return MonitoringConfig(enabled, prometheus).also { conf -> + getValueAsBool(input, "enableJVM")?.let { conf.enableJvm = it } + } } private fun readPrometheus(input: MappingNode?): MonitoringConfig.PrometheusConfig { diff --git a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/MonitoringSetup.kt b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/MonitoringSetup.kt index 293b4d2a..eb05a97d 100644 --- a/src/main/kotlin/io/emeraldpay/dshackle/monitoring/MonitoringSetup.kt +++ b/src/main/kotlin/io/emeraldpay/dshackle/monitoring/MonitoringSetup.kt @@ -20,6 +20,11 @@ import io.emeraldpay.dshackle.config.MainConfig import io.emeraldpay.dshackle.config.MonitoringConfig import io.micrometer.core.instrument.Meter import io.micrometer.core.instrument.Metrics +import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics +import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics +import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics +import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics +import io.micrometer.core.instrument.binder.system.ProcessorMetrics import io.micrometer.core.instrument.config.MeterFilter import org.slf4j.LoggerFactory import org.springframework.stereotype.Service @@ -49,10 +54,22 @@ class MonitoringSetup( Metrics.globalRegistry.add(prometheusRegistry) Metrics.globalRegistry.config().meterFilter(object: MeterFilter { override fun map(id: Meter.Id): Meter.Id { - return id.withName("dshackle." + id.name) + if (id.name.startsWith("jvm") || id.name.startsWith("process") || id.name.startsWith("system")) { + return id + } else { + return id.withName("dshackle." + id.name) + } } }) + if (monitoringConfig.enableJvm) { + ClassLoaderMetrics().bindTo(Metrics.globalRegistry) + JvmMemoryMetrics().bindTo(Metrics.globalRegistry) + JvmGcMetrics().bindTo(Metrics.globalRegistry) + ProcessorMetrics().bindTo(Metrics.globalRegistry) + JvmThreadMetrics().bindTo(Metrics.globalRegistry) + } + if (monitoringConfig.prometheus.enabled) { // use standard JVM server with a single thread blocking processing // prometheus is a single thread periodic call, no reason to setup anything complex