mirror of
https://github.com/open-telemetry/opentelemetry-python-contrib.git
synced 2025-08-02 02:52:18 +08:00
Add callback for direct instrument
This commit is contained in:
@ -173,13 +173,18 @@ def _teardown_request(exc):
|
|||||||
|
|
||||||
|
|
||||||
class _InstrumentedFlask(flask.Flask):
|
class _InstrumentedFlask(flask.Flask):
|
||||||
|
|
||||||
|
name_callback = get_default_span_name
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
self._original_wsgi_ = self.wsgi_app
|
self._original_wsgi_ = self.wsgi_app
|
||||||
self.wsgi_app = _rewrapped_app(self.wsgi_app)
|
self.wsgi_app = _rewrapped_app(self.wsgi_app)
|
||||||
|
|
||||||
_before_request = _wrapped_before_request(get_default_span_name)
|
_before_request = _wrapped_before_request(
|
||||||
|
_InstrumentedFlask.name_callback
|
||||||
|
)
|
||||||
self._before_request = _before_request
|
self._before_request = _before_request
|
||||||
self.before_request(_before_request)
|
self.before_request(_before_request)
|
||||||
self.teardown_request(_teardown_request)
|
self.teardown_request(_teardown_request)
|
||||||
@ -194,6 +199,9 @@ class FlaskInstrumentor(BaseInstrumentor):
|
|||||||
|
|
||||||
def _instrument(self, **kwargs):
|
def _instrument(self, **kwargs):
|
||||||
self._original_flask = flask.Flask
|
self._original_flask = flask.Flask
|
||||||
|
name_callback = kwargs.get("name_callback")
|
||||||
|
if callable(name_callback):
|
||||||
|
_InstrumentedFlask.name_callback = name_callback
|
||||||
flask.Flask = _InstrumentedFlask
|
flask.Flask = _InstrumentedFlask
|
||||||
|
|
||||||
def instrument_app(
|
def instrument_app(
|
||||||
|
@ -208,3 +208,32 @@ class TestProgrammaticCustomSpanName(
|
|||||||
span_list = self.memory_exporter.get_finished_spans()
|
span_list = self.memory_exporter.get_finished_spans()
|
||||||
self.assertEqual(len(span_list), 1)
|
self.assertEqual(len(span_list), 1)
|
||||||
self.assertEqual(span_list[0].name, "flask-custom-span-name")
|
self.assertEqual(span_list[0].name, "flask-custom-span-name")
|
||||||
|
|
||||||
|
|
||||||
|
class TestProgrammaticCustomSpanNameCallbackWithoutApp(
|
||||||
|
InstrumentationTest, TestBase, WsgiTestBase
|
||||||
|
):
|
||||||
|
def setUp(self):
|
||||||
|
super().setUp()
|
||||||
|
|
||||||
|
def custom_span_name():
|
||||||
|
return "instrument-without-app"
|
||||||
|
|
||||||
|
FlaskInstrumentor().instrument(name_callback=custom_span_name)
|
||||||
|
from flask import Flask
|
||||||
|
|
||||||
|
self.app = Flask(__name__)
|
||||||
|
|
||||||
|
self._common_initialization()
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
super().tearDown()
|
||||||
|
with self.disable_logging():
|
||||||
|
FlaskInstrumentor().uninstrument()
|
||||||
|
|
||||||
|
def test_custom_span_name(self):
|
||||||
|
self.client.get("/hello/123")
|
||||||
|
|
||||||
|
span_list = self.memory_exporter.get_finished_spans()
|
||||||
|
self.assertEqual(len(span_list), 1)
|
||||||
|
self.assertEqual(span_list[0].name, "instrument-without-app")
|
||||||
|
Reference in New Issue
Block a user