Skip to content

Commit d111d44

Browse files
committed
Add support for programmatic instrumentation in Flask
1 parent 7cb57c7 commit d111d44

File tree

7 files changed

+34
-40
lines changed

7 files changed

+34
-40
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
SimpleExportSpanProcessor(ConsoleSpanExporter())
3434
)
3535

36-
FlaskInstrumentor().instrument()
37-
app = flask.Flask(__name__)
36+
Flask = FlaskInstrumentor().instrument(flask_class=flask.Flask)
37+
app = Flask(__name__)
3838
opentelemetry.ext.http_requests.enable(trace.get_tracer_provider())
3939

4040

docs/getting-started.rst

+4-4
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,13 +192,16 @@ 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(
201201
SimpleExportSpanProcessor(ConsoleSpanExporter())
202202
)
203203
204-
app = flask.Flask(__name__)
204+
app = Flask(__name__)
205205
opentelemetry.ext.http_requests.enable(trace.get_tracer_provider())
206206
207207
@app.route("/")

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

+17-7
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

-25
This file was deleted.

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

+3
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

+7-2
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

+1
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)