Klientská knihovna Azure Monitor Query pro JavaScript – verze 1.3.1
Klientská knihovna Azure Monitor Query se používá ke spouštění dotazů jen pro čtení na azure Monitorudvou datových platforem:
- protokoly – shromažďuje a uspořádá protokoly a údaje o výkonu z monitorovaných prostředků. Data z různých zdrojů, jako jsou protokoly platformy ze služeb Azure, data protokolů a výkonu z agentů virtuálních počítačů a data o využití a výkonu z aplikací, je možné konsolidovat do jednoho pracovního prostoru služby Azure Log Analytics. Různé datové typy lze analyzovat společně pomocí dotazovacího jazyka Kusto.
- Metriky – shromažďuje číselná data z monitorovaných prostředků do databáze časových řad. Metriky jsou číselné hodnoty, které se shromažďují v pravidelných intervalech a popisují určité aspekty systému v určitém okamžiku. Metriky jsou jednoduché a schopné podporovat scénáře téměř v reálném čase, což je užitečné pro upozorňování a rychlé zjišťování problémů.
prostředky :
- zdrojového kódu
- balíčku
(npm) - Referenční dokumentace k rozhraní API
- Dokumentace ke službě Service
- ukázky
- protokolu změn
Začínáme
Podporovaná prostředí
- LTS verze Node.js
- Nejnovější verze Safari, Chrome, Microsoft Edge a Firefox
Další informace najdete v našich zásad podpory.
Požadavky
- Předplatné Azure
- Implementace TokenCredential, jako je typ přihlašovacích údajů knihovny identit Azure.
- K dotazování protokolů potřebujete jednu z následujících věcí:
- K dotazování metrik potřebujete prostředek Azure libovolného typu (účet úložiště, trezor klíčů, Cosmos DB atd.).
Instalace balíčku
Nainstalujte klientskou knihovnu Azure Monitor Query pro JavaScript pomocí npm:
npm install --save @azure/monitor-query
Vytvoření klienta
K dotazování protokolů nebo metrik se vyžaduje ověřený klient. Následující příklad používá defaultAzureCredential z balíčku @azure/identity.
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);
Konfigurace klienta pro suverénní cloud Azure
Ve výchozím nastavení jsou klienti knihovny nakonfigurovaní tak, aby používali veřejný cloud Azure. Pokud chcete místo toho použít suverénní cloud, při vytváření instance klienta zadejte správnou hodnotu koncového bodu a cílové skupiny. Například:
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",
});
poznámka: V současné době MetricsQueryClient
používá ke dotazování metrik koncový bod Azure Resource Manageru (ARM). Při použití tohoto klienta potřebujete odpovídající koncový bod správy pro váš cloud. Tyto podrobnosti se můžou v budoucnu změnit.
Provedení dotazu
Příklady dotazů na protokoly a metriky najdete v části Příklady.
Klíčové koncepty
Protokoluje limity rychlosti dotazů a omezování.
Služba Log Analytics používá omezování, pokud je frekvence požadavků příliš vysoká. Omezení, jako je například maximální počet vrácených řádků, se také použijí na dotazy Kusto. Další informace najdete v tématu rozhraní API pro dotazy.
Datová struktura metrik
Každá sada hodnot metriky je časová řada s následujícími charakteristikami:
- Čas, kdy byla hodnota shromážděna
- Prostředek přidružený k hodnotě
- Obor názvů, který funguje jako kategorie pro metriku
- Název metriky
- Samotná hodnota
- Některé metriky mají více dimenzí, jak je popsáno v multidimenzionálních metrikách. Vlastní metriky můžou mít až 10 dimenzí.
Příklady
- dotaz protokolů
- dotaz
protokolů orientovaných na pracovní prostor - dotaz
protokolů orientovaných na prostředky - zpracování odpovědí dotazu na protokoly
- dotaz
- dotaz
protokolů služby Batch - scénáře dotazů rozšířených protokolů
- dotaz Metriky
Dotaz na protokoly
LogsQueryClient
lze použít k dotazování pracovního prostoru služby Log Analytics pomocí dotazovacího jazyka Kusto.
timespan.duration
lze zadat jako řetězec ve formátu doby trvání ISO 8601. Můžete použít Durations
konstanty poskytované pro některé běžně používané doby trvání ISO 8601.
Protokoly můžete dotazovat podle ID pracovního prostoru služby Log Analytics nebo ID prostředku Azure. Výsledek se vrátí jako tabulka s kolekcí řádků.
Dotaz na protokoly zaměřené na pracovní prostor
K dotazování podle ID pracovního prostoru použijte metodu LogsQueryClient.queryWorkspace
:
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));
Dotaz na protokoly zaměřené na prostředky
Následující příklad ukazuje, jak dotazovat protokoly přímo z prostředku Azure. Tady se použije queryResource
metoda a předá se ID prostředku Azure. Například /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}
.
Vyhledání ID prostředku:
- Na webu Azure Portal přejděte na stránku vašeho prostředku.
- V okně Přehled vyberte odkaz zobrazení JSON.
- Ve výsledném formátu JSON zkopírujte hodnotu vlastnosti
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);
});
Zpracování odpovědi dotazu na protokoly
Funkce queryWorkspace
LogsQueryClient
vrátí objekt LogsQueryResult
. Typ objektu může být LogsQuerySuccessfulResult
nebo LogsQueryPartialResult
. Tady je hierarchie odpovědi:
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
Pokud například chcete zpracovat odpověď s tabulkami:
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);
}
}
}
Úplnou ukázku najdete zde.
Dotaz na protokoly služby Batch
Následující příklad ukazuje odesílání více dotazů najednou pomocí rozhraní API dávkového dotazu. Dotazy lze reprezentovat jako seznam BatchQuery
objektů.
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);
}
}
}
Zpracování odpovědi dávkového dotazu protokolů
Funkce queryBatch
LogsQueryClient
vrátí objekt LogsQueryBatchResult
.
LogsQueryBatchResult
obsahuje seznam objektů s následujícími možnými typy:
LogsQueryPartialResult
LogsQuerySuccessfulResult
LogsQueryError
Tady je hierarchie odpovědi:
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")
Například následující kód zpracovává odpověď dotazu na dávkové protokoly:
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);
}
}
}
Úplnou ukázku najdete zde.
Scénáře dotazů upřesňujících protokolů
Nastavení časového limitu dotazu protokolů
Spuštění některých dotazů protokolů trvá déle než 3 minuty. Výchozí časový limit serveru je 3 minuty. Časový limit serveru můžete zvýšit na maximálně 10 minut. V následujícím příkladu se vlastnost serverTimeoutInSeconds
objektu LogsQueryOptions
používá ke zvýšení časového limitu serveru na 10 minut:
// 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;
Dotazování na více pracovních prostorů
Stejný dotaz na protokoly je možné spustit napříč několika pracovními prostory služby Log Analytics. Kromě dotazu Kusto jsou vyžadovány následující parametry:
-
workspaceId
– první (primární) ID pracovního prostoru. -
additionalWorkspaces
– seznam pracovních prostorů s výjimkou pracovního prostoru uvedeného v parametruworkspaceId
. Položky seznamu parametrů se můžou skládat z následujících formátů identifikátorů:- Kvalifikované názvy pracovních prostorů
- ID pracovního prostoru
- ID prostředků Azure
Například následující dotaz se spustí ve třech pracovních prostorech:
const queryLogsOptions: LogsQueryOptions = {
additionalWorkspaces: ["<workspace2>", "<workspace3>"],
};
const kustoQuery = "AppEvents | limit 10";
const result = await logsQueryClient.queryWorkspace(
azureLogAnalyticsWorkspaceId,
kustoQuery,
{ duration: Durations.twentyFourHours },
queryLogsOptions,
);
Pokud chcete zobrazit výsledky pro každý pracovní prostor, použijte sloupec TenantId
k seřazení výsledků nebo jejich filtrování v dotazu Kusto.
výsledky objednávky podle id tenanta
AppEvents | order by TenantId
filtrovat výsledky podle id tenanta
AppEvents | filter TenantId == "<workspace2>"
Úplnou ukázku najdete zde.
Zahrnout statistiky
Pokud chcete získat statistiky spouštění dotazů protokolů, jako je využití procesoru a paměti:
- Nastavte vlastnost
LogsQueryOptions.includeQueryStatistics
natrue
. - Přístup k poli
statistics
uvnitř objektuLogsQueryResult
.
Následující příklad vytiskne dobu provádění dotazu:
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
}`,
);
Vzhledem k tomu, že struktura datové části statistics
se liší podle dotazu, použije se návratový typ Record<string, unknown>
. Obsahuje nezpracovanou odpověď JSON. Statistiky se nacházejí v query
vlastnosti JSON. Například:
{
"query": {
"executionTime": 0.0156478,
"resourceUsage": {...},
"inputDatasetStatistics": {...},
"datasetStatistics": [{...}]
}
}
Zahrnout vizualizaci
Získání dat vizualizace pro dotazy na protokoly pomocí operátoru vykreslování :
- Nastavte vlastnost
LogsQueryOptions.includeVisualization
natrue
. - Přístup k poli
visualization
uvnitř objektuLogsQueryResult
.
Například:
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);
Vzhledem k tomu, že struktura datové části visualization
se liší podle dotazu, použije se návratový typ Record<string, unknown>
. Obsahuje nezpracovanou odpověď JSON. Například:
{
"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
}
Dotaz metrik
Následující příklad získá metriky pro předplatné Azure Metrics Advisoru.
Identifikátor URI prostředku musí být prostředek, pro který se dotazují metriky. Obvykle je to formát /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>
.
Vyhledání identifikátoru URI prostředku:
- Na webu Azure Portal přejděte na stránku vašeho prostředku.
- V okně Přehled vyberte odkaz zobrazení JSON.
- Ve výsledném formátu JSON zkopírujte hodnotu vlastnosti
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);
});
V předchozím vzorku jsou metricsResponse
výsledky metriky seřazené podle pořadí, ve kterém uživatel určuje názvy metrik v argumentu pole metricNames
pro funkci queryResource
. Pokud uživatel zadá [firstMetricName, secondMetricName]
, zobrazí se výsledek firstMetricName
před výsledkem pro secondMetricName
v metricResponse
.
Zpracování odpovědi dotazu na metriky
Funkce queryResource
metrik vrátí objekt QueryMetricsResult
. Objekt QueryMetricsResult
obsahuje vlastnosti, jako je seznam objektů typu Metric
, interval
, namespace
a timespan
. K seznamu objektů Metric
lze přistupovat pomocí vlastnosti metrics
. Každý Metric
objekt v tomto seznamu obsahuje seznam TimeSeriesElement
objektů. Každý TimeSeriesElement
obsahuje vlastnosti data
a metadataValues
. Ve vizuální podobě se hierarchie objektů odpovědi podobá následující struktuře:
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)
Příklad zpracování odpovědi
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);
});
Úplnou ukázku najdete zde.
Dotazování metrik pro více prostředků
Pokud chcete dotazovat metriky pro více prostředků Azure v jednom požadavku, použijte metodu MetricsClient.queryResources
. Tato metoda:
- Volá jiné rozhraní API než metody
MetricsClient
. - Při vytváření klienta vyžaduje regionální koncový bod. Například "https://westus3.metrics.monitor.azure.com".
Každý prostředek Azure se musí nacházet:
- Stejná oblast jako koncový bod zadaný při vytváření klienta.
- Stejné předplatné Azure.
Mimoto:
- Uživatel musí mít oprávnění ke čtení dat monitorování na úrovni předplatného Azure. Například role čtenáře monitorování předplatného, na které se má dotazovat.
- Je nutné zadat obor názvů metrik obsahující metriky, které se mají dotazovat. Seznam oborů názvů metrik najdete v tématu Podporované metriky a kategorie protokolů podle typu prostředku.
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
);
Informace o inventáři metrik a dimenzí dostupných pro jednotlivé typy prostředků Azure najdete v tématu Podporované metriky ve službě Azure Monitor.
Řešení problémů
Informace o diagnostice různých scénářů selhání najdete v průvodci odstraňováním potíží .
Další kroky
Další informace o službě Azure Monitor najdete v dokumentaci ke službě Azure Monitor.
Přispívající
Pokud chcete přispívat do této knihovny, přečtěte si průvodce přispívání a přečtěte si další informace o vytváření a testování kódu.
Testy tohoto modulu jsou kombinací živých testů a testů jednotek, které vyžadují, abyste měli instanci služby Azure Monitor. Pokud chcete testy spustit, budete muset spustit:
rush update
rush build -t @azure/monitor-query
cd into sdk/monitor/monitor-query
- Zkopírujte soubor
sample.env
do.env
- Otevřete soubor
.env
v editoru a vyplňte hodnoty. -
npm run test
.
Další podrobnosti najdete v naší složce testy.
Související projekty
Azure SDK for JavaScript