mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-10 07:06:53 +00:00
dd7da015e3
* init rustfs config * improve code for rustfs-config crate * add * improve code for comment * fix: modify rustfs-config crate name * add default fn * improve error logger * fix: modify docker config yaml * improve code for config * feat: restrict kafka feature to Linux only - Add target-specific feature configuration in Cargo.toml for obs and event-notifier crates - Implement conditional compilation for kafka feature only on Linux systems - Add appropriate error handling for non-Linux platforms - Ensure backward compatibility with existing code * refactor(ci): optimize build workflow for better efficiency - Integrate GUI build steps into main build-rustfs job - Add conditional GUI build execution based on tag releases - Simplify workflow by removing redundant build-rustfs-gui job - Copy binary directly to embedded-rustfs directory without downloading artifacts - Update merge job dependency to only rely on build-rustfs - Improve cross-platform compatibility for Windows binary naming (.exe) - Streamline artifact uploading and OSS publishing process - Maintain consistent conditional logic for release operations * refactor(ci): optimize build workflow for better efficiency - Integrate GUI build steps into main build-rustfs job - Add conditional GUI build execution based on tag releases - Simplify workflow by removing redundant build-rustfs-gui job - Copy binary directly to embedded-rustfs directory without downloading artifacts - Update merge job dependency to only rely on build-rustfs - Improve cross-platform compatibility for Windows binary naming (.exe) - Streamline artifact uploading and OSS publishing process - Maintain consistent conditional logic for release operations * fix(ci): add repo-token to setup-protoc action for authentication - Add GITHUB_TOKEN parameter to arduino/setup-protoc@v3 action - Ensure proper authentication for Protoc installation in CI workflow - Maintain consistent setup across different CI environments * modify config * improve readme.md * remove env config relation * add allow(dead_code)
71 lines
2.2 KiB
Rust
71 lines
2.2 KiB
Rust
use crate::sinks::Sink;
|
|
use crate::UnifiedLogEntry;
|
|
use async_trait::async_trait;
|
|
|
|
/// Webhook Sink Implementation
|
|
pub struct WebhookSink {
|
|
endpoint: String,
|
|
auth_token: String,
|
|
client: reqwest::Client,
|
|
max_retries: usize,
|
|
retry_delay_ms: u64,
|
|
}
|
|
|
|
impl WebhookSink {
|
|
pub fn new(endpoint: String, auth_token: String, max_retries: usize, retry_delay_ms: u64) -> Self {
|
|
WebhookSink {
|
|
endpoint,
|
|
auth_token,
|
|
client: reqwest::Client::builder()
|
|
.timeout(std::time::Duration::from_secs(10))
|
|
.build()
|
|
.unwrap_or_else(|_| reqwest::Client::new()),
|
|
max_retries,
|
|
retry_delay_ms,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl Sink for WebhookSink {
|
|
async fn write(&self, entry: &UnifiedLogEntry) {
|
|
let mut retries = 0;
|
|
let url = self.endpoint.clone();
|
|
let entry_clone = entry.clone();
|
|
let auth_value = reqwest::header::HeaderValue::from_str(format!("Bearer {}", self.auth_token.clone()).as_str()).unwrap();
|
|
while retries < self.max_retries {
|
|
match self
|
|
.client
|
|
.post(&url)
|
|
.header(reqwest::header::AUTHORIZATION, auth_value.clone())
|
|
.json(&entry_clone)
|
|
.send()
|
|
.await
|
|
{
|
|
Ok(response) if response.status().is_success() => {
|
|
return;
|
|
}
|
|
_ => {
|
|
retries += 1;
|
|
if retries < self.max_retries {
|
|
tokio::time::sleep(tokio::time::Duration::from_millis(
|
|
self.retry_delay_ms * (1 << retries), // Exponential backoff
|
|
))
|
|
.await;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
eprintln!("Failed to send log to webhook after {} retries", self.max_retries);
|
|
}
|
|
}
|
|
|
|
impl Drop for WebhookSink {
|
|
fn drop(&mut self) {
|
|
// Perform any necessary cleanup here
|
|
// For example, you might want to log that the sink is being dropped
|
|
eprintln!("Dropping WebhookSink with URL: {}", self.endpoint);
|
|
}
|
|
}
|