Transformações de coleta de dados no Azure Monitor

Com as transformações no Azure Monitor, é possível filtrar ou modificar os dados de entrada antes de enviá-los a um workspace do Log Analytics. Este artigo fornece uma descrição básica das transformações e de como elas são implementadas. Também fornece links para outros conteúdos relacionados à criação de uma transformação.

As transformações são executadas no Azure Monitor no pipeline de ingestão de dados depois que a fonte de dados fornece os dados e antes de serem enviados para o destino. A fonte de dados pode executar a própria filtragem antes do envio dos dados, mas contar com a transformação para uma manipulação adicional antes de enviá-los ao destino.

As transformações são definidas em uma DCR (regra de coleta de dados) 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 de dados de entrada e mostra uma consulta de exemplo que pode ser usada. Consulte Estrutura de transformação no Azure Monitor para obter detalhes sobre como criar consultas de transformação.

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

Por que usar transformações

A tabela a seguir descreve as diferentes metas que podem ser alcançadas usando transformações.

Categoria Detalhes
Remover dados confidenciais É possível ter uma fonte de dados que envia informações que você não deseja armazenar por motivos de privacidade ou conformidade.

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

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

Envie-as para uma tabela alternativa. Envie registros confidenciais para uma tabela alternativa com uma configuração diferente de controle de acesso baseado em função.
Enriquecer os dados com informações adicionais ou calculadas Use uma transformação para adicionar informações aos dados que fornecem contexto empresarial ou simplifica 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 de negócios. Por exemplo, você pode adicionar uma coluna que indica uma divisão da empresa com base nas informações de localização em outras colunas.
Reduzir custos de dados Como você é cobrado pelo custo de ingestão de todos os dados enviados a um workspace do Log Analytics, filtre aqueles que são desnecessários para reduzir os custos.

Remova linhas inteiras. Por exemplo, é possível ter uma configuração de diagnóstico para coletar logs de um determinado recurso, mas sem incluir todas as entradas de log geradas por ele. Crie uma transformação que filtra os registros correspondentes a determinados critérios.

Remova uma coluna de cada linha. Também é possível que os dados incluam colunas com dados redundantes ou valores mínimos. Crie uma transformação que filtre colunas que não são necessárias.

Analise dados importantes de uma coluna. Além disso, você pode ter uma tabela com dados importantes que estão em uma coluna específica. Use uma transformação para analisar os dados valiosos em uma nova coluna e remover o original.

Enviar determinadas linhas para logs básicos. Envie as linhas em seus dados que exigem recursos básicos de consulta para tabelas de logs básicas a fim de obter um custo de ingestão menor.
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 com suporte

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, também há suporte para tabelas personalizadas (sufixo de _CL).

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 diretrizes para diferentes métodos para criar transformações.

Coleta de dados Referência
API de ingestão de logs Enviar dados para logs do Azure Monitor usando a API REST (portal do Azure)
Enviar dados para 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ção de dados em insights de contêiner
Hubs de eventos do Azure Tutorial: ingerir eventos dos Hubs de Eventos do Azure nos Logs do Azure Monitor (Visualização Pública)

Vários destinos

Com as transformações, é possível enviar dados para vários destinos em um workspace do Log Analytics usando uma única DCR. Você fornece uma consulta KQL para cada destino e os resultados de cada consulta são enviados para o local correspondente. É possível enviar diferentes conjuntos de dados para diferentes tabelas ou usar várias consultas a fim de enviar diferentes conjuntos de dados para a mesma.

Por exemplo, é possível enviar dados de evento ao Azure Monitor usando a API de ingestão de logs. A maioria dos eventos deve ser enviada a uma tabela de análise onde ela 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, atualmente você deve criar manualmente um novo DCR ou editar um existente. Confira a seção Exemplos para obter exemplos de DCRs que usam vários destinos.

Importante

Atualmente, as tabelas no DCR devem estar no mesmo workspace do Log Analytics. Para enviar para vários workspaces de uma única fonte de dados, use várias DCRs e configure seu aplicativo para enviar os dados para cada uma.

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 de transformações. Isso inclui identificar os erros que ocorrem no KQL e as métricas para acompanhar a duração de sua execução.

Custo para 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 de entrada, como adicionando uma coluna calculada, você será cobrado pela taxa de ingestão padrão pelos dados extras.
  • Se uma transformação reduzir os dados de ingrestão em mais de 50%, você será cobrado pela quantidade de dados filtrados acima de 50%.

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

Dados ingeridos por pipeline Dados descartados por transformação Dados ingeridos pelo workspace do Log Analytics Encargo de processamento de dados Encargo 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 workspace do Log Analytics.

Para evitar essa cobrança, você precisa filtrar 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 os custos adicionais.

Confira os Preços do Azure Monitor das cobranças atuais para ingestão e retenção de dados de log no Azure Monitor.

Importante

Se o Azure Sentinel estiver habilitado para o workspace 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 exemplos de DCRs 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 é uma DCR relacionada ao agente do Azure Monitor que envia dados para a tabela Syslog. 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 é uma DCR relacionada aos dados da API de ingestão de logs que envia dados para as tabelas Syslog e SecurityEvent. Essa DCR requer um dataFlow distinto para cada um deles com diferentes transformKql e OutputStream. Neste exemplo, todos os dados de entrada são enviados para a tabela Syslog enquanto dados mal-intencionados também são enviados para a tabela SecurityEvent. Se você não quiser replicar os dados mal-intencionados em ambas as tabelas, poderá adicionar uma instrução where à 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 de tabelas personalizadas e do Azure

O exemplo a seguir é uma DCR relacionada aos dados da API de ingestão de logs que envia dados para a tabela Syslog e para uma tabela personalizada com os dados em um formato diferente. Essa DCR requer um dataFlow distinto para cada um deles com diferentes transformKql e OutputStream. 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 o 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óximas etapas