Bagikan melalui


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 :

Persiapan

Lingkungan yang didukung

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:
    • Ruang kerja Azure Log Analytics
    • Sumber daya Azure dalam bentuk apa pun (Akun Penyimpanan, Key Vault, Cosmos DB, dll.)
  • 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 DefaultAzureCredential dari paket @azure/identitas.

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

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:

  1. Navigasi ke halaman sumber daya Anda di portal Microsoft Azure.
  2. Dari bilah Gambaran Umum , pilih tautan Tampilan JSON .
  3. 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 queryWorkspaceLogsQueryClient 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 queryBatchLogsQueryClient 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 parameter workspaceId. 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:

  1. Atur properti LogsQueryOptions.includeQueryStatistics ke true.
  2. Akses bidang statistics di dalam objek LogsQueryResult.

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 :

  1. Atur properti LogsQueryOptions.includeVisualization ke true.
  2. Akses bidang visualization di dalam objek LogsQueryResult.

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 . URI sumber daya harus merupakan sumber daya yang metriknya sedang dikueri. Biasanya formatnya /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>.

Untuk menemukan URI sumber daya:

  1. Navigasi ke halaman sumber daya Anda di portal Microsoft Azure.
  2. Dari bilah Gambaran Umum , pilih tautan Tampilan JSON .
  3. 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:

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:

  1. rush update
  2. rush build -t @azure/monitor-query
  3. cd into sdk/monitor/monitor-query
  4. Salin file sample.env ke .env
  5. Buka file .env di editor dan isi nilai.
  6. npm run test.

Untuk detail selengkapnya, lihat folder pengujian kami.

Tayangan