Skip to content

Commit

Permalink
feat(s3): Add front50-sql-mariadb
Browse files Browse the repository at this point in the history
Will eventually switch over to hikari.
  • Loading branch information
ajordens committed Jul 8, 2019
1 parent ff10214 commit 73aec79
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 2 deletions.
11 changes: 11 additions & 0 deletions front50-sql-mariadb/front50-sql-mariadb.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
apply from: "$rootDir/gradle/kotlin.gradle"

tasks.compileGroovy.enabled = false

dependencies {
implementation "org.mariadb.jdbc:mariadb-java-client:2.4.0"
implementation "com.netflix.spinnaker.kork:kork-sql"
implementation("org.jooq:jooq:3.9.6"){
force = true
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.netflix.spinnaker.config

import com.netflix.spectator.api.Registry
import com.netflix.spinnaker.sql.MariaDbConnectionPoolMetricsExporter
import com.netflix.spinnaker.sql.MariaDbDataSourceFactory
import com.netflix.spinnaker.kork.sql.config.DataSourceFactory
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration

@Configuration
@ConditionalOnProperty("sql.enabled")
@ComponentScan("com.netflix.spinnaker.sql")
class MariaDbDataSourceConfiguration {

@Bean
fun connectionPoolMetricsExporter(registry: Registry): MariaDbConnectionPoolMetricsExporter {
return MariaDbConnectionPoolMetricsExporter(registry)
}

@Bean
fun dataSourceFactory(connectionPoolMetricsExporter: MariaDbConnectionPoolMetricsExporter): DataSourceFactory =
MariaDbDataSourceFactory(connectionPoolMetricsExporter)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.netflix.spinnaker.sql

import com.netflix.spectator.api.Registry
import com.netflix.spectator.api.patterns.PolledMeter
import org.mariadb.jdbc.MariaDbPoolDataSource
import org.springframework.scheduling.annotation.Scheduled
import java.util.concurrent.atomic.AtomicLong

class MariaDbConnectionPoolMetricsExporter(
private val registry: Registry
) {

private val dataSourceMetrics: MutableList<DataSourceMetrics> = mutableListOf()

fun track(dataSource: MariaDbPoolDataSource) {
dataSourceMetrics.add(
DataSourceMetrics(dataSource).apply {
registerMeters(registry)
}
)
}

@Scheduled(fixedRate = 5_000)
fun record() {
dataSourceMetrics.forEach {
// They tell me not to use test methods, but yolo. Way better than dealing with MBeans.
it.dataSource.testGetPool()?.let { pool ->
it.activeConnections.set(pool.activeConnections)
it.totalConnections.set(pool.totalConnections)
it.idleConnections.set(pool.idleConnections)
it.blockedConnections.set(pool.connectionRequests)
}
}
}
}

private data class DataSourceMetrics(
val dataSource: MariaDbPoolDataSource,
val activeConnections: AtomicLong = AtomicLong(),
val totalConnections: AtomicLong = AtomicLong(),
val idleConnections: AtomicLong = AtomicLong(),
val blockedConnections: AtomicLong = AtomicLong()
) {

fun registerMeters(registry: Registry) {
monitorValue(registry, "active", activeConnections)
monitorValue(registry, "total", totalConnections)
monitorValue(registry, "idle", idleConnections)
monitorValue(registry, "blocked", blockedConnections)
}

private fun monitorValue(registry: Registry, name: String, value: AtomicLong) {
PolledMeter
.using(registry)
.withName("sql.pool.${dataSource.poolName}.$name")
.monitorValue(value)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Copyright 2019 Netflix, 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 com.netflix.spinnaker.sql

import com.netflix.spinnaker.kork.sql.config.ConnectionPoolProperties
import com.netflix.spinnaker.kork.sql.config.DataSourceFactory
import org.mariadb.jdbc.MariaDbPoolDataSource
import org.springframework.beans.factory.BeanCreationException
import java.sql.SQLException
import javax.sql.DataSource

class MariaDbDataSourceFactory(
private val metricsExporter: MariaDbConnectionPoolMetricsExporter
) : DataSourceFactory {

override fun build(poolName: String, connectionPoolProperties: ConnectionPoolProperties): DataSource {
try {
val dataSource = MariaDbPoolDataSource(connectionPoolProperties.jdbcUrl)
dataSource.poolName = poolName
dataSource.user = connectionPoolProperties.user
dataSource.setPassword(connectionPoolProperties.password)

metricsExporter.track(dataSource)

return dataSource
} catch (e: SQLException) {
throw BeanCreationException("Failed creating pooled data source", e)
}
}
}
5 changes: 3 additions & 2 deletions front50-sql/front50-sql.gradle
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
apply from: "$rootDir/gradle/kotlin.gradle"

dependencies {
implementation project(":front50-sql-mariadb")

implementation "com.netflix.spinnaker.front50:front50-core:${front50Version}"

implementation "com.netflix.spinnaker.kork:kork-sql"
implementation "com.netflix.spinnaker.kork:kork-exceptions"

implementation "org.jooq:jooq:3.11.11"
// implementation "org.jooq:jooq:3.11.11"
implementation "io.strikt:strikt-core"
implementation "com.netflix.hystrix:hystrix-core"
implementation "io.github.resilience4j:resilience4j-retry"

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core"

implementation "org.mariadb.jdbc:mariadb-java-client:2.2.3"
// runtimeOnly "mysql:mysql-connector-java"

testImplementation "io.mockk:mockk"
Expand Down

0 comments on commit 73aec79

Please sign in to comment.