Skip to content

Commit 846f47e

Browse files
committed
Add support for programmatic instrumentation in Flask
1 parent 8c360a1 commit 846f47e

7 files changed

Lines changed: 34 additions & 39 deletions

File tree

docs/examples/opentelemetry-example-app/src/opentelemetry_example_app/flask_example.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,9 @@
4040
SimpleExportSpanProcessor(ConsoleSpanExporter())
4141
)
4242

43-
44-
app = flask.Flask(__name__)
43+
Flask = FlaskInstrumentor().instrument(flask_class=flask.Flask)
44+
app = Flask(__name__)
45+
opentelemetry.ext.http_requests.enable(trace.get_tracer_provider())
4546

4647

4748
@app.route("/")

docs/getting-started.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,6 @@ And let's write a small Flask application that sends an HTTP request, activating
184184
.. code-block:: python
185185
186186
# flask_example.py
187-
from opentelemetry.ext.flask import FlaskInstrumentor
188-
FlaskInstrumentor().instrument() # This needs to be executed before importing Flask
189-
190187
import flask
191188
import requests
192189
@@ -195,6 +192,9 @@ And let's write a small Flask application that sends an HTTP request, activating
195192
from opentelemetry.sdk.trace import TracerProvider
196193
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
197194
from opentelemetry.sdk.trace.export import SimpleExportSpanProcessor
195+
from opentelemetry.ext.flask import FlaskInstrumentor
196+
197+
Flask = FlaskInstrumentor().instrument(flask_class=flask.Flask)
198198
199199
trace.set_tracer_provider(TracerProvider())
200200
trace.get_tracer_provider().add_span_processor(

ext/opentelemetry-ext-flask/src/opentelemetry/ext/flask/__init__.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@
2929
3030
.. code-block:: python
3131
32-
from opentelemetry.ext.flask import FlaskInstrumentor
33-
FlaskInstrumentor().instrument() # This needs to be executed before importing Flask
3432
from flask import Flask
33+
from opentelemetry.ext.flask import FlaskInstrumentor
34+
35+
Flask = FlaskInstrumentor().instrument(flask_class=Flask)
3536
3637
app = Flask(__name__)
3738
@@ -158,11 +159,20 @@ class FlaskInstrumentor(BaseInstrumentor):
158159

159160
def __init__(self):
160161
super().__init__()
161-
self._original_flask = None
162+
self._original_flask_class = None
162163

163-
def _instrument(self, **kwargs):
164-
self._original_flask = flask.Flask
164+
def _instrument(
165+
self, flask_class=None
166+
): # pylint: disable=arguments-differ
167+
if flask_class is not None:
168+
self._original_flask_class = flask_class
169+
return _InstrumentedFlask
170+
171+
self._original_flask_class = flask.Flask
165172
flask.Flask = _InstrumentedFlask
166173

167-
def _uninstrument(self, **kwargs):
168-
flask.Flask = self._original_flask
174+
return None
175+
176+
def _uninstrument(self): # pylint: disable=arguments-differ
177+
flask.Flask = self._original_flask_class
178+
return self._original_flask_class

ext/opentelemetry-ext-flask/tests/conftest.py

Lines changed: 0 additions & 25 deletions
This file was deleted.

ext/opentelemetry-ext-flask/tests/test_flask_integration.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@
1919
from werkzeug.wrappers import BaseResponse
2020

2121
from opentelemetry import trace as trace_api
22+
from opentelemetry.ext.flask import FlaskInstrumentor
2223
from opentelemetry.test.wsgitestutil import WsgiTestBase
2324

25+
Flask = FlaskInstrumentor().instrument(flask_class=Flask)
26+
2427

2528
def expected_attributes(override_attributes):
2629
default_attributes = {

opentelemetry-auto-instrumentation/src/opentelemetry/auto_instrumentation/instrumentor.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ def instrument(self, **kwargs):
5252
self._is_instrumented = True
5353
return result
5454

55-
_LOG.warning("Attempting to instrument while already instrumented")
55+
_LOG.warning(
56+
"Attempting to automatically instrument while already instrumented"
57+
)
5658

5759
return None
5860

@@ -64,7 +66,10 @@ def uninstrument(self, **kwargs):
6466
self._is_instrumented = False
6567
return result
6668

67-
_LOG.warning("Attempting to uninstrument while already uninstrumented")
69+
_LOG.warning(
70+
"Attempting to automatically uninstrument while already"
71+
" uninstrumented"
72+
)
6873

6974
return None
7075

opentelemetry-auto-instrumentation/tests/test_instrumentor.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def test_protect(self):
3434
self.assertIs(instrumentor.uninstrument(), None)
3535

3636
self.assertEqual(instrumentor.instrument(), "instrumented")
37+
3738
with self.assertLogs(level=WARNING):
3839
self.assertIs(instrumentor.instrument(), None)
3940

0 commit comments

Comments
 (0)