details: https://code.tryton.org/tryton/commit/ec19bf52203e
branch: default
user: Cédric Krier <[email protected]>
date: Mon Sep 22 14:45:09 2025 +0200
description:
Add logging for Shopify GraphQL queries and webhooks
diffstat:
modules/web_shop_shopify/routes.py | 3 ++-
modules/web_shop_shopify/shopify_retry.py | 20 ++++++++++++++++++--
2 files changed, 20 insertions(+), 3 deletions(-)
diffs (93 lines):
diff -r 9f701f47d677 -r ec19bf52203e modules/web_shop_shopify/routes.py
--- a/modules/web_shop_shopify/routes.py Thu Aug 14 14:31:32 2025 +0200
+++ b/modules/web_shop_shopify/routes.py Mon Sep 22 14:45:09 2025 +0200
@@ -35,6 +35,7 @@
topic = request.headers.get('X-Shopify-Topic')
order = request.get_json()
+ logger.info("Shopify webhook %s for %s", topic, order['id'])
if topic == 'orders/create':
if not Sale.search([
('web_shop', '=', shop.id),
@@ -58,7 +59,7 @@
sale, = sales
Shop.__queue__.update_sale_ids(shop, [sale.id])
else:
- logger.info("Unsupported topic '%s'", topic)
+ logger.warn("Unsupported topic '%s'", topic)
return Response(status=HTTPStatus.NO_CONTENT)
diff -r 9f701f47d677 -r ec19bf52203e modules/web_shop_shopify/shopify_retry.py
--- a/modules/web_shop_shopify/shopify_retry.py Thu Aug 14 14:31:32 2025 +0200
+++ b/modules/web_shop_shopify/shopify_retry.py Mon Sep 22 14:45:09 2025 +0200
@@ -1,6 +1,7 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
import json
+import logging
import time
import urllib
@@ -21,6 +22,9 @@
return self._response['errors']
from trytond.protocols.wrappers import HTTPStatus
+from trytond.tools.logging import format_args
+
+logger = logging.getLogger(__name__)
def patch():
@@ -32,12 +36,15 @@
if e.response.code == HTTPStatus.TOO_MANY_REQUESTS:
retry_after = float(
e.response.headers.get('Retry-After', 2))
+ logger.debug(
+ "Shopify connection retry after %ss", retry_after)
time.sleep(retry_after)
else:
raise
else:
try:
if Limits.credit_maxed():
+ logger.debug("Shopify connection credit maxed")
time.sleep(0.5)
except Exception:
pass
@@ -46,24 +53,33 @@
open_func = ShopifyConnection._open
ShopifyConnection._open = _open
- def graphql_execute(*args, **kwargs):
+ def graphql_execute(self, *args, **kwargs):
+ log_message = "GraphQL execute %s"
+ log_args = (
+ format_args(args, kwargs, logger.isEnabledFor(logging.DEBUG)),)
while True:
try:
- result = graphql_execute_func(*args, **kwargs)
+ result = graphql_execute_func(self, *args, **kwargs)
except urllib.error.HTTPError as e:
if e.code == HTTPStatus.TOO_MANY_REQUESTS:
retry_after = float(e.headers.get('Retry-After', 2))
+ logger.debug("GraphQL retry after %ss", retry_after)
time.sleep(retry_after)
else:
+ logger.exception(log_message, *log_args)
raise GraphQLException(json.load(e.fp))
if isinstance(result, str):
result = json.loads(result)
if result.get('errors'):
for error in result['errors']:
if error.get('extensions', {}).get('code') == 'THROTTLED':
+ logger.debug("GraphQL throttled")
time.sleep(0.5)
continue
+ logger.exception(log_message, *log_args)
raise GraphQLException(result)
+ logger.info(log_message, *log_args)
+ logger.debug("GraphQL Result: %r", result)
return result
if GraphQL.execute != graphql_execute: