azure-monitor-query-py — скилл для Claude Code: обзор и установка
Скилл помогает писать Python-скрипты для чтения логов Log Analytics и метрик Azure Monitor через официальный SDK. Пригодится при отладке инцидентов и выгрузке телеметрии в Kusto.
npx skills add microsoft/skills --skill azure-monitor-query-py -a claude-codeЧто делает azure-monitor-query-py
Скилл обучает ассистента работать с библиотекой azure-monitor-query на Python. Он задаёт правила для двух ключевых клиентов: LogsQueryClient для логов Log Analytics и MetricsQueryClient для сбора метрик ресурсов Azure. Скрипты оформляются через контекстные менеджеры with или async with. Это гарантирует корректное закрытие сокетов и очистку токенов.
Для аутентификации используется DefaultAzureCredential. В рабочей среде требуется переменная AZURE_TOKEN_CREDENTIALS=prod. Без заданного AZURE_LOG_ANALYTICS_WORKSPACE_ID запросы к таблицам логов не запустятся. Ассистент умеет формировать запросы на языке Kusto, упаковывать результаты в таблицы pandas.DataFrame, запускать пачки запросов через LogsBatchQuery и обрабатывать статус LogsQueryStatus.PARTIAL.
При работе с метриками код строится вокруг идентификатора ресурса AZURE_METRICS_RESOURCE_URI. Скилл помогает запрашивать конкретные показатели вроде утилизации процессора, задавать шаг агрегации, фильтровать выборку по измерениям и получать списки пространств имён.
Какие задачи решает
- писать Kusto-запросы к Log Analytics через LogsQueryClient
- собирать метрики ресурсов Azure с нужной агрегацией и временным окном
- конвертировать выборки логов Azure в таблицы pandas DataFrame
- пакетировать несколько запросов к логам с помощью LogsBatchQuery
Примеры запросов агенту
- Напиши асинхронный скрипт на Python для выгрузки ошибок AppExceptions из Log Analytics за последние сутки.
- Собери метрики загрузки процессора и сетевого трафика для ресурса Azure через MetricsQueryClient.
- Покажи, как пачкой выполнить два Kusto-запроса через LogsBatchQuery и преобразовать вывод в DataFrame.
Как установить azure-monitor-query-py
1Через Skills CLI (Vercel)
npx skills add microsoft/skills --skill azure-monitor-query-py -a claude-code2Вручную: положить файлы
~/.claude/skills/azure-monitor-query-py/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/azure-monitor-query-py/
Вручную: положить файлы
.agents/skills/azure-monitor-query-py/SKILL.mdДля всех проектов — ~/.agents/skills/
Вручную: положить файлы
.cursor/skills/azure-monitor-query-py/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install microsoft/skills azure-monitor-query-py2Вручную: положить файлы
.github/skills/azure-monitor-query-py/SKILL.mdКомандой платформы
gemini skills install https://github.com/microsoft/skills --path .github/plugins/azure-sdk-python/skills/azure-monitor-query-pyВручную: положить файлы
.devin/skills/azure-monitor-query-py/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Claude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о azure-monitor-query-py
Как установить azure-monitor-query-py в Claude Code?
Выполните команду npx skills add microsoft/skills --skill azure-monitor-query-py -a claude-code. Файл навыка сохранится по пути ~/.claude/skills/azure-monitor-query-py/SKILL.md.
Что делает azure-monitor-query-py?
Скилл даёт ассистенту шаблоны и правила работы с Python SDK azure-monitor-query. Он помогает запрашивать логи через Kusto, выгружать метрики ресурсов Azure и настраивать авторизацию через DefaultAzureCredential.
Какие переменные окружения нужны для работы кода?
Для чтения логов требуется AZURE_LOG_ANALYTICS_WORKSPACE_ID, а для метрик — AZURE_METRICS_RESOURCE_URI. В продакшене также задаётся AZURE_TOKEN_CREDENTIALS=prod для ограничения цепочки учётных данных.
Исходный текст
SKILL.md · MIT
---
name: azure-monitor-query-py
description: |
Azure Monitor Query SDK for Python. Use for querying Log Analytics workspaces and Azure Monitor metrics.
Triggers: "azure-monitor-query", "LogsQueryClient", "MetricsQueryClient", "Log Analytics", "Kusto queries", "Azure metrics".
license: MIT
metadata:
author: Microsoft
version: "1.0.0"
package: azure-monitor-query
---
# Azure Monitor Query SDK for Python
Query logs and metrics from Azure Monitor and Log Analytics workspaces.
## Installation
```bash
pip install azure-monitor-query
```
## Environment Variables
```bash
# Log Analytics
AZURE_LOG_ANALYTICS_WORKSPACE_ID=<workspace-id> # Required for log queries
# Metrics
AZURE_METRICS_RESOURCE_URI=/subscriptions/<sub>/resourceGroups/<rg>/providers/<provider>/<type>/<name> # Required for metric queries
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`.** It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
> - 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. **Wrap every client in a context manager** so HTTP transports, sockets, and token caches are released deterministically:
> - Sync: `with <Client>(...) as client:`
> - Async: `async with <Client>(...) as client:` **and** `async with DefaultAzureCredential() as credential:` (from `azure.identity.aio`)
>
> Snippets may abbreviate this setup, but production code should always follow both rules.
```python
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# 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()
```
## Logs Query Client
### Basic Query
```python
from azure.monitor.query import LogsQueryClient
from datetime import timedelta
query = """
AppRequests
| where TimeGenerated > ago(1h)
| summarize count() by bin(TimeGenerated, 5m), ResultCode
| order by TimeGenerated desc
"""
with LogsQueryClient(credential) as client:
response = client.query_workspace(
workspace_id=os.environ["AZURE_LOG_ANALYTICS_WORKSPACE_ID"],
query=query,
timespan=timedelta(hours=1)
)
for table in response.tables:
for row in table.rows:
print(row)
```
### Query with Time Range
```python
from datetime import datetime, timezone
response = client.query_workspace(
workspace_id=workspace_id,
query="AppRequests | take 10",
timespan=(
datetime(2024, 1, 1, tzinfo=timezone.utc),
datetime(2024, 1, 2, tzinfo=timezone.utc)
)
)
```
### Convert to DataFrame
```python
import pandas as pd
response = client.query_workspace(workspace_id, query, timespan=timedelta(hours=1))
if response.tables:
table = response.tables[0]
df = pd.DataFrame(data=table.rows, columns=[col.name for col in table.columns])
print(df.head())
```
### Batch Query
```python
from azure.monitor.query import LogsBatchQuery
queries = [
LogsBatchQuery(workspace_id=workspace_id, query="AppRequests | take 5", timespan=timedelta(hours=1)),
LogsBatchQuery(workspace_id=workspace_id, query="AppExceptions | take 5", timespan=timedelta(hours=1))
]
responses = client.query_batch(queries)
for response in responses:
if response.tables:
print(f"Rows: {len(response.tables[0].rows)}")
```
### Handle Partial Results
```python
from azure.monitor.query import LogsQueryStatus
response = client.query_workspace(workspace_id, query, timespan=timedelta(hours=24))
if response.status == LogsQueryStatus.PARTIAL:
print(f"Partial results: {response.partial_error}")
elif response.status == LogsQueryStatus.FAILURE:
print(f"Query failed: {response.partial_error}")
```
## Metrics Query Client
### Query Resource Metrics
```python
from azure.monitor.query import MetricsQueryClient
from datetime import timedelta
with MetricsQueryClient(credential) as metrics_client:
response = metrics_client.query_resource(
resource_uri=os.environ["AZURE_METRICS_RESOURCE_URI"],
metric_names=["Percentage CPU", "Network In Total"],
timespan=timedelta(hours=1),
granularity=timedelta(minutes=5)
)
for metric in response.metrics:
print(f"{metric.name}:")
for time_series in metric.timeseries:
for data in time_series.data:
print(f" {data.timestamp}: {data.average}")
```
### Aggregations
```python
from azure.monitor.query import MetricAggregationType
response = metrics_client.query_resource(
resource_uri=resource_uri,
metric_names=["Requests"],
timespan=timedelta(hours=1),
aggregations=[
MetricAggregationType.AVERAGE,
MetricAggregationType.MAXIMUM,
MetricAggregationType.MINIMUM,
MetricAggregationType.COUNT
]
)
```
### Filter by Dimension
```python
response = metrics_client.query_resource(
resource_uri=resource_uri,
metric_names=["Requests"],
timespan=timedelta(hours=1),
filter="ApiName eq 'GetBlob'"
)
```
### List Metric Definitions
```python
definitions = metrics_client.list_metric_definitions(resource_uri)
for definition in definitions:
print(f"{definition.name}: {definition.unit}")
```
### List Metric Namespaces
```python
namespaces = metrics_client.list_metric_namespaces(resource_uri)
for ns in namespaces:
print(ns.fully_qualified_namespace)
```
## Async Clients
```python
from azure.monitor.query.aio import LogsQueryClient, MetricsQueryClient
from azure.identity.aio import DefaultAzureCredential
async def query_logs():
async with DefaultAzureCredential() as credential:
async with LogsQueryClient(credential) as client:
response = await client.query_workspace(
workspace_id=workspace_id,
query="AppRequests | take 10",
timespan=timedelta(hours=1)
)
return response
```
## Common Kusto Queries
```kusto
// Requests by status code
AppRequests
| summarize count() by ResultCode
| order by count_ desc
// Exceptions over time
AppExceptions
| summarize count() by bin(TimeGenerated, 1h)
// Slow requests
AppRequests
| where DurationMs > 1000
| project TimeGenerated, Name, DurationMs
| order by DurationMs desc
// Top errors
AppExceptions
| summarize count() by ExceptionType
| top 10 by count_
```
## Client Types
| Client | Purpose |
|--------|---------|
| `LogsQueryClient` | Query Log Analytics workspaces |
| `MetricsQueryClient` | Query Azure Monitor metrics |
## 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. **Always use context managers for clients and async credentials.** Wrap every client in `with Client(...) as client:` (sync) or `async with Client(...) as client:` (async). For async `DefaultAzureCredential` from `azure.identity.aio`, also use `async with credential:` so tokens and transports are cleaned up.
3. **Use `DefaultAzureCredential`** for portable auth across local dev and Azure (avoid connection strings / API keys when possible).
4. **Use timedelta** for relative time ranges
4. **Handle partial results** for large queries
5. **Use batch queries** when running multiple queries
6. **Set appropriate granularity** for metrics to reduce data points
7. **Convert to DataFrame** for easier data analysis
8. **Use aggregations** to summarize metric data
9. **Filter by dimensions** to narrow metric results
## 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. |
© Microsoft · MIT · microsoft/skills