use std::fmt;
use std::sync::Arc;
use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering};
use crate::executor::metric_sink::MetricSink;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct ExecutorMetrics {
pub submitted_tasks: u64,
pub completed_tasks: u64,
pub rejected_tasks: u64,
pub panicked_tasks: u64,
pub queue_depth: usize,
pub workers: usize,
}
pub(crate) struct ExecutorMetricsInner {
submitted_tasks: AtomicU64,
completed_tasks: AtomicU64,
rejected_tasks: AtomicU64,
panicked_tasks: AtomicU64,
queue_depth: AtomicUsize,
workers: usize,
sink: Arc<dyn MetricSink>,
}
impl fmt::Debug for ExecutorMetricsInner {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("ExecutorMetricsInner")
.field("snapshot", &self.snapshot())
.finish_non_exhaustive()
}
}
impl ExecutorMetricsInner {
pub(crate) fn new(workers: usize, sink: Arc<dyn MetricSink>) -> Self {
Self {
submitted_tasks: AtomicU64::new(0),
completed_tasks: AtomicU64::new(0),
rejected_tasks: AtomicU64::new(0),
panicked_tasks: AtomicU64::new(0),
queue_depth: AtomicUsize::new(0),
workers,
sink,
}
}
pub(crate) fn submitted(&self) {
self.submitted_tasks.fetch_add(1, Ordering::Relaxed);
self.queue_depth.fetch_add(1, Ordering::Relaxed);
self.observe();
}
pub(crate) fn completed(&self) {
self.completed_tasks.fetch_add(1, Ordering::Relaxed);
self.queue_depth.fetch_sub(1, Ordering::Relaxed);
self.observe();
}
pub(crate) fn rejected(&self) {
self.rejected_tasks.fetch_add(1, Ordering::Relaxed);
self.observe();
}
pub(crate) fn panicked(&self) {
self.panicked_tasks.fetch_add(1, Ordering::Relaxed);
self.observe();
}
fn observe(&self) {
self.sink.observe_metrics(self.snapshot());
}
pub(crate) fn snapshot(&self) -> ExecutorMetrics {
ExecutorMetrics {
submitted_tasks: self.submitted_tasks.load(Ordering::Relaxed),
completed_tasks: self.completed_tasks.load(Ordering::Relaxed),
rejected_tasks: self.rejected_tasks.load(Ordering::Relaxed),
panicked_tasks: self.panicked_tasks.load(Ordering::Relaxed),
queue_depth: self.queue_depth.load(Ordering::Relaxed),
workers: self.workers,
}
}
}