mcpField
A
azure-monitor-query-py

azure-monitor-query-py

github.com/sickn33云与 DevOps48.7k50 次安装今天更新
代码仓库

关于 azure-monitor-query-py

azure-monitor-query-py 是用于查询 Azure Monitor 和 Log Analytics 工作区日志与指标的 Python 技能,涵盖同步、异步日志查询、批量请求、部分结果处理和数据转换;其中指标客户端示例标注为旧版。

主要功能

  1. 01查询 Log Analytics 工作区
  2. 02批量执行日志查询
  3. 03处理不完整的查询结果
  4. 04将查询表转换为 DataFrame
  5. 05使用异步日志查询

适用场景

  1. 01检查应用请求日志
  2. 02按时间范围比较异常
  3. 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 指标

最佳实践

  1. 使用 timedelta 设置相对时间范围
  2. 处理部分结果,以应对大型查询
  3. 运行多个查询时使用批量查询
  4. 设置合适的粒度,以减少指标数据点
  5. 转换为 DataFrame,以便更轻松地分析数据
  6. 使用聚合汇总指标数据
  7. 按维度筛选,缩小指标结果范围

适用场景

当需要执行概述中描述的工作流或操作时,可使用此技能。

限制

  • 仅当任务明确符合上述范围时,才使用此技能。
  • 请勿将输出视为环境特定验证、测试或专家审查的替代品。
  • 如果缺少必要的输入、权限、安全边界或成功标准,请暂停并请求澄清。

评论

支持 Markdown