Compartir vía


Transformaciones de datos en Container Insights

En este artículo se describe cómo implementar transformaciones de datos en Container Insights. Las transformaciones en Azure Monitor le permiten modificar o filtrar datos antes de ingerirlos en el área de trabajo de Log Analytics. Permiten realizar acciones como filtrar los datos recopilados del clúster para ahorrar costes o procesar datos entrantes para ayudar en las consultas de datos.

Importante

En los artículos Configuración de la recopilación de registros en Container Insights y Filtrado de la recopilación de registros en Container Insights se describen las opciones de configuración estándar para configurar y filtrar la recopilación de datos para Container Insights. Debe realizar cualquier configuración necesaria con estas características antes de usar transformaciones. Use una transformación para realizar el filtrado u otra configuración de datos que no se puede realizar con las opciones de configuración estándar.

Regla de recopilación de datos

Las transformaciones se implementan en reglas de recopilación de datos (DCR) que se usan para configurar la recopilación de datos en Azure Monitor. La configuración de la recopilación de datos mediante DCR describe el DCR que se crea automáticamente al habilitar Container Insights en un clúster. Para crear una transformación, debe realizar una de las siguientes acciones:

  • Nuevo clúster. Use una plantilla de ARM existente para incorporar un clúster de AKS a Container Insights. Modifique el DCR de esa plantilla con la configuración necesaria, incluida una transformación similar a una de las muestras siguientes.
  • DCR existente. Después de incorporar un clúster a Container Insights y a la recopilación de datos configurada, edite su DCR para incluir una transformación mediante cualquiera de los métodos de Editar reglas de recopilación de datos.

Nota:

Actualmente hay una interfaz de usuario mínima para editar DCR, que es necesaria para agregar transformaciones. En la mayoría de los casos, debe editar manualmente el DCR. En este artículo se describe la estructura DCR que se va a implementar. Consulte Creación y edición de reglas de recopilación de datos (DCR) en Azure Monitor para obtener instrucciones sobre cómo implementar esa estructura.

Orígenes de datos

La sección Orígenes de datos del DCR define los distintos tipos de datos entrantes que procesará el DCR. Para Container Insights, esta es la extensión Container Insights, que incluye uno o varios predefinidos streams a partir del prefijo Microsoft-.

La lista de flujos de Container Insights en la DCR depende del Valor preestablecido de coste seleccionado para el clúster. Si recopila todas las tablas, la DCR usará el flujo Microsoft-ContainerInsights-Group-Default, que es un flujo de grupo que incluye todos los flujos enumerados en Valores de flujo. Debe cambiar esto a flujos individuales si va a usar una transformación. Cualquier otra configuración preestablecida de coste ya usará flujos individuales.

En el ejemplo siguiente se muestra el flujo Microsoft-ContainerInsights-Group-Default. Consulte las DCR de ejemplo para ver ejemplos mediante secuencias individuales.

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

Flujos de datos

La sección Flujos de datos del DCR hace que las secuencias coincidan con flujos con destinos definidos en la sección del DCR destinations. Los nombres de tabla no tienen que especificarse para flujos conocidos si los datos se envían a la tabla predeterminada. Los flujos que no requieren una transformación se pueden agrupar en una sola entrada que incluya solo el destino del área de trabajo. Cada uno se enviará a su tabla predeterminada.

Cree una entrada independiente para flujos que requieran una transformación. Esto debe incluir el destino del área de trabajo y la propiedad transformKql. Si va a enviar datos a una tabla alternativa, debe incluir la propiedad outputStream que especifica el nombre de la tabla de destino.

En el ejemplo siguiente se muestra la sección dataFlows de una sola secuencia con una transformación. Consulte las DCR de ejemplo para varios flujos de datos en una única DCR.

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

DCR de ejemplo

Filtrado de datos

En el primer ejemplo se filtran los datos de ContainerLogV2 en función de la columna LogLevel . Solo se recopilarán registros con una LogLevel de error o critical, ya que son las entradas que puede usar para alertar e identificar problemas en el clúster. Recopilar y almacenar otros niveles, como info y debug generar costos sin un valor significativo.

Puede recuperar estos registros mediante la siguiente consulta de registro.

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

Esta lógica se muestra en el diagrama siguiente.

Diagrama que muestra el filtrado de registros de contenedor mediante una transformación.

En una transformación, el nombre de la tabla source se usa para representar los datos entrantes. A continuación se muestra la consulta modificada que se va a usar en la transformación.

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

En el ejemplo se muestra esta transformación agregada al DCR Container insights. Tenga en cuenta que se usa un flujo de datos independiente para Microsoft-ContainerLogV2, ya que se trata de la única secuencia entrante a la que se debe aplicar la transformación. Se usa un flujo de datos independiente para las otras secuencias.

{
    "properties": {
        "location": "eastus2",
        "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')"
            }
        ],
    },
}

Envío de datos a tablas diferentes

En el ejemplo anterior, solo se recopilan registros con una LogLevel de error o critical. Una estrategia alternativa en lugar de no recopilar estos registros es guardarlos en una tabla alternativa configurada para los registros básicos.

Para esta estrategia, se necesitan dos transformaciones. La primera transformación envía los registros con LogLevel de error o critical a la tabla predeterminada. La segunda transformación envía los demás registros a una tabla personalizada denominada ContainerLogV2_CL. Las consultas de cada una se muestran a continuación mediante source para los datos entrantes, tal como se describe en el ejemplo anterior.

# 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')

Esta lógica se muestra en el diagrama siguiente.

Diagrama que muestra el filtrado de registros de contenedor mediante una transformación que envía algunos datos a la tabla de análisis y otros datos a los registros básicos.

Importante

Antes de instalar DCR en este ejemplo, debe crear una nueva tabla con el mismo esquema que ContainerLogV2. Asigne un nombre ContainerLogV2_CL y configúrelo para los registros básicos.

En el ejemplo se muestra esta transformación agregada al DCR Container insights. Hay dos flujos de datos para Microsoft-ContainerLogV2 en este DCR, uno para cada transformación. La primera envía a la tabla predeterminada que no es necesario especificar un nombre de tabla. El segundo requiere la propiedad outputStream para especificar la tabla de destino.

{
    "properties": {
        "location": "eastus2",
        "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"
            }
        ],
    },
}

Pasos siguientes