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

Azure Monitor 中的数据收集转换

通过 Azure Monitor 中的转换,可在将传入数据发送到 Log Analytics 工作区之前对其进行筛选或修改。 本文提供转换的基本说明及其实现方式。 它提供指向用于创建转换的其他内容的链接。

为何使用转换

下表描述了可使用转换实现的不同目标。

类别 详细信息
删除敏感数据 你可能有一个数据源,用于发送不希望出于隐私或合规性原因而存储的信息。

筛选敏感信息。 筛选出整行或筛选出包含敏感信息的特定列。

混淆敏感信息。 将 IP 地址或电话号码中的数字等信息替换为通用字符。

发送到备用表。 将敏感记录发送到具有不同基于角色的访问控制配置的备用表。
使用更多或计算的信息扩充数据 使用转换将信息添加到数据,从而提供业务上下文或稍后简化查询数据。

添加包含更多信息的列。 例如,你可能会添加一个列,用于确定另一列中的 IP 地址是内部地址还是外部地址。

添加特定于业务的信息。 例如,你可能会添加一个列,指示基于其他列中的位置信息的公司部门。
降低数据成本 由于需要为任何发送到 Log Analytics 工作区的数据支付引入费用,因此需要筛选出所有不需要的数据来降低成本。

删除整行。 例如,你可能有一个诊断设置来从特定资源收集资源日志,但不需要它生成的所有日志条目。 创建一个筛选掉符合特定条件的记录的转换。

从每行中删除列。 例如,数据可能包含具有冗余数据或最小值的列。 创建一个筛选出不需要的列的转换。

分析列中的重要数据。 你可能有一个表,其中包含隐藏在特定列中的有价值数据。 使用转换将有价值的数据解析为新列并删除原始数据。

将某些行发送到基本日志。 将数据中需要基本查询功能的行发送到基本日志表,以降低引入成本。

受支持的表

可以将转换应用于 Log Analytics 工作区中的以下表:

转换的工作原理

在数据源传递数据之后且在将数据发送到目标之前,在数据引入管道的 Azure Monitor 中执行转换。 数据源可以在发送数据之前执行自己的筛选,但将其发送到目标之前,需依赖转换来进一步操作。

转换在数据收集规则 (DCR) 中定义,并使用单独应用于传入数据中的每个条目的 Kusto 查询语言 (KQL) 语句。 它必须了解传入数据的格式,并在目标所需的结构中创建输出。

例如,使用 Azure Monitor 代理从虚拟机收集数据的 DCR 将指定要从客户端操作系统中收集的特定数据。 它还可能包括在将数据发送到数据引入管道后应用于该数据的转换,以便进一步筛选数据或添加计算列。 请参阅创建代理转换。 下图演示了此工作流。

Diagram that shows ingestion-time transformation for Azure Monitor Agent.

另一示例是使用日志引入 API 从自定义应用程序发送的数据。 在这种情况下,应用程序将数据发送到数据收集终结点,并在 REST API 调用中指定 DCR。 DCR 包括转换以及目标工作区和表。

Diagram that shows ingestion-time transformation for custom application by using logs ingestion API.

工作区转换 DCR

工作区转换 DCR 是直接应用于 Log Analytics 工作区的特殊 DCR。 它包括一个或多个受支持表的默认转换。 这些转换应用于发送到这些表的任何数据,除非该数据来自另一 DCR。

例如,如果在工作区转换 DCR 中为 Event 表创建转换,它将应用于运行 Log Analytics 代理的虚拟机收集的事件,因为此代理不使用 DCR。 从 Azure Monitor 代理发送的任何数据都将忽略转换,因为它使用 DCR,并且应提供自己的转换。

工作区转换 DCR 的常见用途是收集资源日志,这些日志配置了诊断设置。 以下示例演示了此过程。

Diagram that shows workspace transformation for resource logs configured with diagnostic settings.

多个目标

通过转换,可以使用单个 DCR 将数据发送到 Log Analytics 工作区中的多个目标。 可为每个目标提供一个 KQL 查询,并将每个查询的结果发送到其相应位置。 可以将不同数据集发送到不同的表,或使用多个查询将不同的数据集发送到同一个表。

例如,可以使用日志引入 API 将事件数据发送到 Azure Monitor。 大多数事件应发送到分析表(可在其中定期查询),而审核事件应发送到为基本日志配置的自定义表,以降低成本。

若要使用多个目标,当前必须手动创建新的 DCR 或编辑现有 DCR。 有关使用多个目标的 DCR 的示例,请参阅示例部分。

