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