مكتبة عميل استعلام Azure Monitor ل JavaScript - الإصدار 1.2.0

تستخدم مكتبة عميل استعلام Azure Monitor لتنفيذ استعلامات للقراءة فقط مقابل النظامين الأساسيين للبيانات في Azure Monitor:

  • السجلات - يجمع وينظم بيانات السجل والأداء من الموارد المراقبة. يمكن دمج البيانات من مصادر مختلفة مثل سجلات النظام الأساسي من خدمات Azure وبيانات السجل والأداء من عوامل الأجهزة الظاهرية وبيانات الاستخدام والأداء من التطبيقات في مساحة عمل Azure Log Analytics واحدة. يمكن تحليل أنواع البيانات المختلفة معا باستخدام لغة استعلام Kusto.
  • المقاييس - يجمع البيانات الرقمية من الموارد المراقبة في قاعدة بيانات سلسلة زمنية. القياسات عبارة عن قيم عددية تُجمَّع على فترات زمنية منتظمة وتصف بعض جوانب النظام في وقتٍ معينٍ. المقاييس خفيفة الوزن وقادرة على دعم سيناريوهات قريبة من الوقت الحقيقي، ما يجعلها مفيدة للتنبيه والكشف السريع عن المشكلات.

الموارد:

الشروع في العمل

البيئات المدعومة

لمزيد من المعلومات، راجع نهج الدعم الخاص بنا.

المتطلبات الأساسية

تثبيت الحِزَمة

قم بتثبيت مكتبة عميل Azure Monitor Query ل JavaScript باستخدام npm:

npm install @azure/monitor-query

إنشاء العميل

مطلوب عميل مصادق عليه للاستعلام عن السجلات أو المقاييس. للمصادقة، يستخدم المثال التالي DefaultAzureCredential من حزمة @azure/الهوية .

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

بشكل افتراضي، LogsQueryClientMetricsQueryClient ويتم تكوينهما لاستخدام Azure Public Cloud. لاستخدام سحابة ذات سيادة بدلا من ذلك، قم بتوفير الوسيطة الصحيحة endpoint . على سبيل المثال:

import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, MetricsQueryClient } from "@azure/monitor-query";

const credential = new DefaultAzureCredential();

const logsQueryClient = new LogsQueryClient(credential, {
  endpoint: "https://api.loganalytics.azure.cn/v1",
});

// or
const metricsQueryClient = new MetricsQueryClient(credential{
  endpoint: "https://management.chinacloudapi.cn",
});

ملاحظة: حاليا، MetricsQueryClient يستخدم نقطة نهاية Azure Resource Manager (ARM) للاستعلام عن المقاييس. تحتاج إلى نقطة نهاية الإدارة المقابلة للسحابة الخاصة بك عند استخدام هذا العميل. تخضع هذه التفاصيل للتغيير في المستقبل.

تنفيذ الاستعلام

للحصول على أمثلة على استعلامات السجلات والمقاييس، راجع قسم الأمثلة .

المفاهيم الرئيسية

سجلات حدود معدل الاستعلام والتقييد

تطبق خدمة Log Analytics التقييد عندما يكون معدل الطلب مرتفعا جدا. يتم أيضا تطبيق الحدود، مثل الحد الأقصى لعدد الصفوف التي تم إرجاعها، على استعلامات Kusto. لمزيد من المعلومات، راجع واجهة برمجة تطبيقات الاستعلام.

بنية بيانات المقاييس

كل مجموعة من قيم القياس هي سلسلة زمنية ذات الخصائص التالية:

  • وقت تجميع القيمة
  • المورد المقترن بالقيمة
  • مساحة الاسم التي تعمل كفئة للقياس
  • اسم القياس
  • القيمة نفسها
  • بعض المقاييس لها أبعاد متعددة كما هو موضح في المقاييس متعددة الأبعاد. يمكن أن تحتوي المقاييس المخصصة على ما يصل إلى 10 أبعاد.

أمثلة

استعلام السجلات

LogsQueryClient يمكن استخدام للاستعلام عن مساحة عمل Log Analytics باستخدام لغة استعلام Kusto. timespan.duration يمكن تحديد كسلسلة بتنسيق مدة ISO 8601. يمكنك استخدام الثوابت Durations المتوفرة لبعض مدد ISO 8601 شائعة الاستخدام.

يمكنك الاستعلام عن السجلات حسب معرف مساحة العمل أو معرف المورد. يتم إرجاع النتيجة كجدول مع مجموعة من الصفوف.

استعلام السجلات التي تركز على مساحة العمل

للاستعلام حسب معرف مساحة العمل، استخدم 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. على سبيل المثال، ⁧/subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}⁩.

للعثور على معرف المورد:

  1. انتقل إلى صفحة المورد في مدخل Microsoft Azure.
  2. من جزء Overview ، حدد ارتباط JSON View .
  3. في 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);
});

معالجة استجابة استعلام السجلات

ترجع queryWorkspace دالة LogsQueryClient كائن.LogsQueryResult يمكن أن يكون LogsQuerySuccessfulResult نوع العنصر أو LogsQueryPartialResult. فيما يلي تسلسل هرمي للاستجابة:

LogsQuerySuccessfulResult
|---statistics
|---visualization
|---status ("Success")
|---tables (list of `LogsTable` objects)
    |---name
    |---rows
    |---columnDescriptors (list of `LogsColumn` objects)
        |---name
        |---type

