24
24
* The ``http.route`` Span attribute is set so that one can see which URL rule
25
25
matched a request.
26
26
27
+ SQLCOMMENTER
28
+ *****************************************
29
+ You can optionally configure Flask instrumentation to enable sqlcommenter which enriches
30
+ the query with contextual information.
31
+
32
+ Usage
33
+ -----
34
+
35
+ .. code:: python
36
+
37
+ from opentelemetry.instrumentation.flask import FlaskInstrumentor
38
+
39
+ FlaskInstrumentor().instrument(enable_commenter=True, commenter_options={})
40
+
41
+
42
+ For example,
43
+ ::
44
+
45
+ FlaskInstrumentor when used with SQLAlchemyInstrumentor or Psycopg2Instrumentor, invoking cursor.execute("select * from auth_users")
46
+ will lead to sql query "select * from auth_users" but when SQLCommenter is enabled
47
+ the query will get appended with some configurable tags like "select * from auth_users /*metrics=value*/;"
48
+
49
+ Inorder for the commenter to append flask related tags to sql queries, the commenter needs to enabled on
50
+ the respective SQLAlchemyInstrumentor or Psycopg2Instrumentor framework too.
51
+
52
+ SQLCommenter Configurations
53
+ ***************************
54
+ We can configure the tags to be appended to the sqlquery log by adding configuration inside commenter_options(default:{}) keyword
55
+
56
+ framework = True(Default) or False
57
+
58
+ For example,
59
+ ::
60
+ Enabling this flag will add flask and it's version which is /*flask%%3A2.9.3*/
61
+
62
+ route = True(Default) or False
63
+
64
+ For example,
65
+ ::
66
+ Enabling this flag will add route uri /*route='/home'*/
67
+
68
+ controller = True(Default) or False
69
+
70
+ For example,
71
+ ::
72
+ Enabling this flag will add controller name /*controller='home_view'*/
73
+
27
74
Usage
28
75
-----
29
76
@@ -255,6 +302,8 @@ def _wrapped_before_request(
255
302
request_hook = None ,
256
303
tracer = None ,
257
304
excluded_urls = None ,
305
+ enable_commenter = True ,
306
+ commenter_options = None ,
258
307
):
259
308
def _before_request ():
260
309
if excluded_urls and excluded_urls .url_disabled (flask .request .url ):
@@ -300,6 +349,30 @@ def _before_request():
300
349
flask_request_environ [_ENVIRON_SPAN_KEY ] = span
301
350
flask_request_environ [_ENVIRON_TOKEN ] = token
302
351
352
+ if enable_commenter :
353
+ current_context = context .get_current ()
354
+ flask_info = {}
355
+
356
+ # https://flask.palletsprojects.com/en/1.1.x/api/#flask.has_request_context
357
+ if flask and flask .request :
358
+ if commenter_options .get ("framework" , True ):
359
+ flask_info ["framework" ] = f"flask:{ flask .__version__ } "
360
+ if (
361
+ commenter_options .get ("controller" , True )
362
+ and flask .request .endpoint
363
+ ):
364
+ flask_info ["controller" ] = flask .request .endpoint
365
+ if (
366
+ commenter_options .get ("route" , True )
367
+ and flask .request .url_rule
368
+ and flask .request .url_rule .rule
369
+ ):
370
+ flask_info ["route" ] = flask .request .url_rule .rule
371
+ sqlcommenter_context = context .set_value (
372
+ "SQLCOMMENTER_ORM_TAGS_AND_VALUES" , flask_info , current_context
373
+ )
374
+ context .attach (sqlcommenter_context )
375
+
303
376
return _before_request
304
377
305
378
@@ -336,6 +409,8 @@ class _InstrumentedFlask(flask.Flask):
336
409
_tracer_provider = None
337
410
_request_hook = None
338
411
_response_hook = None
412
+ _enable_commenter = True
413
+ _commenter_options = None
339
414
_meter_provider = None
340
415
341
416
def __init__ (self , * args , ** kwargs ):
@@ -374,6 +449,8 @@ def __init__(self, *args, **kwargs):
374
449
_InstrumentedFlask ._request_hook ,
375
450
tracer ,
376
451
excluded_urls = _InstrumentedFlask ._excluded_urls ,
452
+ enable_commenter = _InstrumentedFlask ._enable_commenter ,
453
+ commenter_options = _InstrumentedFlask ._commenter_options ,
377
454
)
378
455
self ._before_request = _before_request
379
456
self .before_request (_before_request )
@@ -410,6 +487,11 @@ def _instrument(self, **kwargs):
410
487
if excluded_urls is None
411
488
else parse_excluded_urls (excluded_urls )
412
489
)
490
+ enable_commenter = kwargs .get ("enable_commenter" , True )
491
+ _InstrumentedFlask ._enable_commenter = enable_commenter
492
+
493
+ commenter_options = kwargs .get ("commenter_options" , {})
494
+ _InstrumentedFlask ._commenter_options = commenter_options
413
495
meter_provider = kwargs .get ("meter_provider" )
414
496
_InstrumentedFlask ._meter_provider = meter_provider
415
497
flask .Flask = _InstrumentedFlask
@@ -424,6 +506,8 @@ def instrument_app(
424
506
response_hook = None ,
425
507
tracer_provider = None ,
426
508
excluded_urls = None ,
509
+ enable_commenter = True ,
510
+ commenter_options = None ,
427
511
meter_provider = None ,
428
512
):
429
513
if not hasattr (app , "_is_instrumented_by_opentelemetry" ):
@@ -462,6 +546,10 @@ def instrument_app(
462
546
request_hook ,
463
547
tracer ,
464
548
excluded_urls = excluded_urls ,
549
+ enable_commenter = enable_commenter ,
550
+ commenter_options = commenter_options
551
+ if commenter_options
552
+ else {},
465
553
)
466
554
app ._before_request = _before_request
467
555
app .before_request (_before_request )
0 commit comments