Skip to content

Commit

Permalink
feat: replace konf with kotlinx.serialization
Browse files Browse the repository at this point in the history
  • Loading branch information
Cubxity committed Jun 23, 2021
1 parent fae1c42 commit 9355703
Show file tree
Hide file tree
Showing 20 changed files with 161 additions and 132 deletions.
3 changes: 2 additions & 1 deletion api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@

dependencies {
api(kotlin("stdlib"))
api("com.uchuhimo", "konf-toml", "1.1.2")
api("org.jetbrains.kotlinx", "kotlinx-coroutines-core", "1.5.0")
api("org.jetbrains.kotlinx", "kotlinx-serialization-core", "1.2.1")
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@

package dev.cubxity.plugins.metrics.api.metric

import com.uchuhimo.konf.Config
import dev.cubxity.plugins.metrics.api.UnifiedMetrics
import kotlinx.serialization.KSerializer

interface MetricsDriverFactory {
fun registerConfig(config: Config)
interface MetricsDriverFactory<T : Any> {
val configSerializer: KSerializer<T>

fun createDriver(api: UnifiedMetrics, config: Config): MetricsDriver
val defaultConfig: T

fun createDriver(api: UnifiedMetrics, config: T): MetricsDriver
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ interface MetricsManager {

fun unregisterMetric(metric: Metric)

fun registerDriver(name: String, factory: MetricsDriverFactory)
fun registerDriver(name: String, factory: MetricsDriverFactory<out Any>)

fun dispose()
}
Expand Down
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.5.10" apply false
kotlin("kapt") version "1.5.10" apply false
id("org.jetbrains.kotlin.plugin.serialization") version "1.5.0" apply false
id("com.github.johnrengelman.shadow") version "7.0.0" apply false
id("net.kyori.blossom") version "1.3.0" apply false
}
Expand Down
3 changes: 3 additions & 0 deletions common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

apply(plugin = "kotlinx-serialization")

dependencies {
api(project(":unifiedmetrics-api"))
implementation("com.charleskorn.kaml", "kaml", "0.34.0")
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,18 @@

package dev.cubxity.plugins.metrics.common.api

import com.uchuhimo.konf.Config
import com.uchuhimo.konf.Feature
import com.uchuhimo.konf.source.toml
import com.uchuhimo.konf.source.toml.toToml
import com.charleskorn.kaml.Yaml
import dev.cubxity.plugins.metrics.api.metric.Metric
import dev.cubxity.plugins.metrics.api.metric.MetricsDriver
import dev.cubxity.plugins.metrics.api.metric.MetricsDriverFactory
import dev.cubxity.plugins.metrics.api.metric.MetricsManager
import dev.cubxity.plugins.metrics.common.config.MetricsSpec
import dev.cubxity.plugins.metrics.common.plugin.UnifiedMetricsPlugin
import java.nio.file.Files
import kotlin.system.measureTimeMillis

class MetricsManagerImpl(private val plugin: UnifiedMetricsPlugin) : MetricsManager {
private val driverDirectory = plugin.bootstrap.configDirectory.resolve("driver")
private val metricDrivers: MutableMap<String, MetricsDriverFactory> = HashMap()
private val metricDrivers: MutableMap<String, MetricsDriverFactory<Any>> = HashMap()
private val _metrics: MutableList<Metric> = ArrayList()

private var shouldInitialize: Boolean = false
Expand All @@ -44,13 +41,12 @@ class MetricsManagerImpl(private val plugin: UnifiedMetricsPlugin) : MetricsMana
override fun initialize() {
shouldInitialize = true

val driverName = plugin.config[MetricsSpec.driver]
val driverName = plugin.config.metrics.driver
val factory = metricDrivers[driverName]

Files.createDirectories(driverDirectory)

if (factory !== null) {
plugin.bootstrap.logger.info("Initializing driver '$driverName'.")
initializeDriver(driverName, factory)
} else {
plugin.bootstrap.logger.warn("Driver '$driverName' not found. Metrics will be enabled when the driver is loaded.")
Expand All @@ -75,14 +71,12 @@ class MetricsManagerImpl(private val plugin: UnifiedMetricsPlugin) : MetricsMana
}
}

override fun registerDriver(name: String, factory: MetricsDriverFactory) {
metricDrivers[name] = factory
@Suppress("UNCHECKED_CAST")
override fun registerDriver(name: String, factory: MetricsDriverFactory<out Any>) {
metricDrivers[name] = factory as MetricsDriverFactory<Any>

if (shouldInitialize && driver === null) {
val driverName = plugin.config[MetricsSpec.driver]

if (name == driverName) {
plugin.bootstrap.logger.info("Initializing driver '$driverName'.")
if (name == plugin.config.metrics.driver) {
initializeDriver(name, factory)
}
}
Expand All @@ -96,21 +90,32 @@ class MetricsManagerImpl(private val plugin: UnifiedMetricsPlugin) : MetricsMana
driver = null
}

private fun initializeDriver(name: String, factory: MetricsDriverFactory) {
try {
val file = driverDirectory.toFile().resolve("$name.toml")
val config = Config { factory.registerConfig(this) }
.enable(Feature.OPTIONAL_SOURCE_BY_DEFAULT)
.from.toml.file(file)

config.toToml.toFile(file)

val driver = factory.createDriver(plugin.apiProvider, config)
driver.initialize()

this.driver = driver
} catch (error: Throwable) {
plugin.apiProvider.logger.severe("An error occurred whilst initializing metrics driver $name", error)
private fun initializeDriver(name: String, factory: MetricsDriverFactory<Any>) {
plugin.bootstrap.logger.info("Initializing driver '$name'.")
val time = measureTimeMillis {
try {
val file = driverDirectory.toFile().resolve("$name.yml")

val serializer = factory.configSerializer
val config = when {
file.exists() -> Yaml.default.decodeFromString(serializer, file.readText())
else -> factory.defaultConfig
}

try {
file.writeText(Yaml.default.encodeToString(serializer, config))
} catch (exception: Exception) {
plugin.apiProvider.logger.severe("An error occurred whilst saving driver config file ", exception)
}

val driver = factory.createDriver(plugin.apiProvider, config)
driver.initialize()

this.driver = driver
} catch (error: Throwable) {
plugin.apiProvider.logger.severe("An error occurred whilst initializing metrics driver $name", error)
}
}
plugin.bootstrap.logger.info("Driver '$name' initialized ($time ms).")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,14 @@ import dev.cubxity.plugins.metrics.api.UnifiedMetrics
import dev.cubxity.plugins.metrics.api.logging.Logger
import dev.cubxity.plugins.metrics.api.metric.MetricsManager
import dev.cubxity.plugins.metrics.api.platform.Platform
import dev.cubxity.plugins.metrics.common.config.ServerSpec
import dev.cubxity.plugins.metrics.common.plugin.UnifiedMetricsPlugin
import kotlinx.coroutines.CoroutineDispatcher

open class UnifiedMetricsApiProvider(val plugin: UnifiedMetricsPlugin) : UnifiedMetrics {
override val platform: Platform = PlatformImpl(plugin)

override val serverName: String
get() = plugin.config[ServerSpec.name]
get() = plugin.config.server.name

override val logger: Logger
get() = plugin.bootstrap.logger
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,21 @@

package dev.cubxity.plugins.metrics.common.config

import com.uchuhimo.konf.ConfigSpec
import kotlinx.serialization.Serializable

object MetricsSpec : ConfigSpec("metrics") {
val enabled by optional(true, "enabled")
val driver by optional("prometheus", "driver")
}
@Serializable
data class UnifiedMetricsConfig(
val server: UnifiedMetricsServerConfig = UnifiedMetricsServerConfig(),
val metrics: UnifiedMetricsMetricsConfig = UnifiedMetricsMetricsConfig()
)

@Serializable
data class UnifiedMetricsServerConfig(
val name: String = "global"
)

@Serializable
data class UnifiedMetricsMetricsConfig(
val enabled: Boolean = true,
val driver: String = "prometheus"
)
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,21 @@

package dev.cubxity.plugins.metrics.common.plugin

import com.uchuhimo.konf.Config
import com.uchuhimo.konf.Feature
import com.uchuhimo.konf.source.toml
import com.uchuhimo.konf.source.toml.toToml
import com.charleskorn.kaml.Yaml
import dev.cubxity.plugins.metrics.api.UnifiedMetrics
import dev.cubxity.plugins.metrics.api.UnifiedMetricsProvider
import dev.cubxity.plugins.metrics.common.api.UnifiedMetricsApiProvider
import dev.cubxity.plugins.metrics.common.config.MetricsSpec
import dev.cubxity.plugins.metrics.common.config.ServerSpec
import dev.cubxity.plugins.metrics.common.config.UnifiedMetricsConfig
import dev.cubxity.plugins.metrics.common.metric.system.SystemMetric
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import java.nio.file.Files

abstract class AbstractUnifiedMetricsPlugin : UnifiedMetricsPlugin {
private var _config: Config? = null
private var _config: UnifiedMetricsConfig? = null
private var _apiProvider: UnifiedMetricsApiProvider? = null

override val config: Config
override val config: UnifiedMetricsConfig
get() = _config ?: error("The UnifiedMetrics plugin is not loaded.")

override val apiProvider: UnifiedMetricsApiProvider
Expand All @@ -45,21 +43,26 @@ abstract class AbstractUnifiedMetricsPlugin : UnifiedMetricsPlugin {
Files.createDirectories(bootstrap.configDirectory)

_config = loadConfig()
saveConfig()

try {
saveConfig()
} catch (exception: Exception) {
apiProvider.logger.severe("An error occurred whilst saving plugin config file", exception)
}

_apiProvider = UnifiedMetricsApiProvider(this)
UnifiedMetricsProvider.register(apiProvider)
registerPlatformService(apiProvider)

if (config[MetricsSpec.enabled]) {
if (config.metrics.enabled) {
registerMetricsDrivers()
registerPlatformMetrics()
apiProvider.metricsManager.initialize()
}
}

open fun disable() {
if (config[MetricsSpec.enabled]) {
if (config.metrics.enabled) {
apiProvider.metricsManager.dispose()
}

Expand All @@ -79,18 +82,17 @@ abstract class AbstractUnifiedMetricsPlugin : UnifiedMetricsPlugin {
}
}

private fun loadConfig(): Config {
val config = Config {
addSpec(ServerSpec)
addSpec(MetricsSpec)
private fun loadConfig(): UnifiedMetricsConfig {
val file = bootstrap.configDirectory.toFile().resolve("config.yml")

return when {
file.exists() -> Yaml.default.decodeFromString(file.readText())
else -> UnifiedMetricsConfig()
}
val file = bootstrap.configDirectory.toFile().resolve("config.toml")
return config.enable(Feature.OPTIONAL_SOURCE_BY_DEFAULT)
.from.toml.file(file)
}

private fun saveConfig() {
val file = bootstrap.configDirectory.toFile().resolve("config.toml")
config.toToml.toFile(file)
val file = bootstrap.configDirectory.toFile().resolve("config.yml")
file.writeText(Yaml.default.encodeToString(config))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@

package dev.cubxity.plugins.metrics.common.plugin

import com.uchuhimo.konf.Config
import dev.cubxity.plugins.metrics.common.UnifiedMetricsBootstrap
import dev.cubxity.plugins.metrics.common.api.UnifiedMetricsApiProvider
import dev.cubxity.plugins.metrics.common.config.UnifiedMetricsConfig

interface UnifiedMetricsPlugin {
val bootstrap: UnifiedMetricsBootstrap

val config: Config
val config: UnifiedMetricsConfig

val apiProvider: UnifiedMetricsApiProvider
}
2 changes: 2 additions & 0 deletions drivers/influx/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

apply(plugin = "kotlinx-serialization")

dependencies {
compileOnly(project(":unifiedmetrics-api"))
api("com.influxdb", "influxdb-client-java", "1.14.0")
Expand Down

0 comments on commit 9355703

Please sign in to comment.