-
Notifications
You must be signed in to change notification settings - Fork 79
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Whatsapp failed msg logging #1607
Changes from 3 commits
9e2d5fa
cc58de0
dc867ca
7974cc5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -238,7 +238,21 @@ async def send_custom_json( | |
from kairon.chat.converters.channels.response_factory import ConverterFactory | ||
converter_instance = ConverterFactory.getConcreteInstance(messagetype, ChannelTypes.WHATSAPP.value) | ||
response = await converter_instance.messageConverter(message) | ||
self.whatsapp_client.send(response, recipient_id, messaging_type) | ||
resp = self.whatsapp_client.send(response, recipient_id, messaging_type) | ||
|
||
if resp.get("error"): | ||
bot = kwargs.get("assistant_id") | ||
if not bot: | ||
logger.error("Missing assistant_id in kwargs for failed message logging") | ||
return | ||
logger.error(f"WhatsApp message failed: {resp.get('error')}") | ||
try: | ||
ChatDataProcessor.save_whatsapp_failed_messages( | ||
resp, bot, recipient_id, ChannelTypes.WHATSAPP.value, | ||
json_message=json_message | ||
) | ||
except Exception as e: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Enhance error handling and logging security The error handling implementation could be improved in several ways:
- if resp.get("error"):
- bot = kwargs.get("assistant_id")
- if not bot:
- logger.error("Missing assistant_id in kwargs for failed message logging")
- return
- logger.error(f"WhatsApp message failed: {resp.get('error')}")
- try:
- ChatDataProcessor.save_whatsapp_failed_messages(
- resp, bot, recipient_id, ChannelTypes.WHATSAPP.value,
- json_message=json_message
- )
- except Exception as e:
- logger.error(f"Failed to log WhatsApp error: {str(e)}")
+ if resp.get("error"):
+ bot = kwargs.get("assistant_id")
+ if not bot:
+ logger.error("Missing assistant_id in kwargs for failed message logging",
+ extra={"correlation_id": Utility.generate_correlation_id()})
+ return
+
+ error_context = {
+ "correlation_id": Utility.generate_correlation_id(),
+ "error_code": resp.get("error", {}).get("code"),
+ "error_type": resp.get("error", {}).get("type"),
+ "recipient_id": Utility.mask_sensitive_data(recipient_id)
+ }
+ logger.error("WhatsApp message failed", extra=error_context)
+
+ try:
+ for attempt in range(3): # Retry up to 3 times
+ try:
+ ChatDataProcessor.save_whatsapp_failed_messages(
+ resp, bot, recipient_id, ChannelTypes.WHATSAPP.value,
+ json_message=json_message
+ )
+ break
+ except Exception as e:
+ if attempt == 2: # Last attempt
+ logger.error(f"Failed to log WhatsApp error after 3 attempts",
+ extra={"correlation_id": error_context["correlation_id"],
+ "error": str(e)})
+ else:
+ time.sleep(1 * (attempt + 1)) # Exponential backoff
+ except Exception as e:
+ logger.error("Failed to log WhatsApp error",
+ extra={"correlation_id": error_context["correlation_id"],
+ "error": str(e)})
|
||
logger.error(f"Failed to log WhatsApp error: {str(e)}") | ||
else: | ||
self.send(recipient_id, {"preview_url": True, "body": str(json_message)}) | ||
|
||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -167,6 +167,38 @@ def save_whatsapp_audit_log(status_data: Dict, bot: Text, user: Text, recipient: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
campaign_id=campaign_id | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
).save() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@staticmethod | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def save_whatsapp_failed_messages(resp: Dict, bot: Text, recipient: Text, channel_type: Text, **kwargs): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logs failed WhatsApp message responses for debugging and tracking purposes. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Args: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resp (Dict): The response dictionary containing error details. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bot (Text): The bot identifier. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
recipient (Text): The recipient identifier. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
channel_type (Text): The type of channel (e.g., WhatsApp). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Returns: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
None | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
""" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
error = resp.get("error", {}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
message_id = f"failed-{channel_type}-{recipient}-{bot}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
user = "unknown_user" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
failure_reason = error.get("error_data", {}).get("details") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logger.debug(f"WhatsApp message failed to send: {error}") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ChannelLogs( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type=channel_type, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
status="failed", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
data=resp, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
failure_reason=failure_reason, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
message_id=message_id, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
user=user, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bot=bot, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
recipient=recipient, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
json_message=kwargs.get('json_message') | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
).save() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Several improvements needed in the implementation The implementation has several areas that could be improved for better reliability and maintainability:
Consider applying these improvements: - error = resp.get("error", {})
- message_id = f"failed-{channel_type}-{recipient}-{bot}"
- user = "unknown_user"
- failure_reason = error.get("error_data", {}).get("details")
- logger.debug(f"WhatsApp message failed to send: {error}")
+ error = resp.get("error", {})
+ timestamp = datetime.utcnow().strftime("%Y%m%d%H%M%S")
+ message_id = f"failed-{channel_type}-{recipient}-{bot}-{timestamp}"
+ user = kwargs.get('user', 'system')
+
+ error_data = error.get("error_data", {})
+ failure_reason = error_data.get("details")
+ if failure_reason:
+ failure_reason = str(failure_reason)[:500] # Limit length for storage
+
+ logger.debug(f"WhatsApp message failed to send: {error}")
+
+ try:
+ if not all([bot, recipient, channel_type]):
+ raise ValueError("Missing required fields: bot, recipient, or channel_type")
- ChannelLogs(
+ log_entry = ChannelLogs(
type=channel_type,
status="failed",
data=resp,
@@ -199,3 +208,8 @@
recipient=recipient,
json_message=kwargs.get('json_message')
- ).save()
+ )
+ log_entry.save()
+ except Exception as e:
+ logger.error(f"Failed to save WhatsApp error log: {str(e)}")
+ raise 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@staticmethod | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
def get_instagram_static_comment(bot: str) -> str: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
channel = ChatDataProcessor.get_channel_config(bot=bot, connector_type="instagram", mask_characters=False) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Add type hints and response validation
The response handling could be improved with proper type hints and validation:
📝 Committable suggestion