Transformações de coleta de dados no Azure Monitor

Com as transformações no Azure Monitor, você pode filtrar ou modificar dados de entrada antes que eles sejam enviados para um espaço de trabalho do Log Analytics. Este artigo fornece uma descrição básica das transformações e como elas são implementadas. Ele fornece links para outros conteúdos para criar uma transformação.

As transformações são realizadas no Azure Monitor no pipeline de ingestão de dados depois que a fonte de dados entrega os dados e antes de serem enviados para o destino. A fonte de dados pode executar sua própria filtragem antes de enviar dados, mas depois confiar na transformação para manipulação adicional antes de ser enviada para o destino.

As transformações são definidas em uma regra de coleta de dados (DCR) e usam uma instrução KQL (Kusto Query Language) que é aplicada individualmente a cada entrada nos dados recebidos. Ele deve entender o formato dos dados de entrada e criar saída na estrutura esperada pelo destino.

O diagrama a seguir ilustra o processo de transformação dos dados de entrada e mostra uma consulta de exemplo que pode ser usada. Consulte Estrutura da transformação no Azure Monitor para obter detalhes sobre como criar consultas de transformação.

Diagrama que mostra a transformação do tempo de ingestão para dados de entrada.

Por que usar transformações

A tabela a seguir descreve as diferentes metas que você pode alcançar usando transformações.

Categoria Detalhes
Remover dados confidenciais Você pode ter uma fonte de dados que envia informações que você não deseja que sejam armazenadas por motivos de privacidade ou conformidade.

Filtre informações confidenciais. Filtre linhas inteiras ou colunas específicas que contenham informações confidenciais.

Ofuscar informações confidenciais. Substitua informações como dígitos em um endereço IP ou número de telefone por um caractere comum.

Enviar para uma tabela alternativa. Envie registros confidenciais para uma tabela alternativa com diferentes configurações de controle de acesso baseadas em função.
Enriqueça dados com mais informações ou informações calculadas Use uma transformação para adicionar informações aos dados que fornecem contexto de negócios ou simplificam a consulta dos dados posteriormente.

Adicione uma coluna com mais informações. Por exemplo, você pode adicionar uma coluna identificando se um endereço IP em outra coluna é interno ou externo.

Adicione informações específicas da empresa. Por exemplo, você pode adicionar uma coluna indicando uma divisão da empresa com base nas informações de localização em outras colunas.
Reduza os custos de dados Como é cobrado o custo de ingestão por todos os dados enviados para um espaço de trabalho do Log Analytics, você deseja filtrar todos os dados que não são necessários para reduzir seus custos.

Remova linhas inteiras. Por exemplo, você pode ter uma configuração de diagnóstico para coletar logs de recursos de um recurso específico, mas não exigir todas as entradas de log que ele gera. Crie uma transformação que filtre registros que correspondam a um determinado critério.

Remova uma coluna de cada linha. Por exemplo, seus dados podem incluir colunas com dados redundantes ou com valor mínimo. Crie uma transformação que filtre colunas que não são necessárias.

Analise dados importantes de uma coluna. Você pode ter uma tabela com dados valiosos enterrados em uma coluna específica. Use uma transformação para analisar os dados valiosos em uma nova coluna e remover o original.

Envie determinadas linhas para logs básicos. Envie linhas em seus dados que exigem recursos básicos de consulta para tabelas de logs básicas para um custo de ingestão mais baixo.
Formatar dados para o destino Você pode ter uma fonte de dados que envia dados em um formato que não corresponde à estrutura da tabela de destino. Use uma transformação para reformatar os dados para o esquema necessário.

Tabelas suportadas

Consulte Tabelas que dão suporte a transformações nos Logs do Azure Monitor para obter uma lista das tabelas que podem ser usadas com transformações. Você também pode usar a referência de dados do Azure Monitor que lista os atributos de cada tabela, incluindo se ela dá suporte a transformações. Além dessas tabelas, todas as tabelas personalizadas (sufixo de _CL) também são suportadas.

  • Qualquer tabela do Azure listada em Tabelas que dão suporte a transformações nos Logs do Azure Monitor. Você também pode usar a referência de dados do Azure Monitor que lista os atributos de cada tabela, incluindo se ela dá suporte a transformações.
  • Qualquer tabela personalizada criada para o Azure Monitor Agent. (A tabela personalizada do MMA não pode usar transformações)

Criar uma transformação

Há vários métodos para criar transformações, dependendo do método de coleta de dados. A tabela a seguir lista orientações para diferentes métodos de criação de transformações.

Recolha de dados Referência
API de ingestão de logs Enviar dados para os Logs do Azure Monitor usando a API REST (portal do Azure)
Enviar dados para os Logs do Azure Monitor usando a API REST (modelos do Azure Resource Manager)
Máquina virtual com agente do Azure Monitor Adicionar transformação ao Log do Azure Monitor
Cluster do Kubernetes com insights de contêiner Transformações de dados no Container insights
Hubs de Eventos do Azure Tutorial: Ingerir eventos dos Hubs de Eventos do Azure para os Logs do Azure Monitor (Visualização Pública)

Vários destinos

