Использование Python opentelemetry wsgi с gunicorn / Application Insights

У меня нижеприведенная настройка отлично работает в режиме разработки в моем приложении django, поэтому, когда я запускаю python manage.py runsslserver, приложение отлично отчитывается в Application Insights.

from azure.monitor.opentelemetry import configure_azure_monitor

from django.conf import settings as my_settings


def main():
    """Run administrative tasks."""
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my.settings')

    # Configure OpenTelemetry to use Azure Monitor with the specified connection string
    AZ_OPENTELEMETRY_CONNECTION_STRING = impact3_settings.AZ_OPENTELEMETRY_CONNECTION_STRING
    configure_azure_monitor(
        connection_string=AZ_OPENTELEMETRY_CONNECTION_STRING,
    )

    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == '__main__':
    main()

Однако, когда я перенесу это в производство, мы будем использовать gunicorn и wsgi, поэтому manage.py никогда не будет запущен. Я нашел способ добавить OpenTelemetryMiddleware в файл wsgi, но не представляю, как/где вызвать configure_azure_monitor для записи каждого запроса. Что я упускаю?

import os

from django.core.wsgi import get_wsgi_application

from opentelemetry.instrumentation.wsgi import OpenTelemetryMiddleware

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my.settings')

application = get_wsgi_application()
application = OpenTelemetryMiddleware(application)

Я нашел способ добавить OpenTelemetryMiddleware в файл wsgi, но не представляю, как/где вызвать configure_azure_monitor для записи каждого запроса. Что я упускаю?

Здесь необходимо настроить OpenTelemetry и добавить промежуточное ПО для перехвата входящих запросов.

  • Измените WSGI-файл, чтобы включить в него конфигурацию OpenTelemetry:

Код:

import os
import sys

from django.core.wsgi import get_wsgi_application
from opentelemetry.instrumentation.django.middleware import OpenTelemetryMiddleware
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
from opentelemetry.sdk.trace.export import SimpleExportSpanProcessor
from opentelemetry.sdk.trace.export import BatchExportSpanProcessor
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.exporter.azuremonitor.trace_exporter import AzureMonitorTraceExporter
from opentelemetry import trace

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my.settings')

# Configure OpenTelemetry
tracer_provider = TracerProvider(resource=Resource.create({'service.name': 'your-service-name'}))

# Export traces to Azure Monitor
connection_string = "YOUR_CONNECTION_STRING"
azure_exporter = AzureMonitorTraceExporter.from_connection_string(connection_string)
span_processor = BatchExportSpanProcessor(azure_exporter)
tracer_provider.add_span_processor(span_processor)

# Configure OpenTelemetry middleware
application = get_wsgi_application()
application = OpenTelemetryMiddleware(application)

# Start trace provider
trace.set_tracer_provider(tracer_provider)
  • Здесь я настроил пользовательские трассировки событий как результат.

Пользовательское событие:

enter image description here

Вернуться на верх