azure-monitor-opentelemetry-py
Azure Monitor OpenTelemetry Distro for Python. Use for one-line Application Insights setup with auto-instrumentation. Triggers: "azure-monitor-opentelemetry", "configure_azure_monitor", "Application Insights", "OpenTelemetry distro", "auto-instrumentation".
Install
npx skills add https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-python/skills/azure-monitor-opentelemetry-py
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install microsoft-skills@llmmart
git clone https://github.com/microsoft/skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole microsoft/skills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
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/ # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
Authentication & Lifecycle
🔑 Two rules apply to every code sample below:
- Prefer
DefaultAzureCredentialfor ingestion auth when supported.APPLICATIONINSIGHTS_CONNECTION_STRINGidentifies the target Application Insights resource, andcredential=DefaultAzureCredential(...)provides Microsoft Entra authentication.
- Local dev:
DefaultAzureCredentialworks as-is.- Production: set
AZURE_TOKEN_CREDENTIALS=prod(orAZURE_TOKEN_CREDENTIALS=<specific_credential>) to constrain the credential chain to production-safe credentials.- Providers are not context managers. Flush and shut down telemetry providers explicitly at process exit so buffers are exported deterministically.
Snippets may abbreviate this setup, but production code should always follow both rules.
Quick Start
from azure.identity import DefaultAzureCredential
from azure.monitor.opentelemetry import configure_azure_monitor
# Connection string identifies the App Insights resource (read from APPLICATIONINSIGHTS_CONNECTION_STRING env var).
# DefaultAzureCredential authenticates ingestion via Microsoft Entra ID (preferred over instrumentation-key-only auth).
configure_azure_monitor(
credential=DefaultAzureCredential(),
)
# Your application code...
Explicit Connection String
Pass the connection string explicitly by reading it from the environment variable.
The value includes both InstrumentationKey and IngestionEndpoint.
import os
from azure.monitor.opentelemetry import configure_azure_monitor
# Read the full connection string from the environment.
# Format: "InstrumentationKey=<key>;IngestionEndpoint=https://<id>.in.applicationinsights.azure.com/"
connection_string = os.environ["APPLICATIONINSIGHTS_CONNECTION_STRING"]
try:
configure_azure_monitor(
connection_string=connection_string,
)
# Your application code...
except Exception as exc:
raise RuntimeError(f"Azure Monitor configuration failed: {exc}") from exc
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, ManagedIdentityCredential
# Local dev: DefaultAzureCredential. In production, set AZURE_TOKEN_CREDENTIALS=prod or use a specific credential.
credential = DefaultAzureCredential()
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
configure_azure_monitor(
credential=credential
)
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
- Pick sync OR async and stay consistent. Do not mix
azure.xxxsync clients withazure.xxx.aioasync clients in the same call path. Choose one mode per module. - Call
provider.shutdown()/force_flush()at process exit to flush telemetry — providers are not context managers. - 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 Microsoft Entra authentication for production workloads
Reference Files
| File | Contents |
|---|---|
| references/capabilities.md | Additional non-hero capabilities, operation-group coverage, and production checklists. |
| references/non-hero-scenarios.md | Dedicated non-hero examples for secondary/advanced scenarios. |
Files (skills)
-
references
-
capabilities.md 2.5 KB
# azure-monitor-opentelemetry-py capability coverage **SDK/package**: `azure-monitor-opentelemetry` This index maps hero scenarios in `SKILL.md` and links non-hero scenarios documented in dedicated reference files. ## Hero scenarios covered in SKILL.md - `Explicit Connection String` - `With Flask` - `With Django` - `With FastAPI` ## Non-hero scenarios - `Custom Traces`: Dedicated example and implementation notes. See: [`non-hero-scenarios.md#custom-traces`](non-hero-scenarios.md#custom-traces) - `Custom Metrics`: Dedicated example and implementation notes. See: [`non-hero-scenarios.md#custom-metrics`](non-hero-scenarios.md#custom-metrics) - `Custom Logs`: Dedicated example and implementation notes. See: [`non-hero-scenarios.md#custom-logs`](non-hero-scenarios.md#custom-logs) - `Sampling`: Dedicated example and implementation notes. See: [`non-hero-scenarios.md#sampling`](non-hero-scenarios.md#sampling) - `Cloud Role Name`: Set cloud role name for Application Map: See: [`non-hero-scenarios.md#cloud-role-name`](non-hero-scenarios.md#cloud-role-name) - `Disable Specific Instrumentations`: Dedicated example and implementation notes. See: [`non-hero-scenarios.md#disable-specific-instrumentations`](non-hero-scenarios.md#disable-specific-instrumentations) - `Enable Live Metrics`: Dedicated example and implementation notes. See: [`non-hero-scenarios.md#enable-live-metrics`](non-hero-scenarios.md#enable-live-metrics) - `Azure AD Authentication`: Dedicated example and implementation notes. See: [`non-hero-scenarios.md#azure-ad-authentication`](non-hero-scenarios.md#azure-ad-authentication) - `Auto-Instrumentations Included`: | Library | Telemetry Type | See: [`non-hero-scenarios.md#auto-instrumentations-included`](non-hero-scenarios.md#auto-instrumentations-included) - `Configuration Options`: | Parameter | Description | Default | See: [`non-hero-scenarios.md#configuration-options`](non-hero-scenarios.md#configuration-options) ## Related deep-dive references - [`non-hero-scenarios.md`](non-hero-scenarios.md): Dedicated non-hero examples and implementation notes. ## API breadth checklist - Verify client/auth mode for the environment before coding. - Confirm operation-group/method names against current Microsoft Learn API reference. - For Python SDKs with both sync and async clients, document both forms without a blanket preference. - Include cleanup/delete paths for created resources in examples. - Prefer idempotent create/update operations where available. - Validate paging/LRO/error-handling patterns for production paths. -
non-hero-scenarios.md 3.5 KB
# azure-monitor-opentelemetry-py non-hero scenarios These scenarios are intentionally separate from hero flows in `SKILL.md`. They cover secondary/advanced patterns typically used after the primary end-to-end path is working. ## Custom Traces ```python 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 ```python 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 ```python 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 ```python 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: ```python 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 Use `instrumentation_options` to selectively enable or disable individual libraries. Libraries not listed remain enabled by default: ```python from azure.monitor.opentelemetry import configure_azure_monitor # Disable Django and psycopg2; leave flask, requests, urllib, urllib3 etc. enabled configure_azure_monitor( instrumentation_options={ "django": {"enabled": False}, "psycopg2": {"enabled": False}, } ) ``` ## Enable Live Metrics ```python from azure.monitor.opentelemetry import configure_azure_monitor configure_azure_monitor( enable_live_metrics=True ) ``` ## Azure AD Authentication ```python from azure.monitor.opentelemetry import configure_azure_monitor from azure.identity import DefaultAzureCredential, ManagedIdentityCredential # Local dev: DefaultAzureCredential. In production, set AZURE_TOKEN_CREDENTIALS=prod or use a specific credential. credential = DefaultAzureCredential() # Or use a specific credential directly in production: # See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes # credential = ManagedIdentityCredential() configure_azure_monitor( credential=credential ) ``` ## Auto-Instrumentations Included | Library | Telemetry Type | |---------|---------------| | Flask | Traces | | Django | Traces | | FastAPI | Traces | | Requests | Traces | | urllib | Traces | | urllib3 | Traces | | psycopg2 | Traces | | Azure SDK | 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 | | `instrumentation_options` | Dict controlling per-library `enabled` flags | All enabled | | `enable_live_metrics` | Enable Live Metrics stream | False |
-
-
SKILL.md 7.7 KB
--- name: azure-monitor-opentelemetry-py description: | Azure Monitor OpenTelemetry Distro for Python. Use for one-line Application Insights setup with auto-instrumentation. Triggers: "azure-monitor-opentelemetry", "configure_azure_monitor", "Application Insights", "OpenTelemetry distro", "auto-instrumentation". license: MIT metadata: author: Microsoft version: "1.0.0" package: azure-monitor-opentelemetry --- # Azure Monitor OpenTelemetry Distro for Python One-line setup for Application Insights with OpenTelemetry auto-instrumentation. ## Installation ```bash pip install azure-monitor-opentelemetry ``` ## Environment Variables ```bash APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=xxx;IngestionEndpoint=https://xxx.in.applicationinsights.azure.com/ # Required for all auth methods AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production ``` ## Authentication & Lifecycle > **🔑 Two rules apply to every code sample below:** > > 1. **Prefer `DefaultAzureCredential` for ingestion auth when supported.** `APPLICATIONINSIGHTS_CONNECTION_STRING` identifies the target Application Insights resource, and `credential=DefaultAzureCredential(...)` provides Microsoft Entra authentication. > - Local dev: `DefaultAzureCredential` works as-is. > - Production: set `AZURE_TOKEN_CREDENTIALS=prod` (or `AZURE_TOKEN_CREDENTIALS=<specific_credential>`) to constrain the credential chain to production-safe credentials. > 2. **Providers are not context managers.** Flush and shut down telemetry providers explicitly at process exit so buffers are exported deterministically. > > Snippets may abbreviate this setup, but production code should always follow both rules. ## Quick Start ```python from azure.identity import DefaultAzureCredential from azure.monitor.opentelemetry import configure_azure_monitor # Connection string identifies the App Insights resource (read from APPLICATIONINSIGHTS_CONNECTION_STRING env var). # DefaultAzureCredential authenticates ingestion via Microsoft Entra ID (preferred over instrumentation-key-only auth). configure_azure_monitor( credential=DefaultAzureCredential(), ) # Your application code... ``` ## Explicit Connection String Pass the connection string explicitly by reading it from the environment variable. The value includes both `InstrumentationKey` and `IngestionEndpoint`. ```python import os from azure.monitor.opentelemetry import configure_azure_monitor # Read the full connection string from the environment. # Format: "InstrumentationKey=<key>;IngestionEndpoint=https://<id>.in.applicationinsights.azure.com/" connection_string = os.environ["APPLICATIONINSIGHTS_CONNECTION_STRING"] try: configure_azure_monitor( connection_string=connection_string, ) # Your application code... except Exception as exc: raise RuntimeError(f"Azure Monitor configuration failed: {exc}") from exc ``` ## With Flask ```python 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 ```python # settings.py from azure.monitor.opentelemetry import configure_azure_monitor configure_azure_monitor() # Django settings... ``` ## With FastAPI ```python 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 ```python 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 ```python 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 ```python 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 ```python 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: ```python 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 ```python from azure.monitor.opentelemetry import configure_azure_monitor configure_azure_monitor( instrumentations=["flask", "requests"] # Only enable these ) ``` ## Enable Live Metrics ```python from azure.monitor.opentelemetry import configure_azure_monitor configure_azure_monitor( enable_live_metrics=True ) ``` ## Azure AD Authentication ```python from azure.monitor.opentelemetry import configure_azure_monitor from azure.identity import DefaultAzureCredential, ManagedIdentityCredential # Local dev: DefaultAzureCredential. In production, set AZURE_TOKEN_CREDENTIALS=prod or use a specific credential. credential = DefaultAzureCredential() # Or use a specific credential directly in production: # See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes # credential = ManagedIdentityCredential() configure_azure_monitor( credential=credential ) ``` ## 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 1. **Pick sync OR async and stay consistent.** Do not mix `azure.xxx` sync clients with `azure.xxx.aio` async clients in the same call path. Choose one mode per module. 2. **Call `provider.shutdown()` / `force_flush()` at process exit to flush telemetry — providers are not context managers.** 3. **Call configure_azure_monitor() early** — Before importing instrumented libraries 4. **Use environment variables** for connection string in production 5. **Set cloud role name** for multi-service applications 6. **Enable sampling** in high-traffic applications 7. **Use structured logging** for better log analytics queries 8. **Add custom attributes** to spans for better debugging 9. **Use Microsoft Entra authentication** for production workloads ## Reference Files | File | Contents | |------|----------| | [references/capabilities.md](references/capabilities.md) | Additional non-hero capabilities, operation-group coverage, and production checklists. | | [references/non-hero-scenarios.md](references/non-hero-scenarios.md) | Dedicated non-hero examples for secondary/advanced scenarios. |
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.