oncall-engine/engine/engine/wsgi.py
Innokentii Konstantinov 80e93b10cd
Instrument requests lib (#4008)
# What this PR does

Instument requests lib to provide consistent trace_id
2024-03-05 05:22:34 +00:00

66 lines
2.4 KiB
Python

"""
WSGI config for engine project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/
"""
import os
from django.conf import settings
from django.core.wsgi import get_wsgi_application
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.logging import LoggingInstrumentor
from opentelemetry.instrumentation.requests import RequestsInstrumentor
from opentelemetry.instrumentation.wsgi import OpenTelemetryMiddleware
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from whitenoise import WhiteNoise
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.prod")
application = get_wsgi_application()
application = WhiteNoise(application)
# check both OTEL_TRACING_ENABLED and OTEL_EXPORTER_OTLP_ENDPOINT
# since OTLPSpanExporter expects endpoint to send data to
if settings.OTEL_TRACING_ENABLED and settings.OTEL_EXPORTER_OTLP_ENDPOINT:
# Set up tracing and logging instrumentation under uwsgi web server environment.
# Since it's wsgi setup, it will be used in prod.
try:
from uwsgidecorators import postfork
application = OpenTelemetryMiddleware(application)
@postfork
def init_tracing():
trace.set_tracer_provider(TracerProvider())
span_processor = BatchSpanProcessor(OTLPSpanExporter())
trace.get_tracer_provider().add_span_processor(span_processor)
LoggingInstrumentor().instrument() # Instrument logs to add trace_id to log lines
RequestsInstrumentor().instrument() # Instrument requests to instrument downstream calls
except ModuleNotFoundError:
pass
if settings.PYROSCOPE_PROFILER_ENABLED:
try:
import pyroscope
from uwsgidecorators import postfork
@postfork
def init_pyroscope():
pyroscope.configure(
application_name=settings.PYROSCOPE_APPLICATION_NAME,
server_address=settings.PYROSCOPE_SERVER_ADDRESS,
auth_token=settings.PYROSCOPE_AUTH_TOKEN,
detect_subprocesses=True,
tags={"type": "uwsgi"},
)
except ModuleNotFoundError:
# Only works under uwsgi web server environment
pass