The before code logs requests without any shared identifier, making it hard to trace. The after code assigns a unique correlation ID at the entry point and passes it explicitly to downstream services, which log it to enable tracing.
### Before: No correlation ID propagation
import logging
def service_a(request):
logging.info(f"Processing request {request}")
# calls service_b without passing any ID
service_b()
def service_b():
logging.info("Processing in service B")
### After: Correlation ID propagation
import logging
import uuid
class RequestContext:
correlation_id = None
def service_a(request):
# Assign correlation ID if missing
if not hasattr(request, 'correlation_id'):
request.correlation_id = str(uuid.uuid4())
logging.info(f"Processing request {request} with correlation_id={request.correlation_id}")
service_b(request.correlation_id)
def service_b(correlation_id):
logging.info(f"Processing in service B with correlation_id={correlation_id}")