home / skills / sickn33 / antigravity-awesome-skills / azure-monitor-opentelemetry-py

azure-monitor-opentelemetry-py skill

/skills/azure-monitor-opentelemetry-py

This skill configures Azure Monitor OpenTelemetry for Python apps with one-line setup and auto-instrumentation to simplify observability.

npx playbooks add skill sickn33/antigravity-awesome-skills --skill azure-monitor-opentelemetry-py

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
5.0 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".
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/
```

## Quick Start

```python
from azure.monitor.opentelemetry import configure_azure_monitor

# One-line setup - reads connection string from environment
configure_azure_monitor()

# Your application code...
```

## Explicit Configuration

```python
from azure.monitor.opentelemetry import configure_azure_monitor

configure_azure_monitor(
    connection_string="InstrumentationKey=xxx;IngestionEndpoint=https://xxx.in.applicationinsights.azure.com/"
)
```

## 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

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

1. **Call configure_azure_monitor() early** — Before importing instrumented libraries
2. **Use environment variables** for connection string in production
3. **Set cloud role name** for multi-service applications
4. **Enable sampling** in high-traffic applications
5. **Use structured logging** for better log analytics queries
6. **Add custom attributes** to spans for better debugging
7. **Use AAD authentication** for production workloads

Overview

This skill provides a one-line setup to send traces, metrics, and logs from Python apps to Azure Application Insights using the Azure Monitor OpenTelemetry distro. It enables automatic instrumentation for popular frameworks and libraries and supports manual custom traces, metrics, and logs. Use it to get immediate observability with minimal code changes.

How this skill works

The package configures OpenTelemetry SDK components and registers auto-instrumentations (Flask, Django, FastAPI, requests, DB drivers, Redis, etc.). configure_azure_monitor() reads the Application Insights connection string from the environment or accepts explicit parameters, wires exporters, and optionally enables live metrics, sampling, and Azure AD authentication. After calling configure_azure_monitor(), both automatic and manual telemetry (spans, metrics, logs) are captured and sent to Application Insights.

When to use it

  • You want quick Application Insights setup with a single call in a Python app.
  • You need automatic instrumentation for web frameworks and common libraries.
  • You want to collect traces, metrics and logs in one integrated pipeline.
  • You need to enable sampling or live metrics without heavy SDK changes.
  • You want AAD-backed authentication or to set service resource attributes.

Best practices

  • Call configure_azure_monitor() as early as possible, before importing instrumented libraries.
  • Store the connection string in environment variables for production deployments.
  • Set an explicit service name (cloud role) via OpenTelemetry Resource for clear Application Map entries.
  • Enable sampling in high-traffic services to control ingestion costs.
  • Use structured logging and add custom span attributes for richer queryable context.

Example use cases

  • One-line setup in Flask, Django, or FastAPI apps to start sending telemetry to Application Insights.
  • Add a few custom spans and metrics to profile critical business operations.
  • Enable live metrics during performance testing to monitor throughput and errors in near real-time.
  • Use DefaultAzureCredential for managed identity/AAD authentication in production environments.
  • Restrict auto-instrumentation to a subset of libraries (e.g., flask and requests) for focused telemetry.

FAQ

How do I provide the Application Insights connection string?

Set APPLICATIONINSIGHTS_CONNECTION_STRING in the environment or pass connection_string to configure_azure_monitor().

Can I sample traffic to reduce telemetry volume?

Yes. Pass sampling_ratio (0.0 to 1.0) to configure_azure_monitor() to control the sampled percentage.

Does it capture logs as well as traces and metrics?

Yes. After configuration, Python logging emitted by your app is captured and forwarded to Application Insights.

Can I use Azure AD instead of a connection string?

Yes. Provide an Azure credential (for example DefaultAzureCredential) to configure_azure_monitor() to authenticate via AAD.