diff --git a/Cargo.lock b/Cargo.lock index b770286..f7d435f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -450,7 +450,7 @@ dependencies = [ [[package]] name = "nixos-exporter" -version = "0.2.0" +version = "0.3.0" dependencies = [ "axum", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index 698feba..9dd0125 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nixos-exporter" -version = "0.2.0" +version = "0.3.0" edition = "2021" [dependencies] diff --git a/flake.nix b/flake.nix index 5d9f172..6dd91c1 100644 --- a/flake.nix +++ b/flake.nix @@ -10,7 +10,7 @@ in { nixos-exporter = pkgs.rustPlatform.buildRustPackage rec { pname = "nixos-exporter"; - version = "0.1.0"; + version = "0.3.0"; src = ./.; diff --git a/src/main.rs b/src/main.rs index d783420..6d675e3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -59,12 +59,12 @@ impl AppState{ } fn parse_nix_store_path(path: std::path::PathBuf) -> Result<(String, String), String> { - let (hash, name) = path.file_name() - .ok_or_else(String::default)? + let (hash, name) = path.iter().nth(3) + .ok_or_else(|| String::from("Can't read store path name"))? .to_str() - .ok_or_else(String::default)? + .ok_or_else(|| String::from("Failed converting store path name to string"))? .split_once("-") - .ok_or_else(String::default)?; + .ok_or_else(|| String::from("Failed splitting store path name for hash and name"))?; return Ok((hash.to_string(), name.to_string())); } @@ -143,20 +143,33 @@ async fn main() { .unwrap(); } -fn get_current_system() -> Result<(String, String), String> { - let symlink = std::fs::read_link("/run/current-system").map_err(|err| err.to_string())?; +fn parse_symlink(path: String) -> Result<(String, String), String> { + let symlink = std::fs::read_link(path).map_err(|err| err.to_string())?; let (hash, name) = parse_nix_store_path(symlink)?; Ok((String::from(hash), String::from(name))) } -async fn metrics() -> Result<(StatusCode, impl IntoResponse), (StatusCode, impl IntoResponse)> { - let (hash, name) = get_current_system().map_err(|_err| (StatusCode::INTERNAL_SERVER_ERROR, ""))?; +fn gen_prometheus_metric(path: String, infix: String) -> Result { + let (hash, name) = parse_symlink(path).map_err(|err| err)?; + return Ok(format!("nixos_{}_hash{{hash=\"{}\"}} 1\nnixos_{}_name{{name=\"{}\"}} 1\n", infix, hash, infix, name)); +} + +async fn metrics() -> Result<(StatusCode, impl IntoResponse), (StatusCode, impl IntoResponse)> { + let mut out = String::new(); + out.push_str(&gen_prometheus_metric(String::from("/run/current-system"), String::from("current_system")) + .map_err(|err| (StatusCode::INTERNAL_SERVER_ERROR, err))?); + out.push_str(&gen_prometheus_metric(String::from("/run/current-system/kernel"), String::from("current_system_kernel")) + .map_err(|err| (StatusCode::INTERNAL_SERVER_ERROR, err))?); + out.push_str(&gen_prometheus_metric(String::from("/run/booted-system"), String::from("booted_system")) + .map_err(|err| (StatusCode::INTERNAL_SERVER_ERROR, err))?); + out.push_str(&gen_prometheus_metric(String::from("/run/booted-system/kernel"), String::from("booted_system_kernel")) + .map_err(|err| (StatusCode::INTERNAL_SERVER_ERROR, err))?); return Ok(( StatusCode::OK, - format!("nixos_current_system_hash{{hash=\"{}\"}} 1\nnixos_current_system_name{{name=\"{}\"}} 1\n", hash, name) + out, )); }