25
25
# --------------------------------------------------------------------------
26
26
"""Traces network calls using the implementation library from the settings."""
27
27
28
- from azure .core .pipeline import PipelineRequest , PipelineResponse
29
28
from azure .core .tracing .context import tracing_context
30
- from azure .core .tracing .abstract_span import AbstractSpan
31
29
from azure .core .tracing .common import set_span_contexts
32
30
from azure .core .pipeline .policies import SansIOHTTPPolicy
33
31
from azure .core .settings import settings
34
32
35
- try :
36
- from urllib .parse import urlparse
37
- except ImportError :
38
- from urlparse import urlparse
33
+ from six .moves import urllib
39
34
40
35
try :
41
36
from typing import TYPE_CHECKING
42
37
except ImportError :
43
38
TYPE_CHECKING = False
44
39
45
40
if TYPE_CHECKING :
46
- from typing import Any , Optional
47
- from azure .core .pipeline .transport import HttpRequest , HttpResponse
41
+ # the HttpRequest and HttpResponse related type ignores stem from this issue: #5796
42
+ from azure .core .pipeline .transport import HttpRequest , HttpResponse # pylint: disable=ungrouped-imports
43
+ from azure .core .tracing .abstract_span import AbstractSpan # pylint: disable=ungrouped-imports
44
+ from azure .core .pipeline import PipelineRequest , PipelineResponse # pylint: disable=ungrouped-imports
45
+ from typing import Any , Optional , Dict , List , Union
48
46
49
47
50
48
class DistributedTracingPolicy (SansIOHTTPPolicy ):
51
49
"""The policy to create spans for Azure Calls"""
52
50
53
51
def __init__ (self ):
54
52
# type: () -> None
55
- self .parent_span_dict = {}
53
+ self .parent_span_dict = {} # type: Dict[AbstractSpan, List[Union[AbstractSpan, Any]]]
56
54
self ._request_id = "x-ms-client-request-id"
57
55
self ._response_id = "x-ms-request-id"
58
56
59
57
def set_header (self , request , span ):
60
- # type: (PipelineRequest[HttpRequest] , Any) -> None
58
+ # type: (PipelineRequest, Any) -> None
61
59
"""
62
60
Sets the header information on the span.
63
61
"""
64
62
headers = span .to_header ()
65
- request .http_request .headers .update (headers )
63
+ request .http_request .headers .update (headers ) # type: ignore
66
64
67
65
def on_request (self , request ):
68
- # type: (PipelineRequest[HttpRequest], Any ) -> None
66
+ # type: (PipelineRequest) -> None
69
67
parent_span = tracing_context .current_span .get ()
70
68
wrapper_class = settings .tracing_implementation ()
71
69
original_context = [parent_span , None ]
@@ -77,7 +75,7 @@ def on_request(self, request):
77
75
if parent_span is None :
78
76
return
79
77
80
- path = urlparse (request .http_request .url ).path
78
+ path = urllib . parse . urlparse (request .http_request .url ).path # type: ignore
81
79
if not path :
82
80
path = "/"
83
81
child = parent_span .span (name = path )
@@ -99,12 +97,15 @@ def end_span(self, request, response=None):
99
97
if response and self ._response_id in response .headers :
100
98
span .add_attribute (self ._response_id , response .headers [self ._response_id ])
101
99
span .finish ()
102
- set_span_contexts (* self .parent_span_dict .pop (span , None ))
100
+ original_context = self .parent_span_dict .pop (span , None )
101
+ if original_context :
102
+ set_span_contexts (original_context [0 ], original_context [1 ])
103
103
104
104
def on_response (self , request , response ):
105
- # type: (PipelineRequest[HttpRequest] , PipelineResponse[HttpRequest, HttpResponse], Any ) -> None
106
- self .end_span (request .http_request , response = response .http_response )
105
+ # type: (PipelineRequest, PipelineResponse) -> None
106
+ self .end_span (request .http_request , response = response .http_response ) # type: ignore
107
107
108
108
def on_exception (self , _request ): # pylint: disable=unused-argument
109
- # type: (PipelineRequest[HttpRequest], Any) -> bool
110
- self .end_span (_request .http_request )
109
+ # type: (PipelineRequest) -> bool
110
+ self .end_span (_request .http_request ) # type: ignore
111
+ return False
0 commit comments