Skip to content
13 changes: 12 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,13 @@ plugins {
`java-library`
}

scmVersion { tag { prefix.set("") } }
scmVersion {
ignoreUncommittedChanges.set(false)
useHighestVersion.set(true)
tag { prefix.set("") }
}

project.version = scmVersion.version

val kotlinJvmTarget = 17

Expand Down Expand Up @@ -145,6 +151,8 @@ val oktaSpringBootVersion = "2.1.6"
val azureSpringBootBomVersion = "3.14.0"
val tikaVersion = "2.6.0"
val kubernetesClientVersion = "16.0.2"
val jedisVersion = "3.9.0"
val jredistimeseriesVersion = "1.6.0"

// Tests
val jUnitBomVersion = "5.9.1"
Expand Down Expand Up @@ -193,6 +201,9 @@ dependencies {
implementation("org.apache.tika:tika-core:${tikaVersion}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")

implementation("redis.clients:jedis:${jedisVersion}")
implementation("com.redislabs:jredistimeseries:${jredistimeseriesVersion}")

testImplementation(kotlin("test"))
testImplementation(platform("org.junit:junit-bom:${jUnitBomVersion}"))
testImplementation("org.junit.jupiter:junit-jupiter")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ import io.swagger.v3.parser.OpenAPIV3Parser
import java.io.BufferedReader
import org.springdoc.core.customizers.OperationCustomizer
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
@ConditionalOnProperty(name = ["csm.cliapplication"], havingValue = "false", matchIfMissing = true)
open class CsmOpenAPIConfiguration(val csmPlatformProperties: CsmPlatformProperties) {

@Value("\${api.version:?}") private lateinit var apiVersion: String
Expand All @@ -31,8 +33,7 @@ open class CsmOpenAPIConfiguration(val csmPlatformProperties: CsmPlatformPropert
}

@Bean
open fun csmOpenAPI(): OpenAPI {

open fun csmOpenAPI(): OpenAPI? {
val openApiYamlInputStream =
CsmOpenAPIConfiguration::class.java.getResourceAsStream("/static/openapi.yaml")
?: throw IllegalStateException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,16 @@ data class CsmPlatformProperties(
/** Upload files properties */
val upload: Upload = Upload(),
val namespace: String = "phoenix",

/** Persistent metrics configuration */
val metrics: Metrics = Metrics(),
) {

data class Metrics(
val enabled: Boolean = true,
val retentionDays: Int = 400,
)

data class Authorization(

/** The JWT Claim to use to extract a unique identifier for the user account */
Expand Down
10 changes: 10 additions & 0 deletions src/main/kotlin/com/cosmotech/api/events/PersistentMetricEvent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// Copyright (c) Cosmo Tech.
// Licensed under the MIT license.
package com.cosmotech.api.events

import com.cosmotech.api.metrics.PersistentMetric

class PersistentMetricEvent(
publisher: Any,
val metric: PersistentMetric,
) : CsmEvent(publisher)
24 changes: 24 additions & 0 deletions src/main/kotlin/com/cosmotech/api/metrics/PersistentMetric.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright (c) Cosmo Tech.
// Licensed under the MIT license.
package com.cosmotech.api.metrics

private const val DEFAULT_PROVIDER = "cosmotech"

private const val DEFAULT_QUALIFIER = "data"

private const val DEFAULT_SCOPE = "metric"

// key will be ts:scope:vendor:service:name:qualifier
data class PersistentMetric(
val service: String,
val name: String,
val value: Double,
val incrementBy: Int = 0,
val labels: Map<String, String> = emptyMap(),
val qualifier: String = DEFAULT_QUALIFIER,
val timestamp: Long = System.currentTimeMillis(),
val vendor: String = DEFAULT_PROVIDER,
val retention: Long = 0,
val type: PersitentMetricType = PersitentMetricType.COUNTER,
val scope: String = DEFAULT_SCOPE,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// Copyright (c) Cosmo Tech.
// Licensed under the MIT license.
package com.cosmotech.api.metrics

enum class PersitentMetricType {
COUNTER,
GAUGE,
}
50 changes: 50 additions & 0 deletions src/main/kotlin/com/cosmotech/api/redis/JedisConfig.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright (c) Cosmo Tech.
// Licensed under the MIT license.
package com.cosmotech.api.redis

import com.cosmotech.api.config.CsmPlatformProperties
import com.redislabs.redistimeseries.RedisTimeSeries
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import redis.clients.jedis.JedisPool
import redis.clients.jedis.JedisPoolConfig

private const val DEFAULT_POOL_SIZE: Int = 100

private const val DEFAULT_TIMEOUT = 10000

@Configuration
open class JedisConfig {

val logger: Logger = LoggerFactory.getLogger(JedisConfig::class.java)

@Bean
// JedisPool must be use with .use autocloseable method
open fun csmJedisPool(csmPlatformProperties: CsmPlatformProperties): JedisPool {
val twincacheProperties = csmPlatformProperties.twincache!!
val password = twincacheProperties.password
val host = twincacheProperties.host
val port = twincacheProperties.port.toInt()
val timeout = DEFAULT_TIMEOUT
val poolConfig = JedisPoolConfig()
logger.info(
"Starting Redis with Host:{}, Port:{}, Timeout(ms):{}, PoolConfig:{}",
host,
port,
timeout,
poolConfig)
return JedisPool(poolConfig, host, port, timeout, password)
}

@Bean
open fun csmRedisTimeSeries(csmPlatformProperties: CsmPlatformProperties): RedisTimeSeries {
val twincacheProperties = csmPlatformProperties.twincache!!
val password = twincacheProperties.password
val host = twincacheProperties.host
val port = twincacheProperties.port.toInt()
val timeout = DEFAULT_TIMEOUT
return RedisTimeSeries(host, port, timeout, DEFAULT_POOL_SIZE, password)
}
}