@@ -58,6 +58,9 @@ def hello():
58
58
from opentelemetry .propagate import extract
59
59
from opentelemetry .util ._time import _time_ns
60
60
from opentelemetry .util .http import get_excluded_urls
61
+ from opentelemetry .sdk .trace import Span
62
+
63
+
61
64
62
65
_logger = getLogger (__name__ )
63
66
@@ -69,6 +72,7 @@ def hello():
69
72
70
73
_excluded_urls = get_excluded_urls ("FLASK" )
71
74
75
+ """FIND REPLACEMENT FOR Callable"""
72
76
73
77
def get_default_span_name ():
74
78
span_name = ""
@@ -78,6 +82,11 @@ def get_default_span_name():
78
82
span_name = otel_wsgi .get_default_span_name (flask .request .environ )
79
83
return span_name
80
84
85
+ def otel_request_hook_default (span , request ):
86
+ return "hi"
87
+
88
+ def otel_response_hook_default (span , request , response ):
89
+ return "hey"
81
90
82
91
def _rewrapped_app (wsgi_app ):
83
92
def _wrapped_app (wrapped_app_environ , start_response ):
@@ -95,12 +104,17 @@ def _start_response(status, response_headers, *args, **kwargs):
95
104
otel_wsgi .add_response_attributes (
96
105
span , status , response_headers
97
106
)
107
+ if _InstrumentedFlask .otel_response_hook :
108
+ _InstrumentedFlask .otel_response_hook (
109
+ span , flask .request .environ , flask .Response
110
+ )
98
111
else :
99
112
_logger .warning (
100
113
"Flask environ's OpenTelemetry span "
101
114
"missing at _start_response(%s)" ,
102
115
status ,
103
116
)
117
+
104
118
105
119
return start_response (status , response_headers , * args , ** kwargs )
106
120
@@ -109,13 +123,14 @@ def _start_response(status, response_headers, *args, **kwargs):
109
123
return _wrapped_app
110
124
111
125
112
- def _wrapped_before_request (name_callback ):
126
+ def _wrapped_before_request (name_callback , otel_request_hook ):
113
127
def _before_request ():
114
128
if _excluded_urls .url_disabled (flask .request .url ):
115
129
return
116
130
117
131
flask_request_environ = flask .request .environ
118
132
span_name = name_callback ()
133
+ # request_hook = otel_request_hook()
119
134
token = context .attach (
120
135
extract (flask_request_environ , getter = otel_wsgi .wsgi_getter )
121
136
)
@@ -124,6 +139,7 @@ def _before_request():
124
139
125
140
span = tracer .start_span (
126
141
span_name ,
142
+ # request_hook,
127
143
kind = trace .SpanKind .SERVER ,
128
144
start_time = flask_request_environ .get (_ENVIRON_STARTTIME_KEY ),
129
145
)
@@ -143,6 +159,9 @@ def _before_request():
143
159
flask_request_environ [_ENVIRON_ACTIVATION_KEY ] = activation
144
160
flask_request_environ [_ENVIRON_SPAN_KEY ] = span
145
161
flask_request_environ [_ENVIRON_TOKEN ] = token
162
+
163
+ if _InstrumentedFlask .otel_request_hook :
164
+ _InstrumentedFlask .otel_request_hook (span , flask_request_environ )
146
165
147
166
return _before_request
148
167
@@ -171,6 +190,8 @@ def _teardown_request(exc):
171
190
class _InstrumentedFlask (flask .Flask ):
172
191
173
192
name_callback = get_default_span_name
193
+ otel_request_hook = otel_request_hook_default
194
+ otel_response_hook = otel_response_hook_default
174
195
175
196
def __init__ (self , * args , ** kwargs ):
176
197
super ().__init__ (* args , ** kwargs )
@@ -179,7 +200,8 @@ def __init__(self, *args, **kwargs):
179
200
self .wsgi_app = _rewrapped_app (self .wsgi_app )
180
201
181
202
_before_request = _wrapped_before_request (
182
- _InstrumentedFlask .name_callback
203
+ _InstrumentedFlask .name_callback ,
204
+ _InstrumentedFlask .otel_request_hook ,
183
205
)
184
206
self ._before_request = _before_request
185
207
self .before_request (_before_request )
@@ -193,15 +215,24 @@ class FlaskInstrumentor(BaseInstrumentor):
193
215
See `BaseInstrumentor`
194
216
"""
195
217
218
+ """
219
+ THIS SHOULD BE DONE
220
+ """
196
221
def _instrument (self , ** kwargs ):
197
222
self ._original_flask = flask .Flask
223
+ otel_request_hook = kwargs .pop ("request_hook" , None )
224
+ otel_response_hook = kwargs .pop ("response_hook" , None )
198
225
name_callback = kwargs .get ("name_callback" )
199
226
if callable (name_callback ):
200
227
_InstrumentedFlask .name_callback = name_callback
228
+ if callable (otel_request_hook ):
229
+ _InstrumentedFlask .otel_request_hook = otel_request_hook
230
+ if callable (otel_response_hook ):
231
+ _InstrumentedFlask .otel_response_hook = otel_response_hook
201
232
flask .Flask = _InstrumentedFlask
202
233
203
234
def instrument_app (
204
- self , app , name_callback = get_default_span_name
235
+ self , app , name_callback = get_default_span_name , otel_request_hook = otel_request_hook_default
205
236
): # pylint: disable=no-self-use
206
237
if not hasattr (app , "_is_instrumented" ):
207
238
app ._is_instrumented = False
@@ -210,7 +241,7 @@ def instrument_app(
210
241
app ._original_wsgi_app = app .wsgi_app
211
242
app .wsgi_app = _rewrapped_app (app .wsgi_app )
212
243
213
- _before_request = _wrapped_before_request (name_callback )
244
+ _before_request = _wrapped_before_request (name_callback , otel_request_hook )
214
245
app ._before_request = _before_request
215
246
app .before_request (_before_request )
216
247
app .teardown_request (_teardown_request )
0 commit comments