容器见解中的数据转换

本文描述了如何在容器见解中实现数据转换。 Azure Monitor 中的转换允许在数据进入 Log Analytics 工作区之前修改或筛选数据。 它们允许执行诸如筛选从群集收集的数据以节省成本或处理传入数据以帮助进行数据查询之类的操作。

重要

在容器见解中配置日志收集在容器见解中筛选日志收集这两篇文章介绍了用于配置和筛选容器见解数据收集的标准配置设置。 在使用转换之前,应该通过这些功能执行任何所需的配置。 使用转换来执行无法使用标准配置设置执行的筛选或其他数据配置。

数据收集规则

转换在数据收集规则 (DCR) 中实现,用于在 Azure Monitor 中配置数据收集。 使用 DCR 配置数据收集介绍了在群集上启用容器见解时自动创建的 DCR。 若要创建转换,必须执行以下操作之一:

  • 新群集。 使用现有 ARM 模板将 AKS 群集加入到容器见解。 使用所需的配置修改该模板中的 DCR(包括类似于以下示例之一的转换)。
  • 现有 DCR。 将群集加入容器见解并配置数据收集后,使用编辑数据收集规则中的任意一种方法编辑其 DCR,以包含转换。

注意

目前用于编辑 DCR 的 UI 很少,它是添加转换所必需的。 大多数情况下,需要手动编辑 DCR。 本文介绍要实现的 DCR 结构。 请参阅在 Azure Monitor 中创建和修改数据收集规则,以获得关于如何实现该结构的指导。

数据源

DCR 的“数据源”部分定义了 DCR 将处理的不同类型的传入数据。 对于容器见解,这是容器见解扩展,其中包括一个或多个以前缀 Microsoft- 开头的预定义 streams

DCR 中容器见解流的列表取决于为群集选择的成本预设。 如果收集所有表,DCR 将使用 Microsoft-ContainerInsights-Group-Default 流,这是组流,包括 Stream 值中列出的所有流。 如果要使用转换,则必须将其更改为单独的流。 任何其他成本预设设置都将使用单独的流。

下面的示例显示了 Microsoft-ContainerInsights-Group-Default 流。 有关使用单个流的示例,请参阅示例 DCR

"dataSources": {
    "extensions": [
        {
            "streams": [
                "Microsoft-ContainerInsights-Group-Default"
            ],
            "name": "ContainerInsightsExtension",
            "extensionName": "ContainerInsights",
            "extensionSettings": { 
                "dataCollectionSettings": {
                    "interval": "1m",
                    "namespaceFilteringMode": "Off",
                    "namespaces": null,
                    "enableContainerLogV2": true
                }
            }
        }
    ]
}

数据流

DCR 的“数据流”部分将流与 DCR 的 destinations 部分中定义的目标进行匹配。 如果数据被发送到默认表,则不必为已知流指定表名。 不需要转换的流可以组合在一个条目中,该条目只包括工作区目标。 每种数据都会被发送到其默认表。

为需要转换的流创建单独条目。 该流应包括工作区目标和 transformKql 属性。 如果要将数据发送到备用表,则需要包括用于指定目标表的名称的 outputStream 属性。

下面的示例显示了带有转换的单一流的 dataFlows 部分。 有关单一 DCR 中的多个数据流,请参阅示例 DCR

"dataFlows": [
    {
        "streams": [
            "Microsoft-ContainerLogV2"
        ],
        "destinations": [
            "ciworkspace"
        ],
        "transformKql": "source | where PodNamespace == 'kube-system'"
    }
]

示例 DCR

筛选数据

第一个示例根据 LogLevel 列从 ContainerLogV2 中筛选出数据。 将仅收集 LogLevelerrorcritical 的记录,因为你可以使用这些条目来提醒和识别群集中的问题。 收集和存储其他级别(例如 infodebug)会产生成本,但没有显著价值。

可以使用以下日志查询检索这些记录。

ContainerLogV2 | where LogLevel in ('error', 'critical')

下图显示了此逻辑。

此图显示了如何使用转换来筛选容器日志。

在转换中,表名 source 用于表示传入数据。 下面是要在转换中使用的已修改查询。

source | where LogLevel in ('error', 'critical')

以下示例展示了添加到容器见解 DCR 的该转换。 请注意,为 Microsoft-ContainerLogV2 使用了单独的数据流,因为这是你应该将转换应用到其中的唯一传入流。 为其他流使用了单独的数据流。

