Biblioteca cliente de consultas de Azure Monitor para Python: versión 1.2.0
La biblioteca cliente de consultas de Azure Monitor se usa para ejecutar consultas de solo lectura en las dos plataformas de datos de Azure Monitor:
- Registros: recopila y organiza los datos de registro y rendimiento de los recursos supervisados. Los datos de diferentes orígenes, como los registros de plataforma de los servicios de Azure, los datos de registro y rendimiento de los agentes de máquinas virtuales, y los datos de uso y rendimiento de las aplicaciones se pueden consolidar en un único área de trabajo de Azure Log Analytics. Los distintos tipos de datos se pueden analizar conjuntamente mediante el Lenguaje de consulta Kusto.
- Métricas : recopila datos numéricos de recursos supervisados en una base de datos de serie temporal. Las métricas son valores numéricos que se recopilan a intervalos regulares y describen algún aspecto de un sistema en un momento determinado. Las métricas son ligeras y capaces de admitir escenarios casi en tiempo real, lo que hace que sean útiles para alertar y detectar rápidamente problemas.
Recursos:
- Código fuente
- Paquete (PyPI)
- Paquete (Conda)
- Documentación de referencia de API
- Documentación del servicio
- Muestras
- Registro de cambios
Introducción
Requisitos previos
- Python 3.7 o posterior
- Una suscripción de Azure
- Una implementación de TokenCredential, como un tipo de credencial de la biblioteca de Azure Identity.
- Para consultar los registros, necesita un área de trabajo de Azure Log Analytics.
- Para consultar las métricas, necesita un recurso de Azure de cualquier tipo (cuenta de almacenamiento, Key Vault, Cosmos DB, etc.).
Instalar el paquete
Instale la biblioteca cliente de consultas de Azure Monitor para Python con pip:
pip install azure-monitor-query
Creación del cliente
Se requiere un cliente autenticado para consultar registros o métricas. La biblioteca incluye formas sincrónicas y asincrónicas de los clientes. Para autenticarse, cree una instancia de una credencial de token. Use esa instancia al crear o LogsQueryClient
MetricsQueryClient
. En los ejemplos siguientes se usa DefaultAzureCredential
el paquete azure-identity .
Clientes sincrónicos
Considere el ejemplo siguiente, que crea clientes sincrónicos para consultas de registros y métricas:
from azure.identity import DefaultAzureCredential
from azure.monitor.query import LogsQueryClient, MetricsQueryClient
credential = DefaultAzureCredential()
logs_client = LogsQueryClient(credential)
metrics_client = MetricsQueryClient(credential)
Clientes asincrónicos
Las formas asincrónicas de las API de cliente de consulta se encuentran en el .aio
espacio de nombres -sufijo. Por ejemplo:
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)
Configuración de clientes para nubes de Azure no públicas
De forma predeterminada, LogsQueryClient
y MetricsQueryClient
están configurados para conectarse a la nube pública de Azure. Se pueden configurar para conectarse a nubes de Azure no públicas pasando el argumento correcto endpoint
: por ejemplo:
logs_client = LogsQueryClient(credential, endpoint="https://api.loganalytics.azure.cn/v1")
metrics_client = MetricsQueryClient(credential, endpoint="https://management.chinacloudapi.cn")
Nota: Actualmente, MetricsQueryClient
usa el punto de conexión de Azure Resource Manager (ARM) para consultar métricas, por lo que necesitará el punto de conexión de administración correspondiente para la nube al usar este cliente. Esto está sujeto a cambios en el futuro.
Ejecute la consulta.
Para obtener ejemplos de consultas de registros y métricas, consulte la sección Ejemplos .
Conceptos clave
Registra los límites de frecuencia de consulta y la limitación
El servicio Log Analytics aplica la limitación cuando la tasa de solicitudes es demasiado alta. Los límites, como el número máximo de filas devueltas, también se aplican en las consultas de Kusto. Para más información, consulte Query API.
Si está ejecutando una consulta de registros por lotes, una solicitud limitada devolverá un LogsQueryError
objeto . El valor del code
objeto será ThrottledError
.
Estructura de datos de métricas
Cada conjunto de valores de métricas es una serie temporal con las siguientes características:
- Hora en que se recopiló el valor.
- Recurso asociado al valor
- Espacio de nombres que actúa como una categoría para la métrica.
- Nombre de la métrica.
- El propio valor.
- Algunas métricas pueden tener varias dimensiones, como se describe en métricas multidimensionales. Las métricas personalizadas pueden tener hasta 10 dimensiones.
Ejemplos
- consulta de registros
- Consulta de registros de Batch
- Consulta de registros de recursos
- Escenarios de consulta de registros avanzados
- Consulta de métricas
consulta de registros
En este ejemplo se muestra cómo consultar un área de trabajo de Log Analytics. Para controlar la respuesta y verlo en un formato tabular, se usa la biblioteca pandas . Consulte los ejemplos si decide no usar Pandas.
Especificar intervalo de tiempo
El timespan
parámetro especifica la duración del tiempo durante el que se van a consultar los datos. Este valor puede ser uno de los siguientes:
- a
timedelta
- a
timedelta
y una fecha y hora de inicio - un valor datetime/end datetime de inicio
Por ejemplo:
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)
Control de la respuesta de consulta de registros
La query_workspace
API devuelve un LogsQueryResult
objeto o LogsQueryPartialResult
. La batch_query
API devuelve una lista que puede contener LogsQueryResult
objetos , LogsQueryPartialResult
y LogsQueryError
. Esta es una jerarquía de la respuesta:
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
La LogsQueryResult
iteración directa sobre la tabla como una comodidad. Por ejemplo, para controlar una respuesta de consulta de registros con tablas y mostrarla mediante pandas:
response = client.query(...)
for table in response:
df = pd.DataFrame(table.rows, columns=[col.name for col in table.columns])
Puede encontrar un ejemplo completo aquí.
De forma similar, para controlar una respuesta de consulta de registros por lotes:
for result in response:
if result.status == LogsQueryStatus.SUCCESS:
for table in result:
df = pd.DataFrame(table.rows, columns=table.columns)
print(df)
Puede encontrar un ejemplo completo aquí.
Consulta de registros de Batch
En el ejemplo siguiente se muestra cómo enviar varias consultas al mismo tiempo mediante la API de consulta por lotes. Las consultas se pueden representar como una lista de LogsBatchQuery
objetos o un diccionario. En este ejemplo se usa el enfoque anterior.
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)
Consulta de registros de recursos
En el ejemplo siguiente se muestra cómo consultar registros directamente desde un recurso de Azure sin usar un área de trabajo de Log Analytics. Aquí, el query_resource
método se usa en lugar de query_workspace
y, en lugar de un identificador de área de trabajo, se pasa un identificador de recurso de Azure (por ejemplo, /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)
Escenarios de consulta de registros avanzados
Establecimiento del tiempo de espera de la consulta de registros
En el ejemplo siguiente se muestra cómo establecer un tiempo de espera del servidor en segundos. Se genera un tiempo de espera de puerta de enlace si la consulta tarda más tiempo que el tiempo de espera mencionado. El valor predeterminado es 180 segundos y se puede configurar hasta 10 minutos (600 segundos).
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
)
Consulta de varias áreas de trabajo
La misma consulta de registros se puede ejecutar en varias áreas de trabajo de Log Analytics. Además de la consulta de Kusto, se requieren los parámetros siguientes:
workspace_id
: el primer identificador del área de trabajo (principal).additional_workspaces
- Una lista de áreas de trabajo, excepto el área de trabajo proporcionada en elworkspace_id
parámetro . Los elementos de lista del parámetro pueden constar de los siguientes formatos de identificador:- Nombres de área de trabajo calificados
- Identificadores de área de trabajo
- Identificadores de recursos de Azure
Por ejemplo, la siguiente consulta se ejecuta en tres áreas de trabajo:
client.query_workspace(
<workspace_id>,
query,
timespan=timedelta(days=1),
additional_workspaces=['<workspace 2>', '<workspace 3>']
)
Puede encontrar un ejemplo completo aquí.
Incluir estadísticas
Para obtener las estadísticas de ejecución de consultas de registros, como el consumo de CPU y memoria:
- Establezca el parámetro
include_statistics
enTrue
. - Acceda al
statistics
campo dentro delLogsQueryResult
objeto .
En el ejemplo siguiente se imprime el tiempo de ejecución de la consulta:
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}")
El statistics
campo es un dict
que corresponde a la respuesta JSON sin formato y su estructura puede variar según la consulta. Las estadísticas se encuentran dentro de la query
propiedad . Por ejemplo:
{
"query": {
"executionTime": 0.0156478,
"resourceUsage": {...},
"inputDatasetStatistics": {...},
"datasetStatistics": [{...}]
}
}
Incluir visualización
Para obtener datos de visualización de consultas de registros mediante el operador render:
- Establezca la propiedad
include_visualization
enTrue
. - Acceda al
visualization
campo dentro delLogsQueryResult
objeto .
Por ejemplo:
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}")
El visualization
campo es un dict
que corresponde a la respuesta JSON sin formato y su estructura puede variar según la consulta. Por ejemplo:
{
"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
}
Consulta de métricas
En el ejemplo siguiente se obtienen métricas de una suscripción de Event Grid. El URI del recurso es el de un tema de Event Grid.
El URI del recurso debe ser el del recurso para el que se consultan las métricas. Normalmente es del formato /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>
.
Para buscar el URI del recurso:
- Vaya a la página del recurso en el Azure Portal.
- En la hoja Información general , seleccione el vínculo Vista JSON .
- En el JSON resultante, copie el valor de la
id
propiedad .
NOTA: Las métricas se devuelven en el orden del metric_names enviado.
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)
Control de la respuesta de consulta de métricas
La API de consulta de métricas devuelve un MetricsQueryResult
objeto . El MetricsQueryResult
objeto contiene propiedades como una lista de Metric
objetos con tipo , granularity
namespace
, y timespan
. Se Metric
puede tener acceso a la lista de objetos mediante el metrics
parámetro . Cada Metric
objeto de esta lista contiene una lista de TimeSeriesElement
objetos . Cada TimeSeriesElement
objeto contiene data
propiedades y metadata_values
. En forma visual, la jerarquía de objetos de la respuesta es similar a la estructura siguiente:
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)
Ejemplo de control de la respuesta
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
)
)
Solución de problemas
Consulte nuestra guía de solución de problemas para obtener más información sobre cómo diagnosticar varios escenarios de error.
Pasos siguientes
Para más información sobre Azure Monitor, consulte la documentación del servicio Azure Monitor.
Ejemplos
Los ejemplos de código siguientes muestran escenarios comunes con la biblioteca cliente de consultas de Azure Monitor.
Ejemplos de consultas de registros
- Enviar una sola consulta con LogsQueryClient y controlar la respuesta como una tabla (ejemplo asincrónico)
- Envío de una sola consulta con LogsQueryClient y control de la respuesta en el formulario clave-valor
- Envío de una sola consulta con LogsQueryClient sin pandas
- Envío de una sola consulta con LogsQueryClient en varias áreas de trabajo
- Envío de varias consultas con LogsQueryClient
- Envío de una sola consulta con LogsQueryClient mediante el tiempo de espera del servidor
Ejemplos de consultas de métricas
- Envío de una consulta mediante MetricsQueryClient (ejemplo asincrónico)
- Obtener una lista de espacios de nombres de métricas (ejemplo asincrónico)
- Obtener una lista de definiciones de métricas (ejemplo asincrónico)
Contribuciones
Este proyecto agradece las contribuciones y sugerencias. La mayoría de las contribuciones requieren que acepte un Contrato de licencia para el colaborador (CLA) que declara que tiene el derecho a concedernos y nos concede los derechos para usar su contribución. Para obtener más información, visite cla.microsoft.com.
Cuando se envía una solicitud de incorporación de cambios, un bot de CLA determinará de forma automática si tiene que aportar un CLA y completar la PR adecuadamente (por ejemplo, la etiqueta, el comentario). Solo siga las instrucciones que le dará el bot. Solo tendrá que hacerlo una vez en todos los repositorios mediante nuestro CLA.
Este proyecto ha adoptado el Código de conducta de Microsoft Open Source. Para más información, consulte las preguntas más frecuentes del código de conducta o póngase en contacto con opencode@microsoft.com si tiene cualquier otra pregunta o comentario.
Azure SDK for Python