有多种方法可在 Azure Monitor 中创建数据收集规则 (DCR)。 在某些情况下,Azure Monitor 会根据你在 Azure 门户中配置的设置创建和管理 DCR。 在某些情况下,你甚至可能没有意识到你正在使用 DCR。 而在其他方案中,你可能需要创建自己的 DCR,或者直接使用其 JSON 中的定义来编辑现有 DCR。 本文介绍了 DCR 的多种创建方法,并提出了有关 DCR 编辑和故障排除的建议。
注释
本文介绍如何创建和编辑 DCR。 若要创建和编辑数据收集规则关联,请参阅创建和管理数据收集规则关联。
权限
你需要拥有以下权限,才能创建 DCR 和 DCR 关联:
| 内置角色 | 范围 | 原因 | 
|---|---|---|
| 监视参与者 | 
 | 创建或编辑 DCR,将规则分配给计算机,部署关联。 | 
| 虚拟机贡献者 Azure Connected Machine 资源管理员 | 
 | 在 VM(虚拟机)上部署代理扩展。 | 
| 包含操作 Microsoft.Resources/deployments/* 的任何角色 | 
 | 部署 Azure 资源管理器模板。 | 
重要
在目标 Log Analytics 工作区或 Azure Monitor 工作区所在的同一区域中创建 DCR。 你可以将 DCR 关联到租户中任何订阅或资源组中的计算机或容器。 若要跨租户发送数据,必须先启用 Azure Lighthouse。
使用 Azure 门户创建或编辑 DCR
Azure 门户提供了简化体验,便于你为特定方案创建 DCR。 使用此方法时,你无需了解 DCR 的结构,尽管你可能会在配置过程中受到限制,并且可能需要在稍后编辑 DCR 定义来实现转换等高级功能。 每个场景的经历会有所不同,因此请参阅有关具体场景的文档,如下表所述。
| 情景 | DESCRIPTION | 
|---|---|
| 从 VM 收集客户端数据 | 在 Azure 门户使用引导式界面创建 DCR,以从 VM 的客户端操作系统中选择不同数据源。 示例包括 Windows 事件、Syslog 事件和文本日志。 如有必要,会自动安装 Azure Monitor 代理,并在 DCR 与所选的每个 VM 之间自动创建关联。 请参阅使用 Azure Monitor 代理收集数据。 | 
| 表创建 | 使用 Azure 门户在 Log Analytics 工作区中创建新表时,上传 Azure Monitor 用于创建 DCR 的示例数据,其中包括一个可与日志引入 API 一起使用的转换。 你无法在 Azure 门户中修改此 DCR,但可以使用本文中所述的任何方法对其进行修改。 请参阅创建自定义表。 | 
| Kubernetes 监视 | 为监控 Kubernetes 群集,启用 Container Insights 来收集日志,启用 Prometheus 来收集指标。 为容器见解和 Prometheus 分别创建一个 DCR,并将其与群集中的容器化 Azure Monitor 代理版本相关联。 你可能需要修改容器见解 DCR 来添加转换。 请参阅为 Kubernetes 群集启用监视和容器见解中的数据转换。 | 
| 工作区改造 DCR | 工作区转换 DCR 为尚未使用 DCR 的数据收集方案提供转换。 你可以使用 Azure 门户创建此 DCR,从而为特定表创建转换。 请参阅创建工作区转换 DCR。 | 
DCR 定义
无论 DCR 的创建方式如何,每个 DCR 都具有遵循标准 JSON 架构的定义。 若要使用 Azure 门户以外的方法创建或编辑 DCR,需要直接使用其 JSON 定义。 对于某些方案,你必须使用 JSON 定义,因为 Azure 门户没有提供根据需要配置 DCR 的方法。
你可以在 Azure 门户中单击“概述”菜单中的“JSON 视图”,查看 DCR 的 JSON。
在“API 版本”下拉列表中验证是否选择了最新版本的 API。 否则,部分 JSON 可能无法显示。
你也可以调用 DCR REST API 来检索 DCR 的 JSON。 例如,以下 PowerShell 脚本会检索 DCR 的 JSON 并将其保存到文件中。
$ResourceId = "<ResourceId>" # Resource ID of the DCR to edit
$FilePath = "<FilePath>" # File to store DCR content
$DCR = Invoke-AzRestMethod -Path ("$ResourceId"+"?api-version=2023-03-11") -Method GET
$DCR.Content | ConvertFrom-Json | ConvertTo-Json -Depth 20 | Out-File -FilePath $FilePath
注释
你可以在 PowerShell 中使用 Get-AzDataCollectionRule cmdlet 或在 Azure CLI 中使用 az monitor data-collection rule show 命令获取 DCR 的详细信息,但这些方法不提供格式可供编辑的 JSON。 请改用 PowerShell 或 CLI 来调用 REST API,如示例中所示。
使用 JSON 创建或编辑 DCR
除了编辑现有 DCR 之外,你还可以使用示例 DCR之一创建新的 DCR,这些示例提供 JSON,适合很多常见方案。 使用 Azure Monitor 中的数据收集规则结构中的信息针对特定环境和要求修改 JSON 文件。
定义 DCR 后,可以使用 Azure 门户、CLI、PowerShell、API 或 ARM 模板将其部署到 Azure Monitor。
使用 CLI 创建或编辑 DCR
使用 az monitor data-collection rule create 命令根据 JSON 文件创建 DCR。 还可以使用相同命令更新现有 DCR。
az monitor data-collection rule create --location 'chinaeast2' --resource-group 'my-resource-group' --name 'my-dcr' --rule-file 'C:\MyNewDCR.json' --description 'This is my new DCR'
注释
虽然可以选择使用 PowerShell 或 CLI 命令创建和编辑 DCR,但如果出现编译错误,API 和 ARM 方法将提供更详细的错误消息。
在以下示例中,DCR 指定目标 Log Analytics 工作区中不存在的表名。 PowerShell 命令返回通用错误消息,而 API 调用则返回指明确切错误的详细错误消息。
DCR 编辑和测试策略
创建 DCR 或使用 DCR 的 JSON 定义编辑 DCR 时,通常需要多次更新才能实现所需的功能。 你需要一种有效的方法来更新 DCR,在没有得到预期结果时对其进行故障排除,然后继续更新其他内容。 在向 DCR 添加转换时尤其如此,因为你需要验证查询是否按预期运行。 由于无法在 Azure 门户中直接编辑 JSON,因此你可以使用以下策略。
使用本地文件作为 DCR 的源
如果使用本地 JSON 文件作为你要创建和编辑的 DCR 的源,就能确保始终访问最新版本的 DCR 定义。 如果要使用 GitHub 或 Azure DevOps 等版本控制工具来管理更改,那么这是十分理想的选择。 你也可以使用 VS Code 等编辑器更改 DCR,然后使用命令行工具更新 Azure Monitor 中的 DCR,如上文所述。
下面是 PowerShell 脚本示例,可用于将源文件中的更改推送到 DCR。 此操作会在将源文件发送到 Azure Monitor 之前,验证源文件是否为有效的 JSON。
param (
    [Parameter(Mandatory = $true)][string]$ResourceId,  # Resource ID of the DCR
    [Parameter(Mandatory = $true)][string]$FilePath  # Path to the DCR JSON file to upload
)
# Read the DCR content from the file
Write-Host "Reading new DCR content from: $FilePath" -ForegroundColor Green
$DCRContent = Get-Content $FilePath -Raw
# Ensure the DCR content is valid JSON
try {
    $ParsedDCRContent = $DCRContent | ConvertFrom-Json
} catch {
    Write-Host "Invalid JSON content in file: $FilePath" -ForegroundColor Red
    exit 1
}
# Create or update the DCR in the specified resource group
Write-Host "Deploying DCR $ResourceId ..." -ForegroundColor Green
Invoke-AzRestMethod -Path ("$ResourceId"+"?api-version=2023-03-11") -Method PUT -Payload $DCRContent
将 DCR 内容保存到临时文件
如果本地文件中没有 DCR 定义,可以从 Azure Monitor 检索定义并将其保存到临时文件中。 使用 VS Code 等编辑器编辑此文件,然后再将更新推送到 Azure Monitor。
下面是 PowerShell 脚本示例,可用于编辑 Azure Monitor 中现有的 DCR。 该脚本将检索 DCR 定义,将其保存到临时文件,然后再启动 VS Code。 向脚本指示你已保存更改后,系统就会使用新内容更新 DCR 并删除临时文件。
param ([Parameter(Mandatory=$true)] $ResourceId)
# Get DCR content and save it to a local file
$FilePath = "temp.dcr"
$DCR = Invoke-AzRestMethod -Path ("$ResourceId"+"?api-version=2023-03-11") -Method GET
$DCR.Content | ConvertFrom-Json | ConvertTo-Json -Depth 20 | Out-File $FilePath
# Open DCR in code editor
code $FilePath | Wait-Process
{ 
	#write DCR content back from the file
	$DCRContent = Get-Content $FilePath -Raw
	Invoke-AzRestMethod -Path ("$ResourceId"+"?api-version=2023-03-11") -Method PUT -Payload $DCRContent		
}
#Delete temporary file
Remove-Item $FilePath
使用 ARM 模板就地编辑 DCR
如果想要完全在 Azure 门户中编辑 DCR,可以使用导出模板功能来检索适用于 DCR 的 ARM 模板。 然后在 JSON 中修改定义,并在 Azure 门户中重新部署。
- 选择要在 Azure 门户中修改的 DCR,然后选择“导出模板”。 单击“部署”,重新部署同一模板。 
- 单击“编辑模板”,打开 DCR 可编辑的 JSON 版本。 请勿更改参数值。 
- 对 DCR 进行任何所需更改,然后单击“保存”。 
- 如果要创建新的 DCR,则请更改名称参数。 否则,请将参数保留不变。 单击“查看 + 创建”以部署修改后的模板,然后单击“创建”以创建新的 DCR。 
- 如果 DCR 有效且系统没有显示任何错误,则部署成功,DCR 将更新并使用新的配置。 单击“转到资源”以打开修改后的 DCR。 
- 如果 DCR 存在编译错误,你会收到部署失败的消息。 单击“错误详细信息”和“操作详细信息”,查看错误的详细信息。 单击“重新部署”,并再次单击“编辑模板”,对 DCR 进行必要的更改,然后再次保存并部署它。 
验证数据收集并对其进行故障排除
安装 DCR 后,可能需要几个小时更改才能生效并使用更新后的 DCR 收集数据。 如果未看到任何正在收集的数据,则很难确定问题的根本原因。 使用 DCR 监视功能,其包括有助于故障排除的指标和日志。
DCR 指标会自动为所有 DCR 收集,可以像其他 Azure 资源的平台指标一样,使用指标资源管理器分析这些指标。 启用 DCR 错误日志 ,以便在数据处理未成功时获取详细的错误信息。
如果未看到正在收集数据,请按照以下基本步骤排查问题。
- 检查 Logs Ingestion Bytes per Min和Logs Rows Received per Min等指标,以确保数据到达 Azure Monitor。 如果不是这样,请检查您的数据源以确保其按预期正常发送数据。
- 检查 Logs Rows Dropped per Min以确定是否删除了任何行。 这可能并不表示出现错误,因为转换可能会删除这些行。 如果删除的行与Logs Rows Dropped per Min相同,那么工作区中不会引入任何数据。 检查Logs Transformation Errors per Min以确认是否有任何转换错误。
- 检查 Logs Transformation Errors per Min以确定应用于传入数据的转换是否有任何错误。 这可能因数据结构或转换本身发生更改所致。
- 查看 DCRLogErrors表,检查是否可能记录了任何数据引入错误。 这可以在确定问题的根本原因时提供更多详细信息。
 
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
               
              
              