use std::sync::Arc;
use parking_lot::Mutex;
use rocketmq_runtime::{MetadataIoObserver, RuntimeDiagnosticsInputs, ScheduledTaskObserver, ShutdownReport};
use super::RuntimeDiagnosticsDataProvider;
#[derive(Default)]
struct Sources {
schedules: Option<ScheduledTaskObserver>,
metadata: Option<MetadataIoObserver>,
shutdown: Option<ShutdownReport>,
}
#[derive(Clone, Default)]
pub struct RuntimeDiagnosticsSources {
inner: Arc<Mutex<Sources>>,
}
impl RuntimeDiagnosticsSources {
pub fn set_schedules(&self, observer: ScheduledTaskObserver) {
self.inner.lock().schedules = Some(observer);
}
pub fn set_metadata(&self, observer: MetadataIoObserver) {
self.inner.lock().metadata = Some(observer);
}
pub fn retain_shutdown(&self, report: &ShutdownReport) {
let mut summary = ShutdownReport::new("", report.elapsed);
summary.completed = report.completed;
summary.cancelled = report.cancelled;
summary.aborted = report.aborted;
summary.failed = report.failed;
summary.panicked = report.panicked;
summary.timed_out = report.timed_out;
summary.leaked = report.leaked;
summary.blocking_still_running = report.blocking_still_running;
self.inner.lock().shutdown = Some(summary);
}
}
impl RuntimeDiagnosticsDataProvider for RuntimeDiagnosticsSources {
fn snapshot(&self) -> RuntimeDiagnosticsInputs {
let (schedules, metadata, shutdown) = {
let sources = self.inner.lock();
(
sources.schedules.clone(),
sources.metadata.clone(),
sources.shutdown.clone(),
)
};
RuntimeDiagnosticsInputs {
schedule: schedules.map_or_else(Vec::new, |observer| observer.snapshot()),
metadata: metadata.and_then(|observer| observer.snapshot()),
shutdown,
}
}
}