{"library":"opentelemetry-instrumentation-haystack","title":"OpenTelemetry Haystack Instrumentation","description":"The `opentelemetry-instrumentation-haystack` library provides OpenTelemetry tracing capabilities for applications using Haystack (haystack-ai). It automatically captures spans for various Haystack operations, including pipeline execution, document store interactions, and LLM calls, enriching them with relevant attributes. As part of the `openllmetry` project, it follows its rapid release cadence, with version `0.58.0` being the latest, frequently updating to support new Haystack features and OpenTelemetry semantic conventions.","language":"python","status":"active","last_verified":"Thu May 14","install":{"commands":["pip install opentelemetry-instrumentation-haystack haystack-ai openai"],"cli":null},"imports":["from opentelemetry.instrumentation.haystack import HaystackInstrumentor"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nfrom opentelemetry import trace\nfrom opentelemetry.sdk.resources import Resource\nfrom opentelemetry.sdk.trace import TracerProvider\nfrom opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor\nfrom opentelemetry.instrumentation.haystack import HaystackInstrumentor\n\n# 1. Initialize OpenTelemetry TracerProvider\nresource = Resource.create({\"service.name\": \"haystack-app\"})\nprovider = TracerProvider(resource=resource)\n# Use ConsoleSpanExporter for demonstration; replace with OTLPSpanExporter for production\nprovider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter()))\ntrace.set_tracer_provider(provider)\n\n# 2. Instrument Haystack\nHaystackInstrumentor().instrument()\n\n# 3. Haystack Usage (requires 'haystack-ai' and 'openai' to be installed)\ntry:\n    from haystack_ai.components.generators import OpenAIGenerator\n    from haystack_ai.components.builders.prompt_builder import PromptBuilder\n    from haystack_ai.components.pipelines import Pipeline\n    from haystack_ai.components.retrievers.in_memory import InMemoryBM25Retriever\n    from haystack_ai.document_stores.in_memory import InMemoryDocumentStore\n    from haystack_ai.schema import Document\n\n    # Set OpenAI API key for the generator. For local execution, ensure this is set.\n    # For a real application, retrieve from a secure source.\n    if not os.environ.get(\"OPENAI_API_KEY\"): # Using os.environ.get for robustness\n        print(\"Warning: OPENAI_API_KEY not set. OpenAIGenerator might fail or use a default.\")\n\n    # Create a simple document store and add documents\n    document_store = InMemoryDocumentStore()\n    documents = [\n        Document(content=\"The quick brown fox jumps over the lazy dog.\"),\n        Document(content=\"Haystack is an open-source framework for building custom LLM applications.\"),\n        Document(content=\"OpenTelemetry provides observability for your applications.\")\n    ]\n    document_store.write_documents(documents)\n\n    # Create a Haystack pipeline\n    pipeline = Pipeline()\n    pipeline.add_component(\"retriever\", InMemoryBM25Retriever(document_store=document_store))\n    pipeline.add_component(\"prompt_builder\", PromptBuilder(template=\"Answer the question: {{query}}\\nContext: {{documents}}\"))\n    pipeline.add_component(\"generator\", OpenAIGenerator(model=\"gpt-3.5-turbo\"))\n\n    pipeline.connect(\"retriever\", \"prompt_builder.documents\")\n    pipeline.connect(\"prompt_builder\", \"generator.prompt\")\n\n    # Run the pipeline\n    query = \"What is Haystack?\"\n    print(f\"\\nRunning Haystack pipeline with query: '{query}'\")\n    result = pipeline.run(data={\n        \"query\": query,\n        \"retriever\": {\"query\": query}\n    })\n\n    print(\"\\nHaystack Pipeline Result:\")\n    print(result)\n\nexcept ImportError as e:\n    print(f\"\\nSkipping Haystack example due to missing dependencies: {e}\")\n    print(\"Please install 'haystack-ai' and 'openai': pip install haystack-ai openai\")\nexcept Exception as e:\n    print(f\"\\nAn error occurred during Haystack pipeline execution: {e}\")\n    print(\"Ensure OPENAI_API_KEY is set if using OpenAIGenerator and your network is accessible.\")\n\n# 4. Shut down the provider to ensure all spans are exported\nprovider.shutdown()\n","lang":"python","description":"This quickstart demonstrates how to enable OpenTelemetry tracing for a simple Haystack pipeline. It initializes an OpenTelemetry `TracerProvider` with a `ConsoleSpanExporter` (for printing traces to console), instruments Haystack using `HaystackInstrumentor().instrument()`, and then constructs and runs a basic Haystack RAG pipeline. Replace `ConsoleSpanExporter` with `OTLPSpanExporter` for sending traces to a collector. Ensure `haystack-ai` and `openai` are installed and `OPENAI_API_KEY` is set in your environment for the generator to function.","tag":null,"tag_description":null,"last_tested":"2026-04-25","results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-14","installed_version":"0.50.1","pypi_latest":"0.60.0","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":12.2,"avg_import_s":0.42,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.32,"mem_mb":9.2,"disk_size":"161.8M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.36,"mem_mb":9.2,"disk_size":"159.6M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":12.7,"import_time_s":0.23,"mem_mb":9.2,"disk_size":"157M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.24,"mem_mb":9.2,"disk_size":"155M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.48,"mem_mb":10.5,"disk_size":"179.5M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.52,"mem_mb":10.5,"disk_size":"177.1M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":11.7,"import_time_s":0.43,"mem_mb":10.5,"disk_size":"174M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.47,"mem_mb":10.5,"disk_size":"172M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.63,"mem_mb":12.4,"disk_size":"165.6M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.92,"mem_mb":12.4,"disk_size":"163.3M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":10.3,"import_time_s":0.67,"mem_mb":12.4,"disk_size":"160M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.8,"mem_mb":12.4,"disk_size":"158M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.28,"mem_mb":7.7,"disk_size":"164.9M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.31,"mem_mb":7.7,"disk_size":"162.5M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":10.5,"import_time_s":0.29,"mem_mb":7.7,"disk_size":"159M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.35,"mem_mb":7.7,"disk_size":"157M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.27,"mem_mb":8.4,"disk_size":"178.9M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.31,"mem_mb":8.4,"disk_size":"177.0M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":16,"import_time_s":0.24,"mem_mb":8.4,"disk_size":"176M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"opentelemetry-instrumentation-haystack","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.25,"mem_mb":8.4,"disk_size":"174M"}]}}