JavaScript için Azure İzleyici Sorgusu istemci kitaplığı - sürüm 1.3.1
Azure İzleyici Sorgusu istemci kitaplığı, Azure İzleyiciiki veri platformunda salt okunur sorgular yürütmek için kullanılır:
-
Günlükler - İzlenen kaynaklardan günlük ve performans verilerini toplar ve düzenler. Azure hizmetlerinden platform günlükleri, sanal makine aracılarından günlük ve performans verileri ve uygulamalardan alınan kullanım ve performans verileri gibi farklı kaynaklardan gelen veriler,Tek bir
Azure Log Analytics çalışma alanında birleştirilebilir. Çeşitli veri türleri Kusto Sorgu Dilikullanılarak birlikte analiz edilebilir. - Ölçümler - İzlenen kaynaklardan zaman serisi veritabanına sayısal veriler toplar. Ölçümler, düzenli aralıklarla toplanan ve belirli bir zamanda sistemin bazı yönlerini açıklayan sayısal değerlerdir. Ölçümler basittir ve neredeyse gerçek zamanlı senaryoları destekleyerek sorunları uyarmak ve hızlı algılamak için kullanışlı hale getirir.
Kaynakları:
Başlarken
Desteklenen ortamlar
- Node.js
LTS sürümleri - Safari, Chrome, Microsoft Edge ve Firefox'un en son sürümleri
Daha fazla bilgi için
Önkoşullar
- Azure aboneliği
- Azure Kimlik kitaplığı kimlik bilgisi türügibi bir TokenCredential uygulaması.
- Günlükleri sorgulamak için aşağıdakilerden birine ihtiyacınız vardır:
- Azure Log Analytics çalışma alanı
- Her türlü Azure kaynağı (Depolama Hesabı, Key Vault, Cosmos DB vb.)
- Ölçümleri sorgulamak için her türlü Azure kaynağına (Depolama Hesabı, Key Vault, Cosmos DB vb.) ihtiyacınız vardır.
Paketi yükleme
npm ile JavaScript için Azure İzleyici Sorgusu istemci kitaplığını yükleyin:
npm install --save @azure/monitor-query
İstemciyi oluşturma
Günlükleri veya Ölçümleri sorgulamak için kimliği doğrulanmış bir istemci gerekir. Aşağıdaki örnekte kimlik doğrulaması için @azure/identity paketinden DefaultAzureCredential kullanılır.
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 bağımsız bulutu için istemci yapılandırma
Varsayılan olarak, kitaplığın istemcileri Azure Genel Bulutu kullanacak şekilde yapılandırılır. Bunun yerine bağımsız bir bulut kullanmak için, istemci örneği oluştururken doğru uç nokta ve hedef kitle değerini sağlayın. Mesela:
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",
});
Not: şu anda MetricsQueryClient
ölçümleri sorgulamak için Azure Resource Manager (ARM) uç noktasını kullanmaktadır. Bu istemciyi kullanırken bulutunuz için ilgili yönetim uç noktasına ihtiyacınız vardır. Bu ayrıntı gelecekte değişebilir.
Sorguyu yürütme
Günlükler ve Ölçümler sorguları örnekleri için Örnekler bölümüne bakın.
Temel kavramlar
Sorgu hızı sınırlarını ve azaltmayı günlüğe kaydeder
Log Analytics hizmeti, istek oranı çok yüksek olduğunda azaltma uygular. Döndürülen en fazla satır sayısı gibi sınırlar Kusto sorgularına da uygulanır. Daha fazla bilgi için bkz. Sorgu API'.
Ölçümler veri yapısı
Her ölçüm değeri kümesi, aşağıdaki özelliklere sahip bir zaman serisidir:
- Değerin toplandığı saat
- Değerle ilişkilendirilmiş kaynak
- Ölçüm için bir kategori gibi davranan bir ad alanı
- Ölçüm adı
- Değerin kendisi
- Bazı ölçümlerin çok boyutlu ölçümlerde açıklandığı gibi birden çok boyutu vardır. Özel ölçümler en fazla 10 boyuta sahip olabilir.
Örnekler
-
Günlükleri sorgu
- Çalışma alanı merkezli günlükleri sorgulama
- Kaynak odaklı günlükler sorgu
- Günlükleri işleme sorgu yanıtı
- Çalışma alanı merkezli günlükleri sorgulama
- Batch günlükleri sorgu
-
Gelişmiş günlükler sorgu senaryoları
- Günlükleri ayarla sorgu zaman aşımı
- Birden çok çalışma alanını sorgulama
- İstatistikleri dahil
- görselleştirme dahil
- ölçümler sorgu
- Ölçüm sorgu yanıtı işleme
- Yanıt işleme örneği
- Birden çok kaynak için sorgu ölçümleri
Günlükler sorgusu
LogsQueryClient
, Kusto Sorgu Dilikullanarak Log Analytics çalışma alanını sorgulamak için kullanılabilir.
timespan.duration
, ISO 8601 süre biçiminde bir dize olarak belirtilebilir. Yaygın olarak kullanılan bazı ISO 8601 süreleri için sağlanan Durations
sabitlerini kullanabilirsiniz.
Günlükleri Log Analytics çalışma alanı kimliğine veya Azure kaynak kimliğine göre sorgulayabilirsiniz. Sonuç, satır koleksiyonuna sahip bir tablo olarak döndürülür.
Çalışma alanı merkezli günlükler sorgusu
Çalışma alanı kimliğine göre sorgulamak için LogsQueryClient.queryWorkspace
yöntemini kullanın:
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));
Kaynak merkezli günlükler sorgusu
Aşağıdaki örnekte, günlüklerin doğrudan bir Azure kaynağından nasıl sorgu yapılacağı gösterilmektedir. Burada queryResource
yöntemi kullanılır ve bir Azure kaynak kimliği geçirilir. Örneğin, /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}
.
Kaynak kimliğini bulmak için:
- Azure portalında kaynağınızın sayfasına gidin.
- Genel Bakış dikey penceresinde JSON Görünümü bağlantısını seçin.
- Sonuçta elde edilen JSON'da
id
özelliğinin değerini kopyalayın.
/**
* @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);
});
Günlükleri işleme sorgu yanıtı
LogsQueryClient
queryWorkspace
işlevi bir LogsQueryResult
nesnesi döndürür. Nesne türü LogsQuerySuccessfulResult
veya LogsQueryPartialResult
olabilir. Yanıtın hiyerarşisi aşağıdadır:
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
Örneğin, bir yanıtı tablolarla işlemek için:
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);
}
}
}
burada
Batch günlükleri sorgusu
Aşağıdaki örnek, toplu sorgu API'sini kullanarak aynı anda birden çok sorgu göndermeyi gösterir. Sorgular, BatchQuery
nesnelerin listesi olarak gösterilebilir.
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);
}
}
}
Günlükleri işleme toplu sorgu yanıtı
LogsQueryClient
queryBatch
işlevi bir LogsQueryBatchResult
nesnesi döndürür.
LogsQueryBatchResult
aşağıdaki olası türleri içeren bir nesne listesi içerir:
LogsQueryPartialResult
LogsQuerySuccessfulResult
LogsQueryError
Yanıtın hiyerarşisi aşağıdadır:
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")
Örneğin, aşağıdaki kod bir toplu iş günlükleri sorgu yanıtını işler:
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);
}
}
}
burada
Gelişmiş günlükler sorgu senaryoları
Günlükleri ayarlama sorgusu zaman aşımı
Bazı günlük sorgularının yürütülmesi 3 dakikadan uzun sürer. Varsayılan sunucu zaman aşımı 3 dakikadır. Sunucu zaman aşımını en fazla 10 dakikaya çıkarabilirsiniz. Aşağıdaki örnekte, sunucu zaman aşımını 10 dakikaya yükseltmek için LogsQueryOptions
nesnesinin serverTimeoutInSeconds
özelliği kullanılır:
// 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;
Birden çok çalışma alanını sorgulama
Aynı günlük sorgusu birden çok Log Analytics çalışma alanında yürütülebilir. Kusto sorgusuna ek olarak aşağıdaki parametreler de gereklidir:
-
workspaceId
- İlk (birincil) çalışma alanı kimliği. -
additionalWorkspaces
-workspaceId
parametresinde sağlanan çalışma alanı dışında kalan çalışma alanlarının listesi. Parametrenin liste öğeleri aşağıdaki tanımlayıcı biçimlerinden oluşabilir:- Nitelikli çalışma alanı adları
- Çalışma Alanı Kimlikleri
- Azure kaynak kimlikleri
Örneğin, aşağıdaki sorgu üç çalışma alanında yürütülür:
const queryLogsOptions: LogsQueryOptions = {
additionalWorkspaces: ["<workspace2>", "<workspace3>"],
};
const kustoQuery = "AppEvents | limit 10";
const result = await logsQueryClient.queryWorkspace(
azureLogAnalyticsWorkspaceId,
kustoQuery,
{ duration: Durations.twentyFourHours },
queryLogsOptions,
);
Her çalışma alanının sonuçlarını görüntülemek için, sonuçları sıralamak veya Kusto sorgusunda filtrelemek için TenantId
sütununu kullanın.
Sonuçları TenantId göre sıralama
AppEvents | order by TenantId
Sonuçları TenantId göre filtreleme
AppEvents | filter TenantId == "<workspace2>"
burada
İstatistikleri dahil et
Günlükleri almak için CPU ve bellek tüketimi gibi sorgu yürütme istatistikleri:
-
LogsQueryOptions.includeQueryStatistics
özelliğinitrue
olarak ayarlayın. -
LogsQueryResult
nesnesinin içindekistatistics
alanına erişin.
Aşağıdaki örnek sorgu yürütme süresini yazdırır:
const monitorWorkspaceId = "<workspace_id>";
const logsQueryClient = new LogsQueryClient(new DefaultAzureCredential());
const kustoQuery = "AzureActivity | top 10 by TimeGenerated";
const result = await logsQueryClient.queryWorkspace(
monitorWorkspaceId,
kustoQuery,
{ duration: Durations.oneDay },
{
includeQueryStatistics: true,
},
);
const executionTime =
result.statistics && result.statistics.query && result.statistics.query.executionTime;
console.log(
`Results for query '${kustoQuery}', execution time: ${
executionTime == null ? "unknown" : executionTime
}`,
);
statistics
yükünün yapısı sorguya göre değiştiğinden, Record<string, unknown>
dönüş türü kullanılır. Ham JSON yanıtını içerir. İstatistikler JSON'un query
özelliğinde bulunur. Mesela:
{
"query": {
"executionTime": 0.0156478,
"resourceUsage": {...},
"inputDatasetStatistics": {...},
"datasetStatistics": [{...}]
}
}
Görselleştirme ekle
işleme işlecini kullanarak günlük sorgularının görselleştirme verilerini almak için:
-
LogsQueryOptions.includeVisualization
özelliğinitrue
olarak ayarlayın. -
LogsQueryResult
nesnesinin içindekivisualization
alanına erişin.
Mesela:
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
yükünün yapısı sorguya göre değiştiğinden, Record<string, unknown>
dönüş türü kullanılır. Ham JSON yanıtını içerir. Mesela:
{
"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
}
Ölçümler sorgusu
Aşağıdaki örnek, Bir Azure Ölçüm Danışmanı aboneliğinin ölçümlerini alır.
Kaynak URI'sinin ölçümlerin sorgulandığı kaynak olması gerekir. Normalde /subscriptions/<id>/resourceGroups/<rg-name>/providers/<source>/topics/<resource-name>
biçimindedir.
Kaynak URI'sini bulmak için:
- Azure portalında kaynağınızın sayfasına gidin.
- Genel Bakış dikey penceresinde JSON Görünümü bağlantısını seçin.
- Sonuçta elde edilen JSON'da
id
özelliğinin değerini kopyalayın.
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);
});
Yukarıdaki örnekte, metricsResponse
ölçüm sonuçları, kullanıcının queryResource
işlevinin metricNames
dizi bağımsız değişkeninde ölçüm adlarını belirttiği sıraya göre sıralanır. Kullanıcı [firstMetricName, secondMetricName]
belirtirse, firstMetricName
sonucu metricResponse
secondMetricName
için sonuçtan önce görünür.
Ölçüm sorgu yanıtını işleme
Ölçümler queryResource
işlevi bir QueryMetricsResult
nesnesi döndürür.
QueryMetricsResult
nesnesi, Metric
türündeki nesnelerin listesi, interval
, namespace
ve timespan
gibi özellikler içerir.
Metric
nesneleri listesine metrics
özelliği kullanılarak erişilebilir. Bu listedeki her Metric
nesnesi, TimeSeriesElement
nesnelerinin listesini içerir. Her TimeSeriesElement
data
ve metadataValues
özellikleri içerir. Görsel biçimde, yanıtın nesne hiyerarşisi aşağıdaki yapıya benzer:
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)
Yanıt işleme örneği
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);
});
burada
Birden çok kaynak için sorgu ölçümleri
Tek bir istekte birden çok Azure kaynağının ölçümlerini sorgulamak için MetricsClient.queryResources
yöntemini kullanın. Bu yöntem:
-
MetricsClient
yöntemlerinden farklı bir API çağırır. - İstemciyi oluştururken bölgesel bir uç nokta gerektirir. Örneğin, "https://westus3.metrics.monitor.azure.com".
Her Azure kaynağının şu durumlarda bulunması gerekir:
- İstemci oluşturulurken belirtilen uç noktayla aynı bölge.
- Aynı Azure aboneliği.
Ayrıca:
- Kullanıcının izleme verilerini Azure abonelik düzeyinde okuma yetkisine sahip olması gerekir. Örneğin, İzleme Okuyucusu rolü sorgulanacak abonelikte.
- Sorgulanacak ölçümleri içeren ölçüm ad alanı sağlanmalıdır. Ölçüm ad alanlarının listesi için bkz. Desteklenen ölçümler ve kaynak türüne göre günlük kategorileri.
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
);
Her Azure kaynak türü için kullanılabilen ölçümlerin ve boyutların envanteri için bkz. Azure İzleyiciile desteklenen ölçümler.
Sorun giderme
Çeşitli hata senaryolarını tanılamak için
Sonraki adımlar
Azure İzleyici hakkında daha fazla bilgi edinmek için
Katkıda
Bu kitaplığa katkıda bulunmak istiyorsanız kodu oluşturma ve test etme hakkında daha fazla bilgi edinmek için lütfen katkıda bulunma kılavuzu okuyun.
Bu modülün testleri, bir Azure İzleyici örneğine sahip olmanız gereken canlı ve birim testlerinin bir karışımıdır. Testleri yürütmek için şunları çalıştırmanız gerekir:
rush update
rush build -t @azure/monitor-query
cd into sdk/monitor/monitor-query
-
sample.env
dosyasını.env
kopyalama -
.env
dosyasını bir düzenleyicide açın ve değerleri doldurun. -
npm run test
.
Daha fazla ayrıntı için testleri klasörümüzü görüntüleyin.
İlgili projeler
- JavaScript için Microsoft Azure SDK
- Azure İzleyici
Azure SDK for JavaScript