unleash-edge 0.2.0

Unleash edge is a proxy for Unleash. It can return both evaluated feature toggles as well as the raw data from Unleash's client API
Documentation
use super::unleash_client::UnleashClient;
use std::time::Duration;

use crate::error::EdgeError;
use crate::metrics::client_metrics::MetricsCache;
use crate::types::{
    BatchMetricsRequest, BatchMetricsRequestBody, EdgeResult, EdgeSource, EdgeToken,
};
use std::sync::Arc;
use tracing::{debug, warn};

pub async fn send_metrics_task(
    metrics_cache: Arc<MetricsCache>,
    source: Arc<dyn EdgeSource>,
    unleash_client: UnleashClient,
    send_interval: u64,
) {
    loop {
        {
            let metrics = metrics_cache.get_unsent_metrics();
            let api_key = get_first_token(source.clone()).await;

            match api_key {
                Ok(api_key) => {
                    debug!("Going to post {metrics:?} for {api_key:?}");
                    let request = BatchMetricsRequest {
                        api_key: api_key.token.clone(),
                        body: BatchMetricsRequestBody {
                            applications: metrics.applications,
                            metrics: metrics.metrics,
                        },
                    };

                    if let Err(error) = unleash_client.send_batch_metrics(request).await {
                        warn!("Failed to send metrics: {error:?}");
                    } else {
                        metrics_cache.reset_metrics();
                    }
                }
                Err(e) => {
                    warn!("Error sending metrics: {e:?}")
                }
            }
        }

        tokio::time::sleep(Duration::from_secs(send_interval)).await;
    }
}

async fn get_first_token(source: Arc<dyn EdgeSource>) -> EdgeResult<EdgeToken> {
    let api_key = source.get_valid_tokens().await?.get(0).cloned();
    match api_key {
        Some(api_key) => Ok(api_key),
        None => Err(EdgeError::DataSourceError("No tokens found".into())),
    }
}