fix: tracked db prioritize operation name

This commit is contained in:
Vineeth Voruganti 2025-05-22 15:08:23 -04:00
parent 86fa332855
commit 150b2850d2
2 changed files with 15 additions and 12 deletions

View File

@ -1,4 +1,3 @@
import uuid
from contextlib import asynccontextmanager
from fastapi import Depends
@ -16,6 +15,7 @@ async def get_db():
db: AsyncSession = SessionLocal()
try:
await db.execute(text(f"SET application_name = '{context}'"))
await db.commit()
yield db
except Exception:
await db.rollback()
@ -29,21 +29,26 @@ async def get_db():
@asynccontextmanager
async def tracked_db(operation_name=None):
"""Context manager for tracked database sessions"""
# Get request ID if available, or create operation-specific one
context = request_context.get()
# Generate a unique ID for this DB session
token = None
if not context and operation_name:
context = f"task:{operation_name}:{str(uuid.uuid4())[:8]}"
token = request_context.set(context)
# Always prioritize the operation_name if provided
if operation_name:
app_name = f"task:{operation_name}"
# Only modify the context var if we're not in a request context
if not request_context.get():
token = request_context.set(app_name)
else:
# Fallback to request context if no operation name provided
context = request_context.get()
app_name = context if context else "task:unspecified"
# Create session with tracking info
db = SessionLocal()
try:
await db.execute(
text(f"SET application_name = '{context or f'task:{operation_name}'}'")
)
await db.execute(text(f"SET application_name = '{app_name}'"))
await db.commit()
yield db
# Explicitly end transaction if still open

View File

@ -1,8 +1,6 @@
import logging
import os
import re
import uuid
import re
from contextlib import asynccontextmanager
import sentry_sdk
@ -177,7 +175,7 @@ async def track_request(request: Request, call_next):
# Create a request ID that includes endpoint information
# Remove any IDs from the path - updated regex for NanoIDs (21 chars, A-Za-z0-9_-)
endpoint = re.sub(r"/[A-Za-z0-9_-]{21}", "", request.url.path).replace("/", "_")
request_id = f"{request.method}:{endpoint}:{str(uuid.uuid4())[:8]}"
request_id = f"{request.method}:{endpoint}"
# Store in request state and context var
request.state.request_id = request_id