From bbf8160124d7c46147bf835ab64eb0a1d994f40d Mon Sep 17 00:00:00 2001 From: Varsha GS Date: Tue, 2 Jan 2024 18:35:56 +0530 Subject: [PATCH 1/4] flask: capture responseHeadersOnEntrySpans Signed-off-by: Varsha GS --- instana/instrumentation/flask/vanilla.py | 24 +- instana/instrumentation/flask/with_blinker.py | 24 +- tests/apps/flask_app/app.py | 9 +- tests/frameworks/test_flask.py | 221 ++++++++++++------ 4 files changed, 191 insertions(+), 87 deletions(-) diff --git a/instana/instrumentation/flask/vanilla.py b/instana/instrumentation/flask/vanilla.py index d73fc8c1..f49af3d9 100644 --- a/instana/instrumentation/flask/vanilla.py +++ b/instana/instrumentation/flask/vanilla.py @@ -17,6 +17,21 @@ path_tpl_re = re.compile('<.*>') +def extract_custom_headers(span, headers, format): + if agent.options.extra_http_headers is None: + return + try: + for custom_header in agent.options.extra_http_headers: + # Headers are available in this format: HTTP_X_CAPTURE_THIS + flask_header = ('HTTP_' + custom_header.upper()).replace('-', '_') if format else custom_header + + if flask_header in headers: + span.set_tag("http.header.%s" % custom_header, headers[flask_header]) + + except Exception: + logger.debug("extract_custom_headers: ", exc_info=True) + + def before_request_with_instana(*argv, **kwargs): try: env = flask.request.environ @@ -25,12 +40,7 @@ def before_request_with_instana(*argv, **kwargs): flask.g.scope = tracer.start_active_span('wsgi', child_of=ctx) span = flask.g.scope.span - if agent.options.extra_http_headers is not None: - for custom_header in agent.options.extra_http_headers: - # Headers are available in this format: HTTP_X_CAPTURE_THIS - header = ('HTTP_' + custom_header.upper()).replace('-', '_') - if header in env: - span.set_tag("http.header.%s" % custom_header, env[header]) + extract_custom_headers(span, env, format=True) span.set_tag(ext.HTTP_METHOD, flask.request.method) if 'PATH_INFO' in env: @@ -68,6 +78,8 @@ def after_request_with_instana(response): span.mark_as_errored() span.set_tag(ext.HTTP_STATUS_CODE, int(response.status_code)) + extract_custom_headers(span, response.headers, format=False) + tracer.inject(scope.span.context, opentracing.Format.HTTP_HEADERS, response.headers) response.headers.add('Server-Timing', "intid;desc=%s" % scope.span.context.trace_id) except: diff --git a/instana/instrumentation/flask/with_blinker.py b/instana/instrumentation/flask/with_blinker.py index da146108..955896d8 100644 --- a/instana/instrumentation/flask/with_blinker.py +++ b/instana/instrumentation/flask/with_blinker.py @@ -18,6 +18,21 @@ path_tpl_re = re.compile('<.*>') +def extract_custom_headers(span, headers, format): + if agent.options.extra_http_headers is None: + return + try: + for custom_header in agent.options.extra_http_headers: + # Headers are available in this format: HTTP_X_CAPTURE_THIS + flask_header = ('HTTP_' + custom_header.upper()).replace('-', '_') if format else custom_header + + if flask_header in headers: + span.set_tag("http.header.%s" % custom_header, headers[flask_header]) + + except Exception: + logger.debug("extract_custom_headers: ", exc_info=True) + + def request_started_with_instana(sender, **extra): try: env = flask.request.environ @@ -28,12 +43,7 @@ def request_started_with_instana(sender, **extra): flask.g.scope = tracer.start_active_span('wsgi', child_of=ctx) span = flask.g.scope.span - if agent.options.extra_http_headers is not None: - for custom_header in agent.options.extra_http_headers: - # Headers are available in this format: HTTP_X_CAPTURE_THIS - header = ('HTTP_' + custom_header.upper()).replace('-', '_') - if header in env: - span.set_tag("http.header.%s" % custom_header, env[header]) + extract_custom_headers(span, env, format=True) span.set_tag(ext.HTTP_METHOD, flask.request.method) if 'PATH_INFO' in env: @@ -68,6 +78,8 @@ def request_finished_with_instana(sender, response, **extra): span.mark_as_errored() span.set_tag(ext.HTTP_STATUS_CODE, int(response.status_code)) + extract_custom_headers(span, response.headers, format=False) + tracer.inject(scope.span.context, opentracing.Format.HTTP_HEADERS, response.headers) response.headers.add('Server-Timing', "intid;desc=%s" % scope.span.context.trace_id) except: diff --git a/tests/apps/flask_app/app.py b/tests/apps/flask_app/app.py index e6f18aeb..087a2d3f 100755 --- a/tests/apps/flask_app/app.py +++ b/tests/apps/flask_app/app.py @@ -161,10 +161,11 @@ def render_error(): @app.route("/response_headers") def response_headers(): - resp = Response("Foo bar baz") - resp.headers['X-Capture-This'] = 'Ok' - return resp - + headers = { + 'X-Capture-This': 'Ok', + 'X-Capture-That': 'Ok too' + } + return Response("Stan wuz here with headers!", headers=headers) @app.route("/boto3/sqs") def boto3_sqs(): diff --git a/tests/frameworks/test_flask.py b/tests/frameworks/test_flask.py index 35f9d047..78c43512 100644 --- a/tests/frameworks/test_flask.py +++ b/tests/frameworks/test_flask.py @@ -51,21 +51,21 @@ def test_get_request(self): urllib3_span = spans[1] test_span = spans[2] - assert response + self.assertTrue(response) self.assertEqual(200, response.status) - assert('X-INSTANA-T' in response.headers) - assert(int(response.headers['X-INSTANA-T'], 16)) + self.assertIn('X-INSTANA-T', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-T'], 16)) self.assertEqual(response.headers['X-INSTANA-T'], wsgi_span.t) - assert('X-INSTANA-S' in response.headers) - assert(int(response.headers['X-INSTANA-S'], 16)) + self.assertIn('X-INSTANA-S', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-S'], 16)) self.assertEqual(response.headers['X-INSTANA-S'], wsgi_span.s) - assert('X-INSTANA-L' in response.headers) + self.assertIn('X-INSTANA-L', response.headers) self.assertEqual(response.headers['X-INSTANA-L'], '1') - assert('Server-Timing' in response.headers) + self.assertIn('Server-Timing', response.headers) server_timing_value = "intid;desc=%s" % wsgi_span.t self.assertEqual(response.headers['Server-Timing'], server_timing_value) @@ -188,21 +188,21 @@ def test_render_template(self): urllib3_span = spans[2] test_span = spans[3] - assert response + self.assertTrue(response) self.assertEqual(200, response.status) - assert('X-INSTANA-T' in response.headers) - assert(int(response.headers['X-INSTANA-T'], 16)) + self.assertIn('X-INSTANA-T', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-T'], 16)) self.assertEqual(response.headers['X-INSTANA-T'], wsgi_span.t) - assert('X-INSTANA-S' in response.headers) - assert(int(response.headers['X-INSTANA-S'], 16)) + self.assertIn('X-INSTANA-S', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-S'], 16)) self.assertEqual(response.headers['X-INSTANA-S'], wsgi_span.s) - assert('X-INSTANA-L' in response.headers) + self.assertIn('X-INSTANA-L', response.headers) self.assertEqual(response.headers['X-INSTANA-L'], '1') - assert('Server-Timing' in response.headers) + self.assertIn('Server-Timing', response.headers) server_timing_value = "intid;desc=%s" % wsgi_span.t self.assertEqual(response.headers['Server-Timing'], server_timing_value) @@ -266,21 +266,21 @@ def test_render_template_string(self): urllib3_span = spans[2] test_span = spans[3] - assert response + self.assertTrue(response) self.assertEqual(200, response.status) - assert('X-INSTANA-T' in response.headers) - assert(int(response.headers['X-INSTANA-T'], 16)) + self.assertIn('X-INSTANA-T', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-T'], 16)) self.assertEqual(response.headers['X-INSTANA-T'], wsgi_span.t) - assert('X-INSTANA-S' in response.headers) - assert(int(response.headers['X-INSTANA-S'], 16)) + self.assertIn('X-INSTANA-S', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-S'], 16)) self.assertEqual(response.headers['X-INSTANA-S'], wsgi_span.s) - assert('X-INSTANA-L' in response.headers) + self.assertIn('X-INSTANA-L', response.headers) self.assertEqual(response.headers['X-INSTANA-L'], '1') - assert('Server-Timing' in response.headers) + self.assertIn('Server-Timing', response.headers) server_timing_value = "intid;desc=%s" % wsgi_span.t self.assertEqual(response.headers['Server-Timing'], server_timing_value) @@ -344,21 +344,21 @@ def test_301(self): urllib3_span = spans[1] test_span = spans[2] - assert response + self.assertTrue(response) self.assertEqual(301, response.status) - assert('X-INSTANA-T' in response.headers) - assert(int(response.headers['X-INSTANA-T'], 16)) + self.assertIn('X-INSTANA-T', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-T'], 16)) self.assertEqual(response.headers['X-INSTANA-T'], wsgi_span.t) - assert('X-INSTANA-S' in response.headers) - assert(int(response.headers['X-INSTANA-S'], 16)) + self.assertIn('X-INSTANA-S', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-S'], 16)) self.assertEqual(response.headers['X-INSTANA-S'], wsgi_span.s) - assert('X-INSTANA-L' in response.headers) + self.assertIn('X-INSTANA-L', response.headers) self.assertEqual(response.headers['X-INSTANA-L'], '1') - assert('Server-Timing' in response.headers) + self.assertIn('Server-Timing', response.headers) server_timing_value = "intid;desc=%s" % wsgi_span.t self.assertEqual(response.headers['Server-Timing'], server_timing_value) @@ -411,21 +411,21 @@ def test_custom_404(self): urllib3_span = spans[1] test_span = spans[2] - assert response + self.assertTrue(response) self.assertEqual(404, response.status) - # assert('X-INSTANA-T' in response.headers) - # assert(int(response.headers['X-INSTANA-T'], 16)) + # self.assertIn('X-INSTANA-T', response.headers) + # self.assertTrue(int(response.headers['X-INSTANA-T'], 16)) # self.assertEqual(response.headers['X-INSTANA-T'], wsgi_span.t) # - # assert('X-INSTANA-S' in response.headers) - # assert(int(response.headers['X-INSTANA-S'], 16)) + # self.assertIn('X-INSTANA-S', response.headers) + # self.assertTrue(int(response.headers['X-INSTANA-S'], 16)) # self.assertEqual(response.headers['X-INSTANA-S'], wsgi_span.s) # - # assert('X-INSTANA-L' in response.headers) + # self.assertIn('X-INSTANA-L', response.headers) # self.assertEqual(response.headers['X-INSTANA-L'], '1') # - # assert('Server-Timing' in response.headers) + # self.assertIn('Server-Timing', response.headers) # server_timing_value = "intid;desc=%s" % wsgi_span.t # self.assertEqual(response.headers['Server-Timing'], server_timing_value) @@ -478,21 +478,21 @@ def test_404(self): urllib3_span = spans[1] test_span = spans[2] - assert response + self.assertTrue(response) self.assertEqual(404, response.status) - # assert('X-INSTANA-T' in response.headers) - # assert(int(response.headers['X-INSTANA-T'], 16)) + # self.assertIn('X-INSTANA-T', response.headers) + # self.assertTrue(int(response.headers['X-INSTANA-T'], 16)) # self.assertEqual(response.headers['X-INSTANA-T'], wsgi_span.t) # - # assert('X-INSTANA-S' in response.headers) - # assert(int(response.headers['X-INSTANA-S'], 16)) + # self.assertIn('X-INSTANA-S', response.headers) + # self.assertTrue(int(response.headers['X-INSTANA-S'], 16)) # self.assertEqual(response.headers['X-INSTANA-S'], wsgi_span.s) # - # assert('X-INSTANA-L' in response.headers) + # self.assertIn('X-INSTANA-L', response.headers) # self.assertEqual(response.headers['X-INSTANA-L'], '1') # - # assert('Server-Timing' in response.headers) + # self.assertIn('Server-Timing', response.headers) # server_timing_value = "intid;desc=%s" % wsgi_span.t # self.assertEqual(response.headers['Server-Timing'], server_timing_value) @@ -545,21 +545,21 @@ def test_500(self): urllib3_span = spans[1] test_span = spans[2] - assert response + self.assertTrue(response) self.assertEqual(500, response.status) - assert('X-INSTANA-T' in response.headers) - assert(int(response.headers['X-INSTANA-T'], 16)) + self.assertIn('X-INSTANA-T', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-T'], 16)) self.assertEqual(response.headers['X-INSTANA-T'], wsgi_span.t) - assert('X-INSTANA-S' in response.headers) - assert(int(response.headers['X-INSTANA-S'], 16)) + self.assertIn('X-INSTANA-S', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-S'], 16)) self.assertEqual(response.headers['X-INSTANA-S'], wsgi_span.s) - assert('X-INSTANA-L' in response.headers) + self.assertIn('X-INSTANA-L', response.headers) self.assertEqual(response.headers['X-INSTANA-L'], '1') - assert('Server-Timing' in response.headers) + self.assertIn('Server-Timing', response.headers) server_timing_value = "intid;desc=%s" % wsgi_span.t self.assertEqual(response.headers['Server-Timing'], server_timing_value) @@ -616,21 +616,21 @@ def test_render_error(self): urllib3_span = spans[2] test_span = spans[3] - assert response + self.assertTrue(response) self.assertEqual(500, response.status) - # assert('X-INSTANA-T' in response.headers) - # assert(int(response.headers['X-INSTANA-T'], 16)) + # self.assertIn('X-INSTANA-T', response.headers) + # self.assertTrue(int(response.headers['X-INSTANA-T'], 16)) # self.assertEqual(response.headers['X-INSTANA-T'], wsgi_span.t) # - # assert('X-INSTANA-S' in response.headers) - # assert(int(response.headers['X-INSTANA-S'], 16)) + # self.assertIn('X-INSTANA-S', response.headers) + # self.assertTrue(int(response.headers['X-INSTANA-S'], 16)) # self.assertEqual(response.headers['X-INSTANA-S'], wsgi_span.s) # - # assert('X-INSTANA-L' in response.headers) + # self.assertIn('X-INSTANA-L', response.headers) # self.assertEqual(response.headers['X-INSTANA-L'], '1') # - # assert('Server-Timing' in response.headers) + # self.assertIn('Server-Timing', response.headers) # server_timing_value = "intid;desc=%s" % wsgi_span.t # self.assertEqual(response.headers['Server-Timing'], server_timing_value) @@ -692,7 +692,7 @@ def test_exception(self): urllib3_span = spans[2] test_span = spans[3] - assert response + self.assertTrue(response) self.assertEqual(500, response.status) self.assertIsNone(tracer.active_span) @@ -756,21 +756,21 @@ def test_custom_exception_with_log(self): urllib3_span = spans[2] test_span = spans[3] - assert response + self.assertTrue(response) self.assertEqual(502, response.status) - assert('X-INSTANA-T' in response.headers) - assert(int(response.headers['X-INSTANA-T'], 16)) + self.assertIn('X-INSTANA-T', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-T'], 16)) self.assertEqual(response.headers['X-INSTANA-T'], wsgi_span.t) - assert('X-INSTANA-S' in response.headers) - assert(int(response.headers['X-INSTANA-S'], 16)) + self.assertIn('X-INSTANA-S', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-S'], 16)) self.assertEqual(response.headers['X-INSTANA-S'], wsgi_span.s) - assert('X-INSTANA-L' in response.headers) + self.assertIn('X-INSTANA-L', response.headers) self.assertEqual(response.headers['X-INSTANA-L'], '1') - assert('Server-Timing' in response.headers) + self.assertIn('Server-Timing', response.headers) server_timing_value = "intid;desc=%s" % wsgi_span.t self.assertEqual(response.headers['Server-Timing'], server_timing_value) @@ -828,21 +828,21 @@ def test_path_templates(self): urllib3_span = spans[1] test_span = spans[2] - assert response + self.assertTrue(response) self.assertEqual(200, response.status) - assert('X-INSTANA-T' in response.headers) - assert(int(response.headers['X-INSTANA-T'], 16)) + self.assertIn('X-INSTANA-T', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-T'], 16)) self.assertEqual(response.headers['X-INSTANA-T'], wsgi_span.t) - assert('X-INSTANA-S' in response.headers) - assert(int(response.headers['X-INSTANA-S'], 16)) + self.assertIn('X-INSTANA-S', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-S'], 16)) self.assertEqual(response.headers['X-INSTANA-S'], wsgi_span.s) - assert('X-INSTANA-L' in response.headers) + self.assertIn('X-INSTANA-L', response.headers) self.assertEqual(response.headers['X-INSTANA-L'], '1') - assert('Server-Timing' in response.headers) + self.assertIn('Server-Timing', response.headers) server_timing_value = "intid;desc=%s" % wsgi_span.t self.assertEqual(response.headers['Server-Timing'], server_timing_value) @@ -882,3 +882,82 @@ def test_path_templates(self): # We should have a reported path template for this route self.assertEqual("/users/{username}/sayhello", wsgi_span.data["http"]["path_tpl"]) + + def test_response_header_capture(self): + # Hack together a manual custom headers list + from instana.singletons import agent + original_extra_http_headers = agent.options.extra_http_headers + agent.options.extra_http_headers = [u'X-Capture-This', u'X-Capture-That'] + + with tracer.start_active_span('test'): + response = self.http.request('GET', testenv["wsgi_server"] + '/response_headers') + + spans = self.recorder.queued_spans() + self.assertEqual(3, len(spans)) + + wsgi_span = spans[0] + urllib3_span = spans[1] + test_span = spans[2] + + self.assertTrue(response) + self.assertEqual(200, response.status) + self.assertIn('X-INSTANA-T', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-T'], 16)) + self.assertEqual(response.headers['X-INSTANA-T'], wsgi_span.t) + + self.assertIn('X-INSTANA-S', response.headers) + self.assertTrue(int(response.headers['X-INSTANA-S'], 16)) + self.assertEqual(response.headers['X-INSTANA-S'], wsgi_span.s) + + self.assertIn('X-INSTANA-L', response.headers) + self.assertEqual(response.headers['X-INSTANA-L'], '1') + + self.assertIn('Server-Timing', response.headers) + server_timing_value = "intid;desc=%s" % wsgi_span.t + self.assertEqual(response.headers['Server-Timing'], server_timing_value) + + self.assertIsNone(tracer.active_span) + + # Same traceId + self.assertEqual(test_span.t, urllib3_span.t) + self.assertEqual(urllib3_span.t, wsgi_span.t) + + # Parent relationships + self.assertEqual(urllib3_span.p, test_span.s) + self.assertEqual(wsgi_span.p, urllib3_span.s) + + # Synthetic + self.assertIsNone(wsgi_span.sy) + self.assertIsNone(urllib3_span.sy) + self.assertIsNone(test_span.sy) + + # Error logging + self.assertIsNone(test_span.ec) + self.assertIsNone(urllib3_span.ec) + self.assertIsNone(wsgi_span.ec) + + # urllib3 + self.assertEqual("test", test_span.data["sdk"]["name"]) + self.assertEqual("urllib3", urllib3_span.n) + self.assertEqual(200, urllib3_span.data["http"]["status"]) + self.assertEqual(testenv["wsgi_server"] + "/response_headers", urllib3_span.data["http"]["url"]) + self.assertEqual("GET", urllib3_span.data["http"]["method"]) + self.assertIsNotNone(urllib3_span.stack) + self.assertTrue(type(urllib3_span.stack) is list) + self.assertTrue(len(urllib3_span.stack) > 1) + + # wsgi + self.assertEqual("wsgi", wsgi_span.n) + self.assertEqual('127.0.0.1:' + str(testenv["wsgi_port"]), wsgi_span.data["http"]["host"]) + self.assertEqual('/response_headers', wsgi_span.data["http"]["url"]) + self.assertEqual('GET', wsgi_span.data["http"]["method"]) + self.assertEqual(200, wsgi_span.data["http"]["status"]) + self.assertIsNone(wsgi_span.data["http"]["error"]) + self.assertIsNone(wsgi_span.stack) + + self.assertIn("X-Capture-This", wsgi_span.data["http"]["header"]) + self.assertEqual("Ok", wsgi_span.data["http"]["header"]["X-Capture-This"]) + self.assertIn("X-Capture-That", wsgi_span.data["http"]["header"]) + self.assertEqual("Ok too", wsgi_span.data["http"]["header"]["X-Capture-That"]) + + agent.options.extra_http_headers = original_extra_http_headers From 48475bab7eccd135df091b2d397601cec7e31ed6 Mon Sep 17 00:00:00 2001 From: Varsha GS Date: Wed, 3 Jan 2024 17:51:12 +0530 Subject: [PATCH 2/4] place extract_custom_headers function in a common file Signed-off-by: Varsha GS --- instana/instrumentation/flask/common.py | 16 +++++++++++++++- instana/instrumentation/flask/vanilla.py | 16 +--------------- instana/instrumentation/flask/with_blinker.py | 16 +--------------- 3 files changed, 17 insertions(+), 31 deletions(-) diff --git a/instana/instrumentation/flask/common.py b/instana/instrumentation/flask/common.py index de729cda..c9656f9d 100644 --- a/instana/instrumentation/flask/common.py +++ b/instana/instrumentation/flask/common.py @@ -9,7 +9,7 @@ import opentracing.ext.tags as ext from ...log import logger -from ...singletons import tracer +from ...singletons import tracer, agent @wrapt.patch_function_wrapper('flask', 'templating._render') @@ -77,3 +77,17 @@ def handle_user_exception_with_instana(wrapped, instance, argv, kwargs): logger.debug("handle_user_exception_with_instana:", exc_info=True) return response + + +def extract_custom_headers(span, headers, format): + if agent.options.extra_http_headers is None: + return + try: + for custom_header in agent.options.extra_http_headers: + # Headers are available in this format: HTTP_X_CAPTURE_THIS + flask_header = ('HTTP_' + custom_header.upper()).replace('-', '_') if format else custom_header + if flask_header in headers: + span.set_tag("http.header.%s" % custom_header, headers[flask_header]) + + except Exception: + logger.debug("extract_custom_headers: ", exc_info=True) diff --git a/instana/instrumentation/flask/vanilla.py b/instana/instrumentation/flask/vanilla.py index f49af3d9..a83b6efc 100644 --- a/instana/instrumentation/flask/vanilla.py +++ b/instana/instrumentation/flask/vanilla.py @@ -13,25 +13,11 @@ from ...log import logger from ...singletons import agent, tracer from ...util.secrets import strip_secrets_from_query +from common import extract_custom_headers path_tpl_re = re.compile('<.*>') -def extract_custom_headers(span, headers, format): - if agent.options.extra_http_headers is None: - return - try: - for custom_header in agent.options.extra_http_headers: - # Headers are available in this format: HTTP_X_CAPTURE_THIS - flask_header = ('HTTP_' + custom_header.upper()).replace('-', '_') if format else custom_header - - if flask_header in headers: - span.set_tag("http.header.%s" % custom_header, headers[flask_header]) - - except Exception: - logger.debug("extract_custom_headers: ", exc_info=True) - - def before_request_with_instana(*argv, **kwargs): try: env = flask.request.environ diff --git a/instana/instrumentation/flask/with_blinker.py b/instana/instrumentation/flask/with_blinker.py index 955896d8..c2e9024e 100644 --- a/instana/instrumentation/flask/with_blinker.py +++ b/instana/instrumentation/flask/with_blinker.py @@ -11,6 +11,7 @@ from ...log import logger from ...util.secrets import strip_secrets_from_query from ...singletons import agent, tracer +from common import extract_custom_headers import flask from flask import request_started, request_finished, got_request_exception @@ -18,21 +19,6 @@ path_tpl_re = re.compile('<.*>') -def extract_custom_headers(span, headers, format): - if agent.options.extra_http_headers is None: - return - try: - for custom_header in agent.options.extra_http_headers: - # Headers are available in this format: HTTP_X_CAPTURE_THIS - flask_header = ('HTTP_' + custom_header.upper()).replace('-', '_') if format else custom_header - - if flask_header in headers: - span.set_tag("http.header.%s" % custom_header, headers[flask_header]) - - except Exception: - logger.debug("extract_custom_headers: ", exc_info=True) - - def request_started_with_instana(sender, **extra): try: env = flask.request.environ From 2910cde7959389c793faf47fc46cf8c297c78d8d Mon Sep 17 00:00:00 2001 From: Varsha GS Date: Wed, 3 Jan 2024 22:25:26 +0530 Subject: [PATCH 3/4] fix(flask): import correctly Signed-off-by: Varsha GS --- instana/instrumentation/flask/with_blinker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instana/instrumentation/flask/with_blinker.py b/instana/instrumentation/flask/with_blinker.py index c2e9024e..787d44b8 100644 --- a/instana/instrumentation/flask/with_blinker.py +++ b/instana/instrumentation/flask/with_blinker.py @@ -11,7 +11,7 @@ from ...log import logger from ...util.secrets import strip_secrets_from_query from ...singletons import agent, tracer -from common import extract_custom_headers +from .common import extract_custom_headers import flask from flask import request_started, request_finished, got_request_exception From b22ac1dc9492d3d23220e838f893428031093c97 Mon Sep 17 00:00:00 2001 From: Varsha GS Date: Wed, 3 Jan 2024 23:19:47 +0530 Subject: [PATCH 4/4] fix(flask): vanilla imports Signed-off-by: Varsha GS --- instana/instrumentation/flask/vanilla.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instana/instrumentation/flask/vanilla.py b/instana/instrumentation/flask/vanilla.py index a83b6efc..5a384e8e 100644 --- a/instana/instrumentation/flask/vanilla.py +++ b/instana/instrumentation/flask/vanilla.py @@ -13,7 +13,7 @@ from ...log import logger from ...singletons import agent, tracer from ...util.secrets import strip_secrets_from_query -from common import extract_custom_headers +from .common import extract_custom_headers path_tpl_re = re.compile('<.*>')