여러 서비스에 걸쳐 요청을 추적해야 하는 경우가 있습니다.
LangSmith는 컨텍스트 전파 헤더(langsmith-trace 및 메타데이터/태그를 위한 선택적 baggage)를 사용하여 서비스 간 추적 내 실행을 연결하는 분산 추적을 기본적으로 지원합니다.
클라이언트-서버 설정 예시:
- 추적이 클라이언트에서 시작됩니다
- 서버에서 추적이 계속됩니다
Python에서의 분산 추적
# client.py
from langsmith.run_helpers import get_current_run_tree, traceable
import httpx
@traceable
async def my_client_function():
headers = {}
async with httpx.AsyncClient(base_url="...") as client:
if run_tree := get_current_run_tree():
# add langsmith-id to headers
headers.update(run_tree.to_headers())
return await client.post("/my-route", headers=headers)
그런 다음 서버(또는 다른 서비스)가 헤더를 적절히 처리하여 추적을 계속할 수 있습니다. Starlette 또는 FastAPI와 같은 ASGI 앱을 사용하는 경우 LangSmith의 TracingMiddleware를 사용하여 분산 추적을 연결할 수 있습니다.
TracingMiddleware 클래스는 langsmith==0.1.133에 추가되었습니다.
FastAPI 사용 예시:
from langsmith import traceable
from langsmith.middleware import TracingMiddleware
from fastapi import FastAPI, Request
app = FastAPI() # Or Flask, Django, or any other framework
app.add_middleware(TracingMiddleware)
@traceable
async def some_function():
...
@app.post("/my-route")
async def fake_route(request: Request):
return await some_function()
또는 Starlette에서:
from starlette.applications import Starlette
from starlette.middleware import Middleware
from langsmith.middleware import TracingMiddleware
routes = ...
middleware = [
Middleware(TracingMiddleware),
]
app = Starlette(..., middleware=middleware)
다른 서버 프레임워크를 사용하는 경우 langsmith_extra를 통해 헤더를 전달하여 분산 추적을 항상 “수신”할 수 있습니다:
# server.py
import langsmith as ls
from fastapi import FastAPI, Request
@ls.traceable
async def my_application():
...
app = FastAPI() # Or Flask, Django, or any other framework
@app.post("/my-route")
async def fake_route(request: Request):
# request.headers: {"langsmith-trace": "..."}
# as well as optional metadata/tags in `baggage`
with ls.tracing_context(parent=request.headers):
return await my_application()
위 예제는 tracing_context 컨텍스트 매니저를 사용합니다. @traceable로 래핑된 메서드의 langsmith_extra 매개변수에서 상위 실행 컨텍스트를 직접 지정할 수도 있습니다.
# ... same as above
@app.post("/my-route")
async def fake_route(request: Request):
# request.headers: {"langsmith-trace": "..."}
my_application(langsmith_extra={"parent": request.headers})
TypeScript에서의 분산 추적
TypeScript에서의 분산 추적은 langsmith 버전 >=0.1.31이 필요합니다
먼저 클라이언트에서 현재 실행 트리를 가져와 langsmith-trace 및 baggage 헤더 값으로 변환하고 서버에 전달할 수 있습니다:
// client.mts
import { getCurrentRunTree, traceable } from "langsmith/traceable";
const client = traceable(
async () => {
const runTree = getCurrentRunTree();
return await fetch("...", {
method: "POST",
headers: runTree.toHeaders(),
}).then((a) => a.text());
},
{ name: "client" }
);
await client();
그런 다음 서버는 헤더를 다시 실행 트리로 변환하여 추적을 계속 진행합니다.
새로 생성된 실행 트리를 traceable 함수에 전달하려면 withRunTree 헬퍼를 사용할 수 있으며, 이는 traceable 호출 내에서 실행 트리가 전파되도록 보장합니다.
// server.mts
import { RunTree } from "langsmith";
import { traceable, withRunTree } from "langsmith/traceable";
import express from "express";
import bodyParser from "body-parser";
const server = traceable(
(text: string) => `Hello from the server! Received "${text}"`,
{ name: "server" }
);
const app = express();
app.use(bodyParser.text());
app.post("/", async (req, res) => {
const runTree = RunTree.fromHeaders(req.headers);
const result = await withRunTree(runTree, () => server(req.body));
res.send(result);
});