Skip to main content
여러 서비스에 걸쳐 요청을 추적해야 하는 경우가 있습니다. 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-tracebaggage 헤더 값으로 변환하고 서버에 전달할 수 있습니다:
// 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);
});

Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.
I