重要

目前,DCR 中的表必须位于同一 Log Analytics 工作区中。 若要从单个数据源发送到多个工作区,请使用多个 DCR 并将应用程序配置为将数据发送到每个工作区。

Diagram that shows transformation sending data to multiple tables.

创建转换

有多种方法可以创建转换,具体取决于数据收集方法。 下表列出了用于创建转换的不同方法的指导。

类型 参考
将日志引入 API 与转换配合使用 使用 REST API 将数据发送到 Azure Monitor 日志(Azure 门户)
使用 REST API(Azure 资源管理器模板)将数据发送到 Azure Monitor 日志
工作区 DCR 中的转换 使用 Azure 门户将工作区转换添加到 Azure Monitor 日志
使用资源管理器模板将工作区转换添加到 Azure Monitor 日志
DCR 中的代理转换 向 Azure Monitor 日志添加转换

转换的成本

虽然转换本身不会产生直接成本,但以下情况可能会导致额外费用:

  • 如果转换增加了传入数据的大小(例如通过添加计算列),则需要为额外数据支付标准引入费。
  • 如果转换将传入数据减少了 50% 以上,则需要为超过 50% 的筛选数据量付费。

若要计算转换产生的数据处理费用,请使用以下公式:
[通过转换筛选掉的 GB] -([引入的总 GB] / 2)。 下表显示了示例。

管道引入的数据 转换删除的数据 Log Analytics 工作区引入的数据 数据处理费用 引入费用
20 GB 12 GB 8 GB 2 GB 1 8 GB
20 GB 8 GB 12 GB 0 GB 12 GB

1 此费用不包括 Log Analytics 工作区引入的数据的费用。

为了避免产生此费用,应在应用转换之前使用替代方法筛选引入的数据。 通过这样做,可以减少转换处理的数据量,从而最大限度地减少任何额外的成本。

请参阅 Azure Monitor 定价,了解当前在 Azure Monitor 中引入和保留日志数据的费用。

重要

如果为 Log Analytics 工作区启用了 Azure Sentinel,则无论转换筛选的数据量如何,都不会产生筛选引入费用。

示例

以下资源管理器模板显示具有不同模式的示例 DCR。 你可以使用这些模板作为起点,为你自己的场景创建带有转换的 DCR。

单个目标

以下示例是用于向 Syslog 表发送数据的 Azure Monitor 代理的 DCR。 在此示例中,转换会筛选消息中出现“error”的记录的数据。

{ 
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources" : [
        {
            "type": "Microsoft.Insights/dataCollectionRules", 
            "name": "singleDestinationDCR", 
            "apiVersion": "2021-09-01-preview", 
            "location": "eastus", 
            "properties": { 
              "dataSources": { 
                "syslog": [ 
                  { 
                    "name": "sysLogsDataSource", 
                    "streams": [ 
                      "Microsoft-Syslog" 
                    ], 
                    "facilityNames": [ 
                      "auth",
                      "authpriv",
                      "cron",
                      "daemon",
                      "mark",
                      "kern",
                      "mail",
                      "news",
                      "syslog",
                      "user",
                      "uucp"
                    ], 
                    "logLevels": [ 
                      "Debug", 
                      "Critical", 
                      "Emergency" 
                    ] 
                  } 
                ] 
              }, 
              "destinations": { 
                "logAnalytics": [ 
                  { 
                    "workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-resource-group/providers/Microsoft.OperationalInsights/workspaces/my-workspace", 
                    "name": "centralWorkspace" 
                  } 
                ] 
              }, 
              "dataFlows": [ 
                { 
                  "streams": [ 
                    "Microsoft-Syslog" 
                  ], 
                  "transformKql": "source | where message has 'error'", 
                  "destinations": [ 
                    "centralWorkspace" 
                  ] 
                } 
              ] 
            }
        }
    ]
} 

多个 Azure 表

以下示例是日志引入 API 中数据的 DCR,该 API 会将数据发送到 SyslogSecurityEvent 表。 此 DCR 要求每个表都有单独的 dataFlow,并且每个表具有不同的 transformKqlOutputStream。 在此示例中,所有传入数据都发送到 Syslog 表,而恶意数据也发送到 SecurityEvent 表。 如果不想复制这两个表中的恶意数据,则可以将 where 语句添加到第一个查询以删除这些记录。

