Pustaka klien Azure Monitor Query untuk JavaScript - versi 1.3.1
Pustaka klien Azure Monitor Query digunakan untuk menjalankan kueri baca-saja terhadap dua platform data Azure Monitor:
- Log - Mengumpulkan dan mengatur data log dan performa dari sumber daya yang dipantau. Data dari sumber yang berbeda seperti log platform dari layanan Azure, data log dan performa dari agen komputer virtual, dan data penggunaan dan performa dari aplikasi dapat dikonsolidasikan ke dalam satu ruang kerja Azure Log Analytics. Berbagai jenis data dapat dianalisis bersama-sama menggunakan Bahasa Kueri Kusto.
- Metrik - Mengumpulkan data numerik dari sumber daya yang dipantau ke dalam database rangkaian waktu. Metrik adalah nilai numerik yang dikumpulkan secara berkala dan menggambarkan beberapa aspek sistem pada waktu tertentu. Metrik ringan dan mampu mendukung skenario mendekati real-time, membuatnya berguna untuk memperingatkan dan mendeteksi masalah dengan cepat.
Sumber Daya :
- Kode sumber
- Paket
(npm) - dokumentasi referensi API
- dokumentasi Layanan
- Sampel
- Mengubah log
Persiapan
Lingkungan yang didukung
- versi LTS Node.js
- Versi terbaru Safari, Chrome, Microsoft Edge, dan Firefox
Untuk informasi selengkapnya, lihat kebijakan dukungan kami.
Prasyarat
- langganan Azure
- Implementasi TokenCredential
, seperti jenis kredensial pustaka Azure Identity . - Untuk mengkueri Log, Anda memerlukan salah satu hal berikut:
- Untuk mengkueri Metrik, Anda memerlukan sumber daya Azure dalam bentuk apa pun (Akun Penyimpanan, Key Vault, Cosmos DB, dll.).
Menginstal paket
Instal pustaka klien Azure Monitor Query untuk JavaScript dengan npm:
npm install --save @azure/monitor-query
Membuat klien
Klien terautentikasi diperlukan untuk mengkueri Log atau Metrik. Untuk mengautentikasi, contoh berikut menggunakan
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);
Mengonfigurasi klien untuk azure sovereign cloud
Secara default, klien pustaka dikonfigurasi untuk menggunakan Azure Public Cloud. Untuk menggunakan sovereign cloud, berikan nilai titik akhir dan audiens yang benar saat membuat instans klien. Misalnya:
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",
});
Catatan: Saat ini, MetricsQueryClient
menggunakan titik akhir Azure Resource Manager (ARM) untuk mengkueri metrik. Anda memerlukan titik akhir manajemen yang sesuai untuk cloud Anda saat menggunakan klien ini. Detail ini dapat berubah di masa mendatang.
Menjalankan kueri
Untuk contoh kueri Log dan Metrik, lihat bagian Contoh.
Konsep utama
Mencatat batas laju kueri dan pembatasan
Layanan Analitik Log menerapkan pembatasan saat tingkat permintaan terlalu tinggi. Batas, seperti jumlah maksimum baris yang dikembalikan, juga diterapkan pada kueri Kusto. Untuk informasi selengkapnya, lihat Query API.
Struktur data metrik
Setiap set nilai metrik adalah rangkaian waktu dengan karakteristik berikut:
- Waktu nilai dikumpulkan
- Sumber daya yang terkait dengan nilai
- Namespace layanan yang bertindak seperti kategori untuk metrik
- Nama metrik
- Nilai itu sendiri
- Beberapa metrik memiliki beberapa dimensi seperti yang dijelaskan dalam metrik multi-dimensi. Metrik kustom dapat memiliki hingga 10 dimensi.
Contoh
- kueri log
- kueri log
yang bersentrik ruang kerja - kueri log yang bersentrik sumber daya
- Menangani respons kueri log
- kueri log
- kueri log Batch
-
Skenario kueri log tingkat lanjut
- Mengatur batas waktu kueri log
- Mengkueri beberapa ruang kerja
- Menyertakan statistik
- Menyertakan visualisasi
- kueri Metrik
- Menangani respons kueri metrik
- Contoh penanganan respons
- metrik kueri untuk beberapa sumber daya
Kueri log
LogsQueryClient
dapat digunakan untuk mengkueri ruang kerja Analitik Log menggunakan Bahasa Kueri Kusto.
timespan.duration
dapat ditentukan sebagai string dalam format durasi ISO 8601. Anda dapat menggunakan konstanta Durations
yang disediakan untuk beberapa durasi ISO 8601 yang umum digunakan.
Anda dapat mengkueri log menurut ID ruang kerja Log Analytics atau ID sumber daya Azure. Hasilnya dikembalikan sebagai tabel dengan kumpulan baris.
Kueri log yang berentrik ruang kerja
Untuk mengkueri menurut ID ruang kerja, gunakan metode 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));
Kueri log yang bersentrik sumber daya
Contoh berikut menunjukkan cara mengkueri log langsung dari sumber daya Azure. Di sini, metode queryResource
digunakan dan ID sumber daya Azure diteruskan. Misalnya, /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}
.
Untuk menemukan ID sumber daya:
- Navigasi ke halaman sumber daya Anda di portal Microsoft Azure.
- Dari bilah Gambaran Umum
, pilih tautan Tampilan JSON . - Dalam JSON yang dihasilkan, salin nilai properti
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);
});
Menangani respons kueri log
Fungsi queryWorkspace
LogsQueryClient
mengembalikan objek LogsQueryResult
. Jenis objek dapat LogsQuerySuccessfulResult
atau LogsQueryPartialResult
. Berikut adalah hierarki respons:
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
Misalnya, untuk menangani respons dengan tabel:
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);
}
}
}
Sampel lengkap dapat ditemukan di sini.
Kueri log batch
Contoh berikut menunjukkan pengiriman beberapa kueri secara bersamaan menggunakan API kueri batch. Kueri dapat direpresentasikan sebagai daftar objek 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);
}
}
}
Menangani respons kueri batch log
Fungsi queryBatch
LogsQueryClient
mengembalikan objek LogsQueryBatchResult
.
LogsQueryBatchResult
berisi daftar objek dengan jenis yang mungkin berikut ini:
LogsQueryPartialResult
LogsQuerySuccessfulResult
LogsQueryError
Berikut adalah hierarki respons:
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")
Misalnya, kode berikut menangani respons kueri log batch:
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);
}
}
}
Sampel lengkap dapat ditemukan di sini.
Skenario kueri log tingkat lanjut
Mengatur batas waktu kueri log
Beberapa kueri log membutuhkan waktu lebih dari 3 menit untuk dijalankan. Batas waktu server default adalah 3 menit. Anda dapat meningkatkan batas waktu server hingga maksimum 10 menit. Dalam contoh berikut, properti serverTimeoutInSeconds
objek LogsQueryOptions
digunakan untuk meningkatkan batas waktu server menjadi 10 menit:
// 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;
Mengkueri beberapa ruang kerja
Kueri log yang sama dapat dijalankan di beberapa ruang kerja Analitik Log. Selain kueri Kusto, parameter berikut diperlukan:
-
workspaceId
- ID ruang kerja pertama (utama). -
additionalWorkspaces
- Daftar ruang kerja, tidak termasuk ruang kerja yang disediakan dalam parameterworkspaceId
. Item daftar parameter dapat terdiri dari format pengidentifikasi berikut:- Nama ruang kerja yang memenuhi syarat
- ID Ruang Kerja
- ID sumber daya Azure
Misalnya, kueri berikut dijalankan di tiga ruang kerja:
const queryLogsOptions: LogsQueryOptions = {
additionalWorkspaces: ["<workspace2>", "<workspace3>"],
};
const kustoQuery = "AppEvents | limit 10";
const result = await logsQueryClient.queryWorkspace(
azureLogAnalyticsWorkspaceId,
kustoQuery,
{ duration: Durations.twentyFourHours },
queryLogsOptions,
);
Untuk menampilkan hasil untuk setiap ruang kerja, gunakan kolom TenantId
untuk mengurutkan hasil atau memfilternya dalam kueri Kusto.
Hasil pesanan berdasarkan TenantId
AppEvents | order by TenantId
Memfilter hasil menurut TenantId
AppEvents | filter TenantId == "<workspace2>"
Sampel lengkap dapat ditemukan di sini.
Sertakan statistik
Untuk mendapatkan statistik eksekusi kueri log, seperti konsumsi CPU dan memori:
- Atur properti
LogsQueryOptions.includeQueryStatistics
ketrue
. - Akses bidang
statistics
di dalam objekLogsQueryResult
.
Contoh berikut mencetak waktu eksekusi kueri:
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
}`,
);
Karena struktur payload statistics
bervariasi menurut kueri, jenis pengembalian Record<string, unknown>
digunakan. Ini berisi respons JSON mentah. Statistik ditemukan dalam properti query
JSON. Misalnya:
{
"query": {
"executionTime": 0.0156478,
"resourceUsage": {...},
"inputDatasetStatistics": {...},
"datasetStatistics": [{...}]
}
}
Sertakan visualisasi
Untuk mendapatkan data visualisasi untuk kueri log menggunakan operator render :
- Atur properti
LogsQueryOptions.includeVisualization
ketrue
. - Akses bidang
visualization
di dalam objekLogsQueryResult
.
Misalnya:
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);
Karena struktur payload visualization
bervariasi menurut kueri, jenis pengembalian Record<string, unknown>
digunakan. Ini berisi respons JSON mentah. Misalnya:
{
"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
}
Kueri metrik
Contoh berikut mendapatkan metrik untuk langganan Azure Metrics Advisor /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>
.
Untuk menemukan URI sumber daya:
- Navigasi ke halaman sumber daya Anda di portal Microsoft Azure.
- Dari bilah Gambaran Umum
, pilih tautan Tampilan JSON . - Dalam JSON yang dihasilkan, salin nilai properti
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);
});
Dalam sampel sebelumnya, metrik menghasilkan metricsResponse
diurutkan sesuai dengan urutan pengguna menentukan nama metrik dalam argumen array metricNames
untuk fungsi queryResource
. Jika pengguna menentukan [firstMetricName, secondMetricName]
, hasil untuk firstMetricName
akan muncul sebelum hasil untuk secondMetricName
di metricResponse
.
Menangani respons kueri metrik
Metrik queryResource
fungsi mengembalikan objek QueryMetricsResult
. Objek QueryMetricsResult
berisi properti seperti daftar objek yang diketik Metric
, interval
, namespace
, dan timespan
. Daftar objek Metric
dapat diakses menggunakan properti metrics
. Setiap objek Metric
dalam daftar ini berisi daftar objek TimeSeriesElement
. Setiap TimeSeriesElement
berisi properti data
dan metadataValues
. Dalam bentuk visual, hierarki objek respons menyerupai struktur berikut:
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)
Contoh penanganan respons
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);
});
Sampel lengkap dapat ditemukan di sini.
Metrik kueri untuk beberapa sumber daya
Untuk mengkueri metrik untuk beberapa sumber daya Azure dalam satu permintaan, gunakan metode MetricsClient.queryResources
. Metode ini:
- Memanggil API yang berbeda dari metode
MetricsClient
. - Memerlukan titik akhir regional saat membuat klien. Misalnya, "https://westus3.metrics.monitor.azure.com".
Setiap sumber daya Azure harus berada di:
- Wilayah yang sama dengan titik akhir yang ditentukan saat membuat klien.
- Langganan Azure yang sama.
Selanjutnya:
- Pengguna harus berwenang untuk membaca data pemantauan di tingkat langganan Azure. Misalnya, peran Pembaca Pemantauan pada langganan yang akan dikueri.
- Namespace metrik yang berisi metrik yang akan dikueri harus disediakan. Untuk daftar namespace metrik, lihat Metrik dan kategori log yang didukung berdasarkan jenis sumber daya.
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
);
Untuk inventaris metrik dan dimensi yang tersedia untuk setiap jenis sumber daya Azure, lihat Metrik yang didukung dengan Azure Monitor.
Pemecahan masalah
Untuk mendiagnosis berbagai skenario kegagalan, lihat panduan pemecahan masalah .
Langkah berikutnya
Untuk mempelajari selengkapnya tentang Azure Monitor, lihat dokumentasi layanan Azure Monitor .
Berkontribusi
Jika Anda ingin berkontribusi pada pustaka ini, baca panduan berkontribusi untuk mempelajari selengkapnya tentang cara membuat dan menguji kode.
Pengujian modul ini adalah campuran pengujian langsung dan unit, yang mengharuskan Anda memiliki instans Azure Monitor. Untuk menjalankan pengujian, Anda harus menjalankan:
rush update
rush build -t @azure/monitor-query
cd into sdk/monitor/monitor-query
- Salin file
sample.env
ke.env
- Buka file
.env
di editor dan isi nilai. -
npm run test
.
Untuk detail selengkapnya, lihat folder pengujian
Proyek terkait
- Microsoft Azure SDK for JavaScript
- Azure Monitor
Tayangan
Azure SDK for JavaScript