Django Instrumentation ====================== This shows how to use ``opentelemetry-instrumentation-django`` to automatically instrument a Django app. The source files of these examples are available :scm_web:`here `. Preparation ----------- This example will be executed in a separate virtual environment: .. code-block:: $ mkdir django_auto_instrumentation $ virtualenv django_auto_instrumentation $ source django_auto_instrumentation/bin/activate Installation ------------ .. code-block:: $ pip install opentelemetry-sdk $ pip install opentelemetry-instrumentation-django $ pip install requests Execution --------- Execution of the Django app ........................... This example uses Django features intended for development environment. The ``runserver`` option should not be used for production environments. Set these environment variables first: #. ``export DJANGO_SETTINGS_MODULE=instrumentation_example.settings`` The way to achieve OpenTelemetry instrumentation for your Django app is to use an ``opentelemetry.instrumentation.django.DjangoInstrumentor`` to instrument the app. Clone the ``opentelemetry-python`` repository and go to ``opentelemetry-python/docs/examples/django``. Once there, open the ``manage.py`` file. The call to ``DjangoInstrumentor().instrument()`` in ``main`` is all that is needed to make the app be instrumented. Run the Django app with ``python manage.py runserver --noreload``. The ``--noreload`` flag is needed to avoid Django from running ``main`` twice. Execution of the client ....................... Open up a new console and activate the previous virtual environment there too: ``source django_auto_instrumentation/bin/activate`` Go to ``opentelemetry-python/docs/examples/django``, once there run the client with: ``python client.py hello`` Go to the previous console, where the Django app is running. You should see output similar to this one: .. code-block:: { "name": "home_page_view", "context": { "trace_id": "0xed88755c56d95d05a506f5f70e7849b9", "span_id": "0x0a94c7a60e0650d5", "trace_state": "{}" }, "kind": "SpanKind.SERVER", "parent_id": "0x3096ef92e621c22d", "start_time": "2020-04-26T01:49:57.205833Z", "end_time": "2020-04-26T01:49:57.206214Z", "status": { "status_code": "OK" }, "attributes": { "http.request.method": "GET", "server.address": "localhost", "url.scheme": "http", "server.port": 8000, "url.full": "http://localhost:8000/?param=hello", "server.socket.address": "127.0.0.1", "network.protocol.version": "1.1", "http.response.status_code": 200 }, "events": [], "links": [] } The last output shows spans automatically generated by the OpenTelemetry Django Instrumentation package. Disabling Django Instrumentation -------------------------------- Django's instrumentation can be disabled by setting the following environment variable: ``export OTEL_PYTHON_DJANGO_INSTRUMENT=False`` Auto Instrumentation -------------------- This same example can be run using auto instrumentation. Comment out the call to ``DjangoInstrumentor().instrument()`` in ``main``, then Run the django app with ``opentelemetry-instrument python manage.py runserver --noreload``. Repeat the steps with the client, the result should be the same. Usage with Auto Instrumentation and uWSGI ----------------------------------------- uWSGI and Django can be used together with auto instrumentation. To do so, first install uWSGI in the previous virtual environment: ``pip install uwsgi`` Once that is done, run the server with ``uwsgi`` from the directory that contains ``instrumentation_example``: ``opentelemetry-instrument uwsgi --http :8000 --module instrumentation_example.wsgi`` This should start one uWSGI worker in your console. Open up a browser and point it to ``localhost:8000``. This request should display a span exported in the server console. References ---------- * `Django `_ * `OpenTelemetry Project `_ * `OpenTelemetry Django extension `_