Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Клиентская библиотека запросов Azure Monitor используется для выполнения запросов только для чтения к двум платформам данных Azure Monitor:
- Журналы — собирает и систематизирует данные журналов и производительности из отслеживаемых ресурсов. Данные из разных источников, такие как журналы платформы из служб Azure, данные журналов и производительности от агентов виртуальных машин, а также данные об использовании и производительности из приложений, можно объединить в одну рабочую область Azure Log Analytics. Различные типы данных могут быть проанализированы вместе с помощью языка запросов Kusto.
- Метрики — собирает числовые данные из отслеживаемых ресурсов в базу данных временных рядов. Метрики — это числовые значения, собираемые с регулярными интервалами и описывающие некоторые аспекты системы в определенное время. Метрики являются упрощенными и способными поддерживать сценарии почти в режиме реального времени, что делает их полезными для оповещения и быстрого обнаружения проблем.
Ресурсы:
- исходный код.
- Пакет (npm)
- Справочная документация по API
- Сервисная документация
- Образцы
- журнал изменений
Начало работы
Поддерживаемые среды
- Версии Node.js LTS
- Последние версии Safari, Chrome, Microsoft Edge и Firefox
Дополнительные сведения см. вполитики поддержки
Необходимые условия
- Подписка Azure
- Реализация TokenCredential, например, такой тип учетных данных, как в библиотеке удостоверений Azure .
- Чтобы запросить журналы, необходимо выполнить одно из следующих действий.
- Рабочая область Azure Log Analytics
- Ресурс Azure любого типа (учетная запись хранения, Key Vault, Cosmos DB и т. д.)
- Для запроса метрик требуется ресурс Azure любого типа (учетная запись хранения, Key Vault, Cosmos DB и т. д.).
Установка пакета
Установите клиентскую библиотеку запросов Azure Monitor для JavaScript с помощью npm:
npm install --save @azure/monitor-query
Создание клиента
Для запроса журналов или метрик требуется клиент, прошедший проверку подлинности. Для проверки подлинности в следующем примере используется DefaultAzureCredential из пакета @azure/identity .
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, MetricsQueryClient, MetricsClient } from "@azure/monitor-query";
const credential = new DefaultAzureCredential();
// Create a LogsQueryClient
const logsQueryClient = new LogsQueryClient(credential);
// Create a MetricsQueryClient
const metricsQueryClient = new MetricsQueryClient(credential);
// Create a MetricsClient
const endpoint = " https://<endpoint>.monitor.azure.com/";
const metricsClient = new MetricsClient(endpoint, credential);
Настройка клиента для суверенного облака Azure
По умолчанию клиенты библиотеки настроены на использование общедоступного облака Azure. Чтобы использовать суверенное облако, укажите правильное значение конечной точки и аудитории при создании экземпляра клиента. Например:
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, MetricsQueryClient, MetricsClient } from "@azure/monitor-query";
const credential = new DefaultAzureCredential();
// Create a LogsQueryClient
const logsQueryClient: LogsQueryClient = new LogsQueryClient(credential, {
endpoint: "https://api.loganalytics.azure.cn/v1",
audience: "https://api.loganalytics.azure.cn/.default",
});
// Create a MetricsQueryClient
const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(credential, {
endpoint: "https://management.chinacloudapi.cn",
audience: "https://monitor.azure.cn/.default",
});
// Create a MetricsClient
const endpoint = " https://<endpoint>.monitor.azure.cn/";
const metricsClient = new MetricsClient(endpoint, credential, {
audience: "https://monitor.azure.cn/.default",
});
Примечание: В настоящее время MetricsQueryClient
для запроса метрик используется конечная точка Azure Resource Manager (ARM). При использовании этого клиента требуется соответствующая конечная точка управления для облака. Эти сведения могут быть изменены в будущем.
Выполнение запроса
Примеры запросов журналов и метрик см. в разделе Примеры .
Основные понятия
Ограничения частоты запросов журналов и регулирование
Служба Log Analytics применяет регулирование, если скорость запроса слишком высока. Ограничения, такие как максимальное количество возвращаемых строк, также применяются к запросам Kusto. Дополнительные сведения см. в разделе API запросов.
Структура данных метрик
Каждый набор значений метрик — это временный ряд со следующими характеристиками:
- Время сбора значения
- Ресурс, связанный со значением
- Пространство имен, которое действует как категория для метрики
- Имя метрики
- Само значение
- Некоторые метрики имеют несколько измерений, как описано в многомерных метриках. Пользовательские метрики могут содержать до 10 измерений.
Примеры
Запрос журналов
Его LogsQueryClient
можно использовать для запроса рабочей области Log Analytics с помощью языка запросов Kusto. Может timespan.duration
быть указан в виде строки в формате длительности ISO 8601. Вы можете использовать константы, Durations
предоставленные для некоторых часто используемых длительностей ISO 8601.
Журналы можно запрашивать по идентификатору рабочей области Log Analytics или идентификатору ресурса Azure. Результат возвращается в виде таблицы с коллекцией строк.
Запрос журналов, ориентированных на рабочую область
Чтобы выполнить запрос по идентификатору рабочей области, используйте LogsQueryClient.queryWorkspace
метод:
import { LogsQueryClient, Durations, LogsQueryResultStatus } from "@azure/monitor-query";
import { DefaultAzureCredential } from "@azure/identity";
const azureLogAnalyticsWorkspaceId = "<workspace_id>";
const logsQueryClient = new LogsQueryClient(new DefaultAzureCredential());
const kustoQuery = "AppEvents | limit 1";
const result = await logsQueryClient.queryWorkspace(azureLogAnalyticsWorkspaceId, kustoQuery, {
duration: Durations.twentyFourHours,
});
if (result.status === LogsQueryResultStatus.Success) {
const tablesFromResult = 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);
}
}
function processTables(tablesFromResult) {
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);
}
}
}
Запрос к журналам, ориентированным на ресурсы
В следующем примере показано, как запрашивать журналы непосредственно из ресурса Azure.
queryResource
Здесь используется метод и передается идентификатор ресурса Azure. Например: /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}
.
Чтобы найти идентификатор ресурса, выполните следующие действия.
- Перейдите на страницу ресурса на портале Azure.
- В колонке Обзор выберите ссылку Представление JSON .
- В полученном JSON скопируйте значение
id
свойства.
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, Durations, LogsQueryResultStatus } from "@azure/monitor-query";
const logsResourceId = "<the Resource Id for your logs resource>";
const tokenCredential = new DefaultAzureCredential();
const logsQueryClient = new LogsQueryClient(tokenCredential);
const kustoQuery = `MyTable_CL | summarize count()`;
console.log(`Running '${kustoQuery}' over the last One Hour`);
const queryLogsOptions = {
// 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 as any)?.statistics?.query?.executionTime;
console.log(
`Results for query '${kustoQuery}', execution time: ${executionTime == null ? "unknown" : executionTime}`,
);
if (result.status === LogsQueryResultStatus.Success) {
const tablesFromResult = 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);
}
}
function processTables(tablesFromResult) {
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);
}
}
}
Обработка ответа запроса журналов
Функция queryWorkspace
возвращает LogsQueryClient
LogsQueryResult
объект. Тип объекта может быть или LogsQuerySuccessfulResult
LogsQueryPartialResult
. Ниже приведена иерархия ответа:
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
Например, чтобы обрабатывать ответ с таблицами:
function processTables(tablesFromResult) {
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);
}
}
}
С полным образцом можно ознакомиться здесь.
Запрос к журналам пакетной службы
В следующем примере показано, как отправлять несколько запросов одновременно с помощью API пакетного запроса. Запросы могут быть представлены в виде списка BatchQuery
объектов.
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, LogsQueryResultStatus } from "@azure/monitor-query";
const monitorWorkspaceId = "<workspace_id>";
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++;
}
function processTables(tablesFromResult) {
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);
}
}
}
Обработка ответа пакетного запроса журналов
Функция queryBatch
возвращает LogsQueryClient
LogsQueryBatchResult
объект.
LogsQueryBatchResult
содержит список объектов со следующими возможными типами:
LogsQueryPartialResult
LogsQuerySuccessfulResult
LogsQueryError
Ниже приведена иерархия ответа:
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")
Например, следующий код обрабатывает ответ запроса пакетных журналов:
import { LogsQueryResultStatus } from "@azure/monitor-query";
async function processBatchResult(result, queriesBatch) {
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++;
}
}
function processTables(tablesFromResult) {
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);
}
}
}
С полным образцом можно ознакомиться здесь.
Расширенные сценарии запросов журналов
Установка времени ожидания запроса журналов
Выполнение некоторых запросов журналов занимает более 3 минут. Время ожидания сервера по умолчанию — 3 минуты. Время ожидания сервера можно увеличить до 10 минут. В следующем примере LogsQueryOptions
свойство объекта serverTimeoutInSeconds
используется для увеличения времени ожидания сервера до 10 минут:
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, Durations } from "@azure/monitor-query";
const azureLogAnalyticsWorkspaceId = "<workspace_id>";
const tokenCredential = new DefaultAzureCredential();
const logsQueryClient = new LogsQueryClient(tokenCredential);
const kqlQuery = "AppEvents | project TimeGenerated, Name, AppRoleInstance | limit 1";
// setting optional parameters
const queryLogsOptions = {
// 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,
kqlQuery,
{ duration: Durations.twentyFourHours },
queryLogsOptions,
);
const status = result.status;
Запрос нескольких рабочих областей
Один и тот же запрос журналов можно выполнять в нескольких рабочих областях Log Analytics. Помимо запроса Kusto, требуются следующие параметры:
-
workspaceId
- Первый (основной) идентификатор рабочей области. -
additionalWorkspaces
- Список рабочих областей, за исключением рабочей области, указанной в параметреworkspaceId
. Элементы списка параметров могут состоять из следующих форматов идентификаторов:- Квалифицированные имена рабочих областей
- Идентификаторы рабочих областей
- Идентификаторы ресурсов Azure
Например, следующий запрос выполняется в трех рабочих областях:
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, Durations } from "@azure/monitor-query";
const azureLogAnalyticsWorkspaceId = "<workspace_id>";
const tokenCredential = new DefaultAzureCredential();
const logsQueryClient = new LogsQueryClient(tokenCredential);
const kqlQuery = "AppEvents | project TimeGenerated, Name, AppRoleInstance | limit 1";
// setting optional parameters
const queryLogsOptions = {
additionalWorkspaces: ["<workspace2>", "<workspace3>"],
};
const result = await logsQueryClient.queryWorkspace(
azureLogAnalyticsWorkspaceId,
kqlQuery,
{ duration: Durations.twentyFourHours },
queryLogsOptions,
);
const status = result.status;
Чтобы просмотреть результаты для каждой рабочей области, используйте TenantId
столбец, чтобы упорядочить результаты или отфильтровать их в запросе Kusto.
Результаты заказа по TenantId
AppEvents | order by TenantId
Фильтрация результатов по TenantId
AppEvents | filter TenantId == "<workspace2>"
С полным образцом можно ознакомиться здесь.
Включение статистики
Чтобы получить статистику выполнения запросов журналов, например использование ЦП и памяти:
- Задайте для свойства
LogsQueryOptions.includeQueryStatistics
значениеtrue
. - Доступ к
statistics
полю внутриLogsQueryResult
объекта.
В следующем примере выводится время выполнения запроса:
import { LogsQueryClient, Durations } from "@azure/monitor-query";
import { DefaultAzureCredential } from "@azure/identity";
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 as any)?.statistics?.query?.executionTime;
console.log(
`Results for query '${kustoQuery}', execution time: ${executionTime == null ? "unknown" : executionTime}`,
);
Поскольку структура statistics
полезных данных зависит от запроса, Record<string, unknown>
используется тип возвращаемого значения. Он содержит необработанный ответ JSON. Статистика находится в свойстве query
JSON. Например:
{
"query": {
"executionTime": 0.0156478,
"resourceUsage": {...},
"inputDatasetStatistics": {...},
"datasetStatistics": [{...}]
}
}
Включение визуализации
Чтобы получить данные визуализации для запросов к логам с помощью оператора render, выполните следующие действия:
- Задайте для свойства
LogsQueryOptions.includeVisualization
значениеtrue
. - Доступ к
visualization
полю внутриLogsQueryResult
объекта.
Например:
import { LogsQueryClient, Durations } from "@azure/monitor-query";
import { DefaultAzureCredential } from "@azure/identity";
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);
Поскольку структура visualization
полезных данных зависит от запроса, Record<string, unknown>
используется тип возвращаемого значения. Он содержит необработанный ответ JSON. Например:
{
"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
}
Запрос метрик
В следующем примере приведены метрики для подписки Azure Metrics Advisor .
URI ресурса должен быть ресурсом, для которого запрашиваются метрики. Обычно это формат /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>
.
Чтобы найти URI ресурса, выполните следующие действия.
- Перейдите на страницу ресурса на портале Azure.
- В колонке Обзор выберите ссылку Представление JSON .
- В полученном JSON скопируйте значение
id
свойства.
import { DefaultAzureCredential } from "@azure/identity";
import { MetricsQueryClient, Durations } from "@azure/monitor-query";
const metricsResourceId = "<the Resource Id for your metrics resource>";
const tokenCredential = new DefaultAzureCredential();
const metricsQueryClient = new MetricsQueryClient(tokenCredential);
const metricNames = [];
const metricDefinitions = metricsQueryClient.listMetricDefinitions(metricsResourceId);
for await (const { id, name } of metricDefinitions) {
console.log(` metricDefinitions - ${id}, ${name}`);
if (name) {
metricNames.push(name);
}
}
const [firstMetricName, secondMetricName] = metricNames;
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 = 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}`);
}
В предыдущем примере результаты метрик упорядочены в metricsResponse
соответствии с порядком, в котором пользователь указывает имена метрик в аргументе массива metricNames
queryResource
для функции. Если пользователь укажет [firstMetricName, secondMetricName]
, то результат для firstMetricName
появится перед результатом для secondMetricName
в .metricResponse
Обработка ответа на запрос метрик
Функция metrics queryResource
возвращает QueryMetricsResult
объект. Объект QueryMetricsResult
содержит такие свойства, как список Metric
-типизированных объектов, interval
, namespace
, и timespan
. Доступ Metric
к списку объектов можно получить с помощью metrics
свойства. Каждый Metric
объект в этом списке содержит список TimeSeriesElement
объектов. Каждый из них TimeSeriesElement
содержит data
и metadataValues
свойства. В визуальной форме иерархия объектов ответа напоминает следующую структуру:
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)
Пример обработки ответа
import { DefaultAzureCredential } from "@azure/identity";
import { MetricsQueryClient, Durations } from "@azure/monitor-query";
const metricsResourceId = "<the Resource Id for your metrics resource>";
const tokenCredential = new DefaultAzureCredential();
const metricsQueryClient = new MetricsQueryClient(tokenCredential);
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 = 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}`);
}
}
}
}
С полным образцом можно ознакомиться здесь.
Метрики запросов для нескольких ресурсов
Чтобы запросить метрики для нескольких ресурсов Azure в одном запросе, используйте этот MetricsClient.queryResources
метод. Этот метод:
- Вызывает API, отличный от
MetricsClient
методов. - Требуется региональная конечная точка при создании клиента. Например, "https://westus3.metrics.monitor.azure.com".
Каждый ресурс Azure должен находиться в:
- Тот же регион, что и конечная точка, указанная при создании клиента.
- Та же подписка Azure.
Кроме того:
- Пользователь должен быть авторизован для чтения данных мониторинга на уровне подписки Azure. Например, роль читателя мониторинга в запрашиваемой подписке.
- Пространство имен метрик, содержащее метрики для запроса, должно быть предоставлено. Список пространств имен метрик см. в статье Поддерживаемые метрики и категории журналов по типу ресурса.
import { DefaultAzureCredential } from "@azure/identity";
import { MetricsClient } from "@azure/monitor-query";
const resourceIds = [
"/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",
];
const metricsNamespace = "<YOUR_METRICS_NAMESPACE>";
const metricNames = ["requests", "count"];
const endpoint = " https://<endpoint>.monitor.azure.com/";
const credential = new DefaultAzureCredential();
const metricsClient = new MetricsClient(endpoint, credential);
const result = await metricsClient.queryResources(resourceIds, metricNames, metricsNamespace);
Инвентаризацию метрик и измерений, доступных для каждого типа ресурсов Azure, см. в статье Поддерживаемые метрики с Azure Monitor.
Устранение неполадок
Чтобы диагностировать различные сценарии сбоев, см. руководство по устранению неполадок.
Дальнейшие действия
Дополнительные сведения об Azure Monitor см. в документации по службе Azure Monitor.
Способствует
Если вы хотите внести свой вклад в эту библиотеку, ознакомьтесь с руководством по вкладу, чтобы узнать больше о том, как создавать и тестировать код.
Тесты этого модуля — это смесь динамических и модульных тестов, которые требуют наличия экземпляра Azure Monitor. Чтобы выполнить тесты, необходимо выполнить следующее:
rush update
rush build -t @azure/monitor-query
cd into sdk/monitor/monitor-query
- Скопируйте файл в
sample.env
.env
-
.env
Откройте файл в редакторе и заполните значения. -
npm run test
.
Для получения более подробной информации просмотрите нашу папку с тестами .
Связанные проекты
Azure SDK for JavaScript