From d2e4d9e0d21be719e0f3330f4afff4af634f876a Mon Sep 17 00:00:00 2001 From: Janakarajan Natarajan Date: Mon, 13 Feb 2023 16:45:16 +0000 Subject: [PATCH] Fix visualization of interrupt data The data from procfs for interrupts is cumulative. Data for time (t) = data for time (t) - data for time (t-1) --- src/data/interrupts.rs | 16 +++++++++++++++- src/lib.rs | 3 +++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/data/interrupts.rs b/src/data/interrupts.rs index 8d67c7db..4fcd9b3a 100644 --- a/src/data/interrupts.rs +++ b/src/data/interrupts.rs @@ -2,13 +2,14 @@ extern crate ctor; use anyhow::Result; use crate::data::{CollectData, Data, ProcessedData, DataType, TimeEnum}; -use crate::{PERFORMANCE_DATA, VISUALIZATION_DATA}; +use crate::{PDError, PERFORMANCE_DATA, VISUALIZATION_DATA}; use crate::visualizer::{DataVisualizer, GetData}; use chrono::prelude::*; use ctor::ctor; use log::{trace, error}; use serde::{Deserialize, Serialize}; use std::io::{BufRead, BufReader}; +use std::collections::HashMap; pub static INTERRUPTS_FILE_NAME: &str = "interrupts"; @@ -253,11 +254,24 @@ fn get_key_data(values: Vec, key: String) -> Vec, key: String) -> Result { let key_values = get_key_data(values, key); let mut end_values = Vec::new(); + let mut prev_data_map = HashMap::new(); let time_zero = key_values[0].time; + for cpu_data in &key_values[0].per_cpu { + prev_data_map.insert(cpu_data.cpu, cpu_data.count); + } for data in key_values { let mut end_value = data.clone(); end_value.set_time(data.time - time_zero); + for cpu_data in &mut end_value.per_cpu { + cpu_data.count -= prev_data_map + .get(&cpu_data.cpu) + .ok_or(PDError::VisualizerInterruptLineCPUCountError(format!("{}", cpu_data.cpu)))?; + } end_values.push(end_value); + prev_data_map.clear(); + for cpu_data in data.per_cpu { + prev_data_map.insert(cpu_data.cpu, cpu_data.count); + } } Ok(serde_json::to_string(&end_values)?) } diff --git a/src/lib.rs b/src/lib.rs index 00067938..94235323 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,6 +29,9 @@ pub enum PDError { #[error("Error getting Vmstat value for {}", .0)] VisualizerVmstatValueGetError(String), + #[error("Error getting interrupt line count for CPU {}", .0)] + VisualizerInterruptLineCPUCountError(String), + #[error("Error getting Line Name Error")] CollectorLineNameError,