مهملة ⚠️: تم إهمال هذه الحزمة ولم تعد قيد التطوير النشط. يرجى الانتقال إلى الباقات التالية:

ستتم إضافة ميزات جديدة وإصلاحات أخطاء غير أمنية إلى المكتبات البديلة المذكورة أعلاه.

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

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

موارد:

الشروع

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

  • إصدارات LTS من Node.js
  • أحدث إصدارات Safari وChrome وMicrosoft Edge وFirefox

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

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

تثبيت الحزمة

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

npm install --save @azure/monitor-query

إنشاء العميل

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

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

const credential = new DefaultAzureCredential();

// Create a LogsQueryClient
const logsQueryClient = new LogsQueryClient(credential);

// Create a MetricsQueryClient
const metricsQueryClient = new MetricsQueryClient(credential);

// Create a MetricsClient
const endpoint = " https://<endpoint>.monitor.azure.com/";
const metricsClient = new MetricsClient(endpoint, credential);

تكوين العميل لسحابة Azure السيادية

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

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

const credential = new DefaultAzureCredential();

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

// Create a MetricsQueryClient
const metricsQueryClient: MetricsQueryClient = new MetricsQueryClient(credential, {
  endpoint: "https://management.chinacloudapi.cn",
  audience: "https://monitor.azure.cn/.default",
});

// Create a MetricsClient
const endpoint = " https://<endpoint>.monitor.azure.cn/";
const metricsClient = new MetricsClient(endpoint, credential, {
  audience: "https://monitor.azure.cn/.default",
});

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

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

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

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

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

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

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

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

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

الأمثلة

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

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

يمكنك الاستعلام عن السجلات عن طريق معرف مساحة عمل Log Analytics أو معرف مورد Azure. يتم إرجاع النتيجة كجدول يحتوي على مجموعة من الصفوف.

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

للاستعلام عن طريق معرف مساحة العمل، استخدم الطريقة LogsQueryClient.queryWorkspace :

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

const azureLogAnalyticsWorkspaceId = "<workspace_id>";
const logsQueryClient = new LogsQueryClient(new DefaultAzureCredential());

const kustoQuery = "AppEvents | limit 1";
const result = await logsQueryClient.queryWorkspace(azureLogAnalyticsWorkspaceId, kustoQuery, {
  duration: Durations.twentyFourHours,
});

if (result.status === LogsQueryResultStatus.Success) {
  const tablesFromResult = result.tables;

  if (tablesFromResult.length === 0) {
    console.log(`No results for query '${kustoQuery}'`);
    return;
  }
  console.log(`This query has returned table(s) - `);
  processTables(tablesFromResult);
} else {
  console.log(`Error processing the query '${kustoQuery}' - ${result.partialError}`);
  if (result.partialTables.length > 0) {
    console.log(`This query has also returned partial data in the following table(s) - `);
    processTables(result.partialTables);
  }
}

function processTables(tablesFromResult) {
  for (const table of tablesFromResult) {
    const columnHeaderString = table.columnDescriptors
      .map((column) => `${column.name}(${column.type}) `)
      .join("| ");
    console.log("| " + columnHeaderString);
    for (const row of table.rows) {
      const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
      console.log("| " + columnValuesString);
    }
  }
}

الاستعلام عن السجلات المرتكزة على الموارد

يوضح المثال التالي كيفية الاستعلام عن السجلات مباشرة من مورد Azure. هنا، queryResource يتم استخدام الطريقة ويتم تمرير معرف مورد Azure. على سبيل المثال، /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}

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

  1. انتقل إلى صفحة المورد في مدخل Microsoft Azure.
  2. من شفرة نظرة عامة ، حدد الارتباط عرض JSON .
  3. في JSON الناتج، انسخ قيمة id الخاصية.
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, Durations, LogsQueryResultStatus } from "@azure/monitor-query";

const logsResourceId = "<the Resource Id for your logs resource>";

const tokenCredential = new DefaultAzureCredential();
const logsQueryClient = new LogsQueryClient(tokenCredential);

const kustoQuery = `MyTable_CL | summarize count()`;

console.log(`Running '${kustoQuery}' over the last One Hour`);
const queryLogsOptions = {
  // explicitly control the amount of time the server can spend processing the query.
  serverTimeoutInSeconds: 600, // sets the timeout to 10 minutes
  // optionally enable returning additional statistics about the query's execution.
  // (by default, this is off)
  includeQueryStatistics: true,
};

