diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 3622910b7fd7..392322d5edb1 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -98,6 +98,8 @@ "sdk/ml/azure-ai-ml/swagger/**", "sdk/ml/azure-ai-ml/NOTICE.txt", "sdk/ml/azure-ai-ml/.pre-commit-config.yaml", + "sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/db.sqlite3", + "sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/db.sqlite3", "sdk/loadtestservice/azure-developer-loadtesting/**", "sdk/translation/azure-ai-translation-text/azure/ai/translation/text/_serialization.py", "sdk/translation/azure-ai-translation-text/tests/test_break_sentence.py", diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md index e2e72e8c3358..b69d28a6944c 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md @@ -16,6 +16,8 @@ - Update to OTel SKD/API 1.21 ([#33864](https://github.com/Azure/azure-sdk-for-python/pull/33864)) +- Update Django sample + ([#33834](https://github.com/Azure/azure-sdk-for-python/pull/33834)) ## 1.0.0b20 (2024-01-04) diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/db.sqlite3 b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/db.sqlite3 index e69de29bb2d1..38f06d086022 100644 Binary files a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/db.sqlite3 and b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/db.sqlite3 differ diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/example/views.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/example/views.py index f12ad9e1d83f..da16e5ee393e 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/example/views.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/example/views.py @@ -1,27 +1,8 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. # mypy: disable-error-code="attr-defined" -import os from django.http import HttpResponse -from opentelemetry import trace -from opentelemetry.instrumentation.django import DjangoInstrumentor -from opentelemetry.sdk.trace import TracerProvider -from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter - -from azure.monitor.opentelemetry.exporter import AzureMonitorTraceExporter - -# Enable instrumentation in the django library. -DjangoInstrumentor().instrument() - -trace.set_tracer_provider(TracerProvider()) -span_processor = BatchSpanProcessor( - AzureMonitorTraceExporter.from_connection_string( - os.environ["APPLICATIONINSIGHTS_CONNECTION_STRING"] - ) -) -trace.get_tracer_provider().add_span_processor(span_processor) - def index(request): return HttpResponse("Hello, world.") diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/manage.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/manage.py index 849b87a1ca8a..af5923b7667f 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/manage.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/manage.py @@ -5,15 +5,30 @@ import os import sys +from opentelemetry import trace from opentelemetry.instrumentation.django import DjangoInstrumentor +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor + +from azure.monitor.opentelemetry.exporter import AzureMonitorTraceExporter def main(): """Run administrative tasks.""" os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sample.settings') + # Azure Monitor OpenTelemetry Exporters and Django Instrumentation should only be set up once in either asgi.py, wsgi.py, or manage.py, depending on startup method. + # If using manage.py, please remove setup from asgi.py and wsgi.py # Enable instrumentation in the django library. DjangoInstrumentor().instrument() + # Set up Azure Monitor OpenTelemetry Exporter + trace.set_tracer_provider(TracerProvider()) + span_processor = BatchSpanProcessor( + AzureMonitorTraceExporter.from_connection_string( + os.environ["APPLICATIONINSIGHTS_CONNECTION_STRING"] + ) + ) + trace.get_tracer_provider().add_span_processor(span_processor) try: from django.core.management import execute_from_command_line diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/sample/asgi.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/sample/asgi.py index 7caf941a34d7..a78e7cdaa690 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/sample/asgi.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/sample/asgi.py @@ -13,9 +13,28 @@ import os from django.core.asgi import get_asgi_application +from opentelemetry import trace +from opentelemetry.instrumentation.django import DjangoInstrumentor +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor + +from azure.monitor.opentelemetry.exporter import AzureMonitorTraceExporter os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sample.settings') +# Azure Monitor OpenTelemetry Exporters and Django Instrumentation should only be set up once in either asgi.py, wsgi.py, or manage.py, depending on startup method. +# If using manage.py, please remove setup from asgi.py and wsgi.py +# Enable instrumentation in the django library. +DjangoInstrumentor().instrument() +# Set up Azure Monitor OpenTelemetry Exporter +trace.set_tracer_provider(TracerProvider()) +span_processor = BatchSpanProcessor( + AzureMonitorTraceExporter.from_connection_string( + os.environ["APPLICATIONINSIGHTS_CONNECTION_STRING"] + ) +) +trace.get_tracer_provider().add_span_processor(span_processor) + application = get_asgi_application() # cSpell:enable diff --git a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/sample/wsgi.py b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/sample/wsgi.py index 34f760be44e7..a079ddc2c133 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/sample/wsgi.py +++ b/sdk/monitor/azure-monitor-opentelemetry-exporter/samples/traces/django/sample/sample/wsgi.py @@ -12,7 +12,26 @@ import os from django.core.wsgi import get_wsgi_application +from opentelemetry import trace +from opentelemetry.instrumentation.django import DjangoInstrumentor +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor + +from azure.monitor.opentelemetry.exporter import AzureMonitorTraceExporter os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sample.settings') +# Azure Monitor OpenTelemetry Exporters and Django Instrumentation should only be set up once in either asgi.py, wsgi.py, or manage.py, depending on startup method. +# If using manage.py, please remove setup from asgi.py and wsgi.py +# Enable instrumentation in the django library. +DjangoInstrumentor().instrument() +# Set up Azure Monitor OpenTelemetry Exporter +trace.set_tracer_provider(TracerProvider()) +span_processor = BatchSpanProcessor( + AzureMonitorTraceExporter.from_connection_string( + os.environ["APPLICATIONINSIGHTS_CONNECTION_STRING"] + ) +) +trace.get_tracer_provider().add_span_processor(span_processor) + application = get_wsgi_application() diff --git a/sdk/monitor/azure-monitor-opentelemetry/CHANGELOG.md b/sdk/monitor/azure-monitor-opentelemetry/CHANGELOG.md index 927a02767312..d734885c1e39 100644 --- a/sdk/monitor/azure-monitor-opentelemetry/CHANGELOG.md +++ b/sdk/monitor/azure-monitor-opentelemetry/CHANGELOG.md @@ -1,5 +1,16 @@ # Release History +## 1.2.1 (Unreleased) + +### Features Added + +### Bugs Fixed + +### Other Changes + +- Update configure_azure_monitor signature and Django sample + ([#33834](https://github.com/Azure/azure-sdk-for-python/pull/33834)) + ## 1.2.0 (2024-01-18) ### Other Changes @@ -10,6 +21,8 @@ ([#33808](https://github.com/Azure/azure-sdk-for-python/pull/33808)) - Update min dependency versions opentelemetry-resource-detector-azure~=0.1.1, exporter~=1.0.0b21, OTel SDK/API~= 1.21 ([#33866](https://github.com/Azure/azure-sdk-for-python/pull/33866)) +- Update configure_azure_monitor signature and Django sample + ([#33834](https://github.com/Azure/azure-sdk-for-python/pull/33834)) ## 1.1.1 (2023-12-04) diff --git a/sdk/monitor/azure-monitor-opentelemetry/azure/monitor/opentelemetry/_configure.py b/sdk/monitor/azure-monitor-opentelemetry/azure/monitor/opentelemetry/_configure.py index d814c845e560..f36e68126318 100644 --- a/sdk/monitor/azure-monitor-opentelemetry/azure/monitor/opentelemetry/_configure.py +++ b/sdk/monitor/azure-monitor-opentelemetry/azure/monitor/opentelemetry/_configure.py @@ -62,9 +62,14 @@ def configure_azure_monitor(**kwargs) -> None: :paramtype credential: ~azure.core.credentials.TokenCredential or None :keyword bool disable_offline_storage: Boolean value to determine whether to disable storing failed telemetry records for retry. Defaults to `False`. + :keyword str logger_name: The name of the Python logger that telemetry will be collected. + :keyword dict instrumentation_options: A nested dictionary that determines which instrumentations + to enable or disable. Instrumentations are referred to by their Library Names. For example, + `{"azure_sdk": {"enabled": False}, "flask": {"enabled": False}, "django": {"enabled": True}}` + will disable Azure Core Tracing and the Flask instrumentation but leave Django and the other default + instrumentations enabled. :keyword str storage_directory: Storage directory in which to store retry files. Defaults to `/Microsoft/AzureMonitor/opentelemetry-python-`. - :keyword str logger_name: The name of the Python logger that telemetry will be collected. :rtype: None """ diff --git a/sdk/monitor/azure-monitor-opentelemetry/azure/monitor/opentelemetry/_version.py b/sdk/monitor/azure-monitor-opentelemetry/azure/monitor/opentelemetry/_version.py index cfd8fd9078a5..c719acea2c1c 100644 --- a/sdk/monitor/azure-monitor-opentelemetry/azure/monitor/opentelemetry/_version.py +++ b/sdk/monitor/azure-monitor-opentelemetry/azure/monitor/opentelemetry/_version.py @@ -4,4 +4,4 @@ # license information. # -------------------------------------------------------------------------- -VERSION = "1.2.0" +VERSION = "1.2.1" diff --git a/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/db.sqlite3 b/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/db.sqlite3 new file mode 100644 index 000000000000..ca9793b0a54b Binary files /dev/null and b/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/db.sqlite3 differ diff --git a/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/example/views.py b/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/example/views.py index 02c2c9f0e1e9..37961b951f3c 100644 --- a/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/example/views.py +++ b/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/example/views.py @@ -4,12 +4,8 @@ # license information. # -------------------------------------------------------------------------- -from azure.monitor.opentelemetry import configure_azure_monitor from django.http import HttpResponse -# Configure Azure monitor collection telemetry pipeline -configure_azure_monitor() - # Requests sent to the django application will be automatically captured def index(request): diff --git a/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/manage.py b/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/manage.py index 5d854eb0e5f2..222c1993146e 100644 --- a/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/manage.py +++ b/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/manage.py @@ -5,11 +5,18 @@ import os import sys +from azure.monitor.opentelemetry import configure_azure_monitor + def main(): """Run administrative tasks.""" os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sample.settings") + # Configure Azure monitor collection telemetry pipeline + # configure_azure_monitor should only be called once in either asgi.py, wsgi.py, or manage.py, depending on startup method. + # If using manage.py, please remove configure_azure_monitor from asgi.py and wsgi.py + configure_azure_monitor() + try: from django.core.management import execute_from_command_line except ImportError as exc: diff --git a/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/sample/asgi.py b/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/sample/asgi.py index 900201111e28..a299d1a45763 100644 --- a/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/sample/asgi.py +++ b/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/sample/asgi.py @@ -12,10 +12,17 @@ import os +from azure.monitor.opentelemetry import configure_azure_monitor from django.core.asgi import get_asgi_application + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sample.settings") +# Configure Azure monitor collection telemetry pipeline +# configure_azure_monitor should only be called once in etiher asgi.py, wsgi.py, or manage.py, depending on startup method. +# If using asgi, please remove configure_azure_monitor from wsgi.py and manage.py +configure_azure_monitor() + application = get_asgi_application() # cSpell:enable diff --git a/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/sample/wsgi.py b/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/sample/wsgi.py index 1d4733978242..28fbcdcc2cd7 100644 --- a/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/sample/wsgi.py +++ b/sdk/monitor/azure-monitor-opentelemetry/samples/tracing/django/sample/sample/wsgi.py @@ -11,8 +11,15 @@ import os +from azure.monitor.opentelemetry import configure_azure_monitor from django.core.wsgi import get_wsgi_application + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sample.settings") +# Configure Azure monitor collection telemetry pipeline +# configure_azure_monitor should only be called once in either asgi.py, wsgi.py, or manage.py, depending on startup method. +# If using wsgi, please remove configure_azure_monitor from asgi.py and manage.py +configure_azure_monitor() + application = get_wsgi_application()