Skip to content

Commit 690b452

Browse files
authored
Add trace_id to Logs for Enhanced Traceability (#265)
* Add trace-id to logs for tracing of logs across a request cycle * add logs trace-id to langfuse traces
1 parent ae40f00 commit 690b452

File tree

5 files changed

+1016
-984
lines changed

5 files changed

+1016
-984
lines changed

backend/app/core/langfuse/langfuse.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import uuid
22
import logging
33
from typing import Any, Dict, Optional
4+
from asgi_correlation_id import correlation_id
45

56
from langfuse import Langfuse
67
from langfuse.client import StatefulGenerationClient, StatefulTraceClient
@@ -55,10 +56,13 @@ def start_trace(
5556
input: Dict[str, Any],
5657
metadata: Optional[Dict[str, Any]] = None,
5758
):
59+
metadata = metadata or {}
60+
metadata["request_id"] = correlation_id.get() or "N/A"
61+
5862
self.trace = self.langfuse.trace(
5963
name=name,
6064
input=input,
61-
metadata=metadata or {},
65+
metadata=metadata,
6266
session_id=self.session_id,
6367
)
6468

backend/app/core/logger.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
import os
33
from logging.handlers import RotatingFileHandler
4+
from asgi_correlation_id import correlation_id
45
from app.core.config import settings
56

67
LOG_DIR = settings.LOG_DIR
@@ -9,7 +10,16 @@
910
LOG_FILE_PATH = os.path.join(LOG_DIR, "app.log")
1011

1112
LOGGING_LEVEL = logging.INFO
12-
LOGGING_FORMAT = "%(asctime)s - %(levelname)s - %(name)s - %(message)s"
13+
LOGGING_FORMAT = (
14+
"%(asctime)s - [%(correlation_id)s] - %(levelname)s - %(name)s - %(message)s"
15+
)
16+
17+
18+
class CorrelationIdFilter(logging.Filter):
19+
def filter(self, record: logging.LogRecord) -> bool:
20+
record.correlation_id = correlation_id.get() or "N/A"
21+
return True
22+
1323

1424
# Create root logger
1525
logger = logging.getLogger()
@@ -21,11 +31,13 @@
2131
# Stream handler (console)
2232
stream_handler = logging.StreamHandler()
2333
stream_handler.setFormatter(formatter)
34+
stream_handler.addFilter(CorrelationIdFilter())
2435
logger.addHandler(stream_handler)
2536

2637
# Rotating file handler
2738
file_handler = RotatingFileHandler(
2839
LOG_FILE_PATH, maxBytes=10 * 1024 * 1024, backupCount=5
2940
)
3041
file_handler.setFormatter(formatter)
42+
file_handler.addFilter(CorrelationIdFilter())
3143
logger.addHandler(file_handler)

backend/app/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import sentry_sdk
2-
32
from fastapi import FastAPI
43
from fastapi.routing import APIRoute
5-
4+
from asgi_correlation_id.middleware import CorrelationIdMiddleware
65
from app.api.main import api_router
76
from app.core.config import settings
87
import app.core.logger
@@ -24,6 +23,7 @@ def custom_generate_unique_id(route: APIRoute) -> str:
2423
)
2524

2625
app.middleware("http")(http_request_logger)
26+
app.add_middleware(CorrelationIdMiddleware)
2727

2828
app.include_router(api_router, prefix=settings.API_V1_STR)
2929

backend/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ dependencies = [
2828
"pre-commit>=3.8.0",
2929
"openai_responses",
3030
"langfuse>=2.60.3",
31+
"asgi-correlation-id>=4.3.4",
3132
]
3233

3334
[tool.uv]

0 commit comments

Comments
 (0)