2022/02/24
[Rust][libc]statvfsを呼び出してdiskの使用量などを計測する
概要
mountされているdiskの容量が圧迫してきたらアラートを出すようにしたく、以前はstack driverなどを使って使用量が特定のバイト数を超えたらアラートを出すみたいな設定を行なっていましたが
stack driverだと痒いところに手が届かない感じがあり(例えば、diskを拡張したら、アラートの閾値を逐一修正しなくてはいけなかったり等)
せっかくなので、rustのアプリケーションでモニタリングしてアラートを飛ばすようにしました。
その際に Rustから statvfs
というシステムコールを呼び出して、結果をもとに解析を行いアラートを飛ばすようにしました。
以下は、statvfs
をRustから呼ぶ部分を備忘録として記載しておきます。
実装
[dependencies]
libc = "0.2"
use std::{ffi, mem, os::unix::ffi::OsStrExt, path};
fn main() {
let mount_point = path::PathBuf::from("/bitcoin/.bitcoin");
let c_mount_point = ffi::CString::new(mount_point.as_os_str().as_bytes()).unwrap();
let mut statvfs = mem::MaybeUninit::<libc::statvfs>::uninit();
unsafe {
let code = libc::statvfs(c_mount_point.as_ptr(), statvfs.as_mut_ptr());
assert!(code == 0);
let statvfs = statvfs.assume_init();
println!("f_bsize: {}", statvfs.f_bsize);
println!("f_frsize: {}", statvfs.f_frsize);
println!("f_blocks: {}", statvfs.f_blocks);
println!("f_bfree: {}", statvfs.f_bfree);
println!("f_bavail: {}", statvfs.f_bavail);
println!("f_files: {}", statvfs.f_files);
println!("f_ffree: {}", statvfs.f_ffree);
println!("f_favail: {}", statvfs.f_favail);
println!("f_fsid: {}", statvfs.f_fsid);
println!("f_flag: {}", statvfs.f_flag);
println!("f_namemax: {}", statvfs.f_namemax);
}
}
結果の戻り値のf_bavail
やf_blocks
などから空き容量などを計算して、利用しました。
参考
以上です。
関連する記事
Concordiumノードをローカルで動かしてみた
Concordiumの調査のために、ローカルでソースコードをビルドしてノードを動かしてみました
[Rust]axumとdragonflyを使ったWebsocket Chatのサンプル実装
redis互換のdragonflyをPUBSUBとして利用して、Websocket Chatアプリのサンプル実装を行いました。
[Rust]TiDBを使ったサンプルアプリケーションの実装
RustからTiDBを使ったアプリケーションの実装を行いました。
[Rust]Google Cloud Storageを利用する
GCSやNFSのファイルを扱えるpackageをRustで実装しました。