Initialize OpenTelemetry tracing if enabled and packages are available.
()
| 38 | |
| 39 | |
| 40 | def _init_tracing(): |
| 41 | """Initialize OpenTelemetry tracing if enabled and packages are available.""" |
| 42 | global _tracer, _tracing_enabled |
| 43 | |
| 44 | if os.getenv("PROMPTFOO_ENABLE_OTEL", "").lower() not in ("true", "1", "yes"): |
| 45 | return |
| 46 | |
| 47 | try: |
| 48 | from opentelemetry import trace |
| 49 | from opentelemetry.exporter.otlp.proto.http.trace_exporter import ( |
| 50 | OTLPSpanExporter, |
| 51 | ) |
| 52 | from opentelemetry.sdk.trace import TracerProvider |
| 53 | from opentelemetry.sdk.trace.export import SimpleSpanProcessor |
| 54 | |
| 55 | # Get endpoint from environment or use default Promptfoo OTLP receiver |
| 56 | base_endpoint = os.getenv( |
| 57 | "OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4318" |
| 58 | ) |
| 59 | endpoint = f"{base_endpoint.rstrip('/')}/v1/traces" |
| 60 | |
| 61 | provider = TracerProvider() |
| 62 | exporter = OTLPSpanExporter(endpoint=endpoint) |
| 63 | provider.add_span_processor(SimpleSpanProcessor(exporter)) |
| 64 | trace.set_tracer_provider(provider) |
| 65 | |
| 66 | _tracer = trace.get_tracer("promptfoo.python.provider") |
| 67 | _tracing_enabled = True |
| 68 | |
| 69 | except ImportError: |
| 70 | print( |
| 71 | "[PythonProvider] OpenTelemetry packages not installed, tracing disabled. " |
| 72 | "Install with: pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-http", |
| 73 | file=sys.stderr, |
| 74 | flush=True, |
| 75 | ) |
| 76 | except Exception as e: |
| 77 | print( |
| 78 | f"[PythonProvider] Failed to initialize tracing: {e}", |
| 79 | file=sys.stderr, |
| 80 | flush=True, |
| 81 | ) |
| 82 | |
| 83 | |
| 84 | # Initialize tracing at module load |
no test coverage detected
searching dependent graphs…