1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
// // Copyright (C) 2018 Kubos Corporation // // Licensed under the Apache License, Version 2.0 (the "License") // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Contributed by: William Greer ([email protected]) and Sam Justice ([email protected]) // use crate::errors::*; use std::sync::{Arc, Mutex}; /// Generic telemetry collected by the communication service. #[derive(Default, GraphQLObject)] pub struct CommsTelemetry { /// Errors that have occured within the communication service. pub errors: Vec<String>, /// Number of bad uplink packets. pub failed_packets_up: i32, /// Number of bad downlink packets. pub failed_packets_down: i32, /// Number of packets successfully uplinked. pub packets_up: i32, /// Number of packets successfully downlinked. pub packets_down: i32, } /// Enum used to differentiate types of telemetry collected by the communication service. pub enum TelemType { /// Packets down Down, /// Packets down that failed DownFailed, /// Packets up Up, /// Packets up that failed UpFailed, } // Function used to obtain a mutex lock and update communication service errors. pub fn log_error(data: &Arc<Mutex<CommsTelemetry>>, error: String) -> CommsResult<()> { match data.lock() { Ok(mut telem) => { telem.errors.push(error); Ok(()) } Err(_) => Err(CommsServiceError::MutexPoisoned.into()), } } // Function used to obtain a mutex lock and update communcation service telemetry. pub fn log_telemetry(data: &Arc<Mutex<CommsTelemetry>>, telem_type: &TelemType) -> CommsResult<()> { match data.lock() { Ok(mut telem) => { match telem_type { TelemType::Down => telem.packets_down += 1, TelemType::DownFailed => telem.failed_packets_down += 1, TelemType::Up => telem.packets_up += 1, TelemType::UpFailed => telem.failed_packets_up += 1, }; Ok(()) } Err(_) => Err(CommsServiceError::MutexPoisoned.into()), } }