diff --git a/services/tunnelbroker/src/constants.rs b/services/tunnelbroker/src/constants.rs --- a/services/tunnelbroker/src/constants.rs +++ b/services/tunnelbroker/src/constants.rs @@ -62,3 +62,17 @@ pub const DEVICE_TOKEN_INDEX_NAME: &str = "deviceToken-index"; } } + +// Log Error Types + +pub mod error_types { + pub const AMQP_ERROR: &str = "AMQP Error"; + pub const DDB_ERROR: &str = "DDB Error"; + pub const FCM_ERROR: &str = "FCM Error"; + pub const APNS_ERROR: &str = "APNs Error"; + pub const WEB_PUSH_ERROR: &str = "Web Push Error"; + pub const WNS_ERROR: &str = "WNS Error"; + pub const IDENTITY_ERROR: &str = "Identity Error"; + pub const WEBSOCKET_ERROR: &str = "Websocket Error"; + pub const SERVER_ERROR: &str = "Server Error"; +} diff --git a/services/tunnelbroker/src/database/message.rs b/services/tunnelbroker/src/database/message.rs --- a/services/tunnelbroker/src/database/message.rs +++ b/services/tunnelbroker/src/database/message.rs @@ -4,6 +4,7 @@ use crate::constants::dynamodb::undelivered_messages::{ DEVICE_ID, MESSAGE_ID, PAYLOAD, }; +use crate::constants::error_types; #[derive(Debug, derive_more::Display, derive_more::Error)] pub enum MessageErrors { @@ -12,7 +13,11 @@ impl From for MessageErrors { fn from(err: DBItemError) -> Self { - tracing::error!("Failed to extract MessageToDevice attribute: {:?}", err); + tracing::error!( + errorType = error_types::DDB_ERROR, + "Failed to extract MessageToDevice attribute: {:?}", + err + ); MessageErrors::SerializationError } } diff --git a/services/tunnelbroker/src/database/mod.rs b/services/tunnelbroker/src/database/mod.rs --- a/services/tunnelbroker/src/database/mod.rs +++ b/services/tunnelbroker/src/database/mod.rs @@ -14,6 +14,7 @@ use tracing::{debug, error, warn}; use crate::constants::dynamodb::{device_tokens, undelivered_messages}; +use crate::constants::error_types; pub mod message; pub mod message_id; @@ -34,7 +35,10 @@ tonic::Status::unavailable("please retry") } e => { - error!("Encountered an unexpected error: {}", e); + error!( + errorType = error_types::DDB_ERROR, + "Encountered an unexpected error: {}", e + ); tonic::Status::failed_precondition("unexpected error") } } @@ -153,7 +157,10 @@ .send() .await .map_err(|e| { - error!("DynamoDB client failed to remove device token: {:?}", e); + error!( + errorType = error_types::DDB_ERROR, + "DynamoDB client failed to remove device token: {:?}", e + ); Error::AwsSdk(e.into()) })?; @@ -175,7 +182,10 @@ .send() .await .map_err(|e| { - error!("DynamoDB client failed to get device token"); + error!( + errorType = error_types::DDB_ERROR, + "DynamoDB client failed to get device token" + ); Error::AwsSdk(e.into()) })?; @@ -231,8 +241,8 @@ .await .map_err(|e| { error!( - "DynamoDB client failed to find existing device token {:?}", - e + errorType = error_types::DDB_ERROR, + "DynamoDB client failed to find existing device token {:?}", e ); Error::AwsSdk(e.into()) })?; @@ -278,7 +288,10 @@ } put_item_input.send().await.map_err(|e| { - error!("DynamoDB client failed to set device token {:?}", e); + error!( + errorType = error_types::DDB_ERROR, + "DynamoDB client failed to set device token {:?}", e + ); Error::AwsSdk(e.into()) })?; @@ -306,8 +319,8 @@ .await .map_err(|e| { error!( - "DynamoDB client failed to mark device token as invalid {:?}", - e + errorType = error_types::DDB_ERROR, + "DynamoDB client failed to mark device token as invalid {:?}", e ); Error::AwsSdk(e.into()) })?; diff --git a/services/tunnelbroker/src/main.rs b/services/tunnelbroker/src/main.rs --- a/services/tunnelbroker/src/main.rs +++ b/services/tunnelbroker/src/main.rs @@ -15,7 +15,7 @@ use crate::notifs::NotifClient; use anyhow::{anyhow, Result}; use config::CONFIG; -use constants::COMM_SERVICES_USE_JSON_LOGS; +use constants::{error_types, COMM_SERVICES_USE_JSON_LOGS}; use std::env; use tracing::{self, error, info, Level}; use tracing_subscriber::EnvFilter; @@ -59,12 +59,18 @@ Some(apns_client) } Err(err) => { - error!("Error creating APNs client: {}", err); + error!( + errorType = error_types::APNS_ERROR, + "Error creating APNs client: {}", err + ); None } }, None => { - error!("APNs config is missing"); + error!( + errorType = error_types::APNS_ERROR, + "APNs config is missing" + ); None } }; @@ -77,12 +83,15 @@ Some(fcm_client) } Err(err) => { - error!("Error creating FCM client: {}", err); + error!( + errorType = error_types::FCM_ERROR, + "Error creating FCM client: {}", err + ); None } }, None => { - error!("FCM config is missing"); + error!(errorType = error_types::FCM_ERROR, "FCM config is missing"); None } }; @@ -95,12 +104,18 @@ Some(web_client) } Err(err) => { - error!("Error creating Web Push client: {}", err); + error!( + errorType = error_types::WEB_PUSH_ERROR, + "Error creating Web Push client: {}", err + ); None } }, None => { - error!("Web Push config is missing"); + error!( + errorType = error_types::WEB_PUSH_ERROR, + "Web Push config is missing" + ); None } }; @@ -113,12 +128,15 @@ Some(wns_client) } Err(err) => { - error!("Error creating WNS client: {}", err); + error!( + errorType = error_types::WNS_ERROR, + "Error creating WNS client: {}", err + ); None } }, None => { - error!("WNS config is missing"); + error!(errorType = error_types::WNS_ERROR, "WNS config is missing"); None } }; @@ -141,7 +159,7 @@ Ok(_) = grpc_server => { Ok(()) }, Ok(_) = websocket_server => { Ok(()) }, else => { - tracing::error!("A grpc or websocket server crashed."); + tracing::error!(errorType = error_types::SERVER_ERROR, "A grpc or websocket server crashed."); Err(anyhow!("A grpc or websocket server crashed.")) } } diff --git a/services/tunnelbroker/src/notifs/wns/mod.rs b/services/tunnelbroker/src/notifs/wns/mod.rs --- a/services/tunnelbroker/src/notifs/wns/mod.rs +++ b/services/tunnelbroker/src/notifs/wns/mod.rs @@ -1,4 +1,4 @@ -use crate::constants::PUSH_SERVICE_REQUEST_TIMEOUT; +use crate::constants::{error_types, PUSH_SERVICE_REQUEST_TIMEOUT}; use crate::notifs::wns::config::WNSConfig; use error::WNSTokenError; use reqwest::StatusCode; @@ -116,7 +116,12 @@ .text() .await .unwrap_or_else(|_| String::from("")); - tracing::error!(status, "Failure when getting the WNS token: {}", body); + tracing::error!( + errorType = error_types::WNS_ERROR, + status, + "Failure when getting the WNS token: {}", + body + ); return Err(error::Error::WNSToken(WNSTokenError::Unknown(status))); } diff --git a/services/tunnelbroker/src/websockets/session.rs b/services/tunnelbroker/src/websockets/session.rs --- a/services/tunnelbroker/src/websockets/session.rs +++ b/services/tunnelbroker/src/websockets/session.rs @@ -1,6 +1,6 @@ use crate::constants::{ - CLIENT_RMQ_MSG_PRIORITY, DDB_RMQ_MSG_PRIORITY, MAX_RMQ_MSG_PRIORITY, - RMQ_CONSUMER_TAG, + error_types, CLIENT_RMQ_MSG_PRIORITY, DDB_RMQ_MSG_PRIORITY, + MAX_RMQ_MSG_PRIORITY, RMQ_CONSUMER_TAG, }; use crate::notifs::fcm::response::FCMErrorResponse; use crate::notifs::wns::response::WNSErrorResponse; @@ -120,7 +120,10 @@ match auth_request { Err(e) => { - error!("Failed to complete request to identity service: {:?}", e); + error!( + errorType = error_types::IDENTITY_ERROR, + "Failed to complete request to identity service: {:?}", e + ); return Err(SessionError::InternalError); } Ok(false) => { @@ -170,7 +173,10 @@ .retrieve_messages(&device_info.device_id) .await .unwrap_or_else(|e| { - error!("Error while retrieving messages: {}", e); + error!( + errorType = error_types::DDB_ERROR, + "Error while retrieving messages: {}", e + ); Vec::new() }); @@ -360,7 +366,10 @@ .delete_message(&self.device_info.device_id, &message_id) .await { - error!("Failed to delete message: {}:", e); + error!( + errorType = error_types::DDB_ERROR, + "Failed to delete message: {}:", e + ); } } @@ -462,8 +471,8 @@ .await { error!( - "Error invalidating device token {}: {:?}", - device_token, e + errorType = error_types::DDB_ERROR, + "Error invalidating device token {}: {:?}", device_token, e ); }; } @@ -532,8 +541,8 @@ .await { error!( - "Error invalidating device token {}: {:?}", - device_token, e + errorType = error_types::DDB_ERROR, + "Error invalidating device token {}: {:?}", device_token, e ); }; } @@ -595,8 +604,8 @@ .await { error!( - "Error invalidating device token {}: {:?}", - device_token, e + errorType = error_types::DDB_ERROR, + "Error invalidating device token {}: {:?}", device_token, e ); }; } @@ -649,8 +658,8 @@ .await { error!( - "Error invalidating device token {}: {:?}", - device_token, e + errorType = error_types::DDB_ERROR, + "Error invalidating device token {}: {:?}", device_token, e ); }; } @@ -674,7 +683,10 @@ pub async fn send_message_to_device(&mut self, message: Message) { if let Err(e) = self.tx.send(message).await { - error!("Failed to send message to device: {}", e); + error!( + errorType = error_types::AMQP_ERROR, + "Failed to send message to device: {}", e + ); } } @@ -692,7 +704,10 @@ ) .await { - error!("Failed to cancel consumer: {}", e); + error!( + errorType = error_types::AMQP_ERROR, + "Failed to cancel consumer: {}", e + ); } if let Err(e) = self @@ -703,7 +718,10 @@ ) .await { - error!("Failed to delete queue: {}", e); + error!( + errorType = error_types::AMQP_ERROR, + "Failed to delete queue: {}", e + ); } }