1.3. Hardware Ressourcen

Die CPU Auslastung wird über die Rust Bibliothek sysinfo ausgelesen. Die Auswertung erfolgt über die System Klasse der Bibliothek, welche alle Systemressourcen läd und ausgeben kann. Über extracts wird der Status des Systems über mehrere Anfragen hin persistiert. Die CPU Auslastung wird dann in der asynchronen Funktion get_cpus ausgelesen. Hierbei wird der Systemstatus der Arc Mutex entnommen und die Mutex gelocked. Der Systemstatus wird durch die Funktion sysinfo::System::refresh_cpu() erneuert und das Systemobjekt angepasst. Anschließend kann das Systemobjekt zum Auslesen der Prozessorlast verwendet werden. Der erzeugte Vektor an Gleitkommazahlen wird anschließend in das JSON Format umgeformt. Zuletzt wird die JSON Response als HTTP Response an den Client zurückgegeben.

Hier ist ein Ausschnitt aus dem Quellcode zu sehen, der diesen Ablauf implementiert:

use sysinfo::{CpuExt, System, SystemExt, Cpu};
use axum::{
    Json, extract::State,
    Router,
    routing::get,
    response::IntoResponse,
};
use std::sync::{Arc, Mutex, MutexGuard};

#[derive(Clone)]
struct AppState {
    system: Arc<Mutex<System>>
}

#[tokio::main]
async fn main() {
    let app: Router = Router::new()
        // --snip--
        .route("/rest/cpu", get(get_cpus)) // Route "/rest/cpu" endpoint to get_cpus()
        .with_state(AppState {
            system: Arc::new(Mutex::new(System::new_all()))  // Use AppState
        });
    // --snip--
}

// --snip--

async fn get_cpus(State(state): State<AppState>) -> impl IntoResponse {
    let mut system: MutexGuard<System> = state.system.lock().unwrap();
    system.refresh_cpu();
    let v: Vec<_> = system.cpus().iter().map(|cpu: &Cpu| cpu.cpu_usage()).collect();
    Json(v)
}

Bemerkung

Die Beschaffung des Arbeitsspeicher Status funktioniert auf die selbe Art und Weise, weshalb dies hier nicht extra aufgelistet wird.