import json import sys import traceback from typing import Any, Dict, List from botocore.client import BaseClient from botocore.exceptions import BotoCoreError from smelog.factory import BoundLogger from send_push_messages.config import Config as config from send_push_messages.utils import retry def sqs_error_handler(exc, retry_number, *args, **kwargs): client = args[0] err = ( f"{retry_number}/{config.RECEIPTS_SQS_RETRY_COUNT} {client.__class__.__name__} " f"call got {exc} with args: {args} and kwargs {kwargs}. " ) client.logger.error(err + f"{traceback.format_exception(*sys.exc_info()) + traceback.format_stack()}") class SQSClient: """SQS for sending push receipts to SQS.""" def __init__(self, provider: BaseClient, logger: BoundLogger): self.provider = provider self.logger = logger @retry( config.RECEIPTS_SQS_RETRY_COUNT, config.RECEIPTS_SQS_RETRY_DELAY, excepted=(BotoCoreError,), exc_handler=sqs_error_handler, ) def send(self, queue: str, messages: List[Dict[str, Any]]): return self.provider.send_message_batch( QueueUrl=queue, Entries=[ {"Id": str(message["id"]), "MessageBody": json.dumps(message, default=str)} for message in messages ], )