diff --git a/src/system/info.rs b/src/system/info.rs index af27eb96..d62fec01 100644 --- a/src/system/info.rs +++ b/src/system/info.rs @@ -30,6 +30,7 @@ pub struct SystemInfo { pub cpu_vendor_id: String, pub cpu_cores: usize, pub total_memory_gb: u64, + pub cpu_flags: Vec, } #[cfg(test)] @@ -46,10 +47,53 @@ impl SystemInfo { cpu_vendor_id: "GenuineIntel".to_string(), cpu_cores: 2, total_memory_gb: 8, + cpu_flags: vec![ + "sse2".to_string(), + "avx".to_string(), + "avx2".to_string(), + "erms".to_string(), + ], } } } +#[cfg(target_os = "linux")] +fn get_cpu_flags() -> Vec { + use procfs::Current; + + let cpuinfo = match procfs::CpuInfo::current() { + Ok(cpuinfo) => cpuinfo, + Err(e) => { + warn!("Failed to read /proc/cpuinfo: {e}"); + return Vec::new(); + } + }; + + // /proc/cpuinfo uses "flags" on x86_64 and "Features" on aarch64 + let field_name = if cfg!(target_arch = "x86_64") { + "flags" + } else if cfg!(target_arch = "aarch64") { + "Features" + } else { + return Vec::new(); + }; + + let mut flags: Vec = match cpuinfo.get_field(0, field_name) { + Some(value) => value.split_whitespace().map(|s| s.to_string()).collect(), + None => { + warn!("No CPU flags found in /proc/cpuinfo (field: {field_name})"); + return Vec::new(); + } + }; + flags.sort(); + flags +} + +#[cfg(not(target_os = "linux"))] +fn get_cpu_flags() -> Vec { + Vec::new() +} + impl SystemInfo { pub fn new() -> Result { let os = System::distribution_id(); @@ -85,6 +129,8 @@ impl SystemInfo { let cpu_name = cpu.name().to_string(); let cpu_vendor_id = cpu.vendor_id().to_string(); + let cpu_flags = get_cpu_flags(); + Ok(SystemInfo { os, os_version, @@ -96,6 +142,7 @@ impl SystemInfo { cpu_vendor_id, cpu_cores, total_memory_gb, + cpu_flags, }) } } diff --git a/src/upload/interfaces.rs b/src/upload/interfaces.rs index 2be3ce98..c6dc2a8d 100644 --- a/src/upload/interfaces.rs +++ b/src/upload/interfaces.rs @@ -5,7 +5,7 @@ use crate::instruments::InstrumentName; use crate::run_environment::{RepositoryProvider, RunEnvironment, RunEnvironmentMetadata, RunPart}; use crate::system::SystemInfo; -pub const LATEST_UPLOAD_METADATA_VERSION: u32 = 9; +pub const LATEST_UPLOAD_METADATA_VERSION: u32 = 10; #[derive(Deserialize, Serialize, Debug)] #[serde(rename_all = "camelCase")] diff --git a/src/upload/snapshots/codspeed_runner__upload__upload_metadata__tests__get_local_metadata_hash-2.snap b/src/upload/snapshots/codspeed_runner__upload__upload_metadata__tests__get_local_metadata_hash-2.snap index a7002d4f..4b9af9b3 100644 --- a/src/upload/snapshots/codspeed_runner__upload__upload_metadata__tests__get_local_metadata_hash-2.snap +++ b/src/upload/snapshots/codspeed_runner__upload__upload_metadata__tests__get_local_metadata_hash-2.snap @@ -4,7 +4,7 @@ expression: upload_metadata --- { "repositoryProvider": "PROJECT", - "version": 9, + "version": 10, "tokenless": false, "profileMd5": "tfC4VxYiYdJcTWpHpv4Ouw==", "profileEncoding": "gzip", @@ -22,7 +22,13 @@ expression: upload_metadata "cpuName": "cpu0", "cpuVendorId": "GenuineIntel", "cpuCores": 6, - "totalMemoryGb": 16 + "totalMemoryGb": 16, + "cpuFlags": [ + "sse2", + "avx", + "avx2", + "erms" + ] }, "runEnvironment": "LOCAL", "runPart": { diff --git a/src/upload/snapshots/codspeed_runner__upload__upload_metadata__tests__get_metadata_hash-2.snap b/src/upload/snapshots/codspeed_runner__upload__upload_metadata__tests__get_metadata_hash-2.snap index 3cee1ad0..36f97410 100644 --- a/src/upload/snapshots/codspeed_runner__upload__upload_metadata__tests__get_metadata_hash-2.snap +++ b/src/upload/snapshots/codspeed_runner__upload__upload_metadata__tests__get_metadata_hash-2.snap @@ -4,7 +4,7 @@ expression: upload_metadata --- { "repositoryProvider": "GITHUB", - "version": 9, + "version": 10, "tokenless": true, "profileMd5": "jp/k05RKuqP3ERQuIIvx4Q==", "profileEncoding": "gzip", @@ -24,7 +24,13 @@ expression: upload_metadata "cpuName": "cpu0", "cpuVendorId": "GenuineIntel", "cpuCores": 2, - "totalMemoryGb": 8 + "totalMemoryGb": 8, + "cpuFlags": [ + "sse2", + "avx", + "avx2", + "erms" + ] }, "runEnvironment": "GITHUB_ACTIONS", "runPart": { diff --git a/src/upload/upload_metadata.rs b/src/upload/upload_metadata.rs index 418ffbc3..68cf51d3 100644 --- a/src/upload/upload_metadata.rs +++ b/src/upload/upload_metadata.rs @@ -77,7 +77,7 @@ mod tests { hash, // Caution: when changing this value, we need to ensure that // the related backend snapshot remains the same - @"b2c6175fa81d4c4c5eb215e2e77667891f33abca9f8614b45899e3ee070bdca6" + @"0afc09ee58a610d400aa6b3fbdddf628608ed2e11aed39585a50abe96e1c9284" ); assert_json_snapshot!(upload_metadata); } @@ -106,6 +106,12 @@ mod tests { cpu_vendor_id: "GenuineIntel".to_string(), cpu_cores: 6, total_memory_gb: 16, + cpu_flags: vec![ + "sse2".to_string(), + "avx".to_string(), + "avx2".to_string(), + "erms".to_string(), + ], }, }, run_environment: RunEnvironment::Local, @@ -139,7 +145,7 @@ mod tests { hash, // Caution: when changing this value, we need to ensure that // the related backend snapshot remains the same - @"47b6317da2747edae177d8a99143efc6f7516beb3222b9d45331ba48d4e1c369" + @"26c83ef306f189fe5b725043577dbc09a204bbd1c973dd7d1e974ff88235dd84" ); assert_json_snapshot!(upload_metadata); }