关于 azure-monitor-query-py
azure-monitor-query-py 是用于查询 Azure Monitor 和 Log Analytics 工作区日志与指标的 Python 技能,涵盖同步、异步日志查询、批量请求、部分结果处理和数据转换;其中指标客户端示例标注为旧版。
主要功能
- 01查询 Log Analytics 工作区
- 02批量执行日志查询
- 03处理不完整的查询结果
- 04将查询表转换为 DataFrame
- 05使用异步日志查询
适用场景
- 01检查应用请求日志
- 02按时间范围比较异常
- 03使用 pandas 分析查询结果
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill azure-monitor-query-py安装后在 Claude Code 中输入/azure-monitor-query-py确认已加载。
详细介绍
Python 版 Azure Monitor 查询 SDK
查询 Azure Monitor 和 Log Analytics 工作区中的日志和指标。
安装
pip install azure-monitor-query azure-identity
环境变量
# Log Analytics
AZURE_LOG_ANALYTICS_WORKSPACE_ID=<workspace-id>
# Metrics
AZURE_METRICS_RESOURCE_URI=/subscriptions/<sub>/resourceGroups/<rg>/providers/<provider>/<type>/<name>
身份验证
import os
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
日志查询客户端
基本查询
from azure.monitor.query import LogsQueryClient
from datetime import timedelta
client = LogsQueryClient(credential)
query = """
AppRequests
| where TimeGenerated > ago(1h)
| summarize count() by bin(TimeGenerated, 5m), ResultCode
| order by TimeGenerated desc
"""
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)
按时间范围查询
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)
)
)
转换为 DataFrame
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=table.columns)
print(df.head())
批量查询
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)}")
处理部分结果
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}")
指标查询客户端(仅适用于旧版 azure-monitor-query 1.x)
2.0 版移除了 MetricsQueryClient;请勿在上方未固定版本的当前安装环境中运行以下旧版代码片段。新项目请使用 azure-monitor-querymetrics 或 azure-mgmt-monitor,并遵循其文档中说明的架构。请参阅官方迁移通知。
查询资源指标
from azure.monitor.query import MetricsQueryClient
from datetime import timedelta
metrics_client = MetricsQueryClient(credential)
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}")
聚合
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
]
)
按维度筛选
response = metrics_client.query_resource(
resource_uri=resource_uri,
metric_names=["Requests"],
timespan=timedelta(hours=1),
filter="ApiName eq 'GetBlob'"
)
列出指标定义
definitions = metrics_client.list_metric_definitions(resource_uri)
for definition in definitions:
print(f"{definition.name}: {definition.unit}")
列出指标命名空间
namespaces = metrics_client.list_metric_namespaces(resource_uri)
for ns in namespaces:
print(ns.fully_qualified_namespace)
异步客户端
from azure.monitor.query.aio import LogsQueryClient
from azure.identity.aio import DefaultAzureCredential
async def query_logs():
credential = DefaultAzureCredential()
client = LogsQueryClient(credential)
response = await client.query_workspace(
workspace_id=workspace_id,
query="AppRequests | take 10",
timespan=timedelta(hours=1)
)
await client.close()
await credential.close()
return response
常用 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_
客户端类型
| 客户端 | 用途 |
|---|---|
LogsQueryClient | 查询 Log Analytics 工作区 |
MetricsQueryClient | 查询 Azure Monitor 指标 |
最佳实践
- 使用 timedelta 设置相对时间范围
- 处理部分结果,以应对大型查询
- 运行多个查询时使用批量查询
- 设置合适的粒度,以减少指标数据点
- 转换为 DataFrame,以便更轻松地分析数据
- 使用聚合汇总指标数据
- 按维度筛选,缩小指标结果范围
适用场景
当需要执行概述中描述的工作流或操作时,可使用此技能。
限制
- 仅当任务明确符合上述范围时,才使用此技能。
- 请勿将输出视为环境特定验证、测试或专家审查的替代品。
- 如果缺少必要的输入、权限、安全边界或成功标准,请暂停并请求澄清。
评论
支持 Markdown