Azure Monitor Query-clientbibliotheek voor JavaScript - versie 1.3.1
De Azure Monitor Query-clientbibliotheek wordt gebruikt om alleen-lezenquery's uit te voeren op Azure Monitortwee gegevensplatforms:
- 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 tot éé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 tijdstip beschrijven. Metrische gegevens zijn lichtgewicht en kunnen bijna realtime scenario's ondersteunen, waardoor ze handig zijn voor waarschuwingen en snelle detectie van problemen.
resources:
Slag
Ondersteunde omgevingen
- LTS-versies van Node.js
- Nieuwste versies van Safari, Chrome, Microsoft Edge en Firefox
Zie ons ondersteuningsbeleidvoor meer informatie.
Voorwaarden
- Een Azure-abonnement
- Een TokenCredential--implementatie, zoals een referentietype Azure Identity-bibliotheek.
- Als u logboeken wilt opvragen, hebt u een van de volgende zaken nodig:
- Een Azure Log Analytics-werkruimte
- Een Azure-resource van elk type (Opslagaccount, Key Vault, Cosmos DB, enzovoort)
- Als u query's wilt uitvoeren op metrische gegevens, hebt u een Azure-resource van elk type nodig (Opslagaccount, Key Vault, Cosmos DB, enzovoort).
Het pakket installeren
Installeer de Azure Monitor Query-clientbibliotheek voor JavaScript met npm:
npm install --save @azure/monitor-query
De client maken
Een geverifieerde client is vereist voor het opvragen van logboeken of metrische gegevens. Voor verificatie gebruikt het volgende voorbeeld DefaultAzureCredential- uit het @azure/identity-pakket.
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
De clients van de bibliotheek zijn standaard geconfigureerd voor het gebruik van de openbare Azure-cloud. Als u in plaats daarvan een onafhankelijke cloud wilt gebruiken, geeft u het juiste eindpunt en de doelgroepwaarde op bij het instantiëren van een client. Bijvoorbeeld:
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, MetricsQueryClient, MetricsClient } from "@azure/monitor-query";
const credential = new DefaultAzureCredential();
const logsQueryClient: LogsQueryClient = new LogsQueryClient(credential, {
endpoint: "https://api.loganalytics.azure.cn/v1",
audience: "https://api.loganalytics.azure.cn/.default",
});
// or
const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(credential, {
endpoint: "https://management.chinacloudapi.cn",
audience: "https://monitor.azure.cn/.default",
});
// or
const endPoint: string = "<YOUR_METRICS_ENDPOINT>"; //for example, https://eastus.metrics.monitor.azure.com/
const metricsClient: MetricsClient = new MetricsClient(endPoint, credential, {
audience: "https://monitor.azure.cn/.default",
});
Opmerking: momenteel gebruikt MetricsQueryClient
het ARM-eindpunt (Azure Resource Manager) voor het opvragen van metrische gegevens. U hebt het bijbehorende beheereindpunt voor uw cloud nodig bij het gebruik van deze client. Deze details kunnen in de toekomst worden gewijzigd.
De query uitvoeren
Zie de sectie Voorbeelden voor voorbeelden van logboeken en metrische gegevens.
Sleutelbegrippen
Logboeken queryfrequentielimieten en bandbreedtebeperking
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-APIvoor 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
-
logboekenquery's
- query's voor werkruimtegerichte logboeken
- query's op resourcegerichte logboeken
- queryantwoorden van logboeken verwerken
- query's voor batchlogboeken
- geavanceerde queryscenario's voor logboeken
- query voor metrische gegevens
Logboekquery
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
constanten gebruiken die worden verstrekt voor een aantal veelgebruikte ISO 8601-duur.
U kunt query's uitvoeren op logboeken op log analytics-werkruimte-id of Azure-resource-id. Het resultaat wordt geretourneerd als een tabel met een verzameling rijen.
Query voor werkruimtegerichte 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}
.
De resource-id zoeken:
- Navigeer naar de pagina van uw resource in Azure Portal.
- Selecteer op de blade Overzicht de koppeling JSON-weergave.
- Kopieer in de resulterende JSON de waarde van de eigenschap
id
.
/**
* @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);
});
Logboekenqueryantwoord verwerken
De functie queryWorkspace
van LogsQueryClient
retourneert een LogsQueryResult
-object. Het objecttype kan worden LogsQuerySuccessfulResult
of LogsQueryPartialResult
. 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);
}
}
}
Batchqueryantwoorden verwerken in logboeken
De functie queryBatch
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")
Met de volgende code wordt bijvoorbeeld een queryantwoord voor batchlogboeken verwerkt:
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 .
Geavanceerde queryscenario's voor logboeken
Time-out voor logboekquery's instellen
Het uitvoeren van sommige logboekquery's duurt langer dan 3 minuten. De standaardtime-out voor de server is 3 minuten. U kunt de time-out van de server verhogen tot maximaal 10 minuten. In het volgende voorbeeld wordt de eigenschap serverTimeoutInSeconds
van het LogsQueryOptions
object gebruikt om de time-out van de server te verhogen naar 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 de parameterworkspaceId
. De lijstitems van de parameter kunnen bestaan uit de volgende id-indelingen:- Gekwalificeerde werkruimtenamen
- 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 kolom TenantId
om de resultaten te ordenen of te filteren in de Kusto-query.
resultaten order per TenantId-
AppEvents | order by TenantId
Resultaten filteren op TenantId-
AppEvents | filter TenantId == "<workspace2>"
Een volledig voorbeeld vindt u hier .
Statistieken opnemen
Ga als volgende te werk om statistieken over de uitvoering van logboeken op te halen, zoals CPU en geheugenverbruik:
- Stel de eigenschap
LogsQueryOptions.includeQueryStatistics
in optrue
. - Open het
statistics
veld in hetLogsQueryResult
-object.
In het volgende voorbeeld wordt de uitvoeringstijd van de query afgedrukt:
const monitorWorkspaceId = "<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 verschilt per query, wordt een Record<string, unknown>
retourtype gebruikt. Het bevat het onbewerkte JSON-antwoord. De statistieken vindt u in de eigenschap query
van de JSON. Bijvoorbeeld:
{
"query": {
"executionTime": 0.0156478,
"resourceUsage": {...},
"inputDatasetStatistics": {...},
"datasetStatistics": [{...}]
}
}
Visualisatie opnemen
Visualisatiegegevens ophalen voor logboekquery's met behulp van de renderoperator:
- Stel de eigenschap
LogsQueryOptions.includeVisualization
in optrue
. - Open het
visualization
veld in hetLogsQueryResult
-object.
Bijvoorbeeld:
const monitorWorkspaceId = "<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 verschilt per query, 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 dat 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 Azure Portal.
- Selecteer op de blade Overzicht de koppeling JSON-weergave.
- Kopieer in de resulterende JSON de waarde van de eigenschap
id
.
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
gerangschikt op basis van de volgorde waarin de gebruiker de metrische namen opgeeft in het metricNames
matrixargument voor de queryResource
functie. Als de gebruiker [firstMetricName, secondMetricName]
opgeeft, wordt het resultaat voor firstMetricName
weergegeven vóór het resultaat voor secondMetricName
in de metricResponse
.
Queryantwoord voor metrische gegevens verwerken
De metrische gegevens queryResource
functie retourneert een QueryMetricsResult
-object. Het object QueryMetricsResult
bevat eigenschappen zoals een lijst met Metric
-getypte objecten, interval
, namespace
en timespan
. De lijst met Metric
objecten kan worden geopend met behulp van de eigenschap metrics
. Elk Metric
-object in deze lijst bevat een lijst met TimeSeriesElement
objecten. Elke 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 .
Query's uitvoeren op metrische gegevens voor meerdere resources
Als u metrische gegevens voor meerdere Azure-resources in één aanvraag wilt opvragen, gebruikt u de methode MetricsClient.queryResources
. Deze methode:
- Roept een andere API aan dan de
MetricsClient
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:
- De gebruiker moet gemachtigd zijn om bewakingsgegevens te lezen op azure-abonnementsniveau. De rol van Bewakingslezer voor het abonnement waarop een query moet worden uitgevoerd.
- De metrische naamruimte met de metrische gegevens die moeten worden opgevraagd, moet worden opgegeven. Zie Ondersteunde metrische gegevens en logboekcategorieën per resourcetypevoor 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 endpoint: string = "<YOUR_METRICS_ENDPOINT>"; //for example, https://eastus.metrics.monitor.azure.com/
const credential = new DefaultAzureCredential();
const metricsClient: MetricsClient = new MetricsClient(
endpoint,
credential
);
const result: : MetricsQueryResult[] = await metricsClient.queryResources(
resourceIds,
metricNames,
metricsNamespace
);
Zie Ondersteunde metrische gegevens met Azure Monitorvoor een inventaris van metrische gegevens en dimensies die beschikbaar zijn voor elk Azure-resourcetype.
Probleemoplossing
Als u verschillende foutscenario's wilt vaststellen, raadpleegt u de gids voor probleemoplossing.
Volgende stappen
Zie de azure Monitor-servicedocumentatievoor meer informatie over Azure Monitor.
Bijdragen
Als u een bijdrage wilt leveren aan deze bibliotheek, leest u de gids 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 tests map voor meer informatie.
Verwante projecten
Azure SDK for JavaScript