LogsQueryPartialResult
|---statistics
|---visualization
|---status ("PartialFailure")
|---partialError
    |--name
    |--code
    |--message
    |--stack
|---partialTables (list of `LogsTable` objects)
    |---name
    |---rows
    |---columnDescriptors (list of `LogsColumn` objects)
        |---name
        |---type

على سبيل المثال، للتعامل مع استجابة باستخدام الجداول:

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);
    }
  }
}

يمكن العثور على عينة كاملة هنا.

استعلام سجلات الدفعات

يوضح المثال التالي إرسال استعلامات متعددة في نفس الوقت باستخدام واجهة برمجة تطبيقات استعلام الدفعة. يمكن تمثيل الاستعلامات كقوائم كائنات 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);
    }
  }
}

معالجة استجابة استعلام دفعة السجلات

ترجع queryBatch دالة LogsQueryClient كائن.LogsQueryBatchResult LogsQueryBatchResult يحتوي على قائمة بالكائنات مع الأنواع المحتملة التالية:

  • LogsQueryPartialResult
  • LogsQuerySuccessfulResult
  • LogsQueryError

فيما يلي تسلسل هرمي للاستجابة:

LogsQuerySuccessfulResult
|---statistics
|---visualization
|---status ("Success")
|---tables (list of `LogsTable` objects)
    |---name
    |---rows
    |---columnDescriptors (list of `LogsColumn` objects)
        |---name
        |---type

LogsQueryPartialResult
|---statistics
|---visualization
|---status ("PartialFailure")
|---partialError
    |--name
    |--code
    |--message
    |--stack
|---partialTables (list of `LogsTable` objects)
    |---name
    |---rows
    |---columnDescriptors (list of `LogsColumn` objects)
        |---name
        |---type

LogsQueryError
|--name
|--code
|--message
|--stack
|--status ("Failure")

على سبيل المثال، تعالج التعليمات البرمجية التالية استجابة استعلام سجلات الدفعات:

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 - معرف مساحة العمل الأول (الأساسي).
  • additionalWorkspaces - قائمة بمساحات العمل، باستثناء مساحة العمل المتوفرة في المعلمة workspaceId . يمكن أن تتكون عناصر قائمة المعلمة من تنسيقات المعرف التالية:
    • أسماء مساحات العمل المؤهلة
    • معرفات مساحة العمل
    • معرفات موارد Azure

على سبيل المثال، يتم تنفيذ الاستعلام التالي في ثلاث مساحات عمل:

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>"

يمكن العثور على عينة كاملة هنا.

تضمين الإحصائيات

للحصول على إحصائيات تنفيذ استعلام السجلات، مثل وحدة المعالجة المركزية واستهلاك الذاكرة:

  1. اضبط الخاصية LogsQueryOptions.includeQueryStatistics على true.
  2. الوصول إلى statistics الحقل داخل LogsQueryResult الكائن.

يطبع المثال التالي وقت تنفيذ الاستعلام:

const workspaceId = "<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 الأولية. يتم العثور على الإحصائيات داخل query خاصية JSON. على سبيل المثال:

{
  "query": {
    "executionTime": 0.0156478,
    "resourceUsage": {...},
    "inputDatasetStatistics": {...},
    "datasetStatistics": [{...}]
  }
}

تضمين المرئيات

للحصول على بيانات المرئيات لاستعلامات السجلات باستخدام عامل تشغيل العرض:

  1. اضبط الخاصية LogsQueryOptions.includeVisualization على true.
  2. الوصول إلى visualization الحقل داخل LogsQueryResult الكائن.

على سبيل المثال:

const workspaceId = "<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. انتقل إلى صفحة المورد في مدخل Microsoft Azure.
  2. من جزء Overview ، حدد ارتباط JSON View .
  3. في 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 النموذج السابق، يتم ترتيب نتائج القياس وفقا للترتيب الذي يحدد به المستخدم أسماء المقاييس في وسيطة metricNames الصفيف للدالة queryResource . إذا حدد [firstMetricName, secondMetricName]المستخدم ، فستظهر النتيجة ل firstMetricName قبل النتيجة في secondMetricNamemetricResponse.

معالجة استجابة استعلام المقاييس

ترجع دالة المقاييس queryResource كائنا QueryMetricsResult . QueryMetricsResult يحتوي الكائن على خصائص مثل قائمة Metricالكائنات -typed و intervalnamespaceو.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);
});

يمكن العثور على عينة كاملة هنا.

مقاييس الاستعلام لموارد متعددة

للاستعلام عن مقاييس موارد Azure المتعددة في طلب واحد، استخدم MetricsQueryClient.queryResources الأسلوب . فهذا الأسلوب:

  • استدعاء واجهة برمجة تطبيقات مختلفة عن الأساليب MetricsQueryClient .
  • يتطلب نقطة نهاية إقليمية عند إنشاء العميل. على سبيل المثال، "https://westus3.metrics.monitor.azure.com"؛.

يجب أن يتواجد كل مورد 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 batchEndPoint: string = "<YOUR_METRICS_ENDPOINT>"; //for example, https://eastus.metrics.monitor.azure.com/

const credential = new DefaultAzureCredential();
const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(
  batchEndPoint,
  credential
);

const result: : MetricsQueryResult[] = await metricsQueryClient.queryResources(
  resourceIds,
  metricsNamespace,
  metricNames
);

للحصول على مخزون من المقاييس والأبعاد المتوفرة لكل نوع مورد 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.

لمزيد من التفاصيل، اعرض مجلد الاختبارات .

مرات الظهور