const result = await logsQueryClient.queryResource(
  logsResourceId,
  kustoQuery,
  { duration: Durations.sevenDays },
  queryLogsOptions,
);

const executionTime = (result as any)?.statistics?.query?.executionTime;

console.log(
  `Results for query '${kustoQuery}', execution time: ${executionTime == null ? "unknown" : executionTime}`,
);

if (result.status === LogsQueryResultStatus.Success) {
  const tablesFromResult = result.tables;

  if (tablesFromResult.length === 0) {
    console.log(`No results for query '${kustoQuery}'`);
    return;
  }
  console.log(`This query has returned table(s) - `);
  processTables(tablesFromResult);
} else {
  console.log(`Error processing the query '${kustoQuery}' - ${result.partialError}`);
  if (result.partialTables.length > 0) {
    console.log(`This query has also returned partial data in the following table(s) - `);
    processTables(result.partialTables);
  }
}

function processTables(tablesFromResult) {
  for (const table of tablesFromResult) {
    const columnHeaderString = table.columnDescriptors
      .map((column) => `${column.name}(${column.type}) `)
      .join("| ");
    console.log("| " + columnHeaderString);

    for (const row of table.rows) {
      const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
      console.log("| " + columnValuesString);
    }
  }
}

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

الدالة queryWorkspace إرجاع 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

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

function processTables(tablesFromResult) {
  for (const table of tablesFromResult) {
    const columnHeaderString = table.columnDescriptors
      .map((column) => `${column.name}(${column.type}) `)
      .join("| ");
    console.log("| " + columnHeaderString);

    for (const row of table.rows) {
      const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
      console.log("| " + columnValuesString);
    }
  }
}

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

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

يوضح المثال التالي إرسال استعلامات متعددة في نفس الوقت باستخدام واجهة برمجة تطبيقات الاستعلام الدفعي. يمكن تمثيل الاستعلامات كقائمة بالكائنات BatchQuery .

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

const monitorWorkspaceId = "<workspace_id>";

const tokenCredential = new DefaultAzureCredential();
const logsQueryClient = new LogsQueryClient(tokenCredential);

const kqlQuery = "AppEvents | project TimeGenerated, Name, AppRoleInstance | limit 1";
const queriesBatch = [
  {
    workspaceId: monitorWorkspaceId,
    query: kqlQuery,
    timespan: { duration: "P1D" },
  },
  {
    workspaceId: monitorWorkspaceId,
    query: "AzureActivity | summarize count()",
    timespan: { duration: "PT1H" },
  },
  {
    workspaceId: monitorWorkspaceId,
    query:
      "AppRequests | take 10 | summarize avgRequestDuration=avg(DurationMs) by bin(TimeGenerated, 10m), _ResourceId",
    timespan: { duration: "PT1H" },
  },
  {
    workspaceId: monitorWorkspaceId,
    query: "AppRequests | take 2",
    timespan: { duration: "PT1H" },
    includeQueryStatistics: true,
  },
];

const result = await logsQueryClient.queryBatch(queriesBatch);

if (result == null) {
  throw new Error("No response for query");
}

let i = 0;
for (const response of result) {
  console.log(`Results for query with query: ${queriesBatch[i]}`);
  if (response.status === LogsQueryResultStatus.Success) {
    console.log(
      `Printing results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`,
    );
    processTables(response.tables);
  } else if (response.status === LogsQueryResultStatus.PartialFailure) {
    console.log(
      `Printing partial results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`,
    );
    processTables(response.partialTables);
    console.log(
      ` Query had errors:${response.partialError.message} with code ${response.partialError.code}`,
    );
  } else {
    console.log(`Printing errors from query '${queriesBatch[i].query}'`);
    console.log(` Query had errors:${response.message} with code ${response.code}`);
  }
  // next query
  i++;
}

function processTables(tablesFromResult) {
  for (const table of tablesFromResult) {
    const columnHeaderString = table.columnDescriptors
      .map((column) => `${column.name}(${column.type}) `)
      .join("| ");
    console.log("| " + columnHeaderString);

    for (const row of table.rows) {
      const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
      console.log("| " + columnValuesString);
    }
  }
}

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

الدالة queryBatch إرجاع 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")

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

