Langfuse Via OpenLIT
Export traces from a web-search agent to Langfuse by wiring an OTLP HTTP span exporter into OpenLIT's global tracer with batching disabled.
Demonstrates sending Agno traces to Langfuse through OpenLIT.
"""
Langfuse Via OpenLIT
====================
Demonstrates sending Agno traces to Langfuse through OpenLIT.
"""
import base64
import os
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.websearch import WebSearchTools
# ---------------------------------------------------------------------------
# Setup
# ---------------------------------------------------------------------------
LANGFUSE_AUTH = base64.b64encode(
f"{os.getenv('LANGFUSE_PUBLIC_KEY')}:{os.getenv('LANGFUSE_SECRET_KEY')}".encode()
).decode()
os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = (
"https://us.cloud.langfuse.com/api/public/otel" # US data region
)
# os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = "https://cloud.langfuse.com/api/public/otel" # EU data region
# os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = "http://localhost:3000/api/public/otel" # Local deployment (>= v3.22.0)
os.environ["OTEL_EXPORTER_OTLP_HEADERS"] = f"Authorization=Basic {LANGFUSE_AUTH}"
from opentelemetry.exporter.otlp.proto.http.trace_exporter import ( # noqa: E402
OTLPSpanExporter,
)
from opentelemetry.sdk.trace import TracerProvider # noqa: E402
from opentelemetry.sdk.trace.export import SimpleSpanProcessor # noqa: E402
trace_provider = TracerProvider()
trace_provider.add_span_processor(SimpleSpanProcessor(OTLPSpanExporter()))
# Sets the global default tracer provider
from opentelemetry import trace # noqa: E402
trace.set_tracer_provider(trace_provider)
# Creates a tracer from the global tracer provider
tracer = trace.get_tracer(__name__)
import openlit # noqa: E402
# Initialize OpenLIT instrumentation. The disable_batch flag is set to true to process traces immediately.
openlit.init(tracer=tracer, disable_batch=True)
# ---------------------------------------------------------------------------
# Create Agent
# ---------------------------------------------------------------------------
agent = Agent(
model=OpenAIChat(id="gpt-5.6-luna"),
tools=[WebSearchTools()],
markdown=True,
)
# ---------------------------------------------------------------------------
# Run Example
# ---------------------------------------------------------------------------
if __name__ == "__main__":
agent.print_response("What is currently trending on Twitter?")Langfuse export settings
Choose the endpoint for your project's region in the copied source. For current direct OTLP ingestion, replace its header assignment before creating the exporter:
os.environ["OTEL_EXPORTER_OTLP_HEADERS"] = (
f"Authorization=Basic {LANGFUSE_AUTH},x-langfuse-ingestion-version=4"
)Without the version header, traces can take up to ten minutes to appear in Langfuse's v4 data model. See Langfuse OpenTelemetry configuration.
Current OpenLIT initialization
Replace openlit.init(tracer=tracer, disable_batch=True) with the supported call below. OpenLIT reuses the global tracer provider configured earlier; its public initializer no longer accepts tracer.
openlit.init(disable_batch=True, disable_metrics=True, disable_events=True)See OpenLIT configuration. This recipe exports traces to Langfuse; the flags disable OpenLIT's metrics and instrumentation events.
Run the Example
Set up your virtual environment
uv venv --python 3.12
source .venv/bin/activateInstall dependencies
uv pip install -U agno ddgs openai openlit opentelemetry-exporter-otlp opentelemetry-sdkExport environment variables
export LANGFUSE_PUBLIC_KEY="your_langfuse_public_key_here"
export LANGFUSE_SECRET_KEY="your_langfuse_secret_key_here"
export OPENAI_API_KEY="your_openai_api_key_here"Run the example
Save the code above as langfuse_via_openlit.py, then run:
python langfuse_via_openlit.pyFull source: cookbook/observability/langfuse_via_openlit.py