{
    "properties": {
        "location": "chinanorth2",
        "kind": "Linux",
        "dataSources": {
            "syslog": [],
            "extensions": [
                {
                    "streams": [
                        "Microsoft-ContainerLogV2",
                        "Microsoft-KubeEvents",
                        "Microsoft-KubePodInventory"
                    ],
                    "extensionName": "ContainerInsights",
                    "extensionSettings": {
                        "dataCollectionSettings": {
                            "interval": "1m",
                            "namespaceFilteringMode": "Off",
                            "enableContainerLogV2": true
                        }
                    },
                    "name": "ContainerInsightsExtension"
                }
            ]
        },
        "destinations": {
            "logAnalytics": [
                {
                    "workspaceResourceId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/microsoft.operationalinsights/workspaces/my-workspace",
                    "workspaceId": "00000000-0000-0000-0000-000000000000",
                    "name": "ciworkspace"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Microsoft-KubeEvents",
                    "Microsoft-KubePodInventory"
                ],
                "destinations": [
                    "ciworkspace"
                ],
            },
            {
                "streams": [
                    "Microsoft-ContainerLogV2"
                ],
                "destinations": [
                    "ciworkspace"
                ],
                "transformKql": "source | where LogLevel in ('error', 'critical')"
            }
        ],
    },
}

将数据发送到不同的表

在上面的例子中,仅收集 LogLevelerrorcritical 的记录。 备用策略不是根本不收集这些记录,而是将它们保存到为基本日志配置的备用表中。

对于此策略,需要进行两次转换。 第一次转换是将 LogLevelerrorcritical 的记录发送到默认表。 第二次转换是将其他记录发送到名为 ContainerLogV2_CL 的自定义表。 下面显示了每一个的查询,使用 source 作为传入数据,如上一示例所述。

# Return error and critical logs
source | where LogLevel in ('error', 'critical')

# Return logs that aren't error or critical
source | where LogLevel !in ('error', 'critical')

下图显示了此逻辑。

此图显示了如何使用转换来筛选容器日志,该转换将一些数据发送到分析表,将其他数据发送到基本日志。

重要

安装此示例中的 DCR 之前,必须创建一个新表,其架构与 ContainerLogV2 相同。 将其命名为 ContainerLogV2_CL将其配置为适用于基本日志

以下示例展示了添加到容器见解 DCR 的该转换。 此 DCR 中有两个适用于 Microsoft-ContainerLogV2 的数据流,每个对应于一个转换。 第一个转换发送到默认表,不需要指定表名。 第二个转换需要 outputStream 属性来指定目标表。

{
    "properties": {
        "location": "chinanorth2",
        "kind": "Linux",
        "dataSources": {
            "syslog": [],
            "extensions": [
                {
                    "streams": [
                        "Microsoft-ContainerLogV2",
                        "Microsoft-KubeEvents",
                        "Microsoft-KubePodInventory"
                    ],
                    "extensionName": "ContainerInsights",
                    "extensionSettings": {
                        "dataCollectionSettings": {
                            "interval": "1m",
                            "namespaceFilteringMode": "Off",
                            "enableContainerLogV2": true
                        }
                    },
                    "name": "ContainerInsightsExtension"
                }
            ]
        },
        "destinations": {
            "logAnalytics": [
                {
                    "workspaceResourceId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourcegroups/my-resource-group/providers/microsoft.operationalinsights/workspaces/my-workspace",
                    "workspaceId": "00000000-0000-0000-0000-000000000000",
                    "name": "ciworkspace"
                }
            ]
        },
        "dataFlows": [
            {
                "streams": [
                    "Microsoft-KubeEvents",
                    "Microsoft-KubePodInventory"
                ],
                "destinations": [
                    "ciworkspace"
                ],
            },
            {
                "streams": [
                    "Microsoft-ContainerLogV2"
                ],
                "destinations": [
                    "ciworkspace"
                ],
                "transformKql": "source | where LogLevel in ('error', 'critical')"
            },
            {
                "streams": [
                    "Microsoft-ContainerLogV2"
                ],
                "destinations": [
                    "ciworkspace"
                ],
                "transformKql": "source | where LogLevel !in ('error','critical')",
                "outputStream": "Custom-ContainerLogV2_CL"
            }
        ],
    },
}

后续步骤