File size: 3,145 Bytes
d971efd
 
 
 
 
 
 
 
 
 
 
 
 
42b982f
d971efd
 
42b982f
d971efd
 
 
 
42b982f
d971efd
 
 
 
 
 
 
42b982f
 
d971efd
 
 
 
 
 
 
 
 
 
 
42b982f
 
 
 
d971efd
 
42b982f
d971efd
42b982f
 
d971efd
 
 
 
 
 
 
 
 
42b982f
d971efd
42b982f
 
 
 
 
 
 
 
 
 
d971efd
42b982f
 
d971efd
42b982f
 
d971efd
42b982f
 
d971efd
42b982f
d971efd
42b982f
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import os
import base64
from typing import Optional, Literal
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
from opentelemetry import trace
from openinference.instrumentation.smolagents import SmolagentsInstrumentor


def setup_tracing(
    service_name: str = "agent-service",
    enabled: bool = True,
    provider: Literal["langfuse", "phoenix"] = "langfuse",
) -> Optional[TracerProvider]:
    """
    Configure and set up OpenTelemetry tracing with Langfuse or Phoenix integration.

    Args:
        service_name: Name of the service for trace identification
        enabled: Whether tracing should be active
        provider: Which tracing provider to use - "langfuse" or "phoenix"

    Returns:
        Configured TracerProvider instance or None if disabled
    """
    if not enabled:
        return None

    # Setup Phoenix
    if provider == "phoenix":
        try:
            from phoenix.otel import register

            # Create Phoenix tracer provider
            trace_provider = register(
                project_name=service_name,
                endpoint="http://127.0.0.1:6006/v1/traces",
                auto_instrument=True,
            )
            print(f"✅ Phoenix tracing enabled for {service_name}")

            # Instrument smolagents with Phoenix provider
            SmolagentsInstrumentor().instrument(tracer_provider=trace_provider)
            return trace_provider

        except ImportError:
            print("⚠️ Phoenix not installed. Run: pip install 'smolagents[telemetry]'")
            return None

    # Setup Langfuse (default)
    else:
        # Configure Langfuse host
        langfuse_host = os.environ.get("LANGFUSE_HOST", "https://cloud.langfuse.com")

        # Create auth token for Langfuse
        langfuse_public_key = os.environ.get("LANGFUSE_PUBLIC_KEY")
        langfuse_secret_key = os.environ.get("LANGFUSE_SECRET_KEY")

        if not langfuse_public_key or not langfuse_secret_key:
            print("⚠️ Langfuse keys not found in environment")
            return None

        # Configure Langfuse
        langfuse_auth = base64.b64encode(
            f"{langfuse_public_key}:{langfuse_secret_key}".encode()
        ).decode()

        # Set environment variables for OTLP exporter
        os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = f"{langfuse_host}/api/public/otel"
        os.environ["OTEL_EXPORTER_OTLP_HEADERS"] = (
            f"Authorization=Basic {langfuse_auth}"
        )

        # Create a new TracerProvider for Langfuse
        langfuse_provider = TracerProvider()

        # Add Langfuse exporter
        langfuse_provider.add_span_processor(SimpleSpanProcessor(OTLPSpanExporter()))

        # Set as the global default tracer provider
        trace.set_tracer_provider(langfuse_provider)

        print(f"✅ Langfuse tracing enabled for {service_name}")

        # Instrument smolagents
        SmolagentsInstrumentor().instrument(tracer_provider=langfuse_provider)
        return langfuse_provider