JavaScript 用 Azure Monitor クエリ クライアント ライブラリ - バージョン 1.3.1
Azure Monitor クエリ クライアント ライブラリは、Azure Monitorの 2 つのデータ プラットフォーム
-
ログ - 監視対象のリソースからログとパフォーマンス データを収集および整理します。 Azure サービスからのプラットフォーム ログ、仮想マシン エージェントからのログとパフォーマンス データ、アプリの使用状況とパフォーマンス データなど、さまざまなソースからのデータを、Azure Log Analytics ワークスペース1 つの
に統合できます。 Kusto クエリ言語を使用して、さまざまなデータ型を一緒に分析できます。 - メトリック - 監視対象のリソースから時系列データベースに数値データを収集します。 メトリックは、一定の間隔で収集され、特定の時間におけるシステムの一部の側面を記述する数値です。 メトリックは軽量で、ほぼリアルタイムのシナリオをサポートできるため、アラートや問題の迅速な検出に役立ちます。
リソース:
- ソース コード の
- パッケージ (npm)
- API リファレンス ドキュメントの
- サービスのドキュメント
- サンプル
- ログ の変更
はじめ
サポートされている環境
- Node.js の LTS バージョンを
する - Safari、Chrome、Microsoft Edge、Firefox の最新バージョン
詳細については、サポート ポリシーのを参照してください。
前提 条件
- Azure サブスクリプション
- Azure ID ライブラリの資格情報の種類など、TokenCredential 実装。
- ログのクエリを実行するには、次のいずれかが必要です。
- Azure Log Analytics ワークスペース
- 任意の種類の Azure リソース (ストレージ アカウント、Key Vault、Cosmos DB など)
- メトリックのクエリを実行するには、任意の種類の Azure リソース (ストレージ アカウント、Key Vault、Cosmos DB など) が必要です。
パッケージをインストールする
npm を使用して JavaScript 用 Azure Monitor Query クライアント ライブラリをインストールします。
npm install --save @azure/monitor-query
クライアントを作成する
ログまたはメトリックのクエリを実行するには、認証されたクライアントが必要です。 認証するために、次の例では、@azure/ID パッケージ DefaultAzureCredential を使用します。
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);
Azure ソブリン クラウド用にクライアントを構成する
既定では、ライブラリのクライアントは Azure パブリック クラウドを使用するように構成されます。 代わりにソブリン クラウドを使用するには、クライアントをインスタンス化するときに正しいエンドポイントと対象ユーザーの値を指定します。 例えば:
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",
});
注: 現時点では、MetricsQueryClient
はメトリックのクエリに Azure Resource Manager (ARM) エンドポイントを使用しています。 このクライアントを使用する場合は、クラウドに対応する管理エンドポイントが必要です。 この詳細は、今後変更される可能性があります。
クエリを実行する
ログクエリとメトリッククエリの例については、「の例」セクションを参照してください。
主な概念
クエリ レートの制限と調整をログに記録します
Log Analytics サービスは、要求レートが高すぎると調整を適用します。 返される行の最大数などの制限は、Kusto クエリにも適用されます。 詳細については、「クエリ API」を参照してください。
メトリック データ構造
メトリック値の各セットは、次の特性を持つ時系列です。
- 値が収集された時刻
- 値に関連付けられているリソース
- メトリックのカテゴリのように機能する名前空間
- メトリック名
- 値自体
- 多次元メトリックで説明されているように、一部のメトリックには複数のディメンションがあります。 カスタム メトリックには、最大 10 個のディメンションを含めることができます。
例
- ログ クエリ
- バッチ ログクエリ の
- ログのバッチ クエリ応答 を処理する
-
高度なログクエリシナリオ
- ログクエリタイムアウト を設定する
- 複数のワークスペース のクエリを実行する
- 統計 を含める
- 視覚化 を含める
-
メトリック クエリの
- メトリック クエリ応答 を処理する
- 応答 の処理例
- 複数のリソースのクエリ メトリック
ログ クエリ
LogsQueryClient
を使用すると、Kusto クエリ言語を使用して Log Analytics ワークスペースのクエリを実行できます。
timespan.duration
は、ISO 8601 期間形式の文字列として指定できます。 一般的に使用される ISO 8601 期間に提供される Durations
定数を使用できます。
Log Analytics ワークスペース ID または Azure リソース ID でログを照会できます。 結果は、行のコレクションを含むテーブルとして返されます。
ワークスペース中心のログ クエリ
ワークスペース ID でクエリを実行するには、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));
リソース中心のログ クエリ
次の例では、Azure リソースから直接ログにクエリを実行する方法を示します。 ここでは、queryResource
メソッドが使用され、Azure リソース ID が渡されます。 たとえば、/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}
します。
リソース ID を検索するには:
- Azure portal でリソースのページに移動します。
- の [概要] ブレードで、[JSON ビュー] リンクを選択します。
- 結果の JSON で、
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);
});
ログのクエリ応答を処理する
LogsQueryClient
の queryWorkspace
関数は、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
たとえば、テーブルで応答を処理するには、次のようにします。
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);
}
}
}
完全なサンプルは、
バッチ ログ クエリ
次の例では、バッチ クエリ API を使用して複数のクエリを同時に送信する方法を示します。 クエリは、BatchQuery
オブジェクトの一覧として表すことができます。
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);
}
}
}
ログのバッチ クエリ応答を処理する
LogsQueryClient
の queryBatch
関数は、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")
たとえば、次のコードはバッチ ログクエリ応答を処理します。
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);
}
}
}
完全なサンプルは、
高度なログクエリシナリオ
ログクエリのタイムアウトを設定する
一部のログ クエリの実行には 3 分以上かかります。 既定のサーバー タイムアウトは 3 分です。 サーバーのタイムアウトを最大 10 分まで増やすことができます。 次の例では、LogsQueryOptions
オブジェクトの serverTimeoutInSeconds
プロパティを使用して、サーバーのタイムアウトを 10 分に増やしています。
// 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;
複数のワークスペースに対してクエリを実行する
同じログ クエリを複数の Log Analytics ワークスペースで実行できます。 Kusto クエリに加えて、次のパラメーターが必要です。
-
workspaceId
- 最初の (プライマリ) ワークスペース ID。 -
additionalWorkspaces
-workspaceId
パラメーターで指定されたワークスペースを除くワークスペースの一覧。 パラメーターのリスト アイテムは、次の識別子形式で構成できます。- 修飾されたワークスペース名
- ワークスペース ID
- Azure リソース ID
たとえば、次のクエリは 3 つのワークスペースで実行されます。
const queryLogsOptions: LogsQueryOptions = {
additionalWorkspaces: ["<workspace2>", "<workspace3>"],
};
const kustoQuery = "AppEvents | limit 10";
const result = await logsQueryClient.queryWorkspace(
azureLogAnalyticsWorkspaceId,
kustoQuery,
{ duration: Durations.twentyFourHours },
queryLogsOptions,
);
各ワークスペースの結果を表示するには、TenantId
列を使用して結果を並べ替えるか、Kusto クエリでフィルター処理します。
TenantId で結果を並べ替
AppEvents | order by TenantId
TenantId で結果をフィルター処理する
AppEvents | filter TenantId == "<workspace2>"
完全なサンプルは、
統計情報を含める
CPU やメモリ消費量などのクエリ実行統計をログに取得するには:
-
LogsQueryOptions.includeQueryStatistics
プロパティをtrue
に設定します。 -
LogsQueryResult
オブジェクト内のstatistics
フィールドにアクセスします。
次の例では、クエリの実行時間を出力します。
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
}`,
);
statistics
ペイロードの構造はクエリによって異なるため、Record<string, unknown>
戻り値の型が使用されます。 未加工の JSON 応答が含まれています。 統計情報は、JSON の query
プロパティ内にあります。 例えば:
{
"query": {
"executionTime": 0.0156478,
"resourceUsage": {...},
"inputDatasetStatistics": {...},
"datasetStatistics": [{...}]
}
}
視覚化を含める
render 演算子を使用してログ クエリの視覚化データを取得するには:
-
LogsQueryOptions.includeVisualization
プロパティをtrue
に設定します。 -
LogsQueryResult
オブジェクト内のvisualization
フィールドにアクセスします。
例えば:
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 は、メトリックが照会されるリソースの URI である必要があります。 これは通常、/subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>
形式です。
リソース URI を検索するには:
- Azure portal でリソースのページに移動します。
- の [概要] ブレードで、[JSON ビュー] リンクを選択します。
- 結果の JSON で、
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);
});
前のサンプルでは、metricsResponse
のメトリック結果は、queryResource
関数の metricNames
配列引数でメトリック名を指定する順序に従って並べ替えます。 ユーザーが [firstMetricName, secondMetricName]
を指定した場合、firstMetricName
の結果は、metricResponse
の secondMetricName
の結果の前に表示されます。
メトリック クエリの応答を処理する
メトリック 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 { 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);
});
完全なサンプルは、
複数のリソースのメトリックのクエリを実行する
1 つの要求で複数の Azure リソースのメトリックを照会するには、MetricsClient.queryResources
メソッドを使用します。 このメソッドは次のとおりです。
-
MetricsClient
メソッドとは異なる API を呼び出します。 - クライアントの作成時にリージョン エンドポイントが必要です。 たとえば、"https://westus3.metrics.monitor.azure.com"。
各 Azure リソースは次の場所に存在する必要があります。
- クライアントの作成時に指定されたエンドポイントと同じリージョン。
- 同じ Azure サブスクリプション。
その上:
- ユーザーは、Azure サブスクリプション レベルで監視データを読み取る権限を持っている必要があります。 たとえば、監視閲覧者ロールは、照会するサブスクリプションに。
- クエリを実行するメトリックを含むメトリック名前空間を指定する必要があります。 メトリック名前空間の一覧については、「リソースの種類別にサポートされているメトリックとログ カテゴリ」を参照してください。
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
);
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
.
詳細については、フォルダー
関連プロジェクト
- Microsoft Azure SDK for JavaScript の
- Azure Monitor の
Azure SDK for JavaScript