import { LogsQueryResultStatus } from "@azure/monitor-query";

async function processBatchResult(result, queriesBatch) {
  let i = 0;
  for (const response of result) {
    console.log(`Results for query with query: ${queriesBatch[i]}`);
    if (response.status === LogsQueryResultStatus.Success) {
      console.log(
        `Printing results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`,
      );
      processTables(response.tables);
    } else if (response.status === LogsQueryResultStatus.PartialFailure) {
      console.log(
        `Printing partial results from query '${queriesBatch[i].query}' for '${queriesBatch[i].timespan}'`,
      );
      processTables(response.partialTables);
      console.log(
        ` Query had errors:${response.partialError.message} with code ${response.partialError.code}`,
      );
    } else {
      console.log(`Printing errors from query '${queriesBatch[i].query}'`);
      console.log(` Query had errors:${response.message} with code ${response.code}`);
    }
    // next query
    i++;
  }
}

function processTables(tablesFromResult) {
  for (const table of tablesFromResult) {
    const columnHeaderString = table.columnDescriptors
      .map((column) => `${column.name}(${column.type}) `)
      .join("| ");
    console.log("| " + columnHeaderString);

    for (const row of table.rows) {
      const columnValuesString = row.map((columnValue) => `'${columnValue}' `).join("| ");
      console.log("| " + columnValuesString);
    }
  }
}

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

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

تعيين مهلة استعلام السجلات

تستغرق بعض استعلامات السجلات أكثر من 3 دقائق للتنفيذ. مهلة الخادم الافتراضية هي 3 دقائق. يمكنك زيادة مهلة الخادم إلى 10 دقائق كحد أقصى. في المثال التالي، يتم استخدام خاصية LogsQueryOptions الكائن serverTimeoutInSeconds لزيادة مهلة الخادم إلى 10 دقائق:

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

const azureLogAnalyticsWorkspaceId = "<workspace_id>";

const tokenCredential = new DefaultAzureCredential();
const logsQueryClient = new LogsQueryClient(tokenCredential);

const kqlQuery = "AppEvents | project TimeGenerated, Name, AppRoleInstance | limit 1";

// setting optional parameters
const queryLogsOptions = {
  // explicitly control the amount of time the server can spend processing the query.
  serverTimeoutInSeconds: 600, // 600 seconds = 10 minutes
};

const result = await logsQueryClient.queryWorkspace(
  azureLogAnalyticsWorkspaceId,
  kqlQuery,
  { duration: Durations.twentyFourHours },
  queryLogsOptions,
);

const status = result.status;

الاستعلام عن مساحات عمل متعددة

يمكن تنفيذ نفس استعلام السجلات عبر مساحات عمل Log Analytics متعددة. بالإضافة إلى استعلام Kusto، المعلمات التالية مطلوبة:

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

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

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

const azureLogAnalyticsWorkspaceId = "<workspace_id>";

const tokenCredential = new DefaultAzureCredential();
const logsQueryClient = new LogsQueryClient(tokenCredential);

const kqlQuery = "AppEvents | project TimeGenerated, Name, AppRoleInstance | limit 1";

// setting optional parameters
const queryLogsOptions = {
  additionalWorkspaces: ["<workspace2>", "<workspace3>"],
};

const result = await logsQueryClient.queryWorkspace(
  azureLogAnalyticsWorkspaceId,
  kqlQuery,
  { duration: Durations.twentyFourHours },
  queryLogsOptions,
);

const status = result.status;

لعرض النتائج لكل مساحة عمل، استخدم العمود TenantId إما لترتيب النتائج أو تصفيتها في استعلام Kusto.

نتائج الطلب حسب TenantId

AppEvents | order by TenantId

تصفية النتائج حسب TenantId

AppEvents | filter TenantId == "<workspace2>"

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

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

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

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

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

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

const monitorWorkspaceId = "<workspace_id>";
const logsQueryClient = new LogsQueryClient(new DefaultAzureCredential());
const kustoQuery = "AzureActivity | top 10 by TimeGenerated";

const result = await logsQueryClient.queryWorkspace(
  monitorWorkspaceId,
  kustoQuery,
  { duration: Durations.oneDay },
  {
    includeQueryStatistics: true,
  },
);

const executionTime = (result as any)?.statistics?.query?.executionTime;

