haystack
89 строк · 3.1 Кб
1---
2features:
3- |
4Added option to instrument pipeline and component runs.
5This allows users to observe their pipeline runs and component runs in real-time via their chosen observability
6tool. Out-of-the-box support for OpenTelemetry and Datadog will be added in separate contributions.
7
8Example usage for [OpenTelemetry](https://opentelemetry.io/docs/languages/python/):
9
101. Install OpenTelemetry SDK and exporter:
11```bash
12pip install opentelemetry-sdk opentelemetry-exporter-otlp-proto-http
13```
14
152. Configure OpenTelemetry SDK with your tracing provider and exporter:
16```python
17from opentelemetry.sdk.resources import SERVICE_NAME, Resource
18
19from opentelemetry import trace
20from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
21from opentelemetry.sdk.trace import TracerProvider
22from opentelemetry.sdk.trace.export import BatchSpanProcessor
23
24# Service name is required for most backends
25resource = Resource(attributes={
26SERVICE_NAME: "haystack"
27})
28
29traceProvider = TracerProvider(resource=resource)
30processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://localhost:4318/v1/traces"))
31traceProvider.add_span_processor(processor)
32trace.set_tracer_provider(traceProvider)
33
34tracer = traceProvider.get_tracer("my_application")
35
36
373. Create tracer
38```python
39import contextlib
40from typing import Optional, Dict, Any, Iterator
41
42from opentelemetry import trace
43from opentelemetry.trace import NonRecordingSpan
44
45from haystack.tracing import Tracer, Span
46from haystack.tracing import utils as tracing_utils
47import opentelemetry.trace
48
49
50class OpenTelemetrySpan(Span):
51def __init__(self, span: opentelemetry.trace.Span) -> None:
52self._span = span
53
54def set_tag(self, key: str, value: Any) -> None:
55coerced_value = tracing_utils.coerce_tag_value(value)
56self._span.set_attribute(key, coerced_value)
57
58
59class OpenTelemetryTracer(Tracer):
60def __init__(self, tracer: opentelemetry.trace.Tracer) -> None:
61self._tracer = tracer
62
63@contextlib.contextmanager
64def trace(self, operation_name: str, tags: Optional[Dict[str, Any]] = None) -> Iterator[Span]:
65with self._tracer.start_as_current_span(operation_name) as span:
66span = OpenTelemetrySpan(span)
67if tags:
68span.set_tags(tags)
69
70yield span
71
72def current_span(self) -> Optional[Span]:
73current_span = trace.get_current_span()
74if isinstance(current_span, NonRecordingSpan):
75return None
76
77return OpenTelemetrySpan(current_span)
78
79```
80
814. Use the tracer with Haystack:
82```python
83from haystack import tracing
84
85haystack_tracer = OpenTelemetryTracer(tracer)
86tracing.enable_tracing(haystack_tracer)
87```
88
895. Run your pipeline
90