Aggregazioni avanzate nelle query dei log di Monitoraggio di AzureAdvanced aggregations in Azure Monitor log queries

Nota

Prima di seguire questa lezione, è consigliabile completare Aggregazioni nelle query di Monitoraggio di Azure.You should complete Aggregations in Azure Monitor queries before completing this lesson.

Nota

È possibile eseguire questo esercizio nel proprio ambiente di Log Analytics oppure è possibile usare l' ambiente di dimostrazione, che include moltissimi dati di esempio.You can work through this exercise in your own Log Analytics environment, or you can use our Demo environment, which includes plenty of sample data.

Questo articolo descrive alcune delle opzioni di aggregazione più avanzate disponibili per le query di Monitoraggio di Azure.This article describes some of the more advanced aggregation options available to Azure Monitor queries.

Generazione di elenchi e setGenerating lists and sets

È possibile usare makelist per variare la visualizzazione dei dati in base all'ordine dei valori di una determinata colonna.You can use makelist to pivot data by the order of values in a particular column. Se ad esempio è necessario esaminare l'ordine più comune in cui si verificano gli eventi nei computer,For example, you may want to explore the most common order events take place on your machines. è possibile scegliere di visualizzare i dati in base all'ordine degli ID evento in ogni computer.You can essentially pivot the data by the order of EventIDs on each machine.

Event
| where TimeGenerated > ago(12h)
| order by TimeGenerated desc
| summarize makelist(EventID) by Computer
ComputerComputer list_EventIDlist_EventID
computer1computer1 [704,701,1501,1500,1085,704,704,701][704,701,1501,1500,1085,704,704,701]
computer2computer2 [326,105,302,301,300,102][326,105,302,301,300,102]
...... ......

makelist genera un elenco nell'ordine in cui sono stati passati i dati.makelist generates a list in the order that data was passed into it. Per ordinare gli eventi dal meno recente al più recente, usare asc anziché desc nell'istruzione order.To sort events from oldest to newest, use asc in the order statement instead of desc.

È anche utile creare un elenco di semplici valori distinti.It is also useful to create a list of just distinct values. Un elenco di questo tipo è definito Set e può essere generato con makeset:This is called a Set and can be generated with makeset:

Event
| where TimeGenerated > ago(12h)
| order by TimeGenerated desc
| summarize makeset(EventID) by Computer
ComputerComputer list_EventIDlist_EventID
computer1computer1 [704,701,1501,1500,1085][704,701,1501,1500,1085]
computer2computer2 [326,105,302,301,300,102][326,105,302,301,300,102]
...... ......

Analogamente a makelist, anche makeset funziona con i dati ordinati e genera le matrici in base all'ordine delle righe che vengono passate.Like makelist, makeset also works with ordered data and will generate the arrays based on the order of the rows that are passed into it.

Espansione di elenchiExpanding lists

L'operazione inversa di makelist o makeset è mvexpand, che espande un elenco di valori in righe separate.The inverse operation of makelist or makeset is mvexpand, which expands a list of values to separate rows. Questa funzione può espandere i valori in un numero qualsiasi di colonne dinamiche, sia JSON che matrice.It can expand across any number of dynamic columns, both JSON and array. Si supponga ad esempio di controllare la tabella Heartbeat per visualizzare le soluzioni che hanno trasmesso dati dai computer che hanno inviato un heartbeat nell'ultima ora:For example, you could check the Heartbeat table for solutions sending data from computers that sent a heartbeat in the last hour:

Heartbeat
| where TimeGenerated > ago(1h)
| project Computer, Solutions
ComputerComputer SoluzioniSolutions
computer1computer1 "security", "updates", "changeTracking""security", "updates", "changeTracking"
computer2computer2 "security", "updates""security", "updates"
computer3computer3 "antiMalware", "changeTracking""antiMalware", "changeTracking"
...... ......

Usare mvexpand per mostrare ogni valore in una riga separata anziché in un elenco delimitato da virgole:Use mvexpand to show each value in a separate row instead of a comma-separated list:

Heartbeat
| where TimeGenerated > ago(1h)
| project Computer, split(Solutions, ",")
| mvexpand Solutions
ComputerComputer SoluzioniSolutions
computer1computer1 "security""security"
computer1computer1 "updates""updates"
computer1computer1 "changeTracking""changeTracking"
computer2computer2 "security""security"
computer2computer2 "updates""updates"
computer3computer3 "antiMalware""antiMalware"
computer3computer3 "changeTracking""changeTracking"
...... ......

È quindi possibile usare nuovamente makelist per raggruppare gli elementi e questa volta visualizzare l'elenco dei computer per ogni soluzione:You could then use makelist again to group items together, and this time see the list of computers per solution:

Heartbeat
| where TimeGenerated > ago(1h)
| project Computer, split(Solutions, ",")
| mvexpand Solutions
| summarize makelist(Computer) by tostring(Solutions) 
SoluzioniSolutions list_Computerlist_Computer
"security""security" ["computer1", "computer2"]["computer1", "computer2"]
"updates""updates" ["computer1", "computer2"]["computer1", "computer2"]
"changeTracking""changeTracking" ["computer1", "computer3"]["computer1", "computer3"]
"antiMalware""antiMalware" ["computer3"]["computer3"]
...... ......

Gestione di bin mancantiHandling missing bins

