Skip to content

Commit f3ff87f

Browse files
committed
Added trace response headers to Falcon
1 parent 370952f commit f3ff87f

File tree

4 files changed

+41
-2
lines changed

4 files changed

+41
-2
lines changed

.github/workflows/test.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
- 'release/*'
77
pull_request:
88
env:
9-
CORE_REPO_SHA: cad261e5dae1fe986c87e6965664b45cc9ab73c3
9+
CORE_REPO_SHA: f6b04c483f6c416e1927f010c07e71a17a5d79d0
1010

1111
jobs:
1212
build:

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2121
([#299](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/299))
2222
- `opentelemetry-instrumenation-django` now supports request and response hooks.
2323
([#407](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/407))
24+
- `opentelemetry-instrumenation-falcon` added trace response headers support to Falcon.
25+
([#432](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/432))
2426

2527
### Removed
2628
- Remove `http.status_text` from span attributes

instrumentation/opentelemetry-instrumentation-falcon/src/opentelemetry/instrumentation/falcon/__init__.py

+10
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ def on_get(self, req, resp):
5252
from opentelemetry import context, trace
5353
from opentelemetry.instrumentation.falcon.version import __version__
5454
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
55+
from opentelemetry.instrumentation.propagators import (
56+
FuncSetter,
57+
get_global_back_propagator,
58+
)
5559
from opentelemetry.instrumentation.utils import (
5660
extract_attributes_from_object,
5761
http_status_to_status_code,
@@ -148,6 +152,8 @@ def _start_response(status, response_headers, *args, **kwargs):
148152
class _TraceMiddleware:
149153
# pylint:disable=R0201,W0613
150154

155+
back_propagation_setter = FuncSetter(falcon.api.Response.append_header)
156+
151157
def __init__(self, tracer=None, traced_request_attrs=None):
152158
self.tracer = tracer
153159
self._traced_request_attrs = _traced_request_attrs
@@ -209,3 +215,7 @@ def process_response(
209215
description=reason,
210216
)
211217
)
218+
219+
propagator = get_global_back_propagator()
220+
if propagator:
221+
propagator.inject(resp, setter=self.back_propagation_setter)

instrumentation/opentelemetry-instrumentation-falcon/tests/test_falcon.py

+28-1
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,13 @@
1717
from falcon import testing
1818

1919
from opentelemetry.instrumentation.falcon import FalconInstrumentor
20+
from opentelemetry.instrumentation.propagators import (
21+
TraceResponsePropagator,
22+
get_global_back_propagator,
23+
set_global_back_propagator,
24+
)
2025
from opentelemetry.test.test_base import TestBase
21-
from opentelemetry.trace import StatusCode
26+
from opentelemetry.trace import StatusCode, format_span_id, format_trace_id
2227
from opentelemetry.util.http import get_excluded_urls, get_traced_request_attrs
2328

2429
from .app import make_app
@@ -192,6 +197,28 @@ def test_traced_request_attributes(self):
192197
self.assertEqual(span.attributes["query_string"], "q=abc")
193198
self.assertNotIn("not_available_attr", span.attributes)
194199

200+
def test_trace_response(self):
201+
orig = get_global_back_propagator()
202+
set_global_back_propagator(TraceResponsePropagator())
203+
204+
response = self.client().simulate_get(path="/hello?q=abc")
205+
headers = response.headers
206+
span = self.memory_exporter.get_finished_spans()[0]
207+
208+
self.assertIn("traceresponse", headers)
209+
self.assertEqual(
210+
headers["access-control-expose-headers"], "traceresponse",
211+
)
212+
self.assertEqual(
213+
headers["traceresponse"],
214+
"00-{0}-{1}-01".format(
215+
format_trace_id(span.get_span_context().trace_id),
216+
format_span_id(span.get_span_context().span_id),
217+
),
218+
)
219+
220+
set_global_back_propagator(orig)
221+
195222
def test_traced_not_recording(self):
196223
mock_tracer = Mock()
197224
mock_span = Mock()

0 commit comments

Comments
 (0)