pub use did_hosting_common::server::stats_collector::{StatsAggregate, StatsCollector};
use affinidi_messaging_didcomm_service::DIDCommService;
use std::sync::atomic::{AtomicU64, Ordering};
use tracing::{debug, warn};
static SYNC_SEQ: AtomicU64 = AtomicU64::new(0);
pub async fn sync_to_control(
http: &reqwest::Client,
control_url: &str,
server_did: &str,
collector: &StatsCollector,
) {
let deltas = collector.drain_for_sync();
if deltas.is_empty() {
return; }
let seq = SYNC_SEQ.fetch_add(1, Ordering::Relaxed);
let payload = did_hosting_common::StatsSyncPayload {
server_did: server_did.to_string(),
seq,
did_deltas: deltas,
};
let url = format!("{control_url}/api/control/stats");
match http.post(&url).json(&payload).send().await {
Ok(_) => {
#[cfg(feature = "metrics")]
did_hosting_common::server::metrics::inc_stats_sync();
}
Err(e) => {
warn!(error = %e, url = %url, "failed to sync stats to control plane");
}
}
}
pub async fn sync_to_control_didcomm(
svc: &DIDCommService,
server_did: &str,
control_did: &str,
collector: &StatsCollector,
) {
use affinidi_messaging_didcomm::Message;
use did_hosting_common::didcomm_types::MSG_STATS_SYNC;
use serde_json::json;
let deltas = collector.drain_for_sync();
if deltas.is_empty() {
return;
}
let seq = SYNC_SEQ.fetch_add(1, Ordering::Relaxed);
let did_deltas: Vec<_> = deltas
.iter()
.map(|d| {
json!({
"mnemonic": d.mnemonic,
"resolve_delta": d.resolve_delta,
"update_delta": d.update_delta,
"last_resolved_at": d.last_resolved_at,
"last_updated_at": d.last_updated_at,
})
})
.collect();
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
let msg = Message::build(
uuid::Uuid::new_v4().to_string(),
MSG_STATS_SYNC.to_string(),
json!({
"server_did": server_did,
"seq": seq,
"did_deltas": did_deltas,
}),
)
.from(server_did.to_string())
.to(control_did.to_string())
.created_time(now)
.finalize();
if let Err(e) = svc.send_message("server", msg, control_did).await {
debug!(error = %e, "failed to sync stats to control plane via DIDComm");
}
}