Python Django Gunicorn
Prerequisites
Python 3
Installation
-
Install dependencies:
pip install opentelemetry-distro opentelemetry-exporter-otlp-proto-http
opentelemetry-bootstrap -a install -
Modify the gunicorn config file as follows:
gunicorn.conf.pyimport os
from opentelemetry import trace
from opentelemetry.semconv.resource import ResourceAttributes
from opentelemetry.sdk.trace import TracerProvider, Resource
from opentelemetry.sdk.trace.export import (
BatchSpanProcessor,
ConsoleSpanExporter,
SimpleSpanProcessor,
)
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from socket import gethostname
bind = "127.0.0.1:8000"
# Sample Worker processes
workers = 4
worker_class = "sync"
worker_connections = 1000
timeout = 30
keepalive = 2
# Sample logging
errorlog = "-"
loglevel = "info"
accesslog = "-"
access_log_format = (
'%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
)
def post_fork(server, worker):
server.log.info("Worker spawned (pid: %s)", worker.pid)
provider = TracerProvider(resource=Resource({
ResourceAttributes.SERVICE_NAME: os.environ['OTEL_SERVICE_NAME'],
ResourceAttributes.HOST_NAME: gethostname() or 'UNSET',
}))
if os.getenv('OTEL_LOG_LEVEL', '') == 'debug':
processor = SimpleSpanProcessor(ConsoleSpanExporter())
else:
processor = BatchSpanProcessor(OTLPSpanExporter())
provider.add_span_processor(processor)
trace.set_tracer_provider(provider) -
Add the highlighted lines below to your project's
wsgi.py
file:wsgi.pyimport os
from django.core.wsgi import get_wsgi_application
from opentelemetry.instrumentation.django import DjangoInstrumentor
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
DjangoInstrumentor().instrument()
# Additional instrumentations can be enabled by
# following the docs for respective instrumentations at
# https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation
#
# A working example with multiple instrumentations is available at
# https://github.com/cubeapm/sample_app_python_django_gunicorn
application = get_wsgi_application() -
Modify the application run command as follows:
DJANGO_SETTINGS_MODULE=<django_app_name>.settings \
OTEL_METRICS_EXPORTER=none \
OTEL_LOGS_EXPORTER=none \
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://<ip_address_of_cubeapm_server>:4318/v1/traces \
OTEL_EXPORTER_OTLP_COMPRESSION=gzip \
OTEL_SERVICE_NAME=<app_name> \
gunicorn mysite.wsgi -c gunicorn.conf.py
Troubleshooting
The following can be used for debugging:
OTEL_LOG_LEVEL=debug
The following command can be tried on the application host server to check connectivity to CubeAPM server(s):
telnet <ip_address_of_cubeapm_server> 4318