Skip to content

Commit 9ba62bc

Browse files
committed
added conftests.py, added test_agents.py file
1 parent 031dbd0 commit 9ba62bc

File tree

3 files changed

+175
-0
lines changed

3 files changed

+175
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT = (
2+
"OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT"
3+
)
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
from opentelemetry.sdk.resources import Resource
2+
from opentelemetry.sdk.trace import TracerProvider
3+
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
4+
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
5+
6+
7+
from opentelemetry.sdk._events import EventLoggerProvider
8+
from opentelemetry.sdk._logs.export import (
9+
InMemoryLogExporter,
10+
SimpleLogRecordProcessor,
11+
)
12+
13+
from opentelemetry.sdk.metrics import (
14+
MeterProvider,
15+
)
16+
from opentelemetry.sdk.metrics.export import (
17+
InMemoryMetricReader,
18+
)
19+
20+
from opentelemetry.instrumentation.langchain import LangChainInstrumentor
21+
22+
@pytest.fixture(scope="function", name="span_exporter")
23+
def fixture_span_exporter():
24+
exporter = InMemorySpanExporter()
25+
yield exporter
26+
27+
28+
@pytest.fixture(scope="function", name="log_exporter")
29+
def fixture_log_exporter():
30+
exporter = InMemoryLogExporter()
31+
yield exporter
32+
33+
34+
@pytest.fixture(scope="function", name="metric_reader")
35+
def fixture_metric_reader():
36+
exporter = InMemoryMetricReader()
37+
yield exporter
38+
39+
40+
@pytest.fixture(scope="function", name="tracer_provider")
41+
def fixture_tracer_provider(span_exporter):
42+
provider = TracerProvider()
43+
provider.add_span_processor(SimpleSpanProcessor(span_exporter))
44+
return provider
45+
46+
47+
# # not sure if needed
48+
# @pytest.fixture(scope="function", name="event_logger_provider")
49+
# def fixture_event_logger_provider(log_exporter):
50+
# provider = LoggerProvider()
51+
# provider.add_log_record_processor(SimpleLogRecordProcessor(log_exporter))
52+
# event_logger_provider = EventLoggerProvider(provider)
53+
54+
# return event_logger_provider
55+
56+
57+
# # not sure if needed
58+
# @pytest.fixture(scope="function", name="meter_provider")
59+
# def fixture_meter_provider(metric_reader):
60+
# meter_provider = MeterProvider(
61+
# metric_readers=[metric_reader],
62+
# )
63+
64+
# return meter_provider
65+
66+
67+
@pytest.fixture(autouse=True)
68+
def environment():
69+
70+
if not os.getenv("AWS_ACCESS_KEY_ID"):
71+
os.environ["AWS_ACCESS_KEY_ID"] = "test_aws_access_key_id"
72+
73+
if not os.getenv("AWS_SECRET_ACCESS_KEY"):
74+
os.environ["AWS_SECRET_ACCESS_KEY"] = "test_aws_secret_access_key"
75+
76+
if not os.getenv("AWS_REGION"):
77+
os.environ["AWS_REGION"] = "us-west-2"
78+
79+
if not os.getenv("AWS_BEDROCK_ENDPOINT_URL"):
80+
os.environ["AWS_BEDROCK_ENDPOINT_URL"] = "https://bedrock.us-west-2.amazonaws.com"
81+
82+
if not os.getenv("AWS_PROFILE"):
83+
os.environ["AWS_PROFILE"] = "default"
84+
85+
86+
87+
88+
def scrub_aws_credentials(response):
89+
"""Remove sensitive data from response headers."""
90+
if "headers" in response:
91+
for sensitive_header in [
92+
"x-amz-security-token",
93+
"x-amz-request-id",
94+
"x-amzn-requestid",
95+
"x-amz-id-2"
96+
]:
97+
if sensitive_header in response["headers"]:
98+
response["headers"][sensitive_header] = ["REDACTED"]
99+
return response
100+
101+
@pytest.fixture(scope="module")
102+
def vcr_config():
103+
return {
104+
"filter_headers": [
105+
("authorization", "AWS4-HMAC-SHA256 REDACTED"),
106+
("x-amz-date", "REDACTED_DATE"),
107+
("x-amz-security-token", "REDACTED_TOKEN"),
108+
("x-amz-content-sha256", "REDACTED_CONTENT_HASH"),
109+
],
110+
"filter_query_parameters": [
111+
("X-Amz-Security-Token", "REDACTED"),
112+
("X-Amz-Signature", "REDACTED"),
113+
],
114+
"decode_compressed_response": True,
115+
"before_record_response": scrub_aws_credentials,
116+
}
117+
118+
119+
@pytest.fixture(scope="function")
120+
def instrument_no_content(
121+
tracer_provider
122+
):
123+
os.environ.update(
124+
{OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT: "False"}
125+
)
126+
127+
instrumentor = LangChainInstrumentor()
128+
instrumentor.instrument(
129+
tracer_provider=tracer_provider,
130+
)
131+
yield instrumentor
132+
os.environ.pop(OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT, None)
133+
instrumentor.uninstrument()
134+
135+
136+
@pytest.fixture(scope="function")
137+
def instrument_with_content(
138+
tracer_provider
139+
):
140+
os.environ.update(
141+
{OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT: "True"}
142+
)
143+
instrumentor = LangChainInstrumentor()
144+
instrumentor.instrument(
145+
tracer_provider=tracer_provider
146+
)
147+
148+
yield instrumentor
149+
os.environ.pop(OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT, None)
150+
instrumentor.uninstrument()
151+
152+
153+
@pytest.fixture(scope="function")
154+
def instrument_with_content_unsampled(
155+
span_exporter
156+
):
157+
os.environ.update(
158+
{OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT: "True"}
159+
)
160+
161+
tracer_provider = TracerProvider(sampler=ALWAYS_OFF)
162+
tracer_provider.add_span_processor(SimpleSpanProcessor(span_exporter))
163+
164+
instrumentor = LangChainInstrumentor()
165+
instrumentor.instrument(
166+
tracer_provider=tracer_provider
167+
)
168+
169+
yield instrumentor
170+
os.environ.pop(OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT, None)
171+
instrumentor.uninstrument()
172+

instrumentation-genai/opentelemetry-instrumentation-langchain/tests/test_agents.py

Whitespace-only changes.

0 commit comments

Comments
 (0)