Azure Monitor OpenTelemetry Exporter for Python
Low-level exporter for sending OpenTelemetry traces, metrics, and logs to Application Insights.
Installation
pip install azure-monitor-opentelemetry-exporter
Environment Variables
APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=xxx;IngestionEndpoint=https://xxx.in.applicationinsights.azure.com/
When to Use
Scenario Use
Quick setup, auto-instrumentation azure-monitor-opentelemetry (distro)
Custom OpenTelemetry pipeline azure-monitor-opentelemetry-exporter (this)
Fine-grained control over telemetry azure-monitor-opentelemetry-exporter (this)
Trace Exporter
from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from azure.monitor.opentelemetry.exporter import AzureMonitorTraceExporter
Create exporter
exporter = AzureMonitorTraceExporter( connection_string="InstrumentationKey=xxx;..." )
Configure tracer provider
trace.set_tracer_provider(TracerProvider()) trace.get_tracer_provider().add_span_processor( BatchSpanProcessor(exporter) )
Use tracer
tracer = trace.get_tracer(name) with tracer.start_as_current_span("my-span"): print("Hello, World!")
Metric Exporter
from opentelemetry import metrics from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader from azure.monitor.opentelemetry.exporter import AzureMonitorMetricExporter
Create exporter
exporter = AzureMonitorMetricExporter( connection_string="InstrumentationKey=xxx;..." )
Configure meter provider
reader = PeriodicExportingMetricReader(exporter, export_interval_millis=60000) metrics.set_meter_provider(MeterProvider(metric_readers=[reader]))
Use meter
meter = metrics.get_meter(name) counter = meter.create_counter("requests_total") counter.add(1, {"route": "/api/users"})
Log Exporter
import logging from opentelemetry._logs import set_logger_provider from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler from opentelemetry.sdk._logs.export import BatchLogRecordProcessor from azure.monitor.opentelemetry.exporter import AzureMonitorLogExporter
Create exporter
exporter = AzureMonitorLogExporter( connection_string="InstrumentationKey=xxx;..." )
Configure logger provider
logger_provider = LoggerProvider() logger_provider.add_log_record_processor(BatchLogRecordProcessor(exporter)) set_logger_provider(logger_provider)
Add handler to Python logging
handler = LoggingHandler(level=logging.INFO, logger_provider=logger_provider) logging.getLogger().addHandler(handler)
Use logging
logger = logging.getLogger(name) logger.info("This will be sent to Application Insights")
From Environment Variable
Exporters read APPLICATIONINSIGHTS_CONNECTION_STRING automatically:
from azure.monitor.opentelemetry.exporter import AzureMonitorTraceExporter
Connection string from environment
exporter = AzureMonitorTraceExporter()
Azure AD Authentication
from azure.identity import DefaultAzureCredential from azure.monitor.opentelemetry.exporter import AzureMonitorTraceExporter
exporter = AzureMonitorTraceExporter( credential=DefaultAzureCredential() )
Sampling
Use ApplicationInsightsSampler for consistent sampling:
from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.sampling import ParentBasedTraceIdRatio from azure.monitor.opentelemetry.exporter import ApplicationInsightsSampler
Sample 10% of traces
sampler = ApplicationInsightsSampler(sampling_ratio=0.1)
trace.set_tracer_provider(TracerProvider(sampler=sampler))
Offline Storage
Configure offline storage for retry:
from azure.monitor.opentelemetry.exporter import AzureMonitorTraceExporter
exporter = AzureMonitorTraceExporter( connection_string="...", storage_directory="/path/to/storage", # Custom storage path disable_offline_storage=False # Enable retry (default) )
Disable Offline Storage
exporter = AzureMonitorTraceExporter( connection_string="...", disable_offline_storage=True # No retry on failure )
Sovereign Clouds
from azure.identity import AzureAuthorityHosts, DefaultAzureCredential from azure.monitor.opentelemetry.exporter import AzureMonitorTraceExporter
Azure Government
credential = DefaultAzureCredential(authority=AzureAuthorityHosts.AZURE_GOVERNMENT) exporter = AzureMonitorTraceExporter( connection_string="InstrumentationKey=xxx;IngestionEndpoint=https://xxx.in.applicationinsights.azure.us/", credential=credential )
Exporter Types
Exporter Telemetry Type Application Insights Table
AzureMonitorTraceExporter
Traces/Spans requests, dependencies, exceptions
AzureMonitorMetricExporter
Metrics customMetrics, performanceCounters
AzureMonitorLogExporter
Logs traces, customEvents
Configuration Options
Parameter Description Default
connection_string
Application Insights connection string From env var
credential
Azure credential for AAD auth None
disable_offline_storage
Disable retry storage False
storage_directory
Custom storage path Temp directory
Best Practices
-
Use BatchSpanProcessor for production (not SimpleSpanProcessor)
-
Use ApplicationInsightsSampler for consistent sampling across services
-
Enable offline storage for reliability in production
-
Use AAD authentication instead of instrumentation keys
-
Set export intervals appropriate for your workload
-
Use the distro (azure-monitor-opentelemetry ) unless you need custom pipelines