Azure Monitor Query-clientbibliotheek voor Python - versie 1.2.0
De Azure Monitor Query-clientbibliotheek wordt gebruikt om alleen-lezenquery's uit te voeren op de twee gegevensplatforms van Azure Monitor:
- Logboeken : verzamelt en organiseert logboek- en prestatiegegevens van bewaakte resources. Gegevens uit verschillende bronnen, zoals platformlogboeken van Azure-services, logboek- en prestatiegegevens van agents van virtuele machines en gebruiks- en prestatiegegevens van apps, kunnen worden samengevoegd in één Azure Log Analytics-werkruimte. De verschillende gegevenstypen kunnen samen worden geanalyseerd met behulp van de Kusto-querytaal.
- Metrische gegevens : verzamelt numerieke gegevens van bewaakte resources in een tijdreeksdatabase. Metrische gegevens zijn numerieke waarden die regelmatig worden verzameld en een bepaald aspect van een systeem op een bepaald moment beschrijven. Metrische gegevens zijn licht van gewicht en kunnen bijna realtime-scenario's ondersteunen, waardoor ze handig zijn voor waarschuwingen en snelle detectie van problemen.
Bronnen:
- Broncode
- Pakket (PyPI)
- Pakket (Conda)
- API-referentiedocumentatie
- Servicedocumentatie
- Voorbeelden
- Wijzigingenlogboek
Aan de slag
Vereisten
- Python 3.7 of hoger
- Een Azure-abonnement
- Een TokenCredential-implementatie , zoals een referentietype van een Azure Identity-bibliotheek.
- Als u een query wilt uitvoeren op logboeken, hebt u een Azure Log Analytics-werkruimte nodig.
- Als u een query wilt uitvoeren op metrische gegevens, hebt u een Willekeurige Azure-resource nodig (opslagaccount, Key Vault, Cosmos DB, enzovoort).
Het pakket installeren
Installeer de Azure Monitor Query-clientbibliotheek voor Python met pip:
pip install azure-monitor-query
De client maken
Een geverifieerde client is vereist om een query uit te voeren op logboeken of metrische gegevens. De bibliotheek bevat zowel synchrone als asynchrone vormen van de clients. Voor verificatie maakt u een exemplaar van een tokenreferentie. Gebruik dat exemplaar bij het maken van een LogsQueryClient
of MetricsQueryClient
. In de volgende voorbeelden wordt gebruikgemaakt DefaultAzureCredential
van het pakket azure-identity .
Synchrone clients
Bekijk het volgende voorbeeld, waarin synchrone clients worden gemaakt voor het uitvoeren van query's op logboeken en metrische gegevens:
from azure.identity import DefaultAzureCredential
from azure.monitor.query import LogsQueryClient, MetricsQueryClient
credential = DefaultAzureCredential()
logs_client = LogsQueryClient(credential)
metrics_client = MetricsQueryClient(credential)
Asynchrone clients
De asynchrone vormen van de client-API's voor query's zijn te vinden in de .aio
-achtervoegselnaamruimte. Bijvoorbeeld:
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)
Clients configureren voor niet-openbare Azure-clouds
En MetricsQueryClient
zijn standaard LogsQueryClient
geconfigureerd om verbinding te maken met de openbare Azure-cloud. Deze kunnen worden geconfigureerd om verbinding te maken met niet-openbare Azure-clouds door het juiste endpoint
argument door te geven: Bijvoorbeeld:
logs_client = LogsQueryClient(credential, endpoint="https://api.loganalytics.azure.cn/v1")
metrics_client = MetricsQueryClient(credential, endpoint="https://management.chinacloudapi.cn")
Opmerking: momenteel MetricsQueryClient
wordt het ARM-eindpunt (Azure Resource Manager) gebruikt voor het uitvoeren van query's op metrische gegevens, dus u hebt het bijbehorende beheereindpunt voor uw cloud nodig wanneer u deze client gebruikt. Dit kan in de toekomst veranderen.
De query uitvoeren
Zie de sectie Voorbeelden voor voorbeelden van logboeken en metrische query's.
Belangrijkste concepten
Limieten en beperkingen voor logboekquery's
De Log Analytics-service past beperking toe wanneer de aanvraagsnelheid te hoog is. Limieten, zoals het maximum aantal geretourneerde rijen, worden ook toegepast op de Kusto-query's. Zie Query-API voor meer informatie.
Als u een query voor batchlogboeken uitvoert, retourneert een beperkte aanvraag een LogsQueryError
-object. De waarde van code
dat object is ThrottledError
.
Gegevensstructuur voor metrische gegevens
Elke set met metrische waarden is een tijdreeks met de volgende kenmerken:
- Het tijdstip waarop de waarde is verzameld
- De resource die is gekoppeld aan de waarde
- Een naamruimte die fungeert als een categorie voor de metrische waarde
- Een metrische naam
- De waarde zelf
- Sommige metrische gegevens kunnen meerdere dimensies hebben, zoals beschreven in multidimensionale metrische gegevens. Aangepaste metrische gegevens kunnen maximaal 10 dimensies hebben.
Voorbeelden
- Query voor logboeken
- Query voor Batch-logboeken
- Query voor resourcelogboeken
- Queryscenario's voor geavanceerde logboeken
- Query voor metrische gegevens
Query voor logboeken
In dit voorbeeld ziet u hoe u een query uitvoert op een Log Analytics-werkruimte. De pandas-bibliotheek wordt gebruikt om het antwoord te verwerken en in een tabelvorm weer te geven. Bekijk de voorbeelden als u ervoor kiest om pandas niet te gebruiken.
Tijdsperiode opgeven
De timespan
parameter geeft de tijdsduur op waarvoor een query op de gegevens moet worden uitgevoerd. Deze waarde kan een van de volgende zijn:
- een
timedelta
- een
timedelta
en een begindatum/tijd - een begindatum/einddatum
Bijvoorbeeld:
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)
Queryantwoord voor logboeken verwerken
De query_workspace
API retourneert een LogsQueryResult
of een LogsQueryPartialResult
-object. De batch_query
API retourneert een lijst die , LogsQueryPartialResult
en-objecten LogsQueryError
kan bevattenLogsQueryResult
. Hier volgt een hiërarchie van het antwoord:
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
De LogsQueryResult
itereert voor het gemak over de tabel. Als u bijvoorbeeld een queryantwoord voor logboeken wilt afhandelen met tabellen en deze wilt weergeven met pandas:
response = client.query(...)
for table in response:
df = pd.DataFrame(table.rows, columns=[col.name for col in table.columns])
Een volledig voorbeeld vindt u hier.
Op een vergelijkbare manier, voor het verwerken van een queryantwoord in batchlogboeken:
for result in response:
if result.status == LogsQueryStatus.SUCCESS:
for table in result:
df = pd.DataFrame(table.rows, columns=table.columns)
print(df)
Een volledig voorbeeld vindt u hier.
Query voor Batch-logboeken
In het volgende voorbeeld ziet u hoe u meerdere query's tegelijk verzendt met behulp van de batchquery-API. De query's kunnen worden weergegeven als een lijst LogsBatchQuery
met objecten of als een woordenlijst. In dit voorbeeld wordt de vorige benadering gebruikt.
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 voor resourcelogboeken
In het volgende voorbeeld ziet u hoe u logboeken rechtstreeks vanuit een Azure-resource opvraagt zonder een Log Analytics-werkruimte te gebruiken. Hier wordt de query_resource
methode gebruikt in plaats van query_workspace
, en in plaats van een werkruimte-id wordt een Azure-resource-id doorgegeven (bijvoorbeeld /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)
Geavanceerde queryscenario's voor logboeken
Time-out voor logboekquery instellen
In het volgende voorbeeld ziet u het instellen van een servertime-out in seconden. Er treedt een gatewaytime-out op als de query meer tijd kost dan de genoemde time-out. De standaardwaarde is 180 seconden en kan worden ingesteld op 10 minuten (600 seconden).
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
)
Query's uitvoeren op meerdere werkruimten
Dezelfde logboekquery kan worden uitgevoerd in meerdere Log Analytics-werkruimten. Naast de Kusto-query zijn de volgende parameters vereist:
workspace_id
- De eerste (primaire) werkruimte-id.additional_workspaces
- Een lijst met werkruimten, met uitzondering van de werkruimte die in deworkspace_id
parameter is opgegeven. De lijstitems van de parameter kunnen bestaan uit de volgende id-indelingen:- Namen van gekwalificeerde werkruimten
- Werkruimte-id's
- Azure-resource-id's
De volgende query wordt bijvoorbeeld uitgevoerd in drie werkruimten:
client.query_workspace(
<workspace_id>,
query,
timespan=timedelta(days=1),
additional_workspaces=['<workspace 2>', '<workspace 3>']
)
Een volledig voorbeeld vindt u hier.
Statistieken opnemen
Ga als volgende te werk om statistieken over de uitvoering van query's in logboeken op te halen, zoals CPU- en geheugenverbruik:
- Stel de
include_statistics
parameter in opTrue
. - Open het
statistics
veld in hetLogsQueryResult
object.
In het volgende voorbeeld wordt de uitvoeringstijd van de query afgedrukt:
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}")
Het statistics
veld is een dict
die overeenkomt met het onbewerkte JSON-antwoord en de structuur ervan kan per query verschillen. De statistieken zijn te vinden in de query
eigenschap. Bijvoorbeeld:
{
"query": {
"executionTime": 0.0156478,
"resourceUsage": {...},
"inputDatasetStatistics": {...},
"datasetStatistics": [{...}]
}
}
Visualisatie opnemen
Visualisatiegegevens ophalen voor logboekquery's met behulp van de operator render:
- Stel de
include_visualization
eigenschap in opTrue
. - Open het
visualization
veld in hetLogsQueryResult
object.
Bijvoorbeeld:
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}")
Het visualization
veld is een dict
die overeenkomt met het onbewerkte JSON-antwoord en de structuur ervan kan per query verschillen. Bijvoorbeeld:
{
"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 voor metrische gegevens
In het volgende voorbeeld worden metrische gegevens opgehaald voor een Event Grid-abonnement. De resource-URI is die van een Event Grid-onderwerp.
De resource-URI moet die zijn van de resource waarvoor metrische gegevens worden opgevraagd. Het is normaal gesproken van de indeling /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>
.
De resource-URI zoeken:
- Navigeer naar de pagina van uw resource in de Azure Portal.
- Selecteer op de blade Overzicht de koppeling JSON-weergave .
- Kopieer in de resulterende JSON de waarde van de
id
eigenschap.
OPMERKING: De metrische gegevens worden geretourneerd in de volgorde van de metric_names verzonden.
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)
Antwoord op query's voor metrische gegevens verwerken
De QUERY-API voor metrische gegevens retourneert een MetricsQueryResult
-object. Het MetricsQueryResult
object bevat eigenschappen zoals een lijst met Metric
-getypte objecten, granularity
, namespace
en timespan
. De Metric
lijst met objecten kan worden geopend met behulp van de metrics
parameter . Elk Metric
object in deze lijst bevat een lijst met TimeSeriesElement
objecten. Elk TimeSeriesElement
object bevat data
en metadata_values
eigenschappen. In visuele vorm lijkt de objecthiërarchie van het antwoord op de volgende structuur:
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)
Voorbeeld van het verwerken van een antwoord
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
)
)
Problemen oplossen
Zie onze gids voor probleemoplossing voor meer informatie over het diagnosticeren van verschillende foutscenario's.
Volgende stappen
Zie de documentatie voor de Azure Monitor-service voor meer informatie over Azure Monitor.
Voorbeelden
De volgende codevoorbeelden tonen veelvoorkomende scenario's met de Azure Monitor Query-clientbibliotheek.
Voorbeelden van logboekquery's
- Eén query verzenden met LogsQueryClient en het antwoord afhandelen als een tabel (asynchroon voorbeeld)
- Eén query verzenden met LogsQueryClient en het antwoord afhandelen in sleutel-waardevorm
- Eén query verzenden met LogsQueryClient zonder pandas
- Eén query verzenden met LogsQueryClient in meerdere werkruimten
- Meerdere query's verzenden met LogsQueryClient
- Eén query verzenden met LogsQueryClient met behulp van servertime-out
Queryvoorbeelden voor metrische gegevens
- Een query verzenden met metricsQueryClient (asynchroon voorbeeld)
- Een lijst met metrische naamruimten ophalen (asynchroon voorbeeld)
- Een lijst met metrische definities ophalen (asynchroon voorbeeld)
Bijdragen
Wij verwelkomen bijdragen en suggesties voor dit project. Voor de meeste bijdragen moet u instemmen met een licentieovereenkomst voor bijdragers (CLA: Contributor License Agreement) waarin u verklaart dat u gerechtigd bent ons het recht te geven uw bijdrage te gebruiken, en dat u dit ook doet. Ga naar cla.microsoft.com voor meer informatie.
Wanneer u een pull-aanvraag indient, wordt met een CLA-bot automatisch bepaald of u een CLA moet verschaffen en wordt de pull-aanvraag dienovereenkomstig opgemaakt (bijvoorbeeld met een label of commentaar). Volg gewoon de instructies van de bot. U hoeft dit slechts één keer te doen voor alle opslagplaatsen met behulp van onze CLA.
Op dit project is de Microsoft Open Source Code of Conduct (Microsoft Open Source-gedragscode) van toepassing. Zie de Veelgestelde vragen over de gedragscode voor meer informatie of neem contact op opencode@microsoft.com met eventuele aanvullende vragen of opmerkingen.
Azure SDK for Python