关于 azure-monitor-ingestion-py
这是一个使用 Python 将自定义日志写入 Azure Monitor Log Analytics 的 SDK 技能,基于 Logs Ingestion API。内容涵盖同步与异步上传、身份验证、批处理和部分失败处理。
主要功能
- 01同步与异步日志上传
- 02使用 DefaultAzureCredential 验证
- 03从 JSON 文件导入
- 04部分失败回调处理
- 05分块、gzip 压缩与并行上传
- 06Azure Government 配置
适用场景
- 01将应用日志导入 Log Analytics 工作区
- 02从 JSON 文件上传结构化日志
- 03处理批量上传中的失败记录
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill azure-monitor-ingestion-py安装后在 Claude Code 中输入/azure-monitor-ingestion-py确认已加载。
详细介绍
Azure Monitor Python 引入 SDK
使用 Logs Ingestion API 将自定义日志发送到 Azure Monitor Log Analytics 工作区。
安装
pip install azure-monitor-ingestion
pip install azure-identity
环境变量
# Data Collection Endpoint (DCE)
AZURE_DCE_ENDPOINT=https://<dce-name>.<region>.ingest.monitor.azure.com
# Data Collection Rule (DCR) immutable ID
AZURE_DCR_RULE_ID=dcr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# Stream name from DCR
AZURE_DCR_STREAM_NAME=Custom-MyTable_CL
先决条件
使用此 SDK 前,需要准备:
- Log Analytics 工作区 — 日志的目标位置
- Data Collection Endpoint(DCE) — 引入端点
- Data Collection Rule(DCR) — 定义架构和目标位置
- 自定义表 — 位于 Log Analytics 中(通过 DCR 创建或手动创建)
身份验证
from azure.monitor.ingestion import LogsIngestionClient
from azure.identity import DefaultAzureCredential
import os
client = LogsIngestionClient(
endpoint=os.environ["AZURE_DCE_ENDPOINT"],
credential=DefaultAzureCredential()
)
请使用已授权的端点、DCR、流和架构,并配置具备相应范围权限的身份;具体使用 DCE 还是 DCR 引入端点取决于设置。以下 2024 年的时间戳是历史示例数据,并非当前实时引入探测数据。验证时请使用经过批准的合成当前时间戳,上传前请删除 PII 和机密信息,并确认保留期限和费用。无论成功还是失败,都请关闭客户端和凭据;验证本指南时不应上传任何日志。
上传自定义日志
from azure.monitor.ingestion import LogsIngestionClient
from azure.identity import DefaultAzureCredential
import os
client = LogsIngestionClient(
endpoint=os.environ["AZURE_DCE_ENDPOINT"],
credential=DefaultAzureCredential()
)
rule_id = os.environ["AZURE_DCR_RULE_ID"]
stream_name = os.environ["AZURE_DCR_STREAM_NAME"]
logs = [
{"TimeGenerated": "2024-01-15T10:00:00Z", "Computer": "server1", "Message": "Application started"},
{"TimeGenerated": "2024-01-15T10:01:00Z", "Computer": "server1", "Message": "Processing request"},
{"TimeGenerated": "2024-01-15T10:02:00Z", "Computer": "server2", "Message": "Connection established"}
]
client.upload(rule_id=rule_id, stream_name=stream_name, logs=logs)
从 JSON 文件上传
import json
with open("logs.json", "r") as f:
logs = json.load(f)
client.upload(rule_id=rule_id, stream_name=stream_name, logs=logs)
自定义错误处理
使用回调处理部分失败:
failed_logs = []
def on_error(error):
print(f"Upload failed: {error.error}")
failed_logs.extend(error.failed_logs)
client.upload(
rule_id=rule_id,
stream_name=stream_name,
logs=logs,
on_error=on_error
)
# Retry failed logs
if failed_logs:
print(f"Retrying {len(failed_logs)} failed logs...")
client.upload(rule_id=rule_id, stream_name=stream_name, logs=failed_logs)
上传不完整
on_error 回调可以抑制默认异常。请持久化受保护且有大小限制的失败摘要,并将上传报告为部分成功或失败;切勿静默丢弃失败的日志,也不要将整个批次标记为成功。仅对已分类的暂时性故障进行有界退避重试,并核对结果不明确的情况以及重复引入的影响。
异步客户端
import asyncio
from azure.monitor.ingestion.aio import LogsIngestionClient
from azure.identity.aio import DefaultAzureCredential
async def upload_logs():
async with LogsIngestionClient(
endpoint=endpoint,
credential=DefaultAzureCredential()
) as client:
await client.upload(
rule_id=rule_id,
stream_name=stream_name,
logs=logs
)
asyncio.run(upload_logs())
主权云
from azure.identity import AzureAuthorityHosts, DefaultAzureCredential
from azure.monitor.ingestion import LogsIngestionClient
# Azure Government
credential = DefaultAzureCredential(authority=AzureAuthorityHosts.AZURE_GOVERNMENT)
client = LogsIngestionClient(
endpoint="https://example.ingest.monitor.azure.us",
credential=credential,
credential_scopes=["https://monitor.azure.us/.default"]
)
批处理行为
SDK 会自动:
- 将日志拆分为不超过 1MB 的数据块
- 使用 gzip 压缩每个数据块
- 并行上传数据块
SDK 分块不会限制应用程序的输入内存或总引入费用。请限制输入字节数和行数,确认已安装版本的批处理和并发行为,并处理部分成功。
客户端类型
| 客户端 | 用途 |
|---|---|
LogsIngestionClient | 用于上传日志的同步客户端 |
LogsIngestionClient (aio) | 用于上传日志的异步客户端 |
关键概念
| 概念 | 描述 |
|---|---|
| DCE | Data Collection Endpoint — 引入 URL |
| DCR | Data Collection Rule — 定义架构、转换和目标位置 |
| 流 | DCR 中的命名数据流 |
| 自定义表 | Log Analytics 中的目标表(以 _CL 结尾) |
DCR 流名称格式
流名称遵循以下模式:
Custom-<TableName>_CL— 用于自定义表Microsoft-<TableName>— 用于内置表
最佳实践
- 使用 DefaultAzureCredential 进行身份验证
- 妥善处理错误 — 使用
on_error回调处理部分失败 - 包含 TimeGenerated — 所有日志都必须包含此字段
- 与 DCR 架构匹配 — 日志字段必须与 DCR 列定义匹配
- 在高吞吐量场景中使用异步客户端
- 批量上传 — SDK 会处理批处理,但请发送大小合理的数据块
- 监控引入状态 — 在 Log Analytics 中检查引入状态
- 使用上下文管理器 — 确保正确清理客户端
适用场景
当任务涉及执行概述中描述的工作流或操作时,可使用此技能。
限制
- 仅当任务明确符合上述范围时,才使用此技能。
- 不要将输出视为针对具体环境进行验证、测试或专家审查的替代品。
- 如果缺少必要的输入、权限、安全边界或成功标准,请暂停并请求澄清。
评论
支持 Markdown