Megosztás a következőn keresztül:


Azure Monitor lekérdezési naplók JavaScripthez készült ügyféloldali kódtár – 1.0.0-s verzió

A Azure Monitor lekérdezési naplók ügyféloldali kódtára csak olvasható lekérdezések végrehajtására szolgál a Azure Monitor naplók adatplatformján:

  • Naplók – Napló- és teljesítményadatokat gyűjt és rendszerez a figyelt erőforrásokból. A különböző forrásokból származó adatok, például az Azure-szolgáltatások platformnaplói, a virtuálisgép-ügynökök napló- és teljesítményadatai, valamint az alkalmazások használati és teljesítményadatai egyetlen Azure Log Analytics-munkaterületen összevonhatók. A különböző adattípusok együtt elemezhetők a Kusto lekérdezési nyelv használatával.

Áttérés tanácsadói programból @azure/monitor-query⚠️

Az Áttelepítési útmutatóban részletes útmutatást talál arról, hogyan frissítheti az alkalmazáskódot az eredeti @azure/monitor-query csomagról a könyvtárba @azure/monitor-query-logs .

Erőforrások:

Kezdő lépések

Támogatott környezetek

További információért tekintse meg támogatási szabályzatunkat.

Előfeltételek

A csomag telepítése

Telepítse a JavaScripthez készült Azure Monitor Query ügyféloldali kódtárat az npm használatával:

npm install --save @azure/monitor-query-logs

Az ügyfél létrehozása

A naplók lekérdezéséhez hitelesített ügyfélre van szükség. A hitelesítéshez az alábbi példa a @azure/identity csomag DefaultAzureCredential értékét használja.

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

const credential = new DefaultAzureCredential();

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

Ügyfél konfigurálása az Azure szuverén felhőhöz

Alapértelmezés szerint a kódtár ügyfelei az Azure nyilvános felhő használatára vannak konfigurálva. Ha ehelyett szuverén felhőt szeretne használni, adja meg a megfelelő végpontot és célközönség értékét az ügyfél példányosításakor. Például:

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

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

Hajtsa végre a lekérdezést

A naplók lekérdezésére vonatkozó példákért tekintse meg a Példák szakaszt.

Főbb fogalmak

Naplók lekérdezési sebességkorlátai és szabályozása

A Log Analytics szolgáltatás szabályozást alkalmaz, ha a kérések aránya túl magas. A korlátok, például a visszaadott sorok maximális száma a Kusto-lekérdezésekre is érvényesek. További információ: Lekérdezési API.

Példák

Naplók lekérdezése

A LogsQueryClient Log Analytics-munkaterület lekérdezésére használható a Kusto lekérdezési nyelv használatával. Karakterláncként timespan.duration adható meg ISO 8601 időtartamú formátumban. Használhatja az Durations ISO 8601 gyakran használt időtartamokhoz megadott állandókat.

A naplókat a Log Analytics-munkaterület azonosítója vagy az Azure-erőforrás-azonosító alapján kérdezheti le. Az eredményt a rendszer sorok gyűjteményét tartalmazó táblázatként adja vissza.

Munkaterület-központú naplók lekérdezése

A munkaterület-azonosító szerinti lekérdezéshez használja a következő LogsQueryClient.queryWorkspace módszert:

import { LogsQueryClient, Durations, LogsQueryResultStatus } from "@azure/monitor-query-logs";
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);
  }
}

Erőforrás-központú naplók lekérdezése

Az alábbi példa bemutatja, hogyan kérdezheti le a naplókat közvetlenül egy Azure-erőforrásból. Itt a queryResource metódust használjuk, és a rendszer átadja az Azure-erőforrás-azonosítót. Például: /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/{resource-provider}/{resource-type}/{resource-name}.

Az erőforrás-azonosító megkeresése:

  1. Lépjen az erőforrás oldalára a Azure Portal.
  2. Az Áttekintés panelen válassza a JSON-nézet hivatkozást.
  3. Az eredményül kapott JSON-ban másolja ki a id tulajdonság értékét.
import { DefaultAzureCredential } from "@azure/identity";
import { LogsQueryClient, Durations, LogsQueryResultStatus } from "@azure/monitor-query-logs";

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

console.log(`Results for query '${kustoQuery}'`);

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

Naplók lekérdezési válaszának kezelése

A queryWorkspace függvény LogsQueryClient egy objektumot LogsQueryResult ad vissza. Az objektum típusa lehet LogsQuerySuccessfulResult vagy .LogsQueryPartialResult A válasz hierarchiája a következő:

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

Például egy válasz táblákkal való kezeléséhez:

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

A teljes minta itt található.

Kötegelt naplók lekérdezése

