use serde::{Serialize, Deserialize};
use std::collections::HashMap;
use surf::post;
pub async fn push_log(address: String, stream_name: String, stream_value: String, log_messages: Vec<[String; 2]> ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
#[derive(Serialize, Deserialize, Debug)]
struct LogPushStream {
stream: HashMap<String, String>,
values: Vec<[String; 2]>
}
#[derive(Serialize, Deserialize, Debug)]
struct LogPushStreamContainer {
streams: Vec<LogPushStream>
}
let log_stream = LogPushStream {
stream: HashMap::from([(stream_name, stream_value)]),
values: log_messages
};
let stream_container = LogPushStreamContainer {
streams: vec![log_stream]
};
let uri = format!("{}/loki/api/v1/push", address);
let res = post(uri).body_json(&stream_container)?.await?;
let success = res.status() as u8 /100 == 2;
if !success {
return Err(format!("Failed to push log to Loki: {}", res.status()).into());
} else {
Ok(())
}
}