opentelemetry-python-contrib/instrumentation-genai/opentelemetry-instrumentati.../tests/conftest.py

108 lines
3.0 KiB
Python

"""Unit tests configuration module."""
import os
import pytest
from openai import OpenAI
from opentelemetry.instrumentation.openai_v2 import OpenAIInstrumentor
from opentelemetry.instrumentation.openai_v2.utils import (
OTEL_INSTRUMENTATION_OPENAI_CAPTURE_MESSAGE_CONTENT,
)
from opentelemetry.sdk._events import EventLoggerProvider
from opentelemetry.sdk._logs import LoggerProvider
from opentelemetry.sdk._logs.export import (
InMemoryLogExporter,
SimpleLogRecordProcessor,
)
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
from opentelemetry.sdk.trace.export.in_memory_span_exporter import (
InMemorySpanExporter,
)
@pytest.fixture(scope="function", name="span_exporter")
def fixture_span_exporter():
exporter = InMemorySpanExporter()
yield exporter
@pytest.fixture(scope="function", name="log_exporter")
def fixture_log_exporter():
exporter = InMemoryLogExporter()
yield exporter
@pytest.fixture(scope="function", name="tracer_provider")
def fixture_tracer_provider(span_exporter):
provider = TracerProvider()
provider.add_span_processor(SimpleSpanProcessor(span_exporter))
return provider
@pytest.fixture(scope="function", name="event_logger_provider")
def fixture_event_logger_provider(log_exporter):
provider = LoggerProvider()
provider.add_log_record_processor(SimpleLogRecordProcessor(log_exporter))
event_logger_provider = EventLoggerProvider(provider)
return event_logger_provider
@pytest.fixture(autouse=True)
def environment():
if not os.getenv("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = "test-api-key"
@pytest.fixture
def openai_client():
return OpenAI()
@pytest.fixture(scope="module")
def vcr_config():
return {
"filter_headers": ["authorization", "api-key"],
"decode_compressed_response": True,
"before_record_response": scrub_response_headers,
}
@pytest.fixture(scope="function")
def instrument_no_content(tracer_provider, event_logger_provider):
instrumentor = OpenAIInstrumentor()
instrumentor.instrument(
tracer_provider=tracer_provider,
event_logger_provider=event_logger_provider,
)
yield instrumentor
instrumentor.uninstrument()
@pytest.fixture(scope="function")
def instrument_with_content(tracer_provider, event_logger_provider):
os.environ.update(
{OTEL_INSTRUMENTATION_OPENAI_CAPTURE_MESSAGE_CONTENT: "True"}
)
instrumentor = OpenAIInstrumentor()
instrumentor.instrument(
tracer_provider=tracer_provider,
event_logger_provider=event_logger_provider,
)
yield instrumentor
os.environ.pop(OTEL_INSTRUMENTATION_OPENAI_CAPTURE_MESSAGE_CONTENT, None)
instrumentor.uninstrument()
def scrub_response_headers(response):
"""
This scrubs sensitive response headers. Note they are case-sensitive!
"""
response["headers"]["openai-organization"] = "test_organization"
response["headers"]["Set-Cookie"] = "test_set_cookie"
return response