use crate::client::RestClient;
use crate::error::{RestError, Result};
use serde::{Deserialize, Serialize};
use typed_builder::TypedBuilder;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct MetricsConfig {
pub key_distribution_enabled: bool,
pub key_size_buckets: String,
pub key_items_buckets: String,
pub local_storage_max_size_mb: u64,
pub local_storage_retention_days: u64,
pub expose_db_tags: bool,
pub metrics_tag_keys_exposed: Vec<String>,
pub max_requests_in_flight: u64,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, TypedBuilder)]
pub struct MetricsConfigUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub key_distribution_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(into, strip_option))]
pub key_size_buckets: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(into, strip_option))]
pub key_items_buckets: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub local_storage_max_size_mb: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub local_storage_retention_days: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub expose_db_tags: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub metrics_tag_keys_exposed: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[builder(default, setter(strip_option))]
pub max_requests_in_flight: Option<u64>,
}
impl MetricsConfigUpdate {
#[must_use]
pub fn is_empty(&self) -> bool {
self.key_distribution_enabled.is_none()
&& self.key_size_buckets.is_none()
&& self.key_items_buckets.is_none()
&& self.local_storage_max_size_mb.is_none()
&& self.local_storage_retention_days.is_none()
&& self.expose_db_tags.is_none()
&& self.metrics_tag_keys_exposed.is_none()
&& self.max_requests_in_flight.is_none()
}
}
pub struct MetricsConfigHandler {
client: RestClient,
}
impl MetricsConfigHandler {
pub fn new(client: RestClient) -> Self {
Self { client }
}
pub async fn get(&self) -> Result<MetricsConfig> {
self.client.get("/v1/metrics_config").await
}
pub async fn update(&self, update: MetricsConfigUpdate) -> Result<MetricsConfig> {
if update.is_empty() {
return Err(RestError::ValidationError(
"metrics configuration update requires at least one field".to_string(),
));
}
self.client.put("/v1/metrics_config", &update).await
}
}