Trasformazioni della raccolta dati in Monitoraggio di Azure

Con le trasformazioni in Monitoraggio di Azure, è possibile filtrare o modificare i dati in ingresso prima dell'invio a un'area di lavoro Log Analytics. Questo articolo fornisce una descrizione di base delle trasformazioni e del modo in cui vengono implementate. Fornisce collegamenti ad altri contenuti per la creazione di una trasformazione.

Le trasformazioni vengono eseguite in Monitoraggio di Azure nella pipeline di inserimento dati dopo che l'origine dati recapita i dati e prima che vengano inviati alla destinazione. L'origine dati potrebbe eseguire il proprio filtro prima di inviare i dati, ma quindi basarsi sulla trasformazione per ulteriori modifiche prima dell'invio alla destinazione.

Le trasformazioni vengono definite in una regola di raccolta dati (DCR) e usano un'istruzione Linguaggio di query Kusto (KQL) applicata singolarmente a ogni voce nei dati in ingresso. Deve comprendere il formato dei dati in ingresso e creare l'output nella struttura prevista dalla destinazione.

Il diagramma seguente illustra il processo di trasformazione per i dati in ingresso e mostra una query di esempio che potrebbe essere usata. Per informazioni dettagliate sulla creazione di query di trasformazione, vedere Struttura della trasformazione in Monitoraggio di Azure.

Diagramma che mostra la trasformazione in fase di inserimento per i dati in ingresso.

Perché usare le trasformazioni

Nella tabella seguente vengono descritti i diversi obiettivi che è possibile raggiungere usando le trasformazioni.

Categoria Dettagli
Rimuovere i dati sensibili Potrebbe essere presente un'origine dati che invia informazioni che non si desidera archiviare per motivi di privacy o conformità.

Filtrare le informazioni riservate. Filtrare intere righe o colonne specifiche contenenti informazioni riservate.

Offuscare le informazioni riservate. Sostituire le informazioni, ad esempio le cifre in un indirizzo IP o un numero di telefono con un carattere comune.

Inviare a una tabella alternativa. Inviare record sensibili a una tabella alternativa con diverse configurazioni di controllo degli accessi in base al ruolo.
Arricchire i dati con informazioni più o calcolate Usare una trasformazione per aggiungere informazioni ai dati che forniscono contesto aziendale o semplifica l'esecuzione di query sui dati in un secondo momento.

Aggiungere una colonna con altre informazioni. Ad esempio, è possibile aggiungere una colonna che identifica se un indirizzo IP in un'altra colonna è interno o esterno.

Aggiungere informazioni specifiche dell'azienda. Ad esempio, è possibile aggiungere una colonna che indica una divisione aziendale in base alle informazioni sulla posizione in altre colonne.
Ridurre i costi dei dati Poiché vengono addebitati costi di inserimento per i dati inviati a un'area di lavoro Log Analytics, è necessario filtrare i dati che non è necessario ridurre i costi.

Rimuovere intere righe. Ad esempio, potrebbe essere disponibile un'impostazione di diagnostica per raccogliere i log delle risorse da una determinata risorsa, ma non tutte le voci di log generate. Creare una trasformazione che filtra i record che corrispondono a determinati criteri.

Rimuovere una colonna da ogni riga. Ad esempio, i dati possono includere colonne con dati ridondanti o con valore minimo. Creare una trasformazione che filtra le colonne che non sono necessarie.

Analizzare dati importanti da una colonna. Potrebbe essere presente una tabella con dati preziosi sepolti in una determinata colonna. Usare una trasformazione per analizzare i dati importanti in una nuova colonna e rimuovere l'originale.

Inviare determinate righe ai log di base. Inviare righe nei dati che richiedono funzionalità di query di base alle tabelle di log di base per un costo di inserimento inferiore.
Formattare i dati per la destinazione Potrebbe essere presente un'origine dati che invia dati in un formato che non corrisponde alla struttura della tabella di destinazione. Usare una trasformazione per riformattare i dati nello schema richiesto.

Tabelle supportate

Vedere Tabelle che supportano le trasformazioni nei log di Monitoraggio di Azure per un elenco delle tabelle che possono essere usate con le trasformazioni. È anche possibile usare il riferimento ai dati di Monitoraggio di Azure che elenca gli attributi per ogni tabella, incluso se supporta le trasformazioni. Oltre a queste tabelle, sono supportate anche le tabelle personalizzate (suffisso di _CL).

  • Qualsiasi tabella di Azure elencata in Tabelle che supportano le trasformazioni nei log di Monitoraggio di Azure. È anche possibile usare il riferimento ai dati di Monitoraggio di Azure che elenca gli attributi per ogni tabella, incluso se supporta le trasformazioni.
  • Qualsiasi tabella personalizzata creata per l'agente di Monitoraggio di Azure. (la tabella personalizzata MMA non può usare trasformazioni)

Creare una trasformazione

Esistono più metodi per creare trasformazioni a seconda del metodo di raccolta dati. Nella tabella seguente sono elencate le linee guida per diversi metodi per la creazione di trasformazioni.

Raccolta dati Riferimento
API di inserimento dei log Inviare dati ai log di Monitoraggio di Azure usando l'API REST (portale di Azure)
Inviare dati ai log di Monitoraggio di Azure usando l'API REST (modelli di Azure Resource Manager)
Macchina virtuale con l'agente di Monitoraggio di Azure Aggiungere la trasformazione al log di Monitoraggio di Azure
Cluster Kubernetes con Informazioni dettagliate sui contenitori Trasformazioni dei dati in Informazioni dettagliate sui contenitori
Hub eventi di Azure Esercitazione: Inserire eventi da Hub eventi di Azure nei log di Monitoraggio di Azure (anteprima pubblica)