Un'applicazione utile di mvexpand è la necessità di inserire i valori predefiniti in per i contenitori mancanti. Si supponga, ad esempio, che si stia cercando il tempo di esecuzione di un determinato computer esplorando l'heartbeat.A useful application of mvexpand is the need to fill default values in for missing bins. For example, suppose you're looking for the uptime of a particular machine by exploring its heartbeat. e di voler visualizzare l'origine dell'heartbeat che è riportata nella colonna category.You also want to see the source of the heartbeat which is in the category column. In genere, si usa una semplice istruzione summarize, come indicato di seguito:Normally, we would use a simple summarize statement as follows:

Heartbeat
| where TimeGenerated > ago(12h)
| summarize count() by Category, bin(TimeGenerated, 1h)
CategoriaCategory TimeGeneratedTimeGenerated count_count_
Agente direttoDirect Agent 2017-06-06T17:00:00Z2017-06-06T17:00:00Z 1515
Agente direttoDirect Agent 2017-06-06T18:00:00Z2017-06-06T18:00:00Z 6060
Agente direttoDirect Agent 2017-06-06T20:00:00Z2017-06-06T20:00:00Z 5555
Agente direttoDirect Agent 2017-06-06T21:00:00Z2017-06-06T21:00:00Z 5757
Agente direttoDirect Agent 2017-06-06T22:00:00Z2017-06-06T22:00:00Z 6060
...... ...... ......

In questi risultati, tuttavia, l'intervallo di tempo associato a "2017-06-06T19:00:00Z" non è elencato perché non sono presenti dati relativi ad heartbeat per tale ora.In these results though the bucket associated with "2017-06-06T19:00:00Z" is missing because there isn't any heartbeat data for that hour. Per assegnare un valore predefinito agli intervalli di tempo vuoti usare la funzione make-series.Use the make-series function to assign a default value to empty buckets. In questo modo viene generata una riga per ogni categoria con due colonne matrice supplementari, una per i valori e l'altra per gli intervalli di tempo corrispondenti:This will generate a row for each category with two extra array columns, one for values, and one for matching time buckets:

Heartbeat
| make-series count() default=0 on TimeGenerated in range(ago(1d), now(), 1h) by Category 
CategoriaCategory count_count_ TimeGeneratedTimeGenerated
Agente direttoDirect Agent [15,60,0,55,60,57,60,...][15,60,0,55,60,57,60,...] ["2017-06-06T17:00:00.0000000Z","2017-06-06T18:00:00.0000000Z","2017-06-06T19:00:00.0000000Z","2017-06-06T20:00:00.0000000Z","2017-06-06T21:00:00.0000000Z",...]["2017-06-06T17:00:00.0000000Z","2017-06-06T18:00:00.0000000Z","2017-06-06T19:00:00.0000000Z","2017-06-06T20:00:00.0000000Z","2017-06-06T21:00:00.0000000Z",...]
...... ...... ......

Il terzo elemento della matrice count_ è pari a 0 come previsto e nella matrice TimeGenerated è presente un timestamp "2017-06-06T19:00:00.0000000Z" corrispondente.The third element of the count_ array is a 0 as expected, and there is a matching timestamp of "2017-06-06T19:00:00.0000000Z" in the TimeGenerated array. Questo formato di matrice è tuttavia difficile da leggere.This array format is difficult to read though. Usare mvexpand per espandere le matrici e generare l'output nello stesso formato di quello generato da summarize:Use mvexpand to expand the arrays and produce the same format output as generated by summarize:

Heartbeat
| make-series count() default=0 on TimeGenerated in range(ago(1d), now(), 1h) by Category 
| mvexpand TimeGenerated, count_
| project Category, TimeGenerated, count_
CategoriaCategory TimeGeneratedTimeGenerated count_count_
Agente direttoDirect Agent 2017-06-06T17:00:00Z2017-06-06T17:00:00Z 1515
Agente direttoDirect Agent 2017-06-06T18:00:00Z2017-06-06T18:00:00Z 6060
Agente direttoDirect Agent 2017-06-06T19:00:00Z2017-06-06T19:00:00Z 00
Agente direttoDirect Agent 2017-06-06T20:00:00Z2017-06-06T20:00:00Z 5555
Agente direttoDirect Agent 2017-06-06T21:00:00Z2017-06-06T21:00:00Z 5757
Agente direttoDirect Agent 2017-06-06T22:00:00Z2017-06-06T22:00:00Z 6060
...... ...... ......

Limitazione dei risultati a un set di elementi: let, makeset, toscalar, inNarrowing results to a set of elements: let, makeset, toscalar, in

Uno scenario comune consiste nel selezionare i nomi di alcune entità specifiche in base a un set di criteri e quindi filtrare un altro set di dati fino a tale set di entità.A common scenario is to select the names of some specific entities based on a set of criteria and then filter a different data set down to that set of entities. Può ad esempio essere necessario trovare i computer a cui non risultano applicati aggiornamenti e identificare gli indirizzi IP a cui questi computer hanno inviato chiamate:For example you might find computers that are known to have missing updates and identify IPs that these computers called out to:

let ComputersNeedingUpdate = toscalar(
    Update
    | summarize makeset(Computer)
    | project set_Computer
);
WindowsFirewall
| where Computer in (ComputersNeedingUpdate)

Passaggi successiviNext steps

Vedere altre lezioni per l'uso del linguaggio di query Kusto con i dati di log di Monitoraggio di Azure:See other lessons for using the Kusto query language with Azure Monitor log data: