1818
1919 kullanılabilir.
2020*/
21+ use std:: env;
2122use std:: thread:: sleep;
2223use std:: time:: Duration ;
2324// Kodun devam edam kısımlarında kullanılan enstrümanların yer aldığı modüller use ile bildirilmelidir.
@@ -33,42 +34,94 @@ use chrono::{DateTime, Utc};
3334*/
3435fn main ( ) {
3536 let mut system = sysinfo:: System :: new_all ( ) ;
37+ let mut cpu_usages = Vec :: new ( ) ;
3638
3739 // Sürekli metrik çekeceğimiz için bir sonsuz döngü işimizi görebilir
40+ //TODO@buraksenyurt loop gibi sonsuz döngü yerine komut satırı argümanları ile çalıştıralım
41+ /*
42+ cargo run -- 100 2 cpu json
43+ (2 saniyede bir CPU kullanımlarından toplam 100 tane log çek ve json formatında yaz)
44+ cargo run -- 100 2 mem
45+ (2 saniyede bir Memory kullanımlarından toplam 100 tane log çek
46+ ve standart formatta csv olarak yaz)
47+
48+ cargo run -- -c 100 -p 2 -s mem -f json
49+
50+ teknik ? Tüm vector içeriğin program kapanırken topluca dosya yazmak bir seçenek
51+ veya hiç vector kullanmadan stdout üzerinde log ürettikçe dosyaya append et
52+ */
3853 loop {
3954 system. refresh_all ( ) ; // Tüm metrikleri güncelle
4055
4156 println ! (
4257 "Free memory size {} Gb" ,
4358 system. free_memory( ) / ( 1024 * 1024 )
4459 ) ;
60+ /*
61+ Plan :
62+
63+ CPU kullanım değeri %50 ile %75 arasında olanlar için log seviye HEAT
64+ CPU kullanım değeri %70 ile %90 arasında olanlar için log seviye BURN
65+ CPU kullanım değeri %90 üstü olanlar için log seviye ALARM
66+ diğer CPU kullanım değerleri için log seviye NORMAL
67+
68+ Bu planı uygulamak için pattern matchin'i aşağıdaki gibi kullandık
69+
70+ */
4571 for ( idx, cpu) in system. cpus ( ) . iter ( ) . enumerate ( ) {
46- print ! ( " {} {:2.2}%" , idx, cpu. cpu_usage( ) ) ;
72+ // print!(" {} {:2.2}%", idx, cpu.cpu_usage());
73+ let description = format ! ( "{} ({:2.2}%)" , idx, cpu. cpu_usage( ) ) ;
74+ let level = match cpu. cpu_usage ( ) {
75+ 0.0 ..50.0 => Level :: NORMAL ,
76+ 50.0 ..75.0 => Level :: HEAT ,
77+ 75.0 ..90.0 => Level :: BURN ,
78+ 90.0 ..100.0 => Level :: ALARM ,
79+ _ => Level :: UNKNOWN ,
80+ } ;
81+
82+ /*
83+ Sınavda bu konudan soru gelir...
84+
85+ Neden clone kullandık?
86+ clone kullanmadığımızda nasıl bir hata mesajı oluştu?
87+ Value used after being moved [E0382] Hatasının sebebi nedir?
88+ */
89+ let cpu_log = SystemLog :: new ( idx as u32 , Some ( Utc :: now ( ) ) , level, description. clone ( ) ) ;
90+ print ! ( "{}" , description) ;
91+
92+ cpu_usages. push ( cpu_log) ;
4793 }
4894 println ! ( ) ;
49-
5095 sleep ( Duration :: from_secs ( 2 ) ) ; // Şu anki main thread 1 saniye duraksatılır
5196 }
97+ //TODO@buraksenyurt Sonsuz döngüden çıkardıktan sonra sonuçları bir dosyaya yazdıralım (CSV veya JSON)
5298}
5399
54100#[ derive( Debug ) ]
55- pub struct SystemLog {
56- pub id : u32 ,
101+ pub enum Level {
102+ NORMAL ,
103+ HEAT ,
104+ BURN ,
105+ ALARM ,
106+ UNKNOWN ,
107+ }
108+ #[ derive( Debug ) ]
109+ struct SystemLog {
110+ id : u32 ,
57111 // Senaryomuza göre time_stamp bilgisinin olup olmadığı belli değil
58112 // bu nedenle Option şeklinde ele alınabilir (Yani Some(value) veya None olarak kullanılır)
59113 // None memory de nasıl tutulur?
60- pub time_stamp : Option < DateTime < Utc > > ,
61- pub level : String ,
62- pub description : String ,
114+ time_stamp : Option < DateTime < Utc > > ,
115+ level : Level ,
116+ description : String ,
63117}
64118
65119impl SystemLog {
66- pub fn new ( id : u32 , time_stamp : Option < DateTime < Utc > > , level : String , desc : String ) -> Self {
120+ pub fn new ( id : u32 , time_stamp : Option < DateTime < Utc > > , level : Level , desc : String ) -> Self {
67121 SystemLog {
68122 id,
69123 level,
70124 time_stamp,
71- // time_stamp: Utc::now(),
72125 description : desc,
73126 }
74127 }
0 commit comments