Libreria client di Query di Monitoraggio di Azure per Python - versione 1.2.0
La libreria client di Query di Monitoraggio di Azure viene usata per eseguire query di sola lettura su due piattaforme dati di Monitoraggio di Azure:
- Log : raccoglie e organizza i dati dei log e delle prestazioni dalle risorse monitorate. I dati provenienti da origini diverse, ad esempio i log della piattaforma, i servizi di Azure, i log e i dati sulle prestazioni degli agenti delle macchine virtuali, nonché i dati sull'utilizzo e sulle prestazioni delle app possono essere consolidati in un'unica area di lavoro di Azure Log Analytics. I vari tipi di dati possono essere analizzati insieme usando la Linguaggio di query Kusto.
- Metriche : raccoglie i dati numerici dalle risorse monitorate in un database di serie temporali. Le metriche sono valori numerici che vengono raccolti a intervalli regolari e che descrivono un aspetto di un sistema in un determinato momento. Le metriche sono semplici e in grado di supportare scenari quasi in tempo reale, rendendoli utili per l'avviso e il rilevamento rapido dei problemi.
Risorse:
- Codice sorgente
- Pacchetto (PyPI)
- Pacchetto (Conda)
- Documentazione di riferimento delle API
- Documentazione del servizio
- Esempi
- Log delle modifiche
Introduzione
Prerequisiti
- Python 3.7 o versione successiva
- Una sottoscrizione di Azure
- Implementazione di TokenCredential , ad esempio un tipo di credenziali della libreria di identità di Azure.
- Per eseguire query sui log, è necessaria un'area di lavoro di Azure Log Analytics.
- Per eseguire query sulle metriche, è necessaria una risorsa di Azure di qualsiasi tipo (account di archiviazione, Key Vault, Cosmos DB e così via).
Installare il pacchetto
Installare la libreria client di Query di Monitoraggio di Azure per Python con pip:
pip install azure-monitor-query
Creare il client
Per eseguire query sui log o sulle metriche, è necessario un client autenticato. La libreria include sia forme sincrone che asincrone dei client. Per eseguire l'autenticazione, creare un'istanza di una credenziale del token. Usare tale istanza durante la creazione di un LogsQueryClient
oggetto o MetricsQueryClient
. Gli esempi seguenti usano DefaultAzureCredential
il pacchetto azure-identity .
Client sincroni
Si consideri l'esempio seguente, che crea client sincroni per le query log e metriche:
from azure.identity import DefaultAzureCredential
from azure.monitor.query import LogsQueryClient, MetricsQueryClient
credential = DefaultAzureCredential()
logs_client = LogsQueryClient(credential)
metrics_client = MetricsQueryClient(credential)
Client asincroni
Le forme asincrone delle API client di query sono disponibili nello .aio
spazio dei nomi -suffisso. Ad esempio:
from azure.identity.aio import DefaultAzureCredential
from azure.monitor.query.aio import LogsQueryClient, MetricsQueryClient
credential = DefaultAzureCredential()
async_logs_client = LogsQueryClient(credential)
async_metrics_client = MetricsQueryClient(credential)
Configurare i client per cloud di Azure non pubblici
Per impostazione predefinita, LogsQueryClient
e MetricsQueryClient
sono configurati per connettersi al cloud di Azure pubblico. Queste possono essere configurate per connettersi ai cloud di Azure non pubblici passando l'argomento corretto endpoint
: ad esempio:
logs_client = LogsQueryClient(credential, endpoint="https://api.loganalytics.azure.cn/v1")
metrics_client = MetricsQueryClient(credential, endpoint="https://management.chinacloudapi.cn")
Nota: attualmente usa MetricsQueryClient
l'endpoint di Azure Resource Manager (ARM) per eseguire query sulle metriche, quindi sarà necessario l'endpoint di gestione corrispondente per il cloud quando si usa questo client. Questo è soggetto a modifiche in futuro.
Esecuzione della query
Per esempi di query log e metriche, vedere la sezione Esempi .
Concetti chiave
Log limiti di frequenza di query e limitazione
Il servizio Log Analytics applica la limitazione quando la frequenza delle richieste è troppo elevata. I limiti, ad esempio il numero massimo di righe restituiti, vengono applicati anche alle query Kusto. Per altre informazioni, vedere API query.
Se si esegue una query dei log batch, una richiesta limitata restituirà un LogsQueryError
oggetto. Il valore dell'oggetto code
sarà ThrottledError
.
Struttura dei dati delle metriche
Ogni set di valori delle metriche è una serie temporale con le caratteristiche seguenti:
- Ora in cui è stato raccolto il valore
- Risorsa associata al valore
- Spazio dei nomi che funge da categoria per la metrica
- Nome della metrica
- Valore stesso
- Alcune metriche possono avere più dimensioni, come descritto nelle metriche multidimensionali. Le metriche personalizzate possono avere fino a 10 dimensioni.
Esempio
- Query sui log
- Query sui log batch
- Query sui log delle risorse
- Scenari di query di log avanzati
- Query sulle metriche
Query sui log
In questo esempio viene illustrato come eseguire query su un'area di lavoro Log Analytics. Per gestire la risposta e visualizzarla in un modulo tabulare, viene usata la libreria pandas . Vedere gli esempi se si sceglie di non usare pandas.
Specifica intervallo di tempo
Il timespan
parametro specifica la durata dell'ora per cui eseguire query sui dati. I valori validi sono i seguenti:
- a
timedelta
- a e un
timedelta
datetime di inizio - un datetime/end datetime di inizio
Ad esempio:
import os
import pandas as pd
from datetime import datetime, timezone
from azure.monitor.query import LogsQueryClient, LogsQueryStatus
from azure.identity import DefaultAzureCredential
from azure.core.exceptions import HttpResponseError
credential = DefaultAzureCredential()
client = LogsQueryClient(credential)
query = """AppRequests | take 5"""
start_time=datetime(2021, 7, 2, tzinfo=timezone.utc)
end_time=datetime(2021, 7, 4, tzinfo=timezone.utc)
try:
response = client.query_workspace(
workspace_id=os.environ['LOG_WORKSPACE_ID'],
query=query,
timespan=(start_time, end_time)
)
if response.status == LogsQueryStatus.PARTIAL:
error = response.partial_error
data = response.partial_data
print(error)
elif response.status == LogsQueryStatus.SUCCESS:
data = response.tables
for table in data:
df = pd.DataFrame(data=table.rows, columns=table.columns)
print(df)
except HttpResponseError as err:
print("something fatal happened")
print(err)
Gestire la risposta alle query dei log
L'API query_workspace
restituisce un LogsQueryResult
oggetto o un LogsQueryPartialResult
oggetto. L'API batch_query
restituisce un elenco che può contenere LogsQueryResult
oggetti , LogsQueryPartialResult
e LogsQueryError
. Ecco una gerarchia della risposta:
LogsQueryResult
|---statistics
|---visualization
|---tables (list of `LogsTable` objects)
|---name
|---rows
|---columns
|---columns_types
LogsQueryPartialResult
|---statistics
|---visualization
|---partial_error (a `LogsQueryError` object)
|---code
|---message
|---details
|---status
|---partial_data (list of `LogsTable` objects)
|---name
|---rows
|---columns
|---columns_types
L'iterazione LogsQueryResult
diretta della tabella viene eseguita come praticità. Ad esempio, per gestire una risposta di query dei log con tabelle e visualizzarla usando pandas:
response = client.query(...)
for table in response:
df = pd.DataFrame(table.rows, columns=[col.name for col in table.columns])
Un esempio completo è disponibile qui.
In modo analogo, per gestire una risposta di query dei log batch:
for result in response:
if result.status == LogsQueryStatus.SUCCESS:
for table in result:
df = pd.DataFrame(table.rows, columns=table.columns)
print(df)
Un esempio completo è disponibile qui.
Query sui log batch
Nell'esempio seguente viene illustrato l'invio di più query contemporaneamente tramite l'API query batch. Le query possono essere rappresentate come elenco di LogsBatchQuery
oggetti o un dizionario. In questo esempio viene usato l'approccio precedente.
import os
from datetime import timedelta, datetime, timezone
import pandas as pd
from azure.monitor.query import LogsQueryClient, LogsBatchQuery, LogsQueryStatus
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
client = LogsQueryClient(credential)
requests = [
LogsBatchQuery(
query="AzureActivity | summarize count()",
timespan=timedelta(hours=1),
workspace_id=os.environ['LOG_WORKSPACE_ID']
),
LogsBatchQuery(
query= """bad query""",
timespan=timedelta(days=1),
workspace_id=os.environ['LOG_WORKSPACE_ID']
),
LogsBatchQuery(
query= """let Weight = 92233720368547758;
range x from 1 to 3 step 1
| summarize percentilesw(x, Weight * 100, 50)""",
workspace_id=os.environ['LOG_WORKSPACE_ID'],
timespan=(datetime(2021, 6, 2, tzinfo=timezone.utc), datetime(2021, 6, 5, tzinfo=timezone.utc)), # (start, end)
include_statistics=True
),
]
results = client.query_batch(requests)
for res in results:
if res.status == LogsQueryStatus.FAILURE:
# this will be a LogsQueryError
print(res.message)
elif res.status == LogsQueryStatus.PARTIAL:
## this will be a LogsQueryPartialResult
print(res.partial_error)
for table in res.partial_data:
df = pd.DataFrame(table.rows, columns=table.columns)
print(df)
elif res.status == LogsQueryStatus.SUCCESS:
## this will be a LogsQueryResult
table = res.tables[0]
df = pd.DataFrame(table.rows, columns=table.columns)
print(df)
Query sui log delle risorse
Nell'esempio seguente viene illustrato come eseguire query sui log direttamente da una risorsa di Azure senza usare un'area di lavoro Log Analytics. In questo caso, il query_resource
metodo viene usato anziché , e invece di query_workspace
un ID dell'area di lavoro, viene passato un identificatore di risorsa di Azure (ad esempio /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}
).
import os
import pandas as pd
from datetime import timedelta
from azure.monitor.query import LogsQueryClient, LogsQueryStatus
from azure.core.exceptions import HttpResponseError
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
client = LogsQueryClient(credential)
query = """AzureActivity | take 5"""
try:
response = client.query_resource(os.environ['LOGS_RESOURCE_ID'], query, timespan=timedelta(days=1))
if response.status == LogsQueryStatus.PARTIAL:
error = response.partial_error
data = response.partial_data
print(error)
elif response.status == LogsQueryStatus.SUCCESS:
data = response.tables
for table in data:
df = pd.DataFrame(data=table.rows, columns=table.columns)
print(df)
except HttpResponseError as err:
print("something fatal happened")
print(err)
Scenari di query di log avanzati
Impostare il timeout delle query dei log
Nell'esempio seguente viene illustrato l'impostazione di un timeout del server in secondi. Viene generato un timeout del gateway se la query richiede più tempo del timeout indicato. Il valore predefinito è 180 secondi e può essere configurato fino a 10 minuti (600 secondi).
import os
from azure.monitor.query import LogsQueryClient
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
client = LogsQueryClient(credential)
response = client.query_workspace(
os.environ['LOG_WORKSPACE_ID'],
"range x from 1 to 10000000000 step 1 | count",
timespan=timedelta(days=1),
server_timeout=600 # sets the timeout to 10 minutes
)
Eseguire query su più aree di lavoro
La stessa query di log può essere eseguita in più aree di lavoro di Log Analytics. Oltre alla query Kusto, sono necessari i parametri seguenti:
workspace_id
- Il primo ID dell'area di lavoro (primaria).additional_workspaces
- Elenco di aree di lavoro, escluse le aree di lavoro fornite nelworkspace_id
parametro. Gli elementi dell'elenco dei parametri possono essere costituiti dai formati di identificatore seguenti:- Nomi di area di lavoro qualificati
- ID area di lavoro
- ID risorsa di Azure
Ad esempio, la query seguente viene eseguita in tre aree di lavoro:
client.query_workspace(
<workspace_id>,
query,
timespan=timedelta(days=1),
additional_workspaces=['<workspace 2>', '<workspace 3>']
)
Un esempio completo è disponibile qui.
Includere le statistiche
Per ottenere le statistiche di esecuzione delle query dei log, ad esempio l'utilizzo della CPU e della memoria:
- Impostare il parametro
include_statistics
suTrue
. - Accedere al
statistics
campo all'interno dell'oggettoLogsQueryResult
.
Nell'esempio seguente viene stampato il tempo di esecuzione della query:
query = "AzureActivity | top 10 by TimeGenerated"
result = client.query_workspace(
<workspace_id>,
query,
timespan=timedelta(days=1),
include_statistics=True
)
execution_time = result.statistics.get("query", {}).get("executionTime")
print(f"Query execution time: {execution_time}")
Il statistics
campo è un dict
oggetto che corrisponde alla risposta JSON non elaborata e la relativa struttura può variare in base alla query. Le statistiche vengono trovate all'interno della query
proprietà. Ad esempio:
{
"query": {
"executionTime": 0.0156478,
"resourceUsage": {...},
"inputDatasetStatistics": {...},
"datasetStatistics": [{...}]
}
}
Includere la visualizzazione
Per ottenere i dati di visualizzazione per le query di log usando l'operatore di rendering:
- Impostare la proprietà
include_visualization
suTrue
. - Accedere al
visualization
campo all'interno dell'oggettoLogsQueryResult
.
Ad esempio:
query = (
"StormEvents"
"| summarize event_count = count() by State"
"| where event_count > 10"
"| project State, event_count"
"| render columnchart"
)
result = client.query_workspace(
<workspace_id>,
query,
timespan=timedelta(days=1),
include_visualization=True
)
print(f"Visualization result: {result.visualization}")
Il visualization
campo è un dict
oggetto che corrisponde alla risposta JSON non elaborata e la relativa struttura può variare in base alla query. Ad esempio:
{
"visualization": "columnchart",
"title": "the chart title",
"accumulate": False,
"isQuerySorted": False,
"kind": None,
"legend": None,
"series": None,
"yMin": "NaN",
"yMax": "NaN",
"xAxis": None,
"xColumn": None,
"xTitle": "x axis title",
"yAxis": None,
"yColumns": None,
"ySplit": None,
"yTitle": None,
"anomalyColumns": None
}
Query sulle metriche
Nell'esempio seguente vengono recuperate le metriche per una sottoscrizione di Griglia di eventi. L'URI della risorsa è quello di un argomento griglia di eventi.
L'URI della risorsa deve essere quello della risorsa per cui vengono eseguite query sulle metriche. Normalmente è del formato /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>
.
Per trovare l'URI della risorsa:
- Passare alla pagina della risorsa nel portale di Azure.
- Nel pannello Panoramica selezionare il collegamento Visualizzazione JSON .
- Nel codice JSON risultante copiare il valore della
id
proprietà.
NOTA: le metriche vengono restituite nell'ordine del metric_names inviato.
import os
from datetime import timedelta, datetime
from azure.monitor.query import MetricsQueryClient
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
client = MetricsQueryClient(credential)
start_time = datetime(2021, 5, 25)
duration = timedelta(days=1)
metrics_uri = os.environ['METRICS_RESOURCE_URI']
response = client.query_resource(
metrics_uri,
metric_names=["PublishSuccessCount"],
timespan=(start_time, duration)
)
for metric in response.metrics:
print(metric.name)
for time_series_element in metric.timeseries:
for metric_value in time_series_element.data:
print(metric_value.time_stamp)
Gestire la risposta alle query sulle metriche
L'API query delle metriche restituisce un MetricsQueryResult
oggetto. L'oggetto MetricsQueryResult
contiene proprietà come un elenco di Metric
oggetti tipizzati, , granularity
, namespace
e timespan
. È Metric
possibile accedere all'elenco di oggetti usando il metrics
param. Ogni Metric
oggetto in questo elenco contiene un elenco di TimeSeriesElement
oggetti. Ogni TimeSeriesElement
oggetto contiene data
e metadata_values
proprietà. In formato visivo, la gerarchia di oggetti della risposta è simile alla struttura seguente:
MetricsQueryResult
|---granularity
|---timespan
|---cost
|---namespace
|---resource_region
|---metrics (list of `Metric` objects)
|---id
|---type
|---name
|---unit
|---timeseries (list of `TimeSeriesElement` objects)
|---metadata_values
|---data (list of data points represented by `MetricValue` objects)
Esempio di gestione della risposta
import os
from azure.monitor.query import MetricsQueryClient, MetricAggregationType
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
client = MetricsQueryClient(credential)
metrics_uri = os.environ['METRICS_RESOURCE_URI']
response = client.query_resource(
metrics_uri,
metric_names=["MatchedEventCount"],
aggregations=[MetricAggregationType.COUNT]
)
for metric in response.metrics:
print(metric.name)
for time_series_element in metric.timeseries:
for metric_value in time_series_element.data:
if metric_value.count != 0:
print(
"There are {} matched events at {}".format(
metric_value.count,
metric_value.time_stamp
)
)
Risoluzione dei problemi
Per informazioni dettagliate su come diagnosticare vari scenari di errore, vedere la guida alla risoluzione dei problemi .
Passaggi successivi
Per altre informazioni su Monitoraggio di Azure, vedere la documentazione del servizio Monitoraggio di Azure.
Esempi
Gli esempi di codice seguenti mostrano scenari comuni con la libreria client di Query di Monitoraggio di Azure.
Esempi di query di log
- Inviare una singola query con LogsQueryClient e gestire la risposta come tabella (esempio asincrono)
- Inviare una singola query con LogsQueryClient e gestire la risposta nel modulo chiave-valore
- Inviare una singola query con LogsQueryClient senza pandas
- Inviare una singola query con LogsQueryClient in più aree di lavoro
- Inviare più query con LogsQueryClient
- Inviare una singola query con LogsQueryClient usando il timeout del server
Esempi di query sulle metriche
- Inviare una query usando MetricsQueryClient (esempio asincrono)
- Ottenere un elenco di spazi dei nomi delle metriche (esempio asincrono)
- Ottenere un elenco di definizioni di metriche (esempio asincrono)
Contributo
In questo progetto sono benvenuti i contributi e i suggerimenti. Per la maggior parte dei contenuti è necessario sottoscrivere un contratto di licenza di collaborazione (CLA, Contributor License Agreement) che stabilisce che l'utente ha il diritto di concedere, e di fatto concede a Microsoft i diritti d'uso del suo contributo. Per informazioni dettagliate, visitare cla.microsoft.com.
Quando si invia una richiesta pull, un bot CLA determina automaticamente se è necessario specificare un contratto CLA e completare la richiesta pull in modo appropriato (ad esempio con un'etichetta e un commento). Seguire le istruzioni specificate dal bot. Questa operazione deve essere eseguita una sola volta in tutti i repository usando l'applicazione cla.
Questo progetto ha adottato il Codice di comportamento di Microsoft per l'open source. Per altre informazioni, vedere Code of Conduct FAQ (Domande frequenti sul Codice di comportamento Open Source di Microsoft) oppure contattare opencode@microsoft.com per eventuali altre domande o commenti.
Azure SDK for Python