Поделиться через


Клиентская библиотека запросов Azure Monitor для JavaScript — версия 1.3.2

Клиентская библиотека запросов Azure Monitor используется для выполнения запросов только для чтения к двум платформам данных Azure Monitor:

  • Журналы — собирает и систематизирует данные журналов и производительности из отслеживаемых ресурсов. Данные из разных источников, такие как журналы платформы из служб Azure, данные журналов и производительности от агентов виртуальных машин, а также данные об использовании и производительности из приложений, можно объединить в одну рабочую область Azure Log Analytics. Различные типы данных могут быть проанализированы вместе с помощью языка запросов Kusto.
  • Метрики — собирает числовые данные из отслеживаемых ресурсов в базу данных временных рядов. Метрики — это числовые значения, собираемые с регулярными интервалами и описывающие некоторые аспекты системы в определенное время. Метрики являются упрощенными и способными поддерживать сценарии почти в режиме реального времени, что делает их полезными для оповещения и быстрого обнаружения проблем.

Ресурсы:

Начало работы

Поддерживаемые среды

Дополнительные сведения см. вполитики поддержки .

Необходимые условия

  • Подписка Azure
  • Реализация TokenCredential, например, такой тип учетных данных, как в библиотеке удостоверений Azure .
  • Чтобы запросить журналы, необходимо выполнить одно из следующих действий.
  • Для запроса метрик требуется ресурс 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}.

Чтобы найти идентификатор ресурса, выполните следующие действия.

  1. Перейдите на страницу ресурса на портале Azure.
  2. В колонке Обзор выберите ссылку Представление JSON .
  3. В полученном 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 возвращает LogsQueryClientLogsQueryResult объект. Тип объекта может быть или LogsQuerySuccessfulResultLogsQueryPartialResult. Ниже приведена иерархия ответа:

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 возвращает LogsQueryClientLogsQueryBatchResult объект. 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>"

С полным образцом можно ознакомиться здесь.

Включение статистики

Чтобы получить статистику выполнения запросов журналов, например использование ЦП и памяти:

  1. Задайте для свойства LogsQueryOptions.includeQueryStatistics значение true.
  2. Доступ к 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, выполните следующие действия:

  1. Задайте для свойства LogsQueryOptions.includeVisualization значение true.
  2. Доступ к 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 ресурса, выполните следующие действия.

  1. Перейдите на страницу ресурса на портале Azure.
  2. В колонке Обзор выберите ссылку Представление JSON .
  3. В полученном 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 соответствии с порядком, в котором пользователь указывает имена метрик в аргументе массива metricNamesqueryResource для функции. Если пользователь укажет [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.

Кроме того:

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. Чтобы выполнить тесты, необходимо выполнить следующее:

  1. rush update
  2. rush build -t @azure/monitor-query
  3. cd into sdk/monitor/monitor-query
  4. Скопируйте файл в sample.env.env
  5. .env Откройте файл в редакторе и заполните значения.
  6. npm run test.

Для получения более подробной информации просмотрите нашу папку с тестами .