1
1
import unittest
2
- from unittest .mock import patch
2
+ from unittest .mock import MagicMock , patch
3
3
4
4
from opentelemetry import context , trace
5
5
@@ -13,13 +13,77 @@ def tearDown(self) -> None:
13
13
self ._patcher .stop ()
14
14
15
15
def test_get_tracer (self ):
16
- """trace.get_tracer should proxy to the global tracer provider."""
17
- trace .get_tracer ("foo" , "var" )
18
- self ._mock_tracer_provider .get_tracer .assert_called_with ("foo" , "var" )
16
+ """trace.get_tracer should create a proxy to the global tracer provider."""
17
+ tracer = trace .get_tracer ("foo" , "var" )
18
+ self ._mock_tracer_provider .get_tracer .assert_not_called ()
19
+ self .assertIsInstance (tracer , trace .ProxyTracer )
20
+
21
+ tracer .start_span ("one" )
22
+ tracer .start_span ("two" )
23
+ self ._mock_tracer_provider .get_tracer .assert_called_once_with (
24
+ instrumenting_module_name = "foo" ,
25
+ instrumenting_library_version = "var" ,
26
+ )
27
+
19
28
mock_provider = unittest .mock .Mock ()
20
29
trace .get_tracer ("foo" , "var" , mock_provider )
21
30
mock_provider .get_tracer .assert_called_with ("foo" , "var" )
22
31
32
+ def test_set_tracer_provider (self ):
33
+ """trace.get_tracer should update global tracer provider."""
34
+ self .assertIs (
35
+ trace ._TRACER_PROVIDER , # pylint: disable=protected-access
36
+ self ._mock_tracer_provider ,
37
+ )
38
+
39
+ tracer_provider1 = trace .DefaultTracerProvider ()
40
+ trace .set_tracer_provider (tracer_provider1 )
41
+ self .assertIs (
42
+ trace ._TRACER_PROVIDER , # pylint: disable=protected-access
43
+ tracer_provider1 ,
44
+ )
45
+
46
+ tracer_provider2 = trace .DefaultTracerProvider ()
47
+ trace .set_tracer_provider (tracer_provider2 )
48
+ self .assertIs (
49
+ trace ._TRACER_PROVIDER , # pylint: disable=protected-access
50
+ tracer_provider2 ,
51
+ )
52
+
53
+ @patch ("opentelemetry.trace._load_trace_provider" )
54
+ def test_get_tracer_provider (self , load_trace_provider_mock ):
55
+ """trace.get_tracer should get or create a global tracer provider."""
56
+ load_trace_provider_mock .assert_not_called ()
57
+
58
+ tracer_provider = trace .get_tracer_provider ()
59
+ self .assertIs (
60
+ trace ._TRACER_PROVIDER , # pylint: disable=protected-access
61
+ tracer_provider ,
62
+ )
63
+ load_trace_provider_mock .assert_not_called ()
64
+
65
+ trace ._TRACER_PROVIDER = None # pylint: disable=protected-access
66
+ tracer_provider1 = trace .get_tracer_provider ()
67
+ self .assertIsNotNone (
68
+ trace ._TRACER_PROVIDER # pylint: disable=protected-access
69
+ )
70
+ self .assertIs (
71
+ trace ._TRACER_PROVIDER , # pylint: disable=protected-access
72
+ tracer_provider1 ,
73
+ )
74
+ load_trace_provider_mock .assert_called_once_with ("tracer_provider" )
75
+
76
+ tracer_provider2 = trace .get_tracer_provider ()
77
+ self .assertIsNotNone (
78
+ trace ._TRACER_PROVIDER # pylint: disable=protected-access
79
+ )
80
+ self .assertIs (
81
+ trace ._TRACER_PROVIDER , # pylint: disable=protected-access
82
+ tracer_provider2 ,
83
+ )
84
+ self .assertIs (tracer_provider1 , tracer_provider2 )
85
+ load_trace_provider_mock .assert_called_once_with ("tracer_provider" )
86
+
23
87
24
88
class TestTracer (unittest .TestCase ):
25
89
def setUp (self ):
@@ -38,3 +102,109 @@ def test_get_current_span(self):
38
102
finally :
39
103
context .detach (token )
40
104
self .assertEqual (trace .get_current_span (), trace .INVALID_SPAN )
105
+
106
+
107
+ class TestProxyTracer (unittest .TestCase ):
108
+ def setUp (self ):
109
+ self ._patcher = patch ("opentelemetry.trace._TRACER_PROVIDER" )
110
+ self ._patcher .start ()
111
+
112
+ self .proxy_tracer = trace .get_tracer ("foo" , "var" )
113
+ self .inner_tracer = MagicMock (wraps = trace .DefaultTracer ())
114
+
115
+ tracer_provider = MagicMock (wraps = trace .DefaultTracerProvider ())
116
+ tracer_provider .get_tracer .return_value = self .inner_tracer
117
+ trace .set_tracer_provider (tracer_provider )
118
+
119
+ def tearDown (self ):
120
+ self ._patcher .stop ()
121
+
122
+ def test_start_span (self ):
123
+ """ProxyTracer should call `start_span` on a real `Tracer`
124
+ """
125
+ self .inner_tracer .start_span .assert_not_called ()
126
+
127
+ span = self .proxy_tracer .start_span ("span1" )
128
+ self .assertIs (span , trace .INVALID_SPAN )
129
+ self .inner_tracer .start_span .assert_called_once_with (
130
+ name = "span1" ,
131
+ context = None ,
132
+ kind = trace .SpanKind .INTERNAL ,
133
+ attributes = None ,
134
+ links = (),
135
+ start_time = None ,
136
+ record_exception = True ,
137
+ set_status_on_exception = True ,
138
+ )
139
+
140
+ def test_start_as_current_span (self ):
141
+ """ProxyTracer should call `start_as_current_span` on a real `Tracer`
142
+ """
143
+ self .inner_tracer .start_as_current_span .assert_not_called ()
144
+
145
+ with self .proxy_tracer .start_as_current_span ("span1" ) as span :
146
+ self .assertIs (span , trace .INVALID_SPAN )
147
+ self .inner_tracer .start_as_current_span .assert_called_once_with (
148
+ name = "span1" ,
149
+ context = None ,
150
+ kind = trace .SpanKind .INTERNAL ,
151
+ attributes = None ,
152
+ links = (),
153
+ start_time = None ,
154
+ record_exception = True ,
155
+ set_status_on_exception = True ,
156
+ )
157
+
158
+ self .inner_tracer .start_as_current_span .reset_mock ()
159
+
160
+ @self .proxy_tracer .start_as_current_span ("span1" )
161
+ def func (arg , kwarg ):
162
+ self .assertEqual (arg , "argval" )
163
+ self .assertEqual (kwarg , "kwargval" )
164
+ return "retval"
165
+
166
+ self .inner_tracer .start_as_current_span .assert_not_called ()
167
+
168
+ result = func ("argval" , kwarg = "kwargval" )
169
+ self .assertEqual (result , "retval" )
170
+
171
+ self .inner_tracer .start_as_current_span .assert_called_once_with (
172
+ name = "span1" ,
173
+ context = None ,
174
+ kind = trace .SpanKind .INTERNAL ,
175
+ attributes = None ,
176
+ links = (),
177
+ start_time = None ,
178
+ record_exception = True ,
179
+ set_status_on_exception = True ,
180
+ )
181
+
182
+ def test_use_span (self ):
183
+ """ProxyTracer should call `use_span` on a real `Tracer`
184
+ """
185
+ self .inner_tracer .use_span .assert_not_called ()
186
+
187
+ span = self .proxy_tracer .start_span ("span1" )
188
+
189
+ with self .proxy_tracer .use_span (span ) as current_context :
190
+ self .assertIsNone (current_context )
191
+ self .inner_tracer .use_span .assert_called_once_with (
192
+ span = span , end_on_exit = False ,
193
+ )
194
+
195
+ self .inner_tracer .use_span .reset_mock ()
196
+
197
+ @self .proxy_tracer .use_span (span )
198
+ def func (arg , kwarg ):
199
+ self .assertEqual (arg , "argval" )
200
+ self .assertEqual (kwarg , "kwargval" )
201
+ return "retval"
202
+
203
+ self .inner_tracer .use_span .assert_not_called ()
204
+
205
+ result = func ("argval" , kwarg = "kwargval" )
206
+ self .assertEqual (result , "retval" )
207
+
208
+ self .inner_tracer .use_span .assert_called_once_with (
209
+ span = span , end_on_exit = False ,
210
+ )
0 commit comments