Skip to content

Commit ce98bcd

Browse files
committed
fix: Improve logging messages
1 parent 1772b10 commit ce98bcd

File tree

13 files changed

+103
-129
lines changed

13 files changed

+103
-129
lines changed

commerce_coordinator/apps/commercetools/clients.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,8 @@ def create_return_for_order(self, order_id: str, order_version: int, order_line_
433433
)
434434
return returned_order
435435
except CommercetoolsError as err:
436-
handle_commercetools_error(err, f"Unable to create return for order {order_id}")
436+
handle_commercetools_error("[CommercetoolsAPIClient.create_return_for_order]",
437+
err, f"Unable to create return for order {order_id}")
437438
raise err
438439

439440
def update_return_payment_state_after_successful_refund(
@@ -498,7 +499,8 @@ def update_return_payment_state_after_successful_refund(
498499
logger.info("Updated transaction with return item id")
499500
return updated_order
500501
except CommercetoolsError as err:
501-
handle_commercetools_error(err, f"Unable to update ReturnPaymentState of order {order_id}")
502+
handle_commercetools_error("[CommercetoolsAPIClient.update_return_payment_state_after_successful_refund]",
503+
err, f"Unable to update ReturnPaymentState of order {order_id}")
502504
raise OpenEdxFilterException(str(err)) from err
503505

504506
def _preprocess_refund_object(self, refund: Refund, psp: str) -> Refund:
@@ -560,7 +562,7 @@ def create_return_payment_transaction(
560562
f"Unable to create refund payment transaction for payment {payment_id}, refund {refund['id']} "
561563
f"with PSP: {psp}"
562564
)
563-
handle_commercetools_error(err, context)
565+
handle_commercetools_error("[CommercetoolsAPIClient.create_return_payment_transaction]", err, context)
564566
raise err
565567

566568
def update_line_item_transition_state_on_fulfillment(
@@ -611,13 +613,15 @@ def update_line_item_transition_state_on_fulfillment(
611613
return updated_fulfillment_line_item_order
612614
else:
613615
logger.info(
614-
f"The line item {line_item_id} already has the correct state {new_state_key}. "
615-
"Not attempting to transition LineItemState"
616+
f"[CommercetoolsAPIClient] - The line item {line_item_id} "
617+
f"already has the correct state {new_state_key}. "
618+
f"Not attempting to transition LineItemState for order id {order_id}"
616619
)
617620
return self.get_order_by_id(order_id)
618621
except CommercetoolsError as err:
622+
context_prefix = "[CommercetoolsAPIClient.update_line_item_state_on_fulfillment_completion]"
619623
# Logs & ignores version conflict errors due to duplicate Commercetools messages
620-
handle_commercetools_error(err, f"Unable to update LineItemState of order {order_id}", True)
624+
handle_commercetools_error(context_prefix, err, f"Unable to update LineItemState of order {order_id}")
621625
return None
622626

623627
def update_line_items_transition_state(
@@ -676,6 +680,7 @@ def update_line_items_transition_state(
676680
except CommercetoolsError as err:
677681
# Logs & ignores version conflict errors due to duplicate Commercetools messages
678682
handle_commercetools_error(
683+
"[CommercetoolsAPIClient.update_line_items_transition_state]",
679684
err,
680685
f"Failed to update LineItemStates for order ID '{order_id}'. "
681686
f"Line Item IDs: {', '.join(item.id for item in line_items)}",
@@ -770,6 +775,7 @@ def is_first_time_discount_eligible(self, email: str, code: str) -> bool:
770775
return True
771776
except CommercetoolsError as err: # pragma no cover
772777
# Logs & ignores version conflict errors due to duplicate Commercetools messages
773-
handle_commercetools_error(err, f"Unable to check if user {email} is eligible for a "
778+
handle_commercetools_error("[CommercetoolsAPIClient.is_first_time_discount_eligible]",
779+
err, f"Unable to check if user {email} is eligible for a "
774780
f"first time discount", True)
775781
return True

commerce_coordinator/apps/commercetools/sub_messages/tasks.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,11 @@ def fulfill_order_placed_message_signal_task(
7878
return False
7979

8080
if not (customer and order and is_edx_lms_order(order)):
81-
logger.debug(f'[CT-{tag}] order {order_id} is not an edX order, message id: {message_id}')
81+
logger.info(f'[CT-{tag}] order {order_id} is not an edX order, message id: {message_id}')
8282

8383
return True
8484

85-
logger.debug(f'[CT-{tag}] processing edX order {order_id}, message id: {message_id}')
85+
logger.info(f'[CT-{tag}] processing edX order {order_id}, message id: {message_id}')
8686

8787
lms_user_id = get_edx_lms_user_id(customer)
8888

@@ -266,7 +266,7 @@ def _prepare_segment_event_properties(in_order, return_line_item_return_id):
266266
return False
267267

268268
if not (customer and order and is_edx_lms_order(order)): # pragma no cover
269-
logger.debug(f'[CT-{tag}] order {order_id} is not an edX order, message id: {message_id}')
269+
logger.info(f'[CT-{tag}] order {order_id} is not an edX order, message id: {message_id}')
270270
return True
271271

272272
payment_intent_id = get_edx_payment_intent_id(order)
@@ -286,13 +286,13 @@ def _prepare_segment_event_properties(in_order, return_line_item_return_id):
286286
logger.info(f'[CT-{tag}] payment intent {payment_intent_id} already has refunded transaction, '
287287
f'sending Slack notification, message id: {message_id}')
288288
else:
289-
logger.debug(f'[CT-{tag}] payment intent {payment_intent_id} refunded. message id: {message_id}')
289+
logger.info(f'[CT-{tag}] payment intent {payment_intent_id} refunded for message id: {message_id}')
290290
segment_event_properties = _prepare_segment_event_properties(order, return_line_item_return_id)
291291

292292
for line_item in get_edx_items(order):
293293
course_run = get_edx_product_course_run_key(line_item)
294294
# TODO: Remove LMS Enrollment
295-
logger.debug(
295+
logger.info(
296296
f'[CT-{tag}] calling lms to unenroll user {lms_user_name} in {course_run}'
297297
f', message id: {message_id}'
298298
)

commerce_coordinator/apps/commercetools/tasks.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,16 @@ def update_line_item_state_on_fulfillment_completion(
3131
Task for fulfillment completed and order line item state update via Commercetools API.
3232
"""
3333
client = CommercetoolsAPIClient()
34-
try:
35-
updated_order = client.update_line_item_transition_state_on_fulfillment(
36-
order_id,
37-
order_version,
38-
line_item_id,
39-
item_quantity,
40-
from_state_id,
41-
to_state_key
42-
)
43-
return updated_order
44-
except CommercetoolsError as err:
45-
logger.error(f"Unable to update line item [ {line_item_id} ] state on fulfillment "
46-
f"result with error {err.errors} and correlation id {err.correlation_id}")
47-
return None
34+
35+
updated_order = client.update_line_item_transition_state_on_fulfillment(
36+
order_id,
37+
order_version,
38+
line_item_id,
39+
item_quantity,
40+
from_state_id,
41+
to_state_key
42+
)
43+
return updated_order
4844

4945

5046
@shared_task(autoretry_for=(CommercetoolsError,), retry_kwargs={'max_retries': 5, 'countdown': 3})
@@ -58,9 +54,12 @@ def refund_from_stripe_task(
5854
"""
5955
client = CommercetoolsAPIClient()
6056
try:
57+
logger.info(
58+
f"[refund_from_stripe_task] Initiating creation of CT payment's refund transaction object "
59+
f"for payment Intent ID {payment_intent_id}.")
6160
payment = client.get_payment_by_key(payment_intent_id)
6261
if has_full_refund_transaction(payment):
63-
logger.info(f"Stripe charge.refunded event received, but Payment with ID {payment.id} "
62+
logger.info(f"[refund_from_stripe_task] Event 'charge.refunded' received, but Payment with ID {payment.id} "
6463
f"already has a full refund. Skipping task to add refund transaction")
6564
return None
6665
updated_payment = client.create_return_payment_transaction(
@@ -70,8 +69,8 @@ def refund_from_stripe_task(
7069
)
7170
return updated_payment
7271
except CommercetoolsError as err:
73-
logger.error(f"Unable to create refund transaction for payment [ {payment.id} ] "
74-
f"on Stripe refund {stripe_refund['id']} "
72+
logger.error(f"[refund_from_stripe_task] Unable to create CT payment's refund transaction "
73+
f"object for [ {payment.id} ] on Stripe refund {stripe_refund['id']} "
7574
f"with error {err.errors} and correlation id {err.correlation_id}")
7675
return None
7776

@@ -100,7 +99,8 @@ def refund_from_paypal_task(
10099
)
101100
return updated_payment
102101
except CommercetoolsError as err:
103-
logger.error(f"Unable to create refund transaction for payment {payment.key} "
102+
logger.error(f"[refund_from_paypal_task] Unable to create CT payment's refund "
103+
f"transaction object for payment {payment.key} "
104104
f"on PayPal refund {refund.get('id')} "
105105
f"with error {err.errors} and correlation id {err.correlation_id}")
106106
return None

commerce_coordinator/apps/commercetools/tests/test_clients.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -470,8 +470,8 @@ def test_create_return_for_order_exception(self):
470470
exception = cm.exception
471471

472472
expected_message = (
473-
f"[CommercetoolsError] Unable to create return for "
474-
f"order mock_order_id "
473+
f"[CommercetoolsError] [CommercetoolsAPIClient.create_return_for_order] "
474+
f"Unable to create return for order mock_order_id "
475475
f"- Correlation ID: {exception.correlation_id}, Details: {exception.errors}"
476476
)
477477

@@ -604,7 +604,8 @@ def test_create_refund_transaction_exception(self):
604604
exception = cm.exception
605605

606606
expected_message = (
607-
f"[CommercetoolsError] Unable to create refund payment transaction for "
607+
f"[CommercetoolsError] [CommercetoolsAPIClient.create_return_payment_transaction] "
608+
f"Unable to create refund payment transaction for "
608609
f"payment mock_payment_id, refund {mock_stripe_refund.id} with PSP: stripe_edx "
609610
f"- Correlation ID: {exception.correlation_id}, Details: {exception.errors}"
610611
)
@@ -672,7 +673,7 @@ def test_update_line_item_state_exception(self, mock_state_by_id):
672673
status_code=409
673674
)
674675

675-
with patch('commerce_coordinator.apps.commercetools.clients.logging.Logger.info') as log_mock:
676+
with patch('commerce_coordinator.apps.commercetools.clients.logging.Logger.error') as log_mock:
676677
self.client_set.client.update_line_item_transition_state_on_fulfillment(
677678
"mock_order_id",
678679
1,
@@ -683,7 +684,8 @@ def test_update_line_item_state_exception(self, mock_state_by_id):
683684
)
684685

685686
expected_message = (
686-
f"[CommercetoolsError] Unable to update LineItemState "
687+
f"[CommercetoolsError] [CommercetoolsAPIClient.update_line_item_state_on_fulfillment_completion] "
688+
f"Unable to update LineItemState "
687689
f"of order mock_order_id "
688690
f"- Correlation ID: {mock_error_response['correlation_id']}, "
689691
f"Details: {mock_error_response['errors']}"
@@ -763,7 +765,8 @@ def test_update_all_line_items_state_exception(self, mock_state_by_id):
763765
)
764766

765767
expected_message = (
766-
f"[CommercetoolsError] Failed to update LineItemStates "
768+
f"[CommercetoolsError] [CommercetoolsAPIClient.update_line_items_transition_state] "
769+
f"Failed to update LineItemStates "
767770
f"for order ID 'mock_order_id'. Line Item IDs: {mock_order.line_items[0].id} "
768771
f"- Correlation ID: {mock_error_response['correlation_id']}, "
769772
f"Details: {mock_error_response['errors']}"
@@ -795,8 +798,8 @@ def test_order_line_item_in_correct_state(self, mock_order_by_id, mock_state_by_
795798
)
796799

797800
expected_message = (
798-
f"The line item {line_item_id} already has the correct state {mock_line_item_state.key}. "
799-
f"Not attempting to transition LineItemState"
801+
f"[CommercetoolsAPIClient] - The line item {line_item_id} already has the correct state "
802+
f"{mock_line_item_state.key}. Not attempting to transition LineItemState for order id mock_order_id"
800803
)
801804

802805
log_mock.assert_called_with(expected_message)

commerce_coordinator/apps/commercetools/tests/test_tasks.py

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44

55
import logging
6-
from unittest.mock import patch
6+
from unittest.mock import call, patch
77

88
import stripe
99
from commercetools import CommercetoolsError
@@ -62,28 +62,6 @@ def test_correct_arguments_passed(self, mock_client):
6262
*list(EXAMPLE_UPDATE_LINE_ITEM_SIGNAL_PAYLOAD.values())
6363
)
6464

65-
@patch('commerce_coordinator.apps.commercetools.tasks.logger')
66-
def test_exception_handling(self, mock_logger, mock_client):
67-
'''
68-
Check if an error in the client results in a logged error
69-
and None returned.
70-
'''
71-
mock_client().update_line_item_transition_state_on_fulfillment.side_effect = CommercetoolsError(
72-
message="Could not update ReturnPaymentState",
73-
errors="Some error message",
74-
response={},
75-
correlation_id="123456"
76-
)
77-
78-
result = fulfillment_uut(*self.unpack_for_uut(EXAMPLE_UPDATE_LINE_ITEM_SIGNAL_PAYLOAD))
79-
80-
mock_logger.error.assert_called_once_with(
81-
f"Unable to update line item [ {EXAMPLE_UPDATE_LINE_ITEM_SIGNAL_PAYLOAD['line_item_id']} ] "
82-
"state on fulfillment result with error Some error message and correlation id 123456"
83-
)
84-
85-
assert result is None
86-
8765

8866
@patch('commerce_coordinator.apps.commercetools.tasks.CommercetoolsAPIClient')
8967
class ReturnedOrderfromStripeTaskTest(TestCase):
@@ -123,10 +101,10 @@ def test_correct_arguments_passed(self, mock_client):
123101
)
124102

125103
def test_full_refund_already_exists(self, mock_client):
126-
'''
104+
"""
127105
Check if the payment already has a full refund, the task logs the
128-
appropriate message and skips creating a refund transaction.
129-
'''
106+
appropriate messages and skips creating a refund transaction.
107+
"""
130108
mock_payment = gen_payment_with_multiple_transactions(
131109
TransactionType.CHARGE, 4900,
132110
TransactionType.REFUND, 4900
@@ -135,13 +113,22 @@ def test_full_refund_already_exists(self, mock_client):
135113

136114
mock_client.return_value.get_payment_by_key.return_value = mock_payment
137115

116+
payment_intent_id = EXAMPLE_RETURNED_ORDER_STRIPE_SIGNAL_PAYLOAD['payment_intent_id']
117+
138118
with patch('commerce_coordinator.apps.commercetools.tasks.logger') as mock_logger:
139119
result = refund_from_stripe_task(*self.unpack_for_uut(EXAMPLE_RETURNED_ORDER_STRIPE_SIGNAL_PAYLOAD))
140120
self.assertIsNone(result)
141-
mock_logger.info.assert_called_once_with(
142-
f"Stripe charge.refunded event received, but Payment with ID {mock_payment.id} "
143-
f"already has a full refund. Skipping task to add refund transaction"
144-
)
121+
122+
# Check that both info messages were logged in the expected order
123+
mock_logger.info.assert_has_calls([
124+
call(
125+
f"[refund_from_stripe_task] "
126+
f"Initiating creation of CT payment's refund transaction object "
127+
f"for payment Intent ID {payment_intent_id}."),
128+
call(f"[refund_from_stripe_task] Event 'charge.refunded' received, "
129+
f"but Payment with ID {mock_payment.id} "
130+
f"already has a full refund. Skipping task to add refund transaction")
131+
])
145132

146133
@patch('commerce_coordinator.apps.commercetools.tasks.logger')
147134
def test_exception_handling(self, mock_logger, mock_client):
@@ -162,7 +149,8 @@ def test_exception_handling(self, mock_logger, mock_client):
162149
returned_uut(*self.unpack_for_uut(EXAMPLE_RETURNED_ORDER_STRIPE_SIGNAL_PAYLOAD))
163150

164151
mock_logger.error.assert_called_once_with(
165-
f"Unable to create refund transaction for payment [ {mock_payment.id} ] "
152+
f"[refund_from_stripe_task] Unable to create CT payment's refund transaction "
153+
f"object for [ {mock_payment.id} ] "
166154
f"on Stripe refund {EXAMPLE_RETURNED_ORDER_STRIPE_CLIENT_PAYLOAD['stripe_refund']['id']} "
167155
f"with error Some error message and correlation id 123456"
168156
)

commerce_coordinator/apps/commercetools/utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,10 @@ def get_braze_client():
3535
)
3636

3737

38-
def handle_commercetools_error(err: CommercetoolsError, context: str, is_info=False):
38+
def handle_commercetools_error(context_prefix, err: CommercetoolsError, context: str, is_info=False):
3939
"""Handles commercetools errors."""
40-
error_message = f"[CommercetoolsError] {context} - Correlation ID: {err.correlation_id}, Details: {err.errors}"
40+
error_message = (f"[CommercetoolsError] {context_prefix} {context} "
41+
f"- Correlation ID: {err.correlation_id}, Details: {err.errors}")
4142
if is_info:
4243
logger.info(error_message)
4344
else:

commerce_coordinator/apps/commercetools/views.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def post(self, request):
4141
**request.data
4242
}
4343

44-
logger.debug(f'[CT-{tag}] Message received from commercetools with details: {input_data}')
44+
logger.info(f'[CT-{tag}] Message received from commercetools with details: {input_data}')
4545

4646
message_details = OrderLineItemMessageInputSerializer(data=input_data)
4747
message_details.is_valid(raise_exception=True)
@@ -85,7 +85,7 @@ def post(self, request):
8585
**request.data
8686
}
8787

88-
logger.debug(f'[CT-{tag}] Message received from commercetools with details: {input_data}')
88+
logger.info(f'[CT-{tag}] Message received from commercetools with details: {input_data}')
8989

9090
message_details = OrderSanctionedViewMessageInputSerializer(data=input_data)
9191
message_details.is_valid(raise_exception=True)
@@ -127,7 +127,7 @@ def post(self, request):
127127
**request.data
128128
}
129129

130-
logger.debug(f'[CT-{tag}] Message received from commercetools with details: {input_data}')
130+
logger.info(f'[CT-{tag}] Message received from commercetools with details: {input_data}')
131131

132132
message_details = OrderReturnedViewMessageInputSerializer(data=input_data)
133133
message_details.is_valid(raise_exception=True)

0 commit comments

Comments
 (0)