커스텀 트레이서

커스텀 트레이서 (Custom Tracer)

Haystack를 커스텀 트레이싱 백엔드에 연결하는 방법을 알아봐요. Tracer 인터페이스를 구현하면 스팬(span)이 어떻게 만들어지고 태그가 어떻게 기록되는지 완전히 제어할 수 있어요.

출처: 문서

본문

  • 기본 클래스: Tracer 와 Span
  • 활성화 방법: Tracer 인터페이스 구현 후 tracing.enable_tracing(your_tracer)
  • 콘텐츠 트레이싱: 선택 사항. 컴포넌트 입력·출력을 트레이싱하려면 HAYSTACK_CONTENT_TRACING_ENABLED 를 true 로 설정
  • 패키지: Haystack에 내장
  • GitHub: tracer.py

개요 (Overview)

트레이싱 백엔드가 기본 지원되지 않는다면, Tracer 인터페이스를 구현해 Haystack에 연결할 수 있어요. 이렇게 하면 스팬이 어떻게 생성되고 태그가 어떻게 기록되는지 완전히 제어할 수 있어요.

사용법 (Usage)

Tracer 인터페이스를 구현하세요. 아래 코드 스니펫은 OpenTelemetry 패키지를 사용한 예시예요:

import contextlib
from collections.abc import Iterator
from typing import Any
from opentelemetry import trace
from opentelemetry.trace import NonRecordingSpan
from haystack.tracing import Tracer, Span
from haystack.tracing import utils as tracing_utils
import opentelemetry.trace

class OpenTelemetrySpan(Span):
    def __init__(self, span: opentelemetry.trace.Span) -> None:
        self._span = span

    def set_tag(self, key: str, value: Any) -> None:
        # Tracing backends usually don't support any tag value
        # `coerce_tag_value` forces the value to either be a Python
        # primitive (int, float, boolean, str) or tries to dump it as string.
        coerced_value = tracing_utils.coerce_tag_value(value)
        self._span.set_attribute(key, coerced_value)

class OpenTelemetryTracer(Tracer):
    def __init__(self, tracer: opentelemetry.trace.Tracer) -> None:
        self._tracer = tracer

    @contextlib.contextmanager
    def trace(
        self,
        operation_name: str,
        tags: dict[str, Any] | None = None,
        parent_span: Span | None = None,
    ) -> Iterator[Span]:
        with self._tracer.start_as_current_span(operation_name) as span:
            span = OpenTelemetrySpan(span)
            if tags:
                span.set_tags(tags)
            yield span

    def current_span(self) -> Span | None:
        current_span = trace.get_current_span()
        if isinstance(current_span, NonRecordingSpan):
            return None
        return OpenTelemetrySpan(current_span)

Haystack에 커스텀 트레이서를 사용하라고 알려주세요:

from haystack import tracing

haystack_tracer = OpenTelemetryTracer(tracer)
tracing.enable_tracing(haystack_tracer)

더 알아보기 (Learn more)