{ 
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources" : [
        { 
            "type": "Microsoft.Insights/dataCollectionRules", 
            "name": "multiDestinationDCR", 
            "location": "eastus", 
            "apiVersion": "2021-09-01-preview", 
            "properties": { 
                "dataCollectionEndpointId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-resource-group/providers//Microsoft.Insights/dataCollectionEndpoints/my-dce",
                "streamDeclarations": { 
                    "Custom-MyTableRawData": { 
                        "columns": [ 
                            { 
                                "name": "Time", 
                                "type": "datetime" 
                            }, 
                            { 
                                "name": "Computer", 
                                "type": "string" 
                            }, 
                            { 
                                "name": "AdditionalContext", 
                                "type": "string" 
                            } 
                        ] 
                    } 
                }, 
                "destinations": { 
                    "logAnalytics": [ 
                        { 
                            "workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-resource-group/providers/Microsoft.OperationalInsights/workspaces/my-workspace", 
                            "name": "clv2ws1" 
                        }, 
                    ] 
                }, 
                "dataFlows": [ 
                    { 
                        "streams": [ 
                            "Custom-MyTableRawData" 
                        ], 
                        "destinations": [ 
                            "clv2ws1" 
                        ], 
                        "transformKql": "source | project TimeGenerated = Time, Computer, Message = AdditionalContext", 
                        "outputStream": "Microsoft-Syslog" 
                    }, 
                    { 
                        "streams": [ 
                            "Custom-MyTableRawData" 
                        ], 
                        "destinations": [ 
                            "clv2ws1" 
                        ], 
                        "transformKql": "source | where (AdditionalContext has 'malicious traffic!' | project TimeGenerated = Time, Computer, Subject = AdditionalContext", 
                        "outputStream": "Microsoft-SecurityEvent" 
                    } 
                ] 
            } 
        }
    ]
}

Azure 表和自定义表组合

以下示例是日志引入 API 中数据的 DCR,该 API 会将数据发送到 Syslog 表和具有不同格式数据的自定义表。 此 DCR 要求每个表都有单独的 dataFlow,并且每个表具有不同的 transformKqlOutputStream。 使用自定义表时,请务必确保目标(自定义表)的架构包含与要发送的记录架构匹配的自定义列(如何添加或删除自定义列)。 例如,如果记录有一个名为 SyslogMessage 的字段,但目标自定义表只有 TimeGenerated 和 RawData,则将在自定义表中收到一个事件,其中只填充了 TimeGenerated 字段,RawData 字段将为空。 将删除 SyslogMessage 字段,因为目标表的架构不包含名为 SyslogMessage 的字符串字段。

{ 
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources" : [
        { 
            "type": "Microsoft.Insights/dataCollectionRules", 
            "name": "multiDestinationDCR", 
            "location": "eastus", 
            "apiVersion": "2021-09-01-preview", 
            "properties": { 
                "dataCollectionEndpointId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-resource-group/providers//Microsoft.Insights/dataCollectionEndpoints/my-dce",
                "streamDeclarations": { 
                    "Custom-MyTableRawData": { 
                        "columns": [ 
                            { 
                                "name": "Time", 
                                "type": "datetime" 
                            }, 
                            { 
                                "name": "Computer", 
                                "type": "string" 
                            }, 
                            { 
                                "name": "AdditionalContext", 
                                "type": "string" 
                            } 
                        ] 
                    } 
                }, 
                "destinations": { 
                    "logAnalytics": [ 
                        { 
                            "workspaceResourceId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/my-resource-group/providers/Microsoft.OperationalInsights/workspaces/my-workspace", 
                            "name": "clv2ws1" 
                        }, 
                    ] 
                }, 
                "dataFlows": [ 
                    { 
                        "streams": [ 
                            "Custom-MyTableRawData" 
                        ], 
                        "destinations": [ 
                            "clv2ws1" 
                        ], 
                        "transformKql": "source | project TimeGenerated = Time, Computer, SyslogMessage = AdditionalContext", 
                        "outputStream": "Microsoft-Syslog" 
                    }, 
                    { 
                        "streams": [ 
                            "Custom-MyTableRawData" 
                        ], 
                        "destinations": [ 
                            "clv2ws1" 
                        ], 
                        "transformKql": "source | extend jsonContext = parse_json(AdditionalContext) | project TimeGenerated = Time, Computer, AdditionalContext = jsonContext, ExtendedColumn=tostring(jsonContext.CounterName)", 
                        "outputStream": "Custom-MyTable_CL" 
                    } 
                ] 
            } 
        }
    ]
}

后续步骤

使用 Azure Monitor 代理创建数据收集规则以及与虚拟机的关联。