improve error tolerance and logs
This commit is contained in:
		
							parent
							
								
									5c2a75c240
								
							
						
					
					
						commit
						d4380260c1
					
				| @ -5,11 +5,16 @@ use elasticsearch::http::transport::SingleNodeConnectionPool; | ||||
| use elasticsearch::IndexParts; | ||||
| use serde_json::Value; | ||||
| use elasticsearch::auth::Credentials; | ||||
| use std::fmt; | ||||
| 
 | ||||
| pub struct ElasticConection { | ||||
|         conection: Elasticsearch | ||||
| } | ||||
| 
 | ||||
| pub struct ElasticConErr { | ||||
|     content: String, | ||||
| } | ||||
| 
 | ||||
| impl ElasticConection { | ||||
|     pub fn new() -> Result<Self, Box<dyn std::error::Error>> { | ||||
|         let url = Url::parse("http://127.0.0.1:9200")?; | ||||
| @ -23,14 +28,40 @@ impl ElasticConection { | ||||
|         }) | ||||
|     } | ||||
| 
 | ||||
|     pub async fn send(&self, data: Value) -> bool { | ||||
|         let response = self.conection | ||||
|     pub async fn send(&self, data: Value) -> Result<(), ElasticConErr> { | ||||
|         let raw_response = self.conection | ||||
|             .index(IndexParts::Index("nutbeat-0.1")) | ||||
|             .body(data) | ||||
|             .send() | ||||
|             .await.unwrap(); | ||||
|         response.status_code().is_success() | ||||
|             .await; | ||||
|         let response = match raw_response { | ||||
|             Ok(r) => r, | ||||
|             Err(e) => return Err(ElasticConErr { content: e.to_string()}), | ||||
|         }; | ||||
|         let status_code = response.status_code(); | ||||
|         match status_code.clone().is_success() { | ||||
|             true => Ok(()), | ||||
|             false => { | ||||
|                 let err_ret = match response.text().await { | ||||
|                     Ok(ret) => ret, | ||||
|                     Err(_e) => status_code.as_str().to_string(), | ||||
|                 }; | ||||
|                 Err(ElasticConErr { content: err_ret }) | ||||
|             }, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl fmt::Display for ElasticConErr { | ||||
|     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||
|         write!(f, "{}", self.content) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl fmt::Debug for ElasticConErr { | ||||
|     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||||
|         write!( | ||||
|             f, "{}", self.content | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										24
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								src/main.rs
									
									
									
									
									
								
							| @ -4,6 +4,7 @@ use nut::nut_client::NutClient; | ||||
| use elastic_conection::ElasticConection; | ||||
| use chrono; | ||||
| use tokio::time::{sleep, Duration}; | ||||
| use std::fmt; | ||||
| 
 | ||||
| #[tokio::main] | ||||
| async fn main() -> Result<(), Box<dyn std::error::Error>> { | ||||
| @ -17,8 +18,29 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> { | ||||
| } | ||||
| 
 | ||||
| async fn start_loop(e_con: ElasticConection, mut n_con: NutClient) { | ||||
|     let mut has_failed = false; | ||||
|     loop { | ||||
|         e_con.send(n_con.get_data(chrono::offset::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Secs, true)).unwrap()).await; | ||||
|         sleep(Duration::from_secs(10)).await; | ||||
|         let payload = match n_con.get_data(chrono::offset::Utc::now().to_rfc3339_opts(chrono::SecondsFormat::Secs, true)) { | ||||
|             Ok(p) => p, | ||||
|             Err(e) => { | ||||
|                     process_error(Box::new(e), "nut connection", &mut has_failed); | ||||
|                     continue; | ||||
|                 }, | ||||
|         }; | ||||
|         match e_con.send(payload).await { | ||||
|             Ok(()) => has_failed = false, | ||||
|             Err(e) => { | ||||
|                     process_error(Box::new(e), "elasticsearch", &mut has_failed); | ||||
|                     continue; | ||||
|                 }, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn process_error(e: Box<dyn fmt::Display>, system: &str, has_failed: &mut bool) { | ||||
|     if !*has_failed { | ||||
|         *has_failed = true; | ||||
|         log::error!("error in {}: {}", system, e); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -3,7 +3,6 @@ use nut_client::ConfigBuilder; | ||||
| use serde_json::{json, Value}; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| use std::collections::HashMap; | ||||
| use crate::nut::nut_data::Data; | ||||
| 
 | ||||
| pub struct NutClient { | ||||
|     conection: Connection, | ||||
| @ -63,21 +62,3 @@ impl NutClient { | ||||
|         ) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn insert(mut header: String, value: String, data: &mut Data) { | ||||
|     for key in header.split(".") { | ||||
| 
 | ||||
|     } | ||||
|     process(header.split_off(header.find(".").unwrap()+1), value, None, data); | ||||
| } | ||||
| 
 | ||||
| fn process(mut header: String, value: String, pre: Option<String>, data: &mut Data) { | ||||
|     match header.find(".") { | ||||
|         Some(p) => { | ||||
|             process(header.split_off(p+1), value, Some(header), data); | ||||
|         }, | ||||
|         None => { | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -18,24 +18,6 @@ pub struct Batery { | ||||
|     voltage: Option<Voltage>, | ||||
| } | ||||
| 
 | ||||
| impl Batery { | ||||
|     pub fn new() -> Self { | ||||
|         Self { | ||||
|             charge: None, | ||||
|             mrf_date: None, | ||||
|             runtime: None, | ||||
|             btype: None, | ||||
|             voltage: None | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /*pub fn add(&self, data: Vec<String>) {
 | ||||
|         match data.remove(0) { | ||||
|             "charge": | ||||
|         } | ||||
|     }*/ | ||||
| } | ||||
| 
 | ||||
| #[derive(Serialize, Deserialize)] | ||||
| pub struct Charge { | ||||
|     value: Option<u8>, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user