console.log(
  `Results for query '${kustoQuery}', execution time: ${executionTime == null ? "unknown" : executionTime}`,
);

نظرا لأن بنية statistics الحمولة تختلف حسب الاستعلام، Record<string, unknown> يتم استخدام نوع الإرجاع. يحتوي على استجابة JSON الأولية. تم العثور على الإحصائيات داخل query ملكية JSON. على سبيل المثال:

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

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

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

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

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

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

const monitorWorkspaceId = "<workspace_id>";
const logsQueryClient = new LogsQueryClient(new DefaultAzureCredential());

const result = await logsQueryClient.queryWorkspace(
  monitorWorkspaceId,
  `StormEvents
        | summarize event_count = count() by State
        | where event_count > 10
        | project State, event_count
        | render columnchart`,
  { duration: Durations.oneDay },
  {
    includeVisualization: true,
  },
);

console.log("visualization result:", result.visualization);

نظرا لأن بنية visualization الحمولة تختلف حسب الاستعلام، Record<string, unknown> يتم استخدام نوع الإرجاع. يحتوي على استجابة JSON الأولية. على سبيل المثال:

{
  "visualization": "columnchart",
  "title": "the chart title",
  "accumulate": false,
  "isQuerySorted": false,
  "kind": null,
  "legend": null,
  "series": null,
  "yMin": "NaN",
  "yMax": "NaN",
  "xAxis": null,
  "xColumn": null,
  "xTitle": "x axis title",
  "yAxis": null,
  "yColumns": null,
  "ySplit": null,
  "yTitle": null,
  "anomalyColumns": null
}

استعلام المقاييس

يحصل المثال التالي على مقاييس لاشتراك Azure Metrics Advisor . يجب أن يكون عنوان URI للمورد هو عنوان المورد الذي يتم الاستعلام عن المقاييس الخاصة به. عادة ما يكون من التنسيق /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>.

للعثور على عنوان URI للمورد:

  1. انتقل إلى صفحة المورد في مدخل Microsoft Azure.
  2. من شفرة نظرة عامة ، حدد الارتباط عرض JSON .
  3. في JSON الناتج، انسخ قيمة id الخاصية.
import { DefaultAzureCredential } from "@azure/identity";
import { MetricsQueryClient, Durations } from "@azure/monitor-query";

const metricsResourceId = "<the Resource Id for your metrics resource>";

const tokenCredential = new DefaultAzureCredential();
const metricsQueryClient = new MetricsQueryClient(tokenCredential);

const metricNames = [];
const metricDefinitions = metricsQueryClient.listMetricDefinitions(metricsResourceId);
for await (const { id, name } of metricDefinitions) {
  console.log(` metricDefinitions - ${id}, ${name}`);
  if (name) {
    metricNames.push(name);
  }
}

const [firstMetricName, secondMetricName] = metricNames;
if (firstMetricName && secondMetricName) {
  console.log(`Picking an example metric to query: ${firstMetricName} and ${secondMetricName}`);
  const metricsResponse = await metricsQueryClient.queryResource(
    metricsResourceId,
    [firstMetricName, secondMetricName],
    {
      granularity: "PT1M",
      timespan: { duration: Durations.fiveMinutes },
    },
  );

  console.log(
    `Query cost: ${metricsResponse.cost}, interval: ${metricsResponse.granularity}, time span: ${metricsResponse.timespan}`,
  );

  const metrics = metricsResponse.metrics;
  console.log(`Metrics:`, JSON.stringify(metrics, undefined, 2));
  const metric = metricsResponse.getMetricByName(firstMetricName);
  console.log(`Selected Metric: ${firstMetricName}`, JSON.stringify(metric, undefined, 2));
} else {
  console.error(`Metric names are not defined - ${firstMetricName} and ${secondMetricName}`);
}

في العينة السابقة، يتم ترتيب نتائج metricsResponse المقاييس وفقا للترتيب الذي يحدد به المستخدم أسماء المقاييس في metricNames وسيطة المصفوفة للدالة queryResource . إذا حدد [firstMetricName, secondMetricName]المستخدم ، فستظهر النتيجة ل firstMetricName قبل النتيجة في secondMetricNamemetricResponse.

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

