mock_sobes
← Observability — distributed tracing, metrics, logs
middle correct_vs_wrong #369
Сервис обрабатывает входящий запрос. Какой подход к логированию правильный?
Вариант 1
@app.post("/orders")
async def create_order(req: OrderRequest):
    print(f"got order from user {req.user_id} amount {req.amount}")
    try:
        payment = await charge(req.user_id, req.amount, req.card_token)
        print(f"payment ok {payment.id}")
        order = await save_order(req, payment.id)
        print("order saved", order.id)
        return {"order_id": order.id}
    except Exception as e:
        print(f"ERROR: {e}")
        return {"error": "something went wrong"}, 500
Вариант 2
import structlog
from opentelemetry import trace

log = structlog.get_logger("orders")

@app.post("/orders")
async def create_order(req: OrderRequest):
    # trace_id уже в contextvars через middleware
    log.info("order received",
             user_id=req.user_id,
             amount=req.amount,
             currency=req.currency)
    try:
        payment = await charge(req.user_id, req.amount, req.card_token)
        log.info("payment charged",
                 payment_id=payment.id,
                 user_id=req.user_id,
                 amount=req.amount)

        order = await save_order(req, payment.id)
        log.info("order created",
                 order_id=order.id,
                 payment_id=payment.id,
                 user_id=req.user_id)
        return {"order_id": order.id}

    except PaymentDeclined as e:
        log.warning("payment declined",
                    user_id=req.user_id,
                    reason=e.reason)
        raise HTTPException(402, detail={"code": "payment_declined",
                                         "reason": e.reason})

    except Exception:
        log.exception("order creation failed",
                      user_id=req.user_id)
        raise HTTPException(500, detail={"code": "internal_error"})
Чтобы решить вопрос и сохранить попытку — войди.