Loading...
Loading...
Adds OpenTelemetry-based tracing to applications via TrueFoundry's tracing platform (Traceloop SDK). Creates tracing projects, instruments Python/TypeScript code, and captures LLM calls and custom spans.
npx skill4agent add truefoundry/tfy-deploy-skills truefoundry-tracing<objective>Routing note: For ambiguous user intents, use the shared clarification templates in references/intent-clarification.md.
statusTFY_BASE_URLTFY_API_KEYTFY_API_SHscripts/tfy-api.shreferences/tfy-api-setup.mdtfy_tracing_list_projects()TFY_API_SH=~/.claude/skills/truefoundry-tracing/scripts/tfy-api.sh
# List tracing projects
$TFY_API_SH GET /api/ml/v1/tracing-projectstfy_tracing_create_project(name="my-tracing-project")# Create tracing project
$TFY_API_SH POST /api/ml/v1/tracing-projects '{"name": "my-tracing-project"}'idtfy_tracing_create_application(project_id="PROJECT_ID", name="my-app")# Create application under project
$TFY_API_SH POST /api/ml/v1/tracing-projects/PROJECT_ID/applications '{"name": "my-app"}'Fallback: If any of these API endpoints return 404, the tracing API may have changed. Direct the user to create the tracing project via the TrueFoundry UI at→ Tracing section, then return here with the project FQN.$TFY_BASE_URL
requirements.txtpyproject.tomlsetup.pyPipfileopenaianthropiclangchainllama-indexlitellmcoherebedrockvertexaitransformerspackage.jsonopenai@anthropic-ai/sdklangchain@langchain/corepip install traceloop-sdktraceloop-sdkrequirements.txtnpm install @traceloop/node-server-sdkpackage.jsonTraceloop.init()main.pyapp.py# --- Traceloop init MUST be before any LLM imports ---
from traceloop.sdk import Traceloop
Traceloop.init(
app_name="<APP_NAME>",
api_endpoint=f"<TFY_BASE_URL>/api/otel",
headers={
"Authorization": f"Bearer <TFY_API_KEY>",
"X-TFY-TRACING-PROJECT-FQN": "<TRACING_PROJECT_FQN>",
},
disable_batch=False,
)
# --- Now import LLM libraries ---
# from openai import OpenAI
# from anthropic import Anthropic
# etc.<APP_NAME><TFY_BASE_URL>.env<TFY_API_KEY>.env<TRACING_PROJECT_FQN>TFY_BASE_URLTFY_API_KEYimport os
from traceloop.sdk import Traceloop
Traceloop.init(
app_name="<APP_NAME>",
api_endpoint=f"{os.environ['TFY_BASE_URL']}/api/otel",
headers={
"Authorization": f"Bearer {os.environ['TFY_API_KEY']}",
"X-TFY-TRACING-PROJECT-FQN": "<TRACING_PROJECT_FQN>",
},
disable_batch=False,
)index.tsapp.ts// --- Traceloop init MUST be before any LLM imports ---
import * as traceloop from "@traceloop/node-server-sdk";
traceloop.initialize({
appName: "<APP_NAME>",
apiEndpoint: `${process.env.TFY_BASE_URL}/api/otel`,
headers: {
Authorization: `Bearer ${process.env.TFY_API_KEY}`,
"X-TFY-TRACING-PROJECT-FQN": "<TRACING_PROJECT_FQN>",
},
disableBatch: false,
});
// --- Now import LLM libraries ---
// import OpenAI from "openai";
// etc.from traceloop.sdk.decorators import workflow, task, agent, tool
@workflow(name="rag_pipeline")
def run_pipeline(query: str):
context = retrieve(query)
return generate(query, context)
@task(name="retrieve_context")
def retrieve(query: str):
# retrieval logic
...
@task(name="generate_response")
def generate(query: str, context: str):
# LLM call
...
@agent(name="research_agent")
def research_agent(topic: str):
# agent logic
...
@tool(name="web_search")
def web_search(query: str):
# tool logic
...import { withWorkflow, withTask, withAgent, withTool } from "@traceloop/node-server-sdk";
const runPipeline = withWorkflow({ name: "rag_pipeline" }, async (query: string) => {
const context = await retrieve(query);
return generate(query, context);
});
const retrieve = withTask({ name: "retrieve_context" }, async (query: string) => {
// retrieval logic
});
const generate = withTask({ name: "generate_response" }, async (query: string, context: string) => {
// LLM call
});from opentelemetry.sdk.trace.sampling import ParentBased, TraceIdRatioBased
Traceloop.init(
app_name="<APP_NAME>",
api_endpoint=f"{os.environ['TFY_BASE_URL']}/api/otel",
headers={
"Authorization": f"Bearer {os.environ['TFY_API_KEY']}",
"X-TFY-TRACING-PROJECT-FQN": "<TRACING_PROJECT_FQN>",
},
disable_batch=False,
sampler=ParentBased(root=TraceIdRatioBased(0.1)), # 10% sampling
)import { ParentBasedSampler, TraceIdRatioBasedSampler } from "@opentelemetry/sdk-trace-base";
traceloop.initialize({
appName: "<APP_NAME>",
apiEndpoint: `${process.env.TFY_BASE_URL}/api/otel`,
headers: {
Authorization: `Bearer ${process.env.TFY_API_KEY}`,
"X-TFY-TRACING-PROJECT-FQN": "<TRACING_PROJECT_FQN>",
},
disableBatch: false,
sampler: new ParentBasedSampler({ root: new TraceIdRatioBasedSampler(0.1) }), // 10%
});traceloop-sdk@traceloop/node-server-sdkTraceloop.init()AuthorizationX-TFY-TRACING-PROJECT-FQNstatussecretsdeploylogsreferences/api-endpoints.mdCheck that TFY_API_KEY is valid and not expired.
Regenerate at $TFY_BASE_URL → Settings → API Keys.1. Verify Traceloop.init() is called BEFORE LLM library imports — this is the #1 cause.
2. Check that api_endpoint ends with /api/otel (not /api/otel/).
3. Verify X-TFY-TRACING-PROJECT-FQN header matches the project FQN exactly.
4. Set disable_batch=True temporarily to force immediate export and check for errors.
5. Check application logs for OTLP export errors.Run: pip install traceloop-sdk
Ensure you're installing in the correct virtual environment.Traceloop.init() must be called BEFORE importing the LLM library.
Move the init call to the very top of your entry point file.Add sampling — see Step 7 for ParentBased(TraceIdRatioBased) configuration.
Start with 10% sampling (0.1) and adjust based on needs.The tracing API endpoints may differ on your TrueFoundry version.
Create the tracing project via the TrueFoundry UI instead:
$TFY_BASE_URL → Tracing → New Project
Then use the project FQN in your Traceloop.init() configuration.