Com as transformações, você pode enviar dados para vários destinos em um espaço de trabalho do Log Analytics usando um único DCR. Você fornece uma consulta KQL para cada destino, e os resultados de cada consulta são enviados para o local correspondente. Você pode enviar diferentes conjuntos de dados para tabelas diferentes ou usar várias consultas para enviar conjuntos diferentes de dados para a mesma tabela.

Por exemplo, você pode enviar dados de eventos para o Azure Monitor usando a API de ingestão de logs. A maioria dos eventos deve ser enviada para uma tabela de análise onde pode ser consultada regularmente, enquanto os eventos de auditoria devem ser enviados para uma tabela personalizada configurada para logs básicos para reduzir seu custo.

Para usar vários destinos, você deve criar manualmente um novo DCR ou editar um existente. Consulte a seção Exemplos para obter exemplos de DCRs que usam vários destinos.

Importante

Atualmente, as tabelas no DCR devem estar no mesmo espaço de trabalho do Log Analytics. Para enviar para vários espaços de trabalho a partir de uma única fonte de dados, use vários DCRs e configure seu aplicativo para enviar os dados para cada um.

Diagrama que mostra a transformação enviando dados para várias tabelas.

Monitorar transformações

Consulte Monitorar e solucionar problemas de coleta de dados DCR no Azure Monitor para obter detalhes sobre logs e métricas que monitoram a integridade e o desempenho das transformações. Isso inclui a identificação de quaisquer erros que ocorram no KQL e métricas para acompanhar sua duração de execução.

Custo das transformações

Embora as transformações em si não incorram em custos diretos, os seguintes cenários podem resultar em encargos adicionais:

  • Se uma transformação aumentar o tamanho dos dados recebidos, por exemplo, adicionando uma coluna calculada, será cobrada a taxa de ingestão padrão pelos dados extras.
  • Se uma transformação reduzir os dados ingeridos em mais de 50%, você será cobrado pela quantidade de dados filtrados acima de 50%.

Para calcular a taxa de processamento de dados resultante de transformações, use a seguinte fórmula:
[GB filtrado por transformações] - ([GB de dados ingeridos por pipeline] / 2). A tabela a seguir mostra exemplos.

Dados ingeridos por pipeline Dados descartados por transformação Dados ingeridos pelo espaço de trabalho do Log Analytics Taxa de processamento de dados Taxa de ingestão
20 GB 12 GB 8 GB 2 GB 1 8 GB
20 GB 8 GB 12 GB 0 GB 12 GB

1 Essa cobrança exclui a cobrança pelos dados ingeridos pelo espaço de trabalho do Log Analytics.

Para evitar essa cobrança, você deve filtrar os dados ingeridos usando métodos alternativos antes de aplicar transformações. Ao fazer isso, você pode reduzir a quantidade de dados processados por transformações e, portanto, minimizar quaisquer custos adicionais.

Consulte Preços do Azure Monitor para obter informações sobre os encargos atuais de ingestão e retenção de dados de log no Azure Monitor.

Importante

Se o Azure Sentinel estiver habilitado para o espaço de trabalho do Log Analytics, não haverá cobrança de ingestão de filtragem, independentemente da quantidade de dados filtrada pela transformação.

Exemplos

Os modelos do Resource Manager a seguir mostram DCRs de exemplo com padrões diferentes. Você pode usar esses modelos como ponto de partida para criar DCRs com transformações para seus próprios cenários.

Destino único

O exemplo a seguir é um DCR para o Azure Monitor Agent que envia dados para a Syslog tabela. Neste exemplo, a transformação filtra os dados para registros com error na mensagem.

{ 
    "$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" 
                  ] 
                } 
              ] 
            }
        }
    ]
} 

Várias tabelas do Azure

O exemplo a seguir é um DCR para dados da API de ingestão de logs que envia dados para as Syslog tabelas e SecurityEvent . Este DCR requer um separado dataFlow para cada um com um diferente transformKql e OutputStream para cada um. Neste exemplo, todos os dados de entrada são enviados para a tabela, enquanto os Syslog dados mal-intencionados também são enviados para a SecurityEvent tabela. Se você não quiser replicar os dados mal-intencionados em ambas as tabelas, poderá adicionar uma where instrução à primeira consulta para remover esses registros.

{ 
    "$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" 
                    } 
                ] 
            } 
        }
    ]
}

Combinação do Azure e tabelas personalizadas

O exemplo a seguir é um DCR para dados da API de ingestão de logs que envia dados para a Syslog tabela e uma tabela personalizada com os dados em um formato diferente. Este DCR requer um separado dataFlow para cada um com um diferente transformKql e OutputStream para cada um. Ao usar tabelas personalizadas, é importante garantir que o esquema do destino (sua tabela personalizada) contenha as colunas personalizadas (como adicionar ou excluir colunas personalizadas) que correspondam ao esquema dos registros que você está enviando. Por exemplo, se seu registro tiver um campo chamado SyslogMessage, mas a tabela personalizada de destino tiver apenas TimeGenerated e RawData, você receberá um evento na tabela personalizada com apenas o campo TimeGenerated preenchido e o campo RawData estará vazio. O campo SyslogMessage será descartado porque o esquema da tabela de destino não contém um campo de cadeia de caracteres chamado 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" 
                    } 
                ] 
            } 
        }
    ]
}

Próximos passos