你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 Azure 数据资源管理器和 Azure Resource Graph 中的数据与 Log Analytics 工作区中的数据相关联

通过将 Azure 数据资源管理器Azure Resource Graph 中的数据与 Log Analytics 工作区和 Application Insights 资源中的数据相关联来增强 Azure Monitor 日志中的分析。 本文介绍如何从存储在 Log Analytics 工作区中的任何服务运行跨服务查询。 尽管 Microsoft Sentinel 将数据存储在 Log Analytics 工作区中,并支持对 Azure 数据资源管理器的跨服务查询,但并不是 Microsoft Sentinel 的每个功能都支持对 Azure Resource Graph 的查询。

使用支持 Kusto 查询语言(KQL)查询的任何客户端工具(包括 Azure 门户中的 Log Analytics、工作簿、PowerShell 和 REST API)运行跨服务查询。

先决条件

资源 所需权限
Log Analytics 工作区 在查询的 Log Analytics 工作区具有 Microsoft.OperationalInsights/workspaces/query/*/read
例如,Log Analytics 读取者内置角色所提供的权限。
Azure Resource Graph 读取对 Azure Resource Graph 中查询的资源的权限
Azure 数据资源管理器 查看对 Azure 数据资源管理器中查询的表的权限

实施注意事项

以下方案中不支持跨服务查询:

常规跨服务注意事项

  • 数据库名称区分大小写。
  • 使用非参数化函数和函数,其定义不包括其他跨工作区或跨服务表达式。 可接受的函数包括adx()arg()resource()workspace()app()
  • 跨服务查询仅支持数据检索。
  • 跨服务查询唯一支持的命令是 命令。 此功能允许跨群集查询直接引用 Azure Monitor、Azure 数据资源管理器或 Azure Resource Graph 表格函数。

    .show 跨服务查询支持的命令:

    .show functions
    .show function {FunctionName}
    .show database {DatabaseName} schema as json

  • 不支持标识群集中的“时间戳”列。 Log Analytics 查询 API 不会传递时间筛选器。
  • mv-expand 最多支持 2,000 条记录。
  • Azure Monitor 日志不支持此 external_table() 函数,这允许在 Azure 数据资源管理器中查询外部表。 若要查询外部表,请在 Azure 数据资源管理器中定义 external_table(<external-table-name>) 为无参数函数。 然后,可以使用表达式 adx("").<function-name> 调用函数。
  • 使用 join 运算符(而不是联合)时,需要使用 hint 将 Azure 数据资源管理器或 Azure Resource Graph 中的数据与 Log Analytics 工作区中的数据合并。 使用 Hint.remote={direction of the Log Analytics workspace}
    例如:
    AzureDiagnostics
    | join hint.remote=left adx("cluster=ClusterURI").AzureDiagnostics on (ColumnName)
    

Azure Resource Graph 跨服务查询注意事项

  • 查询 arg 部分仅返回前 1,000 条记录。 如果与 join 缺少记录(如果达到限制)结合使用,请记住这一点。
  • 使用 join 运算符可将一个 Azure Resource Graph 表中的数据与 Log Analytics 工作区中的一个表进行组合。
  • Azure Monitor 不返回 Azure Resource Graph 查询错误。
  • Log Analytics 查询编辑器将有效的 Azure Resource Graph 查询标记为语法错误。 例如,有效的查询可能会提供如下所示的错误:“名称 <有效名称> 不引用任何已知的列、表、变量或函数。
  • 不支持这些运算符:smv-apply()rand()arg_max()arg_min()avg()avg_if()countif()sumif()percentile()percentiles()percentilew()percentilesw()stdev()stdevif()stdevp()variance()variancep()varianceif()bin_at
  • Microsoft Sentinel 不支持使用 KQL 的所有功能中的跨服务查询。

使用 adx() 查询 Azure 数据资源管理器中的数据

adx 模式的查询中输入 Azure 数据资源管理器群集的标识符,后跟数据库名称和表。

adx('https://help.kusto.windows.net/Samples').StormEvents

将 Azure 数据资源管理器群集表与 Log Analytics 工作区合并

使用 union 命令将群集表与 Log Analytics 工作区合并。

例如:

union customEvents, adx('https://help.kusto.windows.net/Samples').StormEvents
| take 10
let CL1 = adx('https://help.kusto.windows.net/Samples').StormEvents;
union customEvents, CL1 | take 10

提示

允许使用速记格式:ClusterName/InitialCatalog。 例如 adx('help/Samples') 转换为 adx('help.kusto.windows.net/Samples')

将一个租户的 Azure 数据资源管理器群集中的数据与另一个租户的 Azure Monitor 资源联接

不支持服务之间的跨租户查询。 你已登录到单个租户,可运行跨两个资源的查询。

如果 Azure 数据资源管理器资源位于租户 A 中,Log Analytics 工作区位于租户 B 中,那么请使用下述某种方法:

  • 使用 Azure 数据资源管理器可以为不同租户中的主体添加角色。 在 Azure 数据资源管理器群集上将用户 ID 作为授权用户添加到租户 B 中。 验证 Azure 数据资源管理器群集上的 TrustedExternalTenant 属性是否包含租户 B。在租户 B 中完全运行交叉查询。
  • 使用 Lighthouse 将 Azure Monitor 资源投射到租户 A。

从不同租户连接到 Azure 数据资源管理器群集

Kusto Explorer 会自动将您登录到用户帐户最初所属的租户。 若要使用同一用户帐户访问其他租户中的资源,必须在以下连接字符串中显式指定 TenantId

Data Source=https://ade.applicationinsights.io/subscriptions/SubscriptionId/resourcegroups/ResourceGroupName;Initial Catalog=NetDefaultDB;AAD Federated Security=True;Authority ID=TenantId

使用 arg() 查询 Azure Resource Graph 中的数据(预览版)

输入 arg("") 模式,然后输入 Azure Resource Graph 表名。

例如:

arg("").<Azure-Resource-Graph-table-name>

提示

arg() 操作员现在可以在 Microsoft Defender 门户中使用高级搜寻功能。 此功能允许查询 Microsoft Sentinel 表的结果。 有关详细信息,请参阅 高级搜寻中的 Azure Resource Graph 查询

下面是一些使用新 Azure Resource Graph 跨服务查询功能的 Azure Log Analytics 查询示例:

示例:根据 Azure Resource Graph 查询的结果筛选 Log Analytics 查询

arg("").Resources 
| where type == "microsoft.compute/virtualmachines" and properties.hardwareProfile.vmSize startswith "Standard_D"
| join (
   Heartbeat
   | where TimeGenerated > ago(1d)
   | distinct Computer
)
on $left.name == $right.Computer

示例:创建仅适用于从 arg() 查询获取的某些资源的警报规则

基于标签排除资源。 例如,不要为带有标记的 Test VM 触发警报。

arg("").Resources
| where tags.environment=~'Test'
| project name 

检索与 CPU 利用率相关的性能数据,并筛选出带有 prod 标签的资源。

InsightsMetrics
| where Name == "UtilizationPercentage"
| lookup (
   arg("").Resources 
   | where type == 'microsoft.compute/virtualmachines' 
   | project _ResourceId=tolower(id), tags
)
on _ResourceId
| where tostring(tags.Env) == "Prod"

更多示例用例

  • 使用标记确定 VM 是应全天候运行还是应在夜间关闭。
  • 在包含已定义核心数的任何服务器上显示警报。

从 Log Analytics 工作区创建基于跨服务查询的警报

若要从 Log Analytics 工作区创建基于跨服务查询的警报规则,请按照创建或编辑日志搜索警报规则中的步骤操作,在“范围”选项卡上选择 Log Analytics 工作区

提示

通过选择相关资源作为警报范围,将跨服务查询从 Azure 数据资源管理器和 Azure Resource Graph 运行到 Log Analytics 工作区。

将 Azure Resource Graph 表与 Log Analytics 工作区合并

使用 union 命令将群集表与 Log Analytics 工作区合并。

例如:

union AzureActivity, arg("").Resources
| take 10
let CL1 = arg("").Resources ;
union AzureActivity, CL1 | take 10

使用 join 运算符(而不是联合)时,需要使用 hint 将 Azure Resource Graph 中的数据与 Log Analytics 工作区中的数据合并。 使用 Hint.remote={Direction of the Log Analytics Workspace}。 例如:

Perf | where ObjectName == "Memory" and (CounterName == "Available MBytes Memory")
| extend _ResourceId = replace_string(replace_string(replace_string(_ResourceId, 'microsoft.compute', 'Microsoft.Compute'), 'virtualmachines','virtualMachines'),"resourcegroups","resourceGroups")
| join hint.remote=left (arg("").Resources | where type =~ 'Microsoft.Compute/virtualMachines' | project _ResourceId=id, tags) on _ResourceId | project-away _ResourceId1 | where tostring(tags.env) == "prod"