Azure Monitor OpenTelemetry Distro for Python
One-line setup for Application Insights with OpenTelemetry auto-instrumentation.
Installation
pip install azure-monitor-opentelemetry
Environment Variables
APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=xxx;IngestionEndpoint=https://xxx.in.applicationinsights.azure.com/
Quick Start
from azure.monitor.opentelemetry import configure_azure_monitor
One-line setup - reads connection string from environment
configure_azure_monitor()
Your application code...
Explicit Configuration
from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor( connection_string="InstrumentationKey=xxx;IngestionEndpoint=https://xxx.in.applicationinsights.azure.com/" )
With Flask
from flask import Flask from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor()
app = Flask(name)
@app.route("/") def hello(): return "Hello, World!"
if name == "main": app.run()
With Django
settings.py
from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor()
Django settings...
With FastAPI
from fastapi import FastAPI from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor()
app = FastAPI()
@app.get("/") async def root(): return {"message": "Hello World"}
Custom Traces
from opentelemetry import trace from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor()
tracer = trace.get_tracer(name)
with tracer.start_as_current_span("my-operation") as span: span.set_attribute("custom.attribute", "value") # Do work...
Custom Metrics
from opentelemetry import metrics from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor()
meter = metrics.get_meter(name) counter = meter.create_counter("my_counter")
counter.add(1, {"dimension": "value"})
Custom Logs
import logging from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor()
logger = logging.getLogger(name) logger.setLevel(logging.INFO)
logger.info("This will appear in Application Insights") logger.error("Errors are captured too", exc_info=True)
Sampling
from azure.monitor.opentelemetry import configure_azure_monitor
Sample 10% of requests
configure_azure_monitor( sampling_ratio=0.1 )
Cloud Role Name
Set cloud role name for Application Map:
from azure.monitor.opentelemetry import configure_azure_monitor from opentelemetry.sdk.resources import Resource, SERVICE_NAME
configure_azure_monitor( resource=Resource.create({SERVICE_NAME: "my-service-name"}) )
Disable Specific Instrumentations
from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor( instrumentations=["flask", "requests"] # Only enable these )
Enable Live Metrics
from azure.monitor.opentelemetry import configure_azure_monitor
configure_azure_monitor( enable_live_metrics=True )
Azure AD Authentication
from azure.monitor.opentelemetry import configure_azure_monitor from azure.identity import DefaultAzureCredential
configure_azure_monitor( credential=DefaultAzureCredential() )
Auto-Instrumentations Included
Library Telemetry Type
Flask Traces
Django Traces
FastAPI Traces
Requests Traces
urllib3 Traces
httpx Traces
aiohttp Traces
psycopg2 Traces
pymysql Traces
pymongo Traces
redis Traces
Configuration Options
Parameter Description Default
connection_string
Application Insights connection string From env var
credential
Azure credential for AAD auth None
sampling_ratio
Sampling rate (0.0 to 1.0) 1.0
resource
OpenTelemetry Resource Auto-detected
instrumentations
List of instrumentations to enable All
enable_live_metrics
Enable Live Metrics stream False
Best Practices
-
Call configure_azure_monitor() early — Before importing instrumented libraries
-
Use environment variables for connection string in production
-
Set cloud role name for multi-service applications
-
Enable sampling in high-traffic applications
-
Use structured logging for better log analytics queries
-
Add custom attributes to spans for better debugging
-
Use AAD authentication for production workloads