use datafusion_common::instant::Instant;
use datafusion_physical_plan::metrics::{
Count, ExecutionPlanMetricsSet, MetricBuilder, MetricCategory, Time,
};
pub struct StartableTime {
pub metrics: Time,
pub start: Option<Instant>,
}
impl StartableTime {
pub fn start(&mut self) {
assert!(self.start.is_none());
self.start = Some(Instant::now());
}
pub fn stop(&mut self) {
if let Some(start) = self.start.take() {
self.metrics.add_elapsed(start);
}
}
}
pub struct FileStreamMetrics {
pub time_opening: StartableTime,
pub time_scanning_until_data: StartableTime,
pub time_scanning_total: StartableTime,
pub time_processing: Time,
pub file_open_errors: Count,
pub file_scan_errors: Count,
pub files_opened: Count,
pub files_processed: Count,
}
impl FileStreamMetrics {
pub fn new(metrics: &ExecutionPlanMetricsSet, partition: usize) -> Self {
let time_opening = StartableTime {
metrics: MetricBuilder::new(metrics)
.subset_time("time_elapsed_opening", partition),
start: None,
};
let time_scanning_until_data = StartableTime {
metrics: MetricBuilder::new(metrics)
.subset_time("time_elapsed_scanning_until_data", partition),
start: None,
};
let time_scanning_total = StartableTime {
metrics: MetricBuilder::new(metrics)
.subset_time("time_elapsed_scanning_total", partition),
start: None,
};
let time_processing =
MetricBuilder::new(metrics).subset_time("time_elapsed_processing", partition);
let file_open_errors = MetricBuilder::new(metrics)
.with_category(MetricCategory::Rows)
.counter("file_open_errors", partition);
let file_scan_errors = MetricBuilder::new(metrics)
.with_category(MetricCategory::Rows)
.counter("file_scan_errors", partition);
let files_opened = MetricBuilder::new(metrics)
.with_category(MetricCategory::Rows)
.counter("files_opened", partition);
let files_processed = MetricBuilder::new(metrics)
.with_category(MetricCategory::Rows)
.counter("files_processed", partition);
Self {
time_opening,
time_scanning_until_data,
time_scanning_total,
time_processing,
file_open_errors,
file_scan_errors,
files_opened,
files_processed,
}
}
}