ترجع الدالة metrics queryResource كائنا QueryMetricsResult . يحتوي الكائن QueryMetricsResult على خصائص مثل قائمة الكائنات Metricالمكتوبة ، intervalو ، namespaceو timespan. يمكن الوصول إلى Metric قائمة الكائنات باستخدام الخاصية metrics . يحتوي كل Metric كائن في هذه القائمة على قائمة بالكائنات TimeSeriesElement . كل TimeSeriesElement يحتوي data على وخصائص metadataValues . في الشكل المرئي ، يشبه التسلسل الهرمي للكائن للاستجابة البنية التالية:

QueryMetricsResult
|---cost
|---timespan (of type `QueryTimeInterval`)
|---granularity
|---namespace
|---resourceRegion
|---metrics (list of `Metric` objects)
    |---id
    |---type
    |---name
    |---unit
    |---displayDescription
    |---errorCode
    |---timeseries (list of `TimeSeriesElement` objects)
        |---metadataValues
        |---data (list of data points represented by `MetricValue` objects)
            |---timeStamp
            |---average
            |---minimum
            |---maximum
            |---total
            |---count
|---getMetricByName(metricName): Metric | undefined (convenience method)

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

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

const metricsResourceId = "<the Resource Id for your metrics resource>";

const tokenCredential = new DefaultAzureCredential();
const metricsQueryClient = new MetricsQueryClient(tokenCredential);

console.log(`Picking an example metric to query: MatchedEventCount`);

const metricsResponse = await metricsQueryClient.queryResource(
  metricsResourceId,
  ["MatchedEventCount"],
  {
    timespan: {
      duration: Durations.fiveMinutes,
    },
    granularity: "PT1M",
    aggregations: ["Count"],
  },
);

console.log(
  `Query cost: ${metricsResponse.cost}, granularity: ${metricsResponse.granularity}, time span: ${metricsResponse.timespan}`,
);

const metrics = metricsResponse.metrics;
for (const metric of metrics) {
  console.log(metric.name);
  for (const timeseriesElement of metric.timeseries) {
    for (const metricValue of timeseriesElement.data!) {
      if (metricValue.count !== 0) {
        console.log(`There are ${metricValue.count} matched events at ${metricValue.timeStamp}`);
      }
    }
  }
}

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

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

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

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

يجب أن يتواجد كل مورد Azure في:

  • نفس المنطقة مثل نقطة النهاية المحددة عند إنشاء العميل.
  • نفس اشتراك Azure.

علاوة على ذلك:

import { DefaultAzureCredential } from "@azure/identity";
import { MetricsClient } from "@azure/monitor-query";

const resourceIds = [
  "/subscriptions/0000000-0000-000-0000-000000/resourceGroups/test/providers/Microsoft.OperationalInsights/workspaces/test-logs",
  "/subscriptions/0000000-0000-000-0000-000000/resourceGroups/test/providers/Microsoft.OperationalInsights/workspaces/test-logs2",
];
const metricsNamespace = "<YOUR_METRICS_NAMESPACE>";
const metricNames = ["requests", "count"];
const endpoint = " https://<endpoint>.monitor.azure.com/";

const credential = new DefaultAzureCredential();
const metricsClient = new MetricsClient(endpoint, credential);

const result = await metricsClient.queryResources(resourceIds, metricNames, metricsNamespace);

للحصول على جرد للمقاييس والأبعاد المتوفرة لكل نوع من أنواع موارد Azure، راجع المقاييس المدعومة مع Azure Monitor.

استكشاف الأخطاء وإصلاحها

لتشخيص سيناريوهات الفشل المختلفة، راجع دليل استكشاف الأخطاء وإصلاحها.

الخطوات التالية

لمعرفة المزيد حول Azure Monitor، راجع وثائق خدمة Azure Monitor.

المساهمه

إذا كنت ترغب في المساهمة في هذه المكتبة، فيرجى قراءة دليل المساهمة لمعرفة المزيد حول كيفية إنشاء التعليمات البرمجية واختبارها.

اختبارات هذه الوحدة عبارة عن مزيج من الاختبارات المباشرة والوحدات، والتي تتطلب منك الحصول على مثيل Azure Monitor. لتنفيذ الاختبارات، ستحتاج إلى تشغيل:

  1. pnpm install
  2. pnpm build --filter @azure/monitor-query...
  3. cd into sdk/monitor/monitor-query
  4. انسخ الملف sample.env إلى .env
  5. افتح .env الملف في محرر واملأ القيم.
  6. Person.

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