07-eval/conftest.py (69 lines of code) (raw):
#
# Copyright Elasticsearch B.V. and contributors
# SPDX-License-Identifier: Apache-2.0
#
import os
import traceback
import pytest
from opentelemetry import trace
from opentelemetry.trace import Status, StatusCode
@pytest.fixture
def default_openai_env(monkeypatch):
"""Prevent offline tests from failing due to requiring the ENV OPENAI_API_KEY."""
if "OPENAI_API_KEY" not in os.environ:
monkeypatch.setenv("OPENAI_API_KEY", "test_openai_api_key")
@pytest.fixture(scope="module")
def vcr_config():
"""Scrub sensitive headers and gunzip responses so they are readable"""
sensitive_request_headers = [
"authorization",
"cookie",
"openai-organization",
"openai-project",
]
sensitive_response_headers = {"openai-organization", "set-cookie"}
return {
"decode_compressed_response": True,
"filter_headers": sensitive_request_headers,
"before_record_response": lambda r: {
**r,
"headers": {
k: v
for k, v in r["headers"].items()
if k.lower() not in sensitive_response_headers
},
},
}
@pytest.fixture
def traced_test(request):
tracer = trace.get_tracer(__name__)
span = tracer.start_span(request.node.name)
# pytest_runtest_makereport needs to update the span, so attach it.
request.node.span = span
# Make the span current, but don't end it until the test completes.
with trace.use_span(span, end_on_exit=False):
yield span
span.end()
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
outcome = yield
if call.when != "call":
return # we don't trace setup and teardown phases
if not (span := getattr(item, "span", None)):
return # test didn't use the traced_test fixture
report = outcome.get_result()
if report.skipped:
return span.set_status(
Status(status_code=StatusCode.UNSET, description="Test skipped")
)
if not report.failed:
return span.set_status(Status(status_code=StatusCode.OK))
span.add_event(
"exception",
attributes={
"exception.type": call.excinfo.type.__name__,
"exception.message": str(call.excinfo.value),
"exception.stacktrace": "".join(
traceback.format_exception(
call.excinfo.type, call.excinfo.value, call.excinfo.tb
)
),
},
)
span.set_status(
Status(
status_code=StatusCode.ERROR, description=str(call.excinfo.value)
)
)