Skip to content

Commit f49f8b5

Browse files
authored
Merge pull request #158 from lzchen/http
2 parents a384130 + 34d37d9 commit f49f8b5

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

instrumentation/opentelemetry-instrumentation-requests/CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## Unreleased
44

5+
- Add span name callback
6+
([#158](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/158))
7+
58
## Version 0.15b0
69

710
Released 2020-11-02

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

+15-2
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464

6565
# pylint: disable=unused-argument
6666
# pylint: disable=R0915
67-
def _instrument(tracer_provider=None, span_callback=None):
67+
def _instrument(tracer_provider=None, span_callback=None, name_callback=None):
6868
"""Enables tracing of all requests calls that go through
6969
:code:`requests.session.Session.request` (this includes
7070
:code:`requests.get`, etc.)."""
@@ -124,7 +124,11 @@ def _instrumented_requests_call(
124124
# See
125125
# https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/semantic_conventions/http.md#http-client
126126
method = method.upper()
127-
span_name = "HTTP {}".format(method)
127+
span_name = ""
128+
if name_callback is not None:
129+
span_name = name_callback()
130+
if not span_name or not isinstance(span_name, str):
131+
span_name = get_default_span_name(method)
128132

129133
recorder = RequestsInstrumentor().metric_recorder
130134

@@ -217,6 +221,11 @@ def _uninstrument_from(instr_root, restore_as_bound_func=False):
217221
setattr(instr_root, instr_func_name, original)
218222

219223

224+
def get_default_span_name(method):
225+
"""Default implementation for name_callback, returns HTTP {method_name}."""
226+
return "HTTP {}".format(method).strip()
227+
228+
220229
class RequestsInstrumentor(BaseInstrumentor, MetricMixin):
221230
"""An instrumentor for requests
222231
See `BaseInstrumentor`
@@ -229,10 +238,14 @@ def _instrument(self, **kwargs):
229238
**kwargs: Optional arguments
230239
``tracer_provider``: a TracerProvider, defaults to global
231240
``span_callback``: An optional callback invoked before returning the http response. Invoked with Span and requests.Response
241+
``name_callback``: Callback which calculates a generic span name for an
242+
outgoing HTTP request based on the method and url.
243+
Optional: Defaults to get_default_span_name.
232244
"""
233245
_instrument(
234246
tracer_provider=kwargs.get("tracer_provider"),
235247
span_callback=kwargs.get("span_callback"),
248+
name_callback=kwargs.get("name_callback"),
236249
)
237250
self.init_metrics(
238251
__name__, __version__,

instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py

+24
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,30 @@ def test_basic(self):
107107
self.assertEqual(view_data.aggregator.current.count, 1)
108108
self.assertGreaterEqual(view_data.aggregator.current.sum, 0)
109109

110+
def test_name_callback(self):
111+
def name_callback():
112+
return "test_name"
113+
114+
RequestsInstrumentor().uninstrument()
115+
RequestsInstrumentor().instrument(name_callback=name_callback)
116+
result = self.perform_request(self.URL)
117+
self.assertEqual(result.text, "Hello!")
118+
span = self.assert_span()
119+
120+
self.assertEqual(span.name, "test_name")
121+
122+
def test_name_callback_default(self):
123+
def name_callback():
124+
return 123
125+
126+
RequestsInstrumentor().uninstrument()
127+
RequestsInstrumentor().instrument(name_callback=name_callback)
128+
result = self.perform_request(self.URL)
129+
self.assertEqual(result.text, "Hello!")
130+
span = self.assert_span()
131+
132+
self.assertEqual(span.name, "HTTP GET")
133+
110134
def test_not_foundbasic(self):
111135
url_404 = "http://httpbin.org/status/404"
112136
httpretty.register_uri(

0 commit comments

Comments
 (0)