Più destinazioni

Con le trasformazioni, è possibile inviare dati a più destinazioni in un'area di lavoro Log Analytics usando un singolo DCR. Si fornisce una query KQL per ogni destinazione e i risultati di ogni query vengono inviati alla posizione corrispondente. È possibile inviare diversi set di dati a tabelle diverse o usare più query per inviare set di dati diversi alla stessa tabella.

Ad esempio, è possibile inviare i dati degli eventi in Monitoraggio di Azure usando l'API di inserimento dei log. La maggior parte degli eventi deve essere inviata a una tabella di analisi in cui è possibile eseguire query regolarmente, mentre gli eventi di controllo devono essere inviati a una tabella personalizzata configurata per i log di base per ridurre i costi.

Per usare più destinazioni, è attualmente necessario creare manualmente un nuovo record di dominio o modificarne uno esistente. Vedere la sezione Esempi per esempi di controller di dominio che usano più destinazioni.

Importante

Attualmente, le tabelle nel Registro Azure Container devono trovarsi nella stessa area di lavoro Log Analytics. Per inviare a più aree di lavoro da una singola origine dati, usare più controller di dominio e configurare l'applicazione per inviare i dati a ognuno.

Diagramma che mostra la trasformazione che invia dati a più tabelle.

Monitorare le trasformazioni

Per informazioni dettagliate sui log e sulle metriche che monitorano l'integrità e le prestazioni delle trasformazioni, vedere Monitorare e risolvere i problemi di raccolta dei dati DCR in Monitoraggio di Azure. Ciò include l'identificazione di eventuali errori che si verificano nel KQL e nelle metriche per tenere traccia della durata di esecuzione.

Costo per le trasformazioni

Anche se le trasformazioni stesse non comportano costi diretti, gli scenari seguenti possono comportare costi aggiuntivi:

  • Se una trasformazione aumenta le dimensioni dei dati in ingresso, ad esempio aggiungendo una colonna calcolata, verrà addebitata la tariffa di inserimento standard per i dati aggiuntivi.
  • Se una trasformazione riduce i dati inseriti di oltre il 50%, verrà addebitato l'importo dei dati filtrati superiore al 50%.

Per calcolare l'addebito per l'elaborazione dati risultante dalle trasformazioni, usare la formula seguente:
[GB filtrati in base alle trasformazioni] - ([GB dati inseriti dalla pipeline] / 2). Nella tabella seguente sono illustrati esempi.

Dati inseriti dalla pipeline Dati eliminati dalla trasformazione Dati inseriti dall'area di lavoro Log Analytics Addebito per l'elaborazione dati Addebito per l'inserimento
20 GB 12 GB 8 GB 2 GB 1 8 GB
20 GB 8 GB 12 GB 0 GB 12 GB

1 Questo addebito esclude l'addebito per i dati inseriti dall'area di lavoro Log Analytics.

Per evitare questo addebito, è consigliabile filtrare i dati inseriti usando metodi alternativi prima di applicare trasformazioni. In questo modo, è possibile ridurre la quantità di dati elaborati dalle trasformazioni e, di conseguenza, ridurre al minimo eventuali costi aggiuntivi.

Vedere Prezzi di Monitoraggio di Azure per gli addebiti correnti per l'inserimento e la conservazione dei dati di log in Monitoraggio di Azure.

Importante

Se Azure Sentinel è abilitato per l'area di lavoro Log Analytics, non è previsto alcun addebito per l'inserimento di filtri indipendentemente dalla quantità di dati filtrati dai filtri di trasformazione.

Esempi

I modelli di Resource Manager seguenti mostrano controller di dominio di esempio con modelli diversi. È possibile usare questi modelli come punto di partenza per la creazione di controller di dominio con trasformazioni per scenari personalizzati.

Destinazione singola

L'esempio seguente è un DCR per l'agente di Monitoraggio di Azure che invia i dati alla Syslog tabella. In questo esempio la trasformazione filtra i dati per i record con error nel messaggio.

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

Più tabelle di Azure

L'esempio seguente è un record di registrazione dati per i dati dell'API di inserimento log che invia i dati alle Syslog tabelle e SecurityEvent . Questo record di controllo di dominio richiede un elemento separato dataFlow per ognuno con un transformKql diverso e OutputStream per ognuno. In questo esempio, tutti i dati in ingresso vengono inviati alla Syslog tabella, mentre i dati dannosi vengono inviati anche alla SecurityEvent tabella. Se non si vuole replicare i dati dannosi in entrambe le tabelle, è possibile aggiungere un'istruzione where alla prima query per rimuovere tali record.

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

Combinazione di tabelle personalizzate e di Azure

L'esempio seguente è un record di registrazione dati per i dati dell'API di inserimento log che invia dati sia alla tabella che a Syslog una tabella personalizzata con i dati in un formato diverso. Questo record di controllo di dominio richiede un elemento separato dataFlow per ognuno con un transformKql diverso e OutputStream per ognuno. Quando si usano tabelle personalizzate, è importante assicurarsi che lo schema della destinazione (tabella personalizzata) contenga le colonne personalizzate (come aggiungere o eliminare colonne personalizzate) che corrispondono allo schema dei record inviati. Ad esempio, se il record ha un campo denominato SyslogMessage, ma la tabella personalizzata di destinazione ha solo TimeGenerated e RawData, si riceverà un evento nella tabella personalizzata con solo il campo TimeGenerated popolato e il campo RawData sarà vuoto. Il campo SyslogMessage verrà eliminato perché lo schema della tabella di destinazione non contiene un campo stringa denominato 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" 
                    } 
                ] 
            } 
        }
    ]
}

Passaggi successivi