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.py
"""
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/activate

Install dependencies

uv pip install -U agno ddgs openai openlit opentelemetry-exporter-otlp opentelemetry-sdk

Export 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.py

Full source: cookbook/observability/langfuse_via_openlit.py