Использование 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)
- Здесь я настроил пользовательские трассировки событий как результат.
Пользовательское событие: