azure-monitor-opentelemetry-exporter-py
Azure Monitor OpenTelemetry Exporter for Python. Use for low-level OpenTelemetry export to Application Insights.
- risk
- unknown
- source
- community
- date added
- 2026-02-27
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