OpenTelemetry guide for Django and PostgreSQL/MySQL

In this article, you will learn how to use OpenTelemetry with Uptrace to monitor Django and PostgreSQL/MySQL performance.

Uptrace

What is tracing?

Distributed tracingDjango - 图2open in new window allows you to see how a request progresses through different services and systems, timings of each operation, any logs and errors as they occur.

In a distributed environment, tracing also helps you understand relationships and interactions between microservices. Distributed tracing gives an insight into how a particular microservice is performing and how that service affects other microservices.

Django - 图3

Using tracing, you can break down requests into spansDjango - 图4open in new window. Span is an operation (unit of work) your app performs handling a request, for example, a database query or a network call.

Trace is a tree of spans that shows the path that a request makes through an app. Root span is the first span in a trace.

Django - 图5

To learn more about tracing, see Distributed tracing using OpenTelemetryDjango - 图6open in new window.

What is OpenTelemetry?

OpenTelemetryDjango - 图7open in new window is an open source and vendor-neutral API for distributed tracingDjango - 图8open in new window (including logs and errors) and metricsDjango - 图9open in new window.

Otel specifies how to collect and export telemetry data in a vendor agnostic way. With OpenTelemetry, you can instrumentDjango - 图10open in new window your application once and then add or change vendors without changing the instrumentation, for example, many open source tracing toolsDjango - 图11open in new window already support OpenTelemetry.

OpenTelemetry is available for most programming languages and provides interoperability across different languages and environments.

Creating spans

You can create a span using OpenTelemetry Python APIDjango - 图12open in new window like this:

  1. from opentelemetry import trace
  2. tracer = trace.get_tracer("app_or_package_name", "1.0.0")
  3. def some_func(**kwargs):
  4. with tracer.start_as_current_span("some-func") as span:
  5. // the code you are measuring

What is Uptrace?

UptraceDjango - 图13open in new window is an open source DataDog alternativeDjango - 图14open in new window that helps developers pinpoint failures and find performance bottlenecks. Uptrace can process billions of spans on a single server and allows to monitor your software at 10x lower cost.

You can install UptraceDjango - 图15open in new window by downloading a DEB/RPM package or a pre-compiled binary.

Example application

In this tutorial, you will be instrumenting a toy appDjango - 图16open in new window that uses Django and PostgreSQL database client. You can retrieve the source code with the following command:

  1. git clone git@github.com:uptrace/uptrace.git
  2. cd example/django

The app comes with some dependencies that you can install with:

  1. pip install -r requirements.txt

Then you can run migrations to initialize the database:

  1. ./manage.py migrate

Configuring OpenTelemetry

Uptrace provides OpenTelemetry PythonDjango - 图17open in new window distro that configures OpenTelemetry SDK for you. To install the distro:

  1. pip install uptrace

Then you need to initialize OpenTelemetry whenever the app is started, for example, in manage.py:

  1. # manage.py
  2. import uptrace
  3. def main():
  4. uptrace.configure_opentelemetry(
  5. # Copy DSN here or use UPTRACE_DSN env var.
  6. # dsn="",
  7. service_name="myservice",
  8. service_version="v1.0.0",
  9. )
  10. # other code

See documentationDjango - 图18open in new window for details.

Instrumenting Django

To instrument Django, you need a correspoding OpenTelemetry Django instrumentationDjango - 图19open in new window:

  1. pip install opentelemetry-instrumentation-django

Django instrumentation uses DJANGO_SETTINGS_MODULE env variable to find settings file. Django defines that variable in manage.py file so you should instrument Django app from that file:

  1. # manage.py
  2. from opentelemetry.instrumentation.django import DjangoInstrumentor
  3. def main():
  4. # DjangoInstrumentor uses DJANGO_SETTINGS_MODULE to instrument the project.
  5. # Make sure the var is available before you call the DjangoInstrumentor.
  6. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
  7. DjangoInstrumentor().instrument()

Running the example

You can start Uptrace with a single command using Docker exampleDjango - 图20open in new window:

  1. docker-compose up -d

And then start the appDjango - 图21open in new window passing Uptrace DSN as an env variable:

  1. export UPTRACE_DSN=http://project2_secret_token@localhost:14317/2
  2. ./manage.py runserver

The app should be serving requests on http://localhost:8000 and should render a link to Uptrace UI. After opening the link, you should see this:

Django OpenTelemetry

Instrumenting PostgreSQL/MySQL

If you want to use PostgreSQL/MySQL Django engine instead of SQLite, see OpenTelemetry DjangoDjango - 图23open in new window.

What’s next?

Next, you can learn about OpenTelemetry Python APIDjango - 图24open in new window to create your own instrumentations or browse existing instrumentationsDjango - 图25open in new window provided by the community.