Azure Monitor Query-clientbibliotheek voor JavaScript - 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
- Package (npm)
- API-referentiedocumentatie
- Servicedocumentatie
- Voorbeelden
- Wijzigingenlogboek
Aan de slag
Ondersteunde omgevingen
- LTS-versies van Node.js
- Nieuwste versies van Safari, Chrome, Microsoft Edge en Firefox
Zie ons ondersteuningsbeleid voor meer informatie.
Vereisten
- 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 van de volgende dingen nodig:
- Een Azure Log Analytics-werkruimte
- Een Willekeurige Azure-resource (opslagaccount, Key Vault, Cosmos DB, enzovoort)
- 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 JavaScript met npm:
npm install @azure/monitor-query
De client maken
Een geverifieerde client is vereist om een query uit te voeren op logboeken of metrische gegevens. Voor verificatie wordt in het volgende voorbeeld DefaultAzureCredential uit het pakket @azure/identity gebruikt.
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, MetricsQueryClient, MetricsBatchQueryClient } from "@azure/monitor-query";
const credential = new DefaultAzureCredential();
const logsQueryClient: LogsQueryClient = new LogsQueryClient(credential);
// or
const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(credential);
// or
const endPoint: string = "<YOUR_METRICS_ENDPOINT>"; //for example, https://eastus.metrics.monitor.azure.com/
const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(
endPoint,
credential
);
Client configureren voor onafhankelijke Azure-cloud
En MetricsQueryClient
zijn standaard LogsQueryClient
geconfigureerd voor het gebruik van de openbare Azure-cloud. Als u in plaats daarvan een onafhankelijke cloud wilt gebruiken, geeft u het juiste endpoint
argument op. Bijvoorbeeld:
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, MetricsQueryClient } from "@azure/monitor-query";
const credential = new DefaultAzureCredential();
const logsQueryClient = new LogsQueryClient(credential, {
endpoint: "https://api.loganalytics.azure.cn/v1",
});
// or
const metricsQueryClient = new 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. U hebt het bijbehorende beheereindpunt voor uw cloud nodig wanneer u deze client gebruikt. Dit detail kan in de toekomst worden gewijzigd.
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.
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 hebben meerdere dimensies, zoals beschreven in multidimensionale metrische gegevens. Aangepaste metrische gegevens kunnen maximaal 10 dimensies hebben.
Voorbeelden
- Query voor logboeken
- Query voor Batch-logboeken
- Queryscenario's voor geavanceerde logboeken
- Query voor metrische gegevens
Query voor logboeken
De LogsQueryClient
kan worden gebruikt om een query uit te voeren op een Log Analytics-werkruimte met behulp van de Kusto-querytaal. De timespan.duration
kan worden opgegeven als een tekenreeks in een ISO 8601-duurnotatie. U kunt de Durations
opgegeven constanten gebruiken voor een aantal veelgebruikte ISO 8601-duurs.
U kunt query's uitvoeren op logboeken op werkruimte-id of resource-id. Het resultaat wordt geretourneerd als een tabel met een verzameling rijen.
Query voor op werkruimte gerichte logboeken
Als u een query wilt uitvoeren op werkruimte-id, gebruikt u de LogsQueryClient.queryWorkspace
methode:
import { DefaultAzureCredential } from "@azure/identity";
import { Durations, LogsQueryClient, LogsQueryResultStatus, LogsTable } from "@azure/monitor-query";
const azureLogAnalyticsWorkspaceId = "<the Workspace Id for your Azure Log Analytics resource>";
const logsQueryClient = new LogsQueryClient(new DefaultAzureCredential());
async function run() {
const kustoQuery = "AppEvents | limit 1";
const result = await logsQueryClient.queryWorkspace(azureLogAnalyticsWorkspaceId, kustoQuery, {
duration: Durations.twentyFourHours,
});
if (result.status === LogsQueryResultStatus.Success) {
const tablesFromResult: LogsTable[] = result.tables;
if (tablesFromResult.length === 0) {
console.log(`No results for query '${kustoQuery}'`);
return;
}
console.log(`This query has returned table(s) - `);
processTables(tablesFromResult);
} else {
console.log(`Error processing the query '${kustoQuery}' - ${result.partialError}`);
if (result.partialTables.length > 0) {
console.log(`This query has also returned partial data in the following table(s) - `);
processTables(result.partialTables);
}
}
}
async function processTables(tablesFromResult: LogsTable[]) {
for (const table of tablesFromResult) {
const columnHeaderString = table.columnDescriptors
.map((column) => `${column.name}(${column.type}) `)
.join("| ");
console.log("| " + columnHeaderString);
for (const row of table.rows) {
const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
console.log("| " + columnValuesString);
}
}
}
run().catch((err) => console.log("ERROR:", err));
Query voor resourcegerichte logboeken
In het volgende voorbeeld ziet u hoe u logboeken rechtstreeks vanuit een Azure-resource opvraagt. Hier wordt de queryResource
methode gebruikt en wordt een Azure-resource-id doorgegeven. Bijvoorbeeld /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}
.
Ga als volgende te werk om de resource-id te vinden:
- 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.
/**
* @summary Demonstrates how to run a query against a Log Analytics workspace, using an Azure resource ID.
*/
import { DefaultAzureCredential } from "@azure/identity";
import {
Durations,
LogsQueryClient,
LogsTable,
LogsQueryOptions,
LogsQueryResultStatus,
} from "@azure/monitor-query";
import * as dotenv from "dotenv";
dotenv.config();
const logsResourceId = process.env.LOGS_RESOURCE_ID;
export async function main() {
const tokenCredential = new DefaultAzureCredential();
const logsQueryClient = new LogsQueryClient(tokenCredential);
if (!logsResourceId) {
throw new Error("LOGS_RESOURCE_ID must be set in the environment for this sample");
}
const kustoQuery = `MyTable_CL | summarize count()`
console.log(`Running '${kustoQuery}' over the last One Hour`);
const queryLogsOptions: LogsQueryOptions = {
// explicitly control the amount of time the server can spend processing the query.
serverTimeoutInSeconds: 600, // sets the timeout to 10 minutes
// optionally enable returning additional statistics about the query's execution.
// (by default, this is off)
includeQueryStatistics: true,
};
const result = await logsQueryClient.queryResource(
logsResourceId,
kustoQuery,
{ duration: Durations.sevenDays },
queryLogsOptions);
const executionTime =
result.statistics && result.statistics.query && (result.statistics.query as any).executionTime;
console.log(
`Results for query '${kustoQuery}', execution time: ${
executionTime == null ? "unknown" : executionTime
}`
);
if (result.status === LogsQueryResultStatus.Success) {
const tablesFromResult: LogsTable[] = result.tables;
if (tablesFromResult.length === 0) {
console.log(`No results for query '${kustoQuery}'`);
return;
}
console.log(`This query has returned table(s) - `);
processTables(tablesFromResult);
} else {
console.log(`Error processing the query '${kustoQuery}' - ${result.partialError}`);
if (result.partialTables.length > 0) {
console.log(`This query has also returned partial data in the following table(s) - `);
processTables(result.partialTables);
}
}
}
async function processTables(tablesFromResult: LogsTable[]) {
for (const table of tablesFromResult) {
const columnHeaderString = table.columnDescriptors
.map((column) => `${column.name}(${column.type}) `)
.join("| ");
console.log("| " + columnHeaderString);
for (const row of table.rows) {
const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
console.log("| " + columnValuesString);
}
}
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
process.exit(1);
});
Queryantwoord voor logboeken verwerken
De queryWorkspace
functie van LogsQueryClient
retourneert een LogsQueryResult
-object. Het objecttype kan of LogsQueryPartialResult
zijnLogsQuerySuccessfulResult
. Hier volgt een hiërarchie van het antwoord:
LogsQuerySuccessfulResult
|---statistics
|---visualization
|---status ("Success")
|---tables (list of `LogsTable` objects)
|---name
|---rows
|---columnDescriptors (list of `LogsColumn` objects)
|---name
|---type
LogsQueryPartialResult
|---statistics
|---visualization
|---status ("PartialFailure")
|---partialError
|--name
|--code
|--message
|--stack
|---partialTables (list of `LogsTable` objects)
|---name
|---rows
|---columnDescriptors (list of `LogsColumn` objects)
|---name
|---type
Als u bijvoorbeeld een antwoord wilt verwerken met tabellen:
async function processTables(tablesFromResult: LogsTable[]) {
for (const table of tablesFromResult) {
const columnHeaderString = table.columnDescriptors
.map((column) => `${column.name}(${column.type}) `)
.join("| ");
console.log("| " + columnHeaderString);
for (const row of table.rows) {
const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
console.log("| " + columnValuesString);
}
}
}
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 met BatchQuery
objecten.
export async function main() {
if (!monitorWorkspaceId) {
throw new Error("MONITOR_WORKSPACE_ID must be set in the environment for this sample");
}
const tokenCredential = new DefaultAzureCredential();
const logsQueryClient = new LogsQueryClient(tokenCredential);
const kqlQuery = "AppEvents | project TimeGenerated, Name, AppRoleInstance | limit 1";
const queriesBatch = [
{
workspaceId: monitorWorkspaceId,
query: kqlQuery,
timespan: { duration: "P1D" },
},
{
workspaceId: monitorWorkspaceId,
query: "AzureActivity | summarize count()",
timespan: { duration: "PT1H" },
},
{
workspaceId: monitorWorkspaceId,
query:
"AppRequests | take 10 | summarize avgRequestDuration=avg(DurationMs) by bin(TimeGenerated, 10m), _ResourceId",
timespan: { duration: "PT1H" },
},
{
workspaceId: monitorWorkspaceId,
query: "AppRequests | take 2",
timespan: { duration: "PT1H" },
includeQueryStatistics: true,
},
];
const result = await logsQueryClient.queryBatch(queriesBatch);
if (result == null) {
throw new Error("No response for query");
}
let i = 0;
for (const response of result) {
console.log(`Results for query with query: ${queriesBatch[i]}`);
if (response.status === LogsQueryResultStatus.Success) {
console.log(
`Printing results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`
);
processTables(response.tables);
} else if (response.status === LogsQueryResultStatus.PartialFailure) {
console.log(
`Printing partial results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`
);
processTables(response.partialTables);
console.log(
` Query had errors:${response.partialError.message} with code ${response.partialError.code}`
);
} else {
console.log(`Printing errors from query '${queriesBatch[i].query}'`);
console.log(` Query had errors:${response.message} with code ${response.code}`);
}
// next query
i++;
}
}
async function processTables(tablesFromResult: LogsTable[]) {
for (const table of tablesFromResult) {
const columnHeaderString = table.columnDescriptors
.map((column) => `${column.name}(${column.type}) `)
.join("| ");
console.log("| " + columnHeaderString);
for (const row of table.rows) {
const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
console.log("| " + columnValuesString);
}
}
}
Verwerken van batchqueryantwoorden voor logboeken
De queryBatch
functie van LogsQueryClient
retourneert een LogsQueryBatchResult
-object. LogsQueryBatchResult
bevat een lijst met objecten met de volgende mogelijke typen:
LogsQueryPartialResult
LogsQuerySuccessfulResult
LogsQueryError
Hier volgt een hiërarchie van het antwoord:
LogsQuerySuccessfulResult
|---statistics
|---visualization
|---status ("Success")
|---tables (list of `LogsTable` objects)
|---name
|---rows
|---columnDescriptors (list of `LogsColumn` objects)
|---name
|---type
LogsQueryPartialResult
|---statistics
|---visualization
|---status ("PartialFailure")
|---partialError
|--name
|--code
|--message
|--stack
|---partialTables (list of `LogsTable` objects)
|---name
|---rows
|---columnDescriptors (list of `LogsColumn` objects)
|---name
|---type
LogsQueryError
|--name
|--code
|--message
|--stack
|--status ("Failure")
De volgende code verwerkt bijvoorbeeld een queryantwoord voor batchlogboeken:
async function processBatchResult(result: LogsQueryBatchResult) {
let i = 0;
for (const response of result) {
console.log(`Results for query with query: ${queriesBatch[i]}`);
if (response.status === LogsQueryResultStatus.Success) {
console.log(
`Printing results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`
);
processTables(response.tables);
} else if (response.status === LogsQueryResultStatus.PartialFailure) {
console.log(
`Printing partial results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`
);
processTables(response.partialTables);
console.log(
` Query had errors:${response.partialError.message} with code ${response.partialError.code}`
);
} else {
console.log(`Printing errors from query '${queriesBatch[i].query}'`);
console.log(` Query had errors:${response.message} with code ${response.code}`);
}
// next query
i++;
}
}
async function processTables(tablesFromResult: LogsTable[]) {
for (const table of tablesFromResult) {
const columnHeaderString = table.columnDescriptors
.map((column) => `${column.name}(${column.type}) `)
.join("| ");
console.log("| " + columnHeaderString);
for (const row of table.rows) {
const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
console.log("| " + columnValuesString);
}
}
}
Een volledig voorbeeld vindt u hier.
Queryscenario's voor geavanceerde logboeken
Time-out voor logboekquery instellen
Het uitvoeren van sommige logboekquery's duurt langer dan 3 minuten. De standaardtime-out van de server is 3 minuten. U kunt de servertime-out verhogen tot maximaal 10 minuten. In het volgende voorbeeld wordt de eigenschap van serverTimeoutInSeconds
het LogsQueryOptions
object gebruikt om de time-out van de server te verhogen tot 10 minuten:
// setting optional parameters
const queryLogsOptions: LogsQueryOptions = {
// explicitly control the amount of time the server can spend processing the query.
serverTimeoutInSeconds: 600, // 600 seconds = 10 minutes
};
const result = await logsQueryClient.queryWorkspace(
azureLogAnalyticsWorkspaceId,
kustoQuery,
{ duration: Durations.twentyFourHours },
queryLogsOptions
);
const tablesFromResult = result.tables;
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:
workspaceId
- De eerste (primaire) werkruimte-id.additionalWorkspaces
- Een lijst met werkruimten, met uitzondering van de werkruimte die is opgegeven in deworkspaceId
parameter . 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:
const queryLogsOptions: LogsQueryOptions = {
additionalWorkspaces: ["<workspace2>", "<workspace3>"],
};
const kustoQuery = "AppEvents | limit 10";
const result = await logsQueryClient.queryWorkspace(
azureLogAnalyticsWorkspaceId,
kustoQuery,
{ duration: Durations.twentyFourHours },
queryLogsOptions
);
Als u de resultaten voor elke werkruimte wilt weergeven, gebruikt u de TenantId
kolom om de resultaten te ordenen of te filteren in de Kusto-query.
Resultaten ordenen op TenantId
AppEvents | order by TenantId
Resultaten filteren op TenantId
AppEvents | filter TenantId == "<workspace2>"
Een volledig voorbeeld vindt u hier.
Statistieken opnemen
Statistieken over uitvoering van logboekquery's ophalen, zoals CPU- en geheugenverbruik:
- Stel de
LogsQueryOptions.includeQueryStatistics
eigenschap in optrue
. statistics
Het veld in hetLogsQueryResult
object openen.
In het volgende voorbeeld wordt de uitvoeringstijd van de query afgedrukt:
const workspaceId = "<workspace_id>";
const logsQueryClient = new LogsQueryClient(new DefaultAzureCredential());
const kustoQuery = "AzureActivity | top 10 by TimeGenerated";
const result = await logsQueryClient.queryWorkspace(
monitorWorkspaceId,
kustoQuery,
{ duration: Durations.oneDay },
{
includeQueryStatistics: true,
}
);
const executionTime =
result.statistics && result.statistics.query && result.statistics.query.executionTime;
console.log(
`Results for query '${kustoQuery}', execution time: ${
executionTime == null ? "unknown" : executionTime
}`
);
Omdat de structuur van de statistics
nettolading per query verschilt, wordt een Record<string, unknown>
retourtype gebruikt. Het bevat het onbewerkte JSON-antwoord. De statistieken bevinden zich in de query
eigenschap van de JSON. Bijvoorbeeld:
{
"query": {
"executionTime": 0.0156478,
"resourceUsage": {...},
"inputDatasetStatistics": {...},
"datasetStatistics": [{...}]
}
}
Visualisatie opnemen
Visualisatiegegevens ophalen voor logboekquery's met behulp van de render-operator:
- Stel de
LogsQueryOptions.includeVisualization
eigenschap in optrue
. visualization
Het veld in hetLogsQueryResult
object openen.
Bijvoorbeeld:
const workspaceId = "<workspace_id>";
const logsQueryClient = new LogsQueryClient(new DefaultAzureCredential());
const result = await logsQueryClient.queryWorkspace(
monitorWorkspaceId,
@"StormEvents
| summarize event_count = count() by State
| where event_count > 10
| project State, event_count
| render columnchart",
{ duration: Durations.oneDay },
{
includeVisualization: true
}
);
console.log("visualization result:", result.visualization);
Omdat de structuur van de visualization
nettolading per query verschilt, wordt een Record<string, unknown>
retourtype gebruikt. Het bevat het onbewerkte JSON-antwoord. Bijvoorbeeld:
{
"visualization": "columnchart",
"title": "the chart title",
"accumulate": false,
"isQuerySorted": false,
"kind": null,
"legend": null,
"series": null,
"yMin": "NaN",
"yMax": "NaN",
"xAxis": null,
"xColumn": null,
"xTitle": "x axis title",
"yAxis": null,
"yColumns": null,
"ySplit": null,
"yTitle": null,
"anomalyColumns": null
}
Query voor metrische gegevens
In het volgende voorbeeld worden metrische gegevens opgehaald voor een Azure Metrics Advisor-abonnement .
De resource-URI moet die zijn van de resource waarvoor metrische gegevens worden opgevraagd. Deze heeft normaal gesproken 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.
import { DefaultAzureCredential } from "@azure/identity";
import { Durations, Metric, MetricsQueryClient } from "@azure/monitor-query";
import * as dotenv from "dotenv";
dotenv.config();
const metricsResourceId = process.env.METRICS_RESOURCE_ID;
export async function main() {
const tokenCredential = new DefaultAzureCredential();
const metricsQueryClient = new MetricsQueryClient(tokenCredential);
if (!metricsResourceId) {
throw new Error("METRICS_RESOURCE_ID must be set in the environment for this sample");
}
const iterator = metricsQueryClient.listMetricDefinitions(metricsResourceId);
let result = await iterator.next();
let metricNames: string[] = [];
for await (const result of iterator) {
console.log(` metricDefinitions - ${result.id}, ${result.name}`);
if (result.name) {
metricNames.push(result.name);
}
}
const firstMetricName = metricNames[0];
const secondMetricName = metricNames[1];
if (firstMetricName && secondMetricName) {
console.log(`Picking an example metric to query: ${firstMetricName} and ${secondMetricName}`);
const metricsResponse = await metricsQueryClient.queryResource(
metricsResourceId,
[firstMetricName, secondMetricName],
{
granularity: "PT1M",
timespan: { duration: Durations.fiveMinutes },
}
);
console.log(
`Query cost: ${metricsResponse.cost}, interval: ${metricsResponse.granularity}, time span: ${metricsResponse.timespan}`
);
const metrics: Metric[] = metricsResponse.metrics;
console.log(`Metrics:`, JSON.stringify(metrics, undefined, 2));
const metric = metricsResponse.getMetricByName(firstMetricName);
console.log(`Selected Metric: ${firstMetricName}`, JSON.stringify(metric, undefined, 2));
} else {
console.error(`Metric names are not defined - ${firstMetricName} and ${secondMetricName}`);
}
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
process.exit(1);
});
In het voorgaande voorbeeld worden metrische resultaten in metricsResponse
geordend volgens de volgorde waarin de gebruiker de metrische namen opgeeft in het metricNames
matrixargument voor de queryResource
functie. Als de gebruiker opgeeft [firstMetricName, secondMetricName]
, wordt het resultaat voor firstMetricName
weergegeven vóór het resultaat voor secondMetricName
in de metricResponse
.
Queryantwoord voor metrische gegevens verwerken
De functie metrische gegevens queryResource
retourneert een QueryMetricsResult
-object. Het QueryMetricsResult
object bevat eigenschappen zoals een lijst met Metric
-getypte objecten, interval
, namespace
en timespan
. De Metric
lijst met objecten kan worden geopend met behulp van de metrics
eigenschap . Elk Metric
object in deze lijst bevat een lijst met TimeSeriesElement
objecten. Elk TimeSeriesElement
bevat data
en metadataValues
eigenschappen. In visuele vorm lijkt de objecthiërarchie van het antwoord op de volgende structuur:
QueryMetricsResult
|---cost
|---timespan (of type `QueryTimeInterval`)
|---granularity
|---namespace
|---resourceRegion
|---metrics (list of `Metric` objects)
|---id
|---type
|---name
|---unit
|---displayDescription
|---errorCode
|---timeseries (list of `TimeSeriesElement` objects)
|---metadataValues
|---data (list of data points represented by `MetricValue` objects)
|---timeStamp
|---average
|---minimum
|---maximum
|---total
|---count
|---getMetricByName(metricName): Metric | undefined (convenience method)
Voorbeeld van het verwerken van een antwoord
import { DefaultAzureCredential } from "@azure/identity";
import { Durations, Metric, MetricsQueryClient } from "@azure/monitor-query";
import * as dotenv from "dotenv";
dotenv.config();
const metricsResourceId = process.env.METRICS_RESOURCE_ID;
export async function main() {
const tokenCredential = new DefaultAzureCredential();
const metricsQueryClient = new MetricsQueryClient(tokenCredential);
if (!metricsResourceId) {
throw new Error(
"METRICS_RESOURCE_ID for an Azure Metrics Advisor subscription must be set in the environment for this sample"
);
}
console.log(`Picking an example metric to query: MatchedEventCount`);
const metricsResponse = await metricsQueryClient.queryResource(
metricsResourceId,
["MatchedEventCount"],
{
timespan: {
duration: Durations.fiveMinutes,
},
granularity: "PT1M",
aggregations: ["Count"],
}
);
console.log(
`Query cost: ${metricsResponse.cost}, granularity: ${metricsResponse.granularity}, time span: ${metricsResponse.timespan}`
);
const metrics: Metric[] = metricsResponse.metrics;
for (const metric of metrics) {
console.log(metric.name);
for (const timeseriesElement of metric.timeseries) {
for (const metricValue of timeseriesElement.data!) {
if (metricValue.count !== 0) {
console.log(`There are ${metricValue.count} matched events at ${metricValue.timeStamp}`);
}
}
}
}
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
process.exit(1);
});
Een volledig voorbeeld vindt u hier.
Metrische gegevens voor meerdere resources opvragen
Gebruik de MetricsQueryClient.queryResources
methode om metrische gegevens op te vragen voor meerdere Azure-resources in één aanvraag. Deze methode:
- Roept een andere API aan dan de
MetricsQueryClient
methoden. - Vereist een regionaal eindpunt bij het maken van de client. Bijvoorbeeld "https://westus3.metrics.monitor.azure.com".
Elke Azure-resource moet zich bevinden in:
- Dezelfde regio als het eindpunt dat is opgegeven bij het maken van de client.
- Hetzelfde Azure-abonnement.
Bovendien moet de metrische naamruimte met de metrische gegevens worden opgegeven die moeten worden opgevraagd. Zie Ondersteunde metrische gegevens en logboekcategorieën per resourcetype voor een lijst met metrische naamruimten.
let resourceIds: string[] = [
"/subscriptions/0000000-0000-000-0000-000000/resourceGroups/test/providers/Microsoft.OperationalInsights/workspaces/test-logs",
"/subscriptions/0000000-0000-000-0000-000000/resourceGroups/test/providers/Microsoft.OperationalInsights/workspaces/test-logs2",
];
let metricsNamespace: string = "<YOUR_METRICS_NAMESPACE>";
let metricNames: string[] = ["requests", "count"];
const batchEndPoint: string = "<YOUR_METRICS_ENDPOINT>"; //for example, https://eastus.metrics.monitor.azure.com/
const credential = new DefaultAzureCredential();
const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(
batchEndPoint,
credential
);
const result: : MetricsQueryResult[] = await metricsQueryClient.queryResources(
resourceIds,
metricsNamespace,
metricNames
);
Zie Ondersteunde metrische gegevens met Azure Monitor voor een inventarisatie van metrische gegevens en dimensies die beschikbaar zijn voor elk Azure-resourcetype.
Problemen oplossen
Raadpleeg de handleiding voor probleemoplossing om verschillende foutscenario's te diagnosticeren.
Volgende stappen
Zie de documentatie voor de Azure Monitor-service voor meer informatie over Azure Monitor.
Bijdragen
Als u een bijdrage wilt leveren aan deze bibliotheek, leest u de handleiding voor bijdragen voor meer informatie over het bouwen en testen van de code.
De tests van deze module zijn een combinatie van live- en eenheidstests, waarvoor u een Azure Monitor-exemplaar moet hebben. Als u de tests wilt uitvoeren, moet u het volgende uitvoeren:
rush update
rush build -t @azure/monitor-query
cd into sdk/monitor/monitor-query
- Kopieer het
sample.env
bestand naar.env
- Open het
.env
bestand in een editor en vul de waarden in. npm run test
.
Bekijk onze map tests voor meer informatie.
Verwante projecten
Azure SDK for JavaScript
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor