use std::time::Duration;
use secrecy::SecretString;
use crate::batch::BatcherConfig;
use crate::error::TraceError;
#[derive(Clone, Debug)]
pub struct LangfuseConfig {
pub host: String,
pub public_key: String,
pub secret_key: SecretString,
pub environment: Option<String>,
pub release: Option<String>,
pub batcher: BatcherConfig,
pub timeout: Duration,
pub max_retries: u32,
}
impl Default for LangfuseConfig {
fn default() -> Self {
Self {
host: "https://cloud.langfuse.com".into(),
public_key: String::new(),
secret_key: SecretString::from(String::new()),
environment: None,
release: None,
batcher: BatcherConfig::default(),
timeout: Duration::from_secs(10),
max_retries: 3,
}
}
}
impl LangfuseConfig {
pub fn from_env() -> Result<Self, TraceError> {
let public_key = std::env::var("LANGFUSE_PUBLIC_KEY")
.map_err(|_| TraceError::MissingEnvVar("LANGFUSE_PUBLIC_KEY".into()))?;
let secret_key = std::env::var("LANGFUSE_SECRET_KEY")
.map_err(|_| TraceError::MissingEnvVar("LANGFUSE_SECRET_KEY".into()))?;
let host =
std::env::var("LANGFUSE_HOST").unwrap_or_else(|_| "https://cloud.langfuse.com".into());
let environment = std::env::var("LANGFUSE_ENVIRONMENT").ok();
let release = std::env::var("LANGFUSE_RELEASE").ok();
let mut batcher = BatcherConfig::default();
if let Ok(v) = std::env::var("LANGFUSE_FLUSH_INTERVAL_MS") {
batcher.flush_interval = Duration::from_millis(
v.parse()
.map_err(|_| TraceError::InvalidConfig("LANGFUSE_FLUSH_INTERVAL_MS".into()))?,
);
}
if let Ok(v) = std::env::var("LANGFUSE_MAX_BATCH") {
batcher.max_batch = v
.parse()
.map_err(|_| TraceError::InvalidConfig("LANGFUSE_MAX_BATCH".into()))?;
}
if let Ok(v) = std::env::var("LANGFUSE_QUEUE_CAPACITY") {
batcher.queue_capacity = v
.parse()
.map_err(|_| TraceError::InvalidConfig("LANGFUSE_QUEUE_CAPACITY".into()))?;
}
let timeout = match std::env::var("LANGFUSE_TIMEOUT_MS") {
Ok(v) => Duration::from_millis(
v.parse()
.map_err(|_| TraceError::InvalidConfig("LANGFUSE_TIMEOUT_MS".into()))?,
),
Err(_) => Duration::from_secs(10),
};
let max_retries = match std::env::var("LANGFUSE_MAX_RETRIES") {
Ok(v) => v
.parse()
.map_err(|_| TraceError::InvalidConfig("LANGFUSE_MAX_RETRIES".into()))?,
Err(_) => 3,
};
Ok(Self {
host,
public_key,
secret_key: SecretString::from(secret_key),
environment,
release,
batcher,
timeout,
max_retries,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_env_missing_keys_returns_missing_env_var() {
let res = LangfuseConfig::from_env();
match res {
Err(TraceError::MissingEnvVar(_)) => {}
Ok(_) => {} other => panic!("unexpected: {other:?}"),
}
}
}