use ockam_core::async_trait;
use opentelemetry_sdk::export::logs::{LogBatch, LogExporter};
use opentelemetry_sdk::logs::LogResult;
use std::time::Duration;
#[derive(Debug)]
pub struct DecoratedLogExporter<L: LogExporter> {
exporter: L,
}
#[async_trait]
impl<L: LogExporter> LogExporter for DecoratedLogExporter<L> {
async fn export(&mut self, batch: LogBatch<'_>) -> LogResult<()> {
self.exporter.export(batch).await
}
fn shutdown(&mut self) {
self.exporter.shutdown()
}
}
impl<L: LogExporter> DecoratedLogExporter<L> {
pub fn new(exporter: L) -> DecoratedLogExporter<L> {
DecoratedLogExporter { exporter }
}
}
#[derive(Debug)]
pub struct OckamLogExporter<L: LogExporter> {
exporter: L,
log_export_cutoff: Option<Duration>,
}
#[async_trait]
impl<L: LogExporter> LogExporter for OckamLogExporter<L> {
async fn export(&mut self, batch: LogBatch<'_>) -> LogResult<()> {
match self.log_export_cutoff {
Some(cutoff) => {
let f = self.exporter.export(batch);
let _ = tokio::time::timeout(cutoff, f).await;
Ok(())
}
None => self.exporter.export(batch).await,
}
}
fn shutdown(&mut self) {
self.exporter.shutdown()
}
}
impl<L: LogExporter> OckamLogExporter<L> {
pub fn new(exporter: L, log_export_cutoff: Option<Duration>) -> OckamLogExporter<L> {
OckamLogExporter {
exporter,
log_export_cutoff,
}
}
}