Skip to content

Commit 29bb827

Browse files
fix PR comments and tests
1 parent 88046cd commit 29bb827

6 files changed

Lines changed: 70 additions & 43 deletions

File tree

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Copyright (c) Microsoft Corporation.
22
# Licensed under the MIT License.
33

4+
from .agent365_exporter_options import Agent365ExporterOptions
5+
46
# Agent365Exporter is not exported intentionally.
57
# It should only be used internally by the observability core module.
68
__all__ = ["Agent365ExporterOptions"]

tests/observability/core/test_agent365.py

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
Agent365ExporterOptions,
1010
)
1111
from microsoft_agents_a365.observability.core.trace_processor import SpanProcessor
12-
from opentelemetry import trace as otel_trace
1312
from opentelemetry.sdk.resources import Resource
1413
from opentelemetry.sdk.trace import TracerProvider
1514

@@ -19,18 +18,28 @@ class TestAgent365Configure(unittest.TestCase):
1918

2019
def setUp(self):
2120
"""Set up test fixtures."""
21+
# Reset TelemetryManager state before each test
22+
from microsoft_agents_a365.observability.core.config import _telemetry_manager
23+
from microsoft_agents_a365.observability.core.opentelemetry_scope import OpenTelemetryScope
24+
25+
_telemetry_manager._tracer_provider = None
26+
_telemetry_manager._span_processors = {}
27+
OpenTelemetryScope._tracer = None
28+
2229
self.mock_token_resolver = Mock()
2330
self.mock_token_resolver.return_value = "test_token_123"
2431

2532
def tearDown(self):
2633
"""Clean up after each test."""
2734
# Reset the telemetry manager singleton state
2835
from microsoft_agents_a365.observability.core.config import _telemetry_manager
36+
from microsoft_agents_a365.observability.core.opentelemetry_scope import OpenTelemetryScope
2937

3038
_telemetry_manager._tracer_provider = None
3139
_telemetry_manager._span_processors = {}
40+
OpenTelemetryScope._tracer = None
3241

33-
otel_trace._TRACER_PROVIDER = None
42+
# Do NOT reset otel_trace._TRACER_PROVIDER to None to avoid NonRecordingSpan issues in other tests
3443

3544
def test_configure_basic_functionality(self):
3645
"""Test configure function with basic parameters and legacy parameters."""
@@ -144,39 +153,6 @@ def test_configure_prevents_duplicate_initialization(self):
144153
mock_logger.warning.assert_called_once()
145154
self.assertIn("already configured", mock_logger.warning.call_args[0][0].lower())
146155

147-
@patch("microsoft_agents_a365.observability.core.config.is_agent365_exporter_enabled")
148-
@patch("microsoft_agents_a365.observability.core.config.TracerProvider")
149-
def test_configure_creates_new_tracer_provider(self, mock_provider_class, mock_is_enabled):
150-
"""Test configure() creates new TracerProvider when none exists and adds processors."""
151-
mock_is_enabled.return_value = False
152-
153-
new_provider = TracerProvider(
154-
resource=Resource.create({
155-
"service.name": "test-service",
156-
"service.namespace": "test-namespace",
157-
})
158-
)
159-
mock_provider_class.return_value = new_provider
160-
161-
result = configure(service_name="test-service", service_namespace="test-namespace")
162-
self.assertTrue(result)
163-
164-
# Verify both processors were added by inspecting the MultiSpanProcessor
165-
166-
active_processor = new_provider._active_span_processor
167-
self.assertIsNotNone(active_processor)
168-
169-
# MultiSpanProcessor has a _span_processors list
170-
processors = active_processor._span_processors
171-
self.assertEqual(
172-
len(processors), 2, "Should have 2 processors: BatchSpanProcessor and SpanProcessor"
173-
)
174-
175-
# Verify types of processors
176-
processor_types = [type(p).__name__ for p in processors]
177-
self.assertIn("BatchSpanProcessor", processor_types)
178-
self.assertIn("SpanProcessor", processor_types)
179-
180156
@patch("microsoft_agents_a365.observability.core.config.is_agent365_exporter_enabled")
181157
@patch("microsoft_agents_a365.observability.core.config.trace.get_tracer_provider")
182158
def test_configure_uses_existing_tracer_provider(self, mock_get_provider, mock_is_enabled):

tests/observability/core/test_execute_tool_scope.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,28 @@
22
# Licensed under the MIT License.
33

44
import os
5-
from pathlib import Path
65
import sys
76
import unittest
8-
import pytest
7+
from pathlib import Path
98

9+
import pytest
1010
from microsoft_agents_a365.observability.core import (
1111
AgentDetails,
12-
ExecutionType,
1312
ExecuteToolScope,
13+
ExecutionType,
1414
Request,
1515
SourceMetadata,
1616
TenantDetails,
1717
ToolCallDetails,
1818
configure,
1919
get_tracer_provider,
2020
)
21+
from microsoft_agents_a365.observability.core.config import _telemetry_manager
2122
from microsoft_agents_a365.observability.core.constants import (
2223
GEN_AI_EXECUTION_SOURCE_DESCRIPTION_KEY,
2324
GEN_AI_EXECUTION_SOURCE_NAME_KEY,
2425
)
26+
from microsoft_agents_a365.observability.core.opentelemetry_scope import OpenTelemetryScope
2527
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
2628
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
2729

@@ -56,6 +58,17 @@ def setUpClass(cls):
5658
def setUp(self):
5759
super().setUp()
5860

