finish string null values in UI

This commit is contained in:
Martin Ptáček
2023-06-13 23:35:55 +02:00
parent 2b1341ed23
commit de217e9503
4 changed files with 91 additions and 91 deletions

View File

@ -27,16 +27,15 @@ data class PromConfigFile(
fun toPromConfiguration(): PromConfiguration {
return PromConfiguration(
pushproxProxyUrl = this.pushprox?.proxy_url ?: "",
remoteWriteScrapeInterval = this.remote_write?.scrape_interval
?: defaultRemoteWriteScrapeInterval,
remoteWriteScrapeInterval = (this.remote_write?.scrape_interval ?: defaultRemoteWriteScrapeInterval).toString(),
pushproxEnabled = this.pushprox?.enabled ?: false,
pushproxFqdn = this.pushprox?.fqdn ?: "",
remoteWriteEnabled = this.remote_write?.enabled ?: false,
remoteWriteEndpoint = this.remote_write?.remote_write_endpoint ?: "",
prometheusServerEnabled = this.prometheus_server?.enabled ?: true,
prometheusServerPort = this.prometheus_server?.port ?: defaultPrometheusServerPort,
remoteWriteMaxSamplesPerExport = this.remote_write?.max_samples_per_export ?: defaultRemoteWriteMaxSamplesPerExport,
remoteWriteExportInterval = this.remote_write?.export_interval ?: defaultRemoteWriteExportInterval,
prometheusServerPort = (this.prometheus_server?.port ?: defaultPrometheusServerPort).toString(),
remoteWriteMaxSamplesPerExport = (this.remote_write?.max_samples_per_export ?: defaultRemoteWriteMaxSamplesPerExport).toString(),
remoteWriteExportInterval = (this.remote_write?.export_interval ?: defaultRemoteWriteExportInterval).toString(),
)
}
}
@ -68,15 +67,15 @@ data class RemoteWriteConfigFile(
data class PromConfiguration(
// the following are default values for various configuration settings
val prometheusServerEnabled: Boolean = true,
val prometheusServerPort: Int = defaultPrometheusServerPort,
val prometheusServerPort: String = defaultPrometheusServerPort.toString(),
val pushproxEnabled: Boolean = false,
val pushproxFqdn: String = "",
val pushproxProxyUrl: String = "",
val remoteWriteEnabled: Boolean = false,
val remoteWriteScrapeInterval: Int = defaultRemoteWriteScrapeInterval,
val remoteWriteScrapeInterval: String = defaultRemoteWriteScrapeInterval.toString(),
val remoteWriteEndpoint: String = "",
val remoteWriteExportInterval : Int = defaultRemoteWriteExportInterval,
val remoteWriteMaxSamplesPerExport : Int = defaultRemoteWriteMaxSamplesPerExport,
val remoteWriteExportInterval : String = defaultRemoteWriteExportInterval.toString(),
val remoteWriteMaxSamplesPerExport : String = defaultRemoteWriteMaxSamplesPerExport.toString(),
) {
fun toStructuredText(): String {

View File

@ -212,7 +212,7 @@ private fun PrometheusServerPage(
value = uiState.promConfig.prometheusServerPort.toString(),
singleLine = true,
onValueChange = {
promViewModel.updatePromConfig(UpdatePromConfig.PrometheusServerPort, it.toInt())
promViewModel.updatePromConfig(UpdatePromConfig.PrometheusServerPort, it)
},
label = { Text("Prometheus HTTP port") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
@ -301,12 +301,14 @@ private fun RemoteWritePage(
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text("Remote write configuration:")
Spacer(modifier = Modifier.padding(bottom = 12.dp))
TextField(
value = uiState.promConfig.remoteWriteEndpoint,
singleLine = true,
onValueChange = {
promViewModel.updatePromConfig(UpdatePromConfig.PushproxFqdn, it)
promViewModel.updatePromConfig(UpdatePromConfig.RemoteWriteEndpoint, it)
},
label = {
Text(text = "Remote write endpoint")
@ -315,14 +317,11 @@ private fun RemoteWritePage(
)
TextField(
value = scrapeIntervalState.value,
value = uiState.promConfig.remoteWriteScrapeInterval,
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
onValueChange = {
val converted : Int? = it.toIntOrNull()
if (converted != null) {
promViewModel.updatePromConfig(UpdatePromConfig.RemoteWriteScrapeInterval, converted)
}
promViewModel.updatePromConfig(UpdatePromConfig.RemoteWriteScrapeInterval, it)
},
label = {
Text(text = "Scrape interval in seconds")
@ -330,14 +329,11 @@ private fun RemoteWritePage(
)
TextField(
value = uiState.promConfig.remoteWriteMaxSamplesPerExport.toString(),
value = uiState.promConfig.remoteWriteMaxSamplesPerExport,
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
onValueChange = {
promViewModel.updatePromConfig(
UpdatePromConfig.RemoteWriteMaxSamplesPerExport,
it.toInt(),
)
promViewModel.updatePromConfig(UpdatePromConfig.RemoteWriteMaxSamplesPerExport, it)
},
label = {
Text(text = "Max number of samples per export")
@ -345,11 +341,11 @@ private fun RemoteWritePage(
)
TextField(
value = uiState.promConfig.remoteWriteExportInterval.toString(),
value = uiState.promConfig.remoteWriteExportInterval,
singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
onValueChange = {
promViewModel.updatePromConfig(UpdatePromConfig.PushproxProxyUrl, it.toInt())
promViewModel.updatePromConfig(UpdatePromConfig.RemoteWriteExportInterval, it)
},
label = {
Text(text = "Export interval in seconds")

View File

@ -20,7 +20,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
private val TAG: String = "PROMVIEWMODEL"
private const val TAG: String = "PROMVIEWMODEL"
enum class ConfigFileState {
LOADING, // parsing configuration file now
@ -29,36 +29,6 @@ enum class ConfigFileState {
SUCCESS,
}
class PromUiConfiguration private constructor(
val prometheusServerEnabled: Boolean,
val prometheusServerPort: String,
val pushproxEnabled: Boolean,
val pushproxFqdn: String,
val pushproxProxyUrl: String,
val remoteWriteEnabled: Boolean,
val remoteWriteScrapeInterval: String,
val remoteWriteEndpoint: String,
val remoteWriteExportInterval : String,
val remoteWriteMaxSamplesPerExport : String,
){
companion object {
fun default() : PromUiConfiguration{
val template = PromConfiguration()
return PromUiConfiguration(
remoteWriteEndpoint = template.remoteWriteEndpoint,
prometheusServerPort = template.prometheusServerPort.toString(),
prometheusServerEnabled = //TODO asap
)
}
}
// Throws exception when values are illegal
fun toPromConfiguration() : PromConfiguration {
//TODO
}
}
enum class UpdatePromConfig {
PrometheusServerEnabled,
PrometheusServerPort,
@ -68,7 +38,7 @@ enum class UpdatePromConfig {
RemoteWriteEnabled,
RemoteWriteScrapeInterval,
RemoteWriteEndpoint,
RemoteWriteexportInterval,
RemoteWriteExportInterval,
RemoteWriteMaxSamplesPerExport,
}
@ -87,7 +57,7 @@ data class PromUiState(
val configValidationException: String? = null,
)
class PromViewModel() : ViewModel() {
class PromViewModel : ViewModel() {
private val _uiState = MutableStateFlow(PromUiState())
val uiState: StateFlow<PromUiState> = _uiState.asStateFlow()
@ -215,45 +185,80 @@ class PromViewModel() : ViewModel() {
return false
}
private fun somePushProxVariableUnset(config : PromConfiguration) : Boolean {
return config.pushproxFqdn.isBlank() || config.pushproxProxyUrl.isBlank()
}
private fun somePrometheusServerVariableUnset(config : PromConfiguration) : Boolean {
return config.prometheusServerPort.isBlank()
}
private fun someRemoteWriteVariableUnset(config : PromConfiguration) : Boolean {
return config.remoteWriteEndpoint.isBlank()
|| config.remoteWriteScrapeInterval.isBlank()
|| config.remoteWriteExportInterval.isBlank()
|| config.remoteWriteMaxSamplesPerExport.isBlank()
}
private fun validatePromConfiguration(): Boolean {
val config: PromConfiguration = uiState.value.promConfig
// check eather pushprox or prometheus server is on
// check either pushprox or prometheus server is turned on
if (!config.pushproxEnabled && !config.prometheusServerEnabled) {
return displayConfigValidationDialog("Please enable PushProx or Prometheus server!")
}
// check port boundaries
val minPort = 1024
val maxPort = 65535
if (config.prometheusServerPort < minPort || config.prometheusServerPort > maxPort) {
return displayConfigValidationDialog("Prometheus exporter port out of bounds!")
// check for empty configuration
if(config.pushproxEnabled && somePushProxVariableUnset(config)){
return displayConfigValidationDialog("Please set all PushProx configuration settings!")
}
if(config.prometheusServerEnabled && somePrometheusServerVariableUnset(config)){
return displayConfigValidationDialog("Set all Prometheus Server config settings!")
}
if(config.remoteWriteEnabled && someRemoteWriteVariableUnset(config)){
return displayConfigValidationDialog("Set all Remote Write configuration settings!")
}
// check scrape interval boundaries
val minScrapeInterval = 1
val maxScrapeInterval = 3600 / 4
val scrapeInterval = config.remoteWriteScrapeInterval
if (scrapeInterval > maxScrapeInterval || scrapeInterval < minScrapeInterval) {
return displayConfigValidationDialog("Remote write scrape interval out of bounds!")
// validate settings for remote write
if(config.remoteWriteEnabled){
// check scrape interval boundaries
val minScrapeInterval = 1
val maxScrapeInterval = 3600 / 4
val scrapeInterval : Int = config.remoteWriteScrapeInterval.toIntOrNull()
?: return displayConfigValidationDialog("Scrape interval must be a number!")
if (scrapeInterval > maxScrapeInterval || scrapeInterval < minScrapeInterval) {
return displayConfigValidationDialog("Remote write scrape interval out of bounds!")
}
// check max samples per export
config.remoteWriteMaxSamplesPerExport.toIntOrNull()
?: return displayConfigValidationDialog("Max Samples Per Export must be a number!")
// check export interval
val exportInterval : Int = config.remoteWriteExportInterval.toIntOrNull()
?: return displayConfigValidationDialog("Export interval must be a number!")
if (scrapeInterval > exportInterval){
return displayConfigValidationDialog(
"Scrape interval must be smaller than Export interval!"
)
}
}
// if remote write enabled, remote_write_endpoint is set
if (config.remoteWriteEnabled && config.remoteWriteEndpoint.isBlank()) {
return displayConfigValidationDialog("Please set remote write endpoint!")
// validate settings for prometheus server
if(config.prometheusServerEnabled){
// check port boundaries
val minPort = 1024
val maxPort = 65535
val prometheusServerPort : Int = config.prometheusServerPort.toIntOrNull()
?: return displayConfigValidationDialog("Prometheus Server Port must be a number!")
if (prometheusServerPort < minPort || prometheusServerPort > maxPort) {
return displayConfigValidationDialog("Prometheus exporter port out of bounds!")
}
}
// if pushprox is enabled, fqdn is set
if (config.pushproxEnabled && config.pushproxFqdn.isBlank()) {
return displayConfigValidationDialog(
"Please set proxy fqdn! For example: test.example.com"
)
}
// if pushprox is enabled, proxy_url is set
if (config.pushproxEnabled && config.pushproxProxyUrl.isBlank()) {
return displayConfigValidationDialog("Please set proxy_url!")
}
// no need to validate anything for pushprox
return true
}
@ -315,7 +320,7 @@ class PromViewModel() : ViewModel() {
UpdatePromConfig.PrometheusServerPort -> _uiState.update { current ->
current.copy(
promConfig = current.promConfig.copy(
prometheusServerPort = value as Int,
prometheusServerPort = value as String,
)
)
}
@ -355,7 +360,7 @@ class PromViewModel() : ViewModel() {
UpdatePromConfig.RemoteWriteScrapeInterval -> _uiState.update { current ->
current.copy(
promConfig = current.promConfig.copy(
remoteWriteScrapeInterval = value as Int,
remoteWriteScrapeInterval = value as String,
)
)
}
@ -368,10 +373,10 @@ class PromViewModel() : ViewModel() {
)
}
UpdatePromConfig.RemoteWriteexportInterval -> _uiState.update {current ->
UpdatePromConfig.RemoteWriteExportInterval -> _uiState.update { current ->
current.copy(
promConfig = current.promConfig.copy(
remoteWriteExportInterval = value as Int
remoteWriteExportInterval = value as String
)
)
}
@ -379,7 +384,7 @@ class PromViewModel() : ViewModel() {
UpdatePromConfig.RemoteWriteMaxSamplesPerExport -> _uiState.update { current ->
current.copy(
promConfig = current.promConfig.copy(
remoteWriteMaxSamplesPerExport = value as Int
remoteWriteMaxSamplesPerExport = value as String
)
)
}

View File

@ -56,11 +56,11 @@ class PromWorker(
if (config.remoteWriteEnabled) {
remoteWriteSender = RemoteWriteSender(
RemoteWriteConfiguration(
scrapeInterval = config.remoteWriteScrapeInterval,
scrapeInterval = config.remoteWriteScrapeInterval.toInt(),
remoteWriteEndpoint = config.remoteWriteEndpoint,
collectorRegistry = collectorRegistry,
exportInterval = config.remoteWriteExportInterval,
maxSamplesPerExport = config.remoteWriteMaxSamplesPerExport,
exportInterval = config.remoteWriteExportInterval.toInt(),
maxSamplesPerExport = config.remoteWriteMaxSamplesPerExport.toInt(),
) { context }
)
launch {
@ -72,7 +72,7 @@ class PromWorker(
launch {
PrometheusServer.start(
PrometheusServerConfig(
config.prometheusServerPort,
config.prometheusServerPort.toInt(),
::performScrape,
::countSuccessfulScrape,
),