Az alábbi példa több lekérdezés egyidejű küldését mutatja be a kötegelt lekérdezési API használatával. A lekérdezések objektumok listájaként BatchQuery ábrázolhatók.

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

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

Naplók kezelése kötegelt lekérdezési válasz

A queryBatch függvény LogsQueryClient egy objektumot LogsQueryBatchResult ad vissza. LogsQueryBatchResult A következő lehetséges típusú objektumok listáját tartalmazza:

  • LogsQueryPartialResult
  • LogsQuerySuccessfulResult
  • LogsQueryError

A válasz hierarchiája a következő:

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

A következő kód például egy kötegelt naplók lekérdezési választ kezel:

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

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

A teljes minta itt található.

Speciális naplók lekérdezési forgatókönyvei

Naplók lekérdezési időtúllépésének beállítása

Egyes naplólekérdezések végrehajtása 3 percnél tovább tart. A kiszolgáló alapértelmezett időtúllépése 3 perc. A kiszolgáló időtúllépését legfeljebb 10 percre növelheti. A következő példában az LogsQueryOptions objektum serverTimeoutInSeconds tulajdonságával 10 percre növelheti a kiszolgáló időtúllépését:

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

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;

Több munkaterület lekérdezése

Ugyanaz a naplólekérdezés több Log Analytics-munkaterületen is végrehajtható. A Kusto-lekérdezés mellett a következő paraméterekre van szükség:

  • workspaceId - Az első (elsődleges) munkaterület-azonosító.
  • additionalWorkspaces - A munkaterületek listája, kivéve a workspaceId paraméterben megadott munkaterületet. A paraméter listaelemei a következő azonosítóformátumokból állhatnak:
    • Minősített munkaterületnevek
    • Munkaterület-azonosítók
    • Azure-erőforrásazonosítók

A következő lekérdezés például három munkaterületen fut:

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

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;

Az egyes munkaterületek eredményeinek megtekintéséhez az TenantId oszlop használatával rendezheti az eredményeket, vagy szűrheti őket a Kusto-lekérdezésben.

Eredmények rendelése TenantId szerint

AppEvents | order by TenantId

Eredmények szűrése TenantId szerint

AppEvents | filter TenantId == "<workspace2>"

A teljes minta itt található.

Statisztikák belefoglalása

Naplók lekérdezés-végrehajtási statisztikáinak, például a processzor- és memóriahasználatnak a lekérése:

  1. Állítsa a LogsQueryOptions.includeQueryStatistics tulajdonságot trueértékre.
  2. Nyissa meg az objektumon statistics belüli mezőtLogsQueryResult.

Az alábbi példa kinyomtatja a lekérdezés végrehajtási idejét:

import { LogsQueryClient, Durations } from "@azure/monitor-query-logs";
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,
  },
);

console.log(`Results for query '${kustoQuery}'`);

Mivel a statistics hasznos adatok szerkezete lekérdezésenként változik, a rendszer visszatérési típust Record<string, unknown> használ. A nyers JSON-választ tartalmazza. A statisztikák a query JSON tulajdonságában találhatók. Például:

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

Vizualizáció belefoglalása

Vizualizációs adatok lekérése naplólekérdezésekhez a render operátor használatával:

  1. Állítsa a LogsQueryOptions.includeVisualization tulajdonságot trueértékre.
  2. Nyissa meg az objektumon visualization belüli mezőtLogsQueryResult.

Például:

import { LogsQueryClient, Durations } from "@azure/monitor-query-logs";
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);

Mivel a visualization hasznos adatok szerkezete lekérdezésenként változik, a rendszer visszatérési típust Record<string, unknown> használ. A nyers JSON-választ tartalmazza. Például:

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

Hibaelhárítás

A különböző hibaforgatókönyvek diagnosztizálásához tekintse meg a hibaelhárítási útmutatót.

Következő lépések

További információ a Azure Monitor: Azure Monitor szolgáltatás dokumentációja.

Közreműködés

Ha hozzá szeretne járulni ehhez a kódtárhoz, olvassa el a közreműködői útmutatót, amelyből többet is megtudhat a kód összeállításáról és teszteléséről.

Ennek a modulnak a tesztjei élő és egységtesztek keverékei, amelyekhez Azure Monitor-példányra van szükség. A tesztek végrehajtásához a következőt kell futtatnia:

  1. rush update
  2. rush build -t @azure/monitor-query-logs
  3. cd into sdk/monitor/monitor-query
  4. Másolja a fájlt sample.env a .env
  5. Nyissa meg a fájlt .env egy szerkesztőben, és töltse ki az értékeket.
  6. npm run test.

További részletekért tekintse meg a tesztek mappát.