7
7
import wrapt
8
8
9
9
from ...log import logger
10
- from ...tracer import internal_tracer
10
+ from ...tracer import internal_tracer as tracer
11
11
12
12
DJ_INSTANA_MIDDLEWARE = 'instana.instrumentation.django.middleware.InstanaMiddleware'
13
13
@@ -26,44 +26,48 @@ def __init__(self, get_response=None):
26
26
def process_request (self , request ):
27
27
try :
28
28
env = request .environ
29
+ ctx = None
29
30
if 'HTTP_X_INSTANA_T' in env and 'HTTP_X_INSTANA_S' in env :
30
- ctx = internal_tracer .extract (ot .Format .HTTP_HEADERS , env )
31
- span = internal_tracer .start_span ("django" , child_of = ctx )
32
- else :
33
- span = internal_tracer .start_span ("django" )
31
+ ctx = tracer .extract (ot .Format .HTTP_HEADERS , env )
32
+
33
+ self .scope = tracer .start_active_span ('django' , child_of = ctx )
34
34
35
- span .set_tag (ext .HTTP_URL , env ['PATH_INFO' ])
36
- span .set_tag ("http.params" , env ['QUERY_STRING' ])
37
- span .set_tag (ext .HTTP_METHOD , request .method )
38
- span .set_tag ("http.host" , env ['HTTP_HOST' ])
39
- self .span = span
35
+ self .scope .span .set_tag (ext .HTTP_METHOD , request .method )
36
+ if 'PATH_INFO' in env :
37
+ self .scope .span .set_tag (ext .HTTP_URL , env ['PATH_INFO' ])
38
+ if 'QUERY_STRING' in env :
39
+ self .scope .span .set_tag ("http.params" , env ['QUERY_STRING' ])
40
+ if 'HTTP_HOST' in env :
41
+ self .scope .span .set_tag ("http.host" , env ['HTTP_HOST' ])
40
42
except Exception as e :
41
43
logger .debug ("Instana middleware @ process_response: " , e )
42
44
43
45
def process_response (self , request , response ):
44
46
try :
45
- if self .span :
47
+ if self .scope is not None :
46
48
if 500 <= response .status_code <= 511 :
47
- self .span .set_tag ("error" , True )
48
- ec = self .span .tags .get ('ec' , 0 )
49
+ self .scope . span .set_tag ("error" , True )
50
+ ec = self .scope . span .tags .get ('ec' , 0 )
49
51
if ec is 0 :
50
- self .span .set_tag ("ec" , ec + 1 )
52
+ self .scope . span .set_tag ("ec" , ec + 1 )
51
53
52
- self .span .set_tag (ext .HTTP_STATUS_CODE , response .status_code )
53
- internal_tracer .inject (self .span .context , ot .Format .HTTP_HEADERS , response )
54
- self .span .finish ()
55
- self .span = None
54
+ self .scope .span .set_tag (ext .HTTP_STATUS_CODE , response .status_code )
55
+ tracer .inject (self .scope .span .context , ot .Format .HTTP_HEADERS , response )
56
56
except Exception as e :
57
57
logger .debug ("Instana middleware @ process_response: " , e )
58
58
finally :
59
+ self .scope .close ()
60
+ self .scope = None
59
61
return response
60
62
61
63
def process_exception (self , request , exception ):
62
- if self .span :
63
- self .span .log_kv ({'message' : exception })
64
- self .span .set_tag ("error" , True )
65
- ec = self .span .tags .get ('ec' , 0 )
66
- self .span .set_tag ("ec" , ec + 1 )
64
+ if self .scope is not None :
65
+ self .scope .span .set_tag (ext .HTTP_STATUS_CODE , 500 )
66
+ self .scope .span .set_tag ('http.error' , str (exception ))
67
+ self .scope .span .set_tag ("error" , True )
68
+ ec = self .scope .span .tags .get ('ec' , 0 )
69
+ self .scope .span .set_tag ("ec" , ec + 1 )
70
+ self .scope .close ()
67
71
68
72
69
73
def load_middleware_wrapper (wrapped , instance , args , kwargs ):
@@ -77,7 +81,7 @@ def load_middleware_wrapper(wrapped, instance, args, kwargs):
77
81
return wrapped (* args , ** kwargs )
78
82
79
83
# Save the list of middleware for Snapshot reporting
80
- internal_tracer .sensor .meter .djmw = settings .MIDDLEWARE
84
+ tracer .sensor .meter .djmw = settings .MIDDLEWARE
81
85
82
86
if type (settings .MIDDLEWARE ) is tuple :
83
87
settings .MIDDLEWARE = (DJ_INSTANA_MIDDLEWARE ,) + settings .MIDDLEWARE
@@ -91,7 +95,7 @@ def load_middleware_wrapper(wrapped, instance, args, kwargs):
91
95
return wrapped (* args , ** kwargs )
92
96
93
97
# Save the list of middleware for Snapshot reporting
94
- internal_tracer .sensor .meter .djmw = settings .MIDDLEWARE_CLASSES
98
+ tracer .sensor .meter .djmw = settings .MIDDLEWARE_CLASSES
95
99
96
100
if type (settings .MIDDLEWARE_CLASSES ) is tuple :
97
101
settings .MIDDLEWARE_CLASSES = (DJ_INSTANA_MIDDLEWARE ,) + settings .MIDDLEWARE_CLASSES
@@ -107,8 +111,9 @@ def load_middleware_wrapper(wrapped, instance, args, kwargs):
107
111
except Exception as e :
108
112
logger .warn ("Instana: Couldn't add InstanaMiddleware to Django: " , e )
109
113
114
+
110
115
try :
111
116
if 'django' in sys .modules :
112
117
wrapt .wrap_function_wrapper ('django.core.handlers.base' , 'BaseHandler.load_middleware' , load_middleware_wrapper )
113
- except :
118
+ except Exception :
114
119
pass
0 commit comments