61+
# Reset TelemetryManager state to ensure fresh configuration
62+
_telemetry_manager._tracer_provider = None
63+
_telemetry_manager._span_processors = {}
64+
OpenTelemetryScope._tracer = None
65+
66+
# Reconfigure to get a fresh TracerProvider
67+
configure(
68+
service_name="test-execute-tool-service",
69+
service_namespace="test-namespace",
70+
)
71+
5972
# Set up tracer to capture spans
6073
self.span_exporter = InMemorySpanExporter()
6174
tracer_provider = get_tracer_provider()

tests/observability/core/test_inference_scope.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
# Licensed under the MIT License.
33

44
import os
5-
from pathlib import Path
65
import sys
76
import unittest
8-
import pytest
7+
from pathlib import Path
98

9+
import pytest
1010
from microsoft_agents_a365.observability.core import (
1111
ExecutionType,
1212
InferenceCallDetails,
@@ -19,10 +19,12 @@
1919
get_tracer_provider,
2020
)
2121
from microsoft_agents_a365.observability.core.agent_details import AgentDetails
22+
from microsoft_agents_a365.observability.core.config import _telemetry_manager
2223
from microsoft_agents_a365.observability.core.constants import (
2324
GEN_AI_EXECUTION_SOURCE_DESCRIPTION_KEY,
2425
GEN_AI_EXECUTION_SOURCE_NAME_KEY,
2526
)
27+
from microsoft_agents_a365.observability.core.opentelemetry_scope import OpenTelemetryScope
2628
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
2729
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
2830

@@ -47,11 +49,21 @@ def setUpClass(cls):
4749
def setUp(self):
4850
super().setUp()
4951

52+
# Reset TelemetryManager state to ensure fresh configuration
53+
_telemetry_manager._tracer_provider = None
54+
_telemetry_manager._span_processors = {}
55+
OpenTelemetryScope._tracer = None
56+
57+
# Reconfigure to get a fresh TracerProvider
58+
configure(
59+
service_name="test-inference-service",
60+
service_namespace="test-namespace",
61+
)
62+
5063
# Set up tracer to capture spans
5164
self.span_exporter = InMemorySpanExporter()
5265
tracer_provider = get_tracer_provider()
5366
tracer_provider.add_span_processor(SimpleSpanProcessor(self.span_exporter))
54-
# trace.set_tracer_provider(tracer_provider)
5567

5668
def tearDown(self):
5769
super().tearDown()

tests/observability/core/test_invoke_agent_scope.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
# Licensed under the MIT License.
33

44
import os
5-
from pathlib import Path
65
import sys
76
import unittest
8-
import pytest
7+
from pathlib import Path
98
from urllib.parse import urlparse
109

10+
import pytest
1111
from microsoft_agents_a365.observability.core import (
1212
AgentDetails,
1313
ExecutionType,
@@ -19,6 +19,7 @@
1919
configure,
2020
get_tracer_provider,
2121
)
22+
from microsoft_agents_a365.observability.core.config import _telemetry_manager
2223
from microsoft_agents_a365.observability.core.constants import (
2324
GEN_AI_CALLER_AGENT_USER_CLIENT_IP,
2425
GEN_AI_EXECUTION_SOURCE_DESCRIPTION_KEY,
@@ -27,6 +28,7 @@
2728
GEN_AI_INPUT_MESSAGES_KEY,
2829
)
2930
from microsoft_agents_a365.observability.core.models.caller_details import CallerDetails
31+
from microsoft_agents_a365.observability.core.opentelemetry_scope import OpenTelemetryScope
3032
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
3133
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
3234

@@ -97,6 +99,18 @@ def setUpClass(cls):
9799
def setUp(self):
98100
super().setUp()
99101

102+
# Reset TelemetryManager state to ensure fresh configuration
103+
104+
_telemetry_manager._tracer_provider = None
105+
_telemetry_manager._span_processors = {}
106+
OpenTelemetryScope._tracer = None
107+
108+
# Reconfigure to get a fresh TracerProvider
109+
configure(
110+
service_name="test-invoke-agent-service",
111+
service_namespace="test-namespace",
112+
)
113+
100114
# Set up tracer to capture spans
101115
self.span_exporter = InMemorySpanExporter()
102116
tracer_provider = get_tracer_provider()

tests/observability/core/test_record_attributes.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from unittest.mock import Mock, patch
88

99
from microsoft_agents_a365.observability.core import AgentDetails, TenantDetails
10+
from microsoft_agents_a365.observability.core.config import _telemetry_manager
1011
from microsoft_agents_a365.observability.core.opentelemetry_scope import OpenTelemetryScope
1112
from opentelemetry import trace
1213
from opentelemetry.sdk.trace import TracerProvider
@@ -53,6 +54,15 @@ def setUpClass(cls):
5354

5455
def setUp(self):
5556
"""Clear spans before each test."""
57+
# Reset TelemetryManager state to ensure fresh configuration
58+
_telemetry_manager._tracer_provider = None
59+
_telemetry_manager._span_processors = {}
60+
61+
# Create a fresh TracerProvider for this test
62+
provider = TracerProvider()
63+
trace.set_tracer_provider(provider)
64+
provider.add_span_processor(SimpleSpanProcessor(self.exporter))
65+
5666
# Force OpenTelemetryScope to refresh its tracer reference
5767
OpenTelemetryScope._tracer = None
5868
self.exporter.clear()

0 commit comments

Comments
 (0)