Skip to content

Commit 3e43095

Browse files
committed
fix logging with correlation_id, fix flaky test
1 parent 5cdfde8 commit 3e43095

File tree

9 files changed

+45
-79
lines changed

9 files changed

+45
-79
lines changed

src/api/main.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from config.container import TopLevelContainer
99
from seedwork.domain.exceptions import DomainException, EntityNotFoundException
1010
from seedwork.infrastructure.logging import LoggerFactory, logger
11-
from seedwork.infrastructure.request_context import request_context
1211

1312
# configure logger prior to first usage
1413
LoggerFactory.configure(logger_name="api")

src/api/routers/catalog.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from modules.catalog.application.query.get_listing_details import GetListingDetails
1616
from seedwork.application import Application
1717
from seedwork.domain.value_objects import Money
18-
from seedwork.infrastructure.request_context import request_context
1918

2019
"""
2120
Inspired by https://developer.ebay.com/api-docs/sell/inventory/resources/offer/methods/createOffer

src/cli/__main__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
)
5656
)
5757

58-
# use transaction context to acccess any dependency (i.e a repository, a service, etc.)
58+
# use transaction context to access any dependency (i.e a repository, a service, etc.)
5959
with app.transaction_context() as ctx:
6060
listing_repository = ctx.get_service(ListingRepository)
6161
listing_count = listing_repository.count()

src/config/container.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,23 +104,25 @@ def on_enter_transaction_context(ctx):
104104
engine = ctx.app.dependency_provider["db_engine"]
105105
session = Session(engine)
106106
correlation_id = uuid.uuid4()
107+
logger.correlation_id.set(uuid.uuid4())
107108
transaction_container = TransactionContainer(
108109
db_session=session, correlation_id=correlation_id, logger=logger
109110
)
110111
ctx.dependency_provider = IocProvider(transaction_container)
111-
logger.info(f"{id(session)} transaction started")
112+
logger.debug(f"transaction started")
112113

113114
@application.on_exit_transaction_context
114115
def on_exit_transaction_context(ctx, exc_type, exc_val, exc_tb):
115116
session = ctx.dependency_provider.get_dependency("db_session")
116117
if exc_type:
117118
session.rollback()
118-
logger.info(f"{id(session)} rollback due to {exc_type}")
119+
logger.debug(f"rollback due to {exc_type}")
119120
else:
120121
session.commit()
121-
logger.info(f"{id(session)} committed")
122+
logger.debug(f"committed")
122123
session.close()
123-
logger.info(f"{id(session)} transaction ended ")
124+
logger.debug(f"transaction ended ")
125+
logger.correlation_id.set(uuid.UUID(int=0))
124126

125127
@application.transaction_middleware
126128
def logging_middleware(ctx, next, command=None, query=None, event=None):

src/modules/bidding/tests/application/test_create_listing_when_draft_is_published.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ def test_create_listing_on_draft_published_event(app, engine):
2020
)
2121

2222
with app.transaction_context() as ctx:
23-
listing_repository = ctx.get_service(BiddingListingRepository)
23+
listing_repository = ctx[BiddingListingRepository]
2424
assert listing_repository.count() == 1

src/seedwork/application/__init__.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
import importlib
22
import inspect
3-
import uuid
43
from collections import defaultdict
54
from functools import partial
6-
from typing import Dict, Type
7-
8-
from sqlalchemy.orm import Session
5+
from typing import Any
96

107
from seedwork.application.command_handlers import CommandResult
118
from seedwork.application.commands import Command
@@ -16,8 +13,7 @@
1613
from seedwork.application.queries import Query
1714
from seedwork.application.query_handlers import QueryResult
1815
from seedwork.domain.events import DomainEvent
19-
from seedwork.infrastructure.logging import logger
20-
from seedwork.infrastructure.request_context import request_context
16+
from seedwork.utils.data_structures import OrderedSet
2117

2218

2319
def get_function_arguments(func):
@@ -187,9 +183,13 @@ def handle_domain_event(self, event) -> EventResultSet:
187183
def collect_integration_event(self, event):
188184
self.integration_events.append(event)
189185

190-
def get_service(self, service_cls):
186+
def get_service(self, service_cls) -> Any:
187+
"""Get a dependency from the dependency provider"""
191188
return self.dependency_provider.get_dependency(service_cls)
192189

190+
def __getitem__(self, item) -> Any:
191+
return self.get_service(item)
192+
193193
@property
194194
def current_user(self):
195195
return self.dependency_provider.get_dependency("current_user")
@@ -201,7 +201,7 @@ def __init__(self, name, version=1.0):
201201
self.version = version
202202
self.command_handlers = {}
203203
self.query_handlers = {}
204-
self.event_handlers = defaultdict(set)
204+
self.event_handlers = defaultdict(OrderedSet)
205205

206206
def query_handler(self, handler_func):
207207
"""Query handler decorator"""

src/seedwork/infrastructure/logging.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
import logging
2+
import uuid
3+
from contextvars import ContextVar
24
from datetime import datetime
35
from logging.config import dictConfig
46

57
from pythonjsonlogger import jsonlogger
68

7-
from seedwork.infrastructure.request_context import request_context
89
from seedwork.utils.functional import SimpleLazyObject
910

11+
correlation_id: ContextVar[uuid.UUID] = ContextVar(
12+
"correlation_id", default=uuid.UUID("00000000-0000-0000-0000-000000000000")
13+
)
14+
1015

1116
class RequestContextFilter(logging.Filter):
1217
""" "Provides correlation id parameter for the logger"""
1318

14-
def __init__(self, name: str, request_context) -> None:
19+
def __init__(self, name: str, correlation_id) -> None:
1520
super().__init__(name=name)
16-
self.request_context = request_context
21+
self.correlation_id = correlation_id
1722

1823
def filter(self, record):
19-
record.correlation_id = self.request_context.correlation_id.get()
24+
record.correlation_id = self.correlation_id.get()
2025
return True
2126

2227

@@ -40,11 +45,11 @@ def configure(
4045
cls,
4146
logger_name="app",
4247
log_filename="./logs.json",
43-
request_context=request_context,
48+
correlation_id=correlation_id,
4449
):
4550
cls.logger_name = logger_name
4651
cls.log_filename = log_filename
47-
cls.request_context = request_context
52+
cls.correlation_id = correlation_id
4853
cls._configured = True
4954

5055
@classmethod
@@ -131,9 +136,10 @@ def create_logger(cls):
131136

132137
dictConfig(logging_config)
133138
logger = logging.getLogger(name=cls.logger_name)
139+
logger.correlation_id = cls.correlation_id
134140
logger.addFilter(
135141
RequestContextFilter(
136-
name=cls.logger_name, request_context=cls.request_context
142+
name=cls.logger_name, correlation_id=cls.correlation_id
137143
)
138144
)
139145
return logger

src/seedwork/infrastructure/request_context.py

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from collections import OrderedDict
2+
3+
4+
class OrderedSet(OrderedDict):
5+
def __init__(self, iterable=None):
6+
super().__init__()
7+
if iterable:
8+
for item in iterable:
9+
self.add(item)
10+
11+
def add(self, item):
12+
self[item] = None
13+
14+
def update(self, iterable):
15+
for item in iterable:
16+
self.add(item)

0 commit comments

Comments
 (0)