use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct GlobalConfig {
#[serde(default = "default_log_level")]
pub log_level: String,
#[serde(default)]
pub log_format: Option<String>,
#[serde(default)]
pub source_label_key: Option<String>,
#[serde(default)]
pub source_label_value: Option<String>,
#[serde(default)]
pub state: Option<GlobalStateConfig>,
#[serde(default)]
pub api: Option<ApiConfig>,
#[serde(default)]
pub metrics: Option<MetricsConfig>,
#[serde(default)]
pub backpressure: Option<BackpressureConfig>,
#[serde(default)]
pub degradation: Option<DegradationConfig>,
#[serde(default)]
pub reload: Option<ReloadConfig>,
#[serde(default)]
pub dump_on_sigusr1: Option<DumpOnSigusr1Config>,
#[serde(default)]
pub bulkhead: Option<BulkheadConfig>,
#[serde(default)]
pub load_shedding: Option<LoadSheddingConfig>,
#[serde(default)]
pub hooks: Option<HooksConfig>,
#[serde(default)]
pub audit: Option<AuditConfig>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AuditConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_true")]
pub log_credential_access: bool,
#[serde(default = "default_true")]
pub log_config_changes: bool,
}
fn default_true() -> bool {
true
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct HooksConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub path: Option<String>,
#[serde(default = "default_hooks_timeout_secs")]
pub timeout_secs: u64,
#[serde(default)]
pub memory_limit_mb: Option<u64>,
#[serde(default)]
pub allow_network: bool,
#[serde(default)]
pub allow_fs: bool,
#[serde(default = "default_hooks_auth_cache_ttl_secs")]
pub auth_cache_ttl_secs: u64,
}
fn default_hooks_timeout_secs() -> u64 {
5
}
fn default_hooks_auth_cache_ttl_secs() -> u64 {
1800
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct SourceHooksConfig {
#[serde(default)]
pub script: Option<String>,
#[serde(default)]
pub script_inline: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct LoadSheddingConfig {
#[serde(default)]
pub skip_priority_below: Option<u32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct BulkheadConfig {
#[serde(default)]
pub max_concurrent_sources: Option<u32>,
#[serde(default)]
pub max_concurrent_requests: Option<u32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ReloadConfig {
#[serde(default)]
pub restart_sources_on_sighup: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct DumpOnSigusr1Config {
#[serde(default = "default_dump_destination")]
pub destination: String,
#[serde(default)]
pub path: Option<String>,
}
fn default_dump_destination() -> String {
"log".to_string()
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct DegradationConfig {
#[serde(default)]
pub state_store_fallback: Option<String>,
#[serde(default)]
pub emit_without_checkpoint: Option<bool>,
#[serde(default = "default_reduced_frequency_multiplier")]
pub reduced_frequency_multiplier: f64,
}
fn default_reduced_frequency_multiplier() -> f64 {
2.0
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct BackpressureConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub detection: BackpressureDetectionConfig,
#[serde(default = "default_backpressure_strategy")]
pub strategy: BackpressureStrategyConfig,
#[serde(default)]
pub disk_buffer: Option<BackpressureDiskBufferConfig>,
#[serde(default = "default_drop_policy")]
pub drop_policy: DropPolicyConfig,
#[serde(default)]
pub max_queue_age_secs: Option<u64>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum BackpressureStrategyConfig {
#[default]
Block,
DiskBuffer,
Drop,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum DropPolicyConfig {
#[default]
OldestFirst,
NewestFirst,
Random,
}
fn default_backpressure_strategy() -> BackpressureStrategyConfig {
BackpressureStrategyConfig::Block
}
fn default_drop_policy() -> DropPolicyConfig {
DropPolicyConfig::OldestFirst
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct BackpressureDetectionConfig {
#[serde(default = "default_stdout_buffer_size")]
pub stdout_buffer_size: u64,
#[serde(default = "default_event_queue_size")]
pub event_queue_size: usize,
#[serde(default)]
pub memory_threshold_mb: Option<u64>,
}
fn default_stdout_buffer_size() -> u64 {
65536
}
fn default_event_queue_size() -> usize {
10_000
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct BackpressureDiskBufferConfig {
pub path: String,
#[serde(default = "default_disk_buffer_max_size_mb")]
pub max_size_mb: u64,
#[serde(default = "default_disk_buffer_segment_size_mb")]
pub segment_size_mb: u64,
}
fn default_disk_buffer_max_size_mb() -> u64 {
1024
}
fn default_disk_buffer_segment_size_mb() -> u64 {
64
}
pub(crate) fn default_log_level() -> String {
"info".to_string()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct GlobalStateConfig {
pub backend: String,
#[serde(default)]
pub path: Option<String>,
#[serde(default)]
pub url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ApiConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_api_address")]
pub address: String,
#[serde(default = "default_api_port")]
pub port: u16,
}
fn default_api_address() -> String {
"0.0.0.0".to_string()
}
fn default_api_port() -> u16 {
8080
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct MetricsConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_metrics_address")]
pub address: String,
#[serde(default = "default_metrics_port")]
pub port: u16,
}
fn default_metrics_address() -> String {
"0.0.0.0".to_string()
}
fn default_metrics_port() -> u16 {
9090
}