Azure Monitor 内の Log Analytics ワークスペース、アプリケーション、リソース全体のデータにクエリを実行する

複数のワークスペース、アプリケーション、リソースのデータにクエリを実行するには、次の 2 つの方法があります。

  • この記事の中で説明するように、workspace()app()、または resource() 式を使用して、ワークスペース、アプリ、またはリソース情報を明示的に指定します。
  • リソース コンテキスト クエリを使用して、暗黙的に行います。 特定のリソース、リソース グループ、またはサブスクリプションのコンテキスト内でクエリを実行すると、そのクエリはこれらのリソースのデータを含むすべてのワークスペースから、関連データを取得します。 リソースコンテキスト クエリは、従来の Application Insights リソースからはデータを取得しません。

この記事では、workspace()app()resource() 式を使用して、複数の Log Analytics ワークスペース、アプリケーション、リソースのデータに対してクエリを実行する方法について説明します。

Azure Lighthouse 経由で他の Microsoft Entra テナントのサブスクリプションを管理している場合は、それらの顧客テナントに作成された Log Analytics ワークスペースをクエリに含めることができます。

重要

ワークスペース ベースの Application Insights リソースを使用している場合、テレメトリは、その他のすべてのログ データと共に Log Analytics ワークスペースに格納されます。 workspace() 式を使用して、複数のワークスペース内のアプリケーションのデータにクエリを実行します。 同じワークスペース内にある複数のアプリケーションのデータにクエリを実行するために、クロスワークスペース クエリは必要ありません。

必要なアクセス許可

  • クエリを実行する Log Analytics ワークスペースに対し、Microsoft.OperationalInsights/workspaces/query/*/read アクセス許可が必要です。これは、たとえば、Log Analytics 閲覧者組み込みロールによって提供されます。
  • クエリを保存するには、そのクエリを保存するクエリ パックに対して microsoft.operationalinsights/querypacks/queries/action アクセス許可が必要です (たとえば、Log Analytics 共同作成者組み込みロールによって提供されるように)。

制限事項

  • クロスリソースおよびクロスサービス クエリでは、パラメーター化された関数と、その定義に他のクロスワークスペースまたはクロスサービス式 (adx()arg()resource()workspace()app() など) が含まれている関数はサポートされません。
  • 1 つのクエリ内には、最大 100 個の Log Analytics ワークスペースまたは従来の Application Insights リソースを含めることができます。
  • 多数のリソースに対してクエリを実行すると、クエリの速度が大幅に低下する可能性があります。
  • ログ検索アラート内のクロスリソース クエリは、現行の scheduledQueryRules API でのみサポートされます。 レガシ Log Analytics Alerts API を使用している場合、現行の API に切り替える必要があります。
  • 別のワークスペースなどのクロスリソースへの参照は明示的に行う必要があり、パラメーター化することはできません。

関数を使用してワークスペース、アプリケーション、リソース全体にクエリを実行する

このセクションでは、関数を使用して、および関数を使用せずに、ワークスペース、アプリケーション、リソースにクエリを実行する方法について説明します。

関数を使用せずにクエリを実行する

任意のリソース インスタンスの複数のリソースにクエリを実行できます。 これらのリソースとしては、ワークスペースとアプリを組み合わせて使用できます。

3 つのワークスペースにわたるクエリの例:

union 
  Update, 
  workspace("00000000-0000-0000-0000-000000000001").Update, 
  workspace("00000000-0000-0000-0000-000000000002").Update
| where TimeGenerated >= ago(1h)
| where UpdateState == "Needed"
| summarize dcount(Computer) by Classification

union 演算子、where 演算子、summarize 演算子の詳細については、「union 演算子」、「where 演算子」、「summarize 演算子」を参照してください。

関数を使用したクエリ

クロスリソース クエリを使用して、複数の Log Analytics ワークスペースおよび Application Insights コンポーネントのデータを関連付ける場合、クエリは複雑になり、管理が困難になる可能性があります。 Azure Monitor ログ クエリでの関数を利用して、クエリ リソースの範囲設定からクエリ ロジックを分離する必要があります。 この方法で、クエリの構造を簡略化できます。 次の例は、複数の Application Insights コンポーネントを監視し、アプリケーション名毎に失敗した要求の数を視覚化する方法を示しています。

次の例のように Application Insights コンポーネントの範囲を参照するクエリを作成します。 withsource= SourceApp コマンドで、ログを送信したアプリケーション名を指定する列を追加します。 このクエリを関数として保存し、applicationsScoping という別名を付けます。

// crossResource function that scopes my Application Insights components
union withsource= SourceApp
app('00000000-0000-0000-0000-000000000000').requests, 
app('00000000-0000-0000-0000-000000000001').requests,
app('00000000-0000-0000-0000-000000000002').requests,
app('00000000-0000-0000-0000-000000000003').requests,
app('00000000-0000-0000-0000-000000000004').requests

これで、次の例のようなクロスリソース クエリでこの関数を使用できるようになります。 関数のエイリアス applicationsScoping から、すべての定義済みアプリケーションから要求テーブルの和集合が返されます。 このクエリによって、失敗した要求がフィルター処理され、アプリケーション別に傾向が視覚化されます。 parse 演算子はこの例では省略可能です。 SourceApp プロパティからアプリケーション名が抽出されます。

applicationsScoping 
| where timestamp > ago(12h)
| where success == 'False'
| parse SourceApp with * '(' applicationId ')' * 
| summarize count() by applicationId, bin(timestamp, 1h) 
| render timechart

Note

この方法はログ検索アラートでは使用することができません。これは、アラートの作成時にアラート ルール リソース (ワークスペースやアプリケーションなど) のアクセス検証が実行されるためです。 アラートの作成後に新しいリソースを関数に追加することはサポートされません。 ログ検索アラートにおけるリソースの範囲指定に関数を使用する場合は、ポータル内で、または Azure Resource Manager テンプレートを使用してアラート ルールを編集し、リソースの範囲指定を更新する必要があります。 または、リソースの一覧をログ検索アラート クエリ内に含めることができます。

workspace() を使用して Log Analytics ワークスペース全体にクエリを実行する

workspace() 式を使用して、同じリソース グループ、別のリソース グループ、または別のサブスクリプション内にある、特定のワークスペースからデータを取得します。 この式を使用して、Application Insights クエリにログ データを含めたり、ログ クエリで複数のワークスペースのデータにクエリを実行したりできます。

構文

workspace(識別子)

引数

*Identifier*: 次の表の中のいずれかの形式を使用して、ワークスペースを識別します。

識別子 説明
ID ワークスペースの GUID workspace("00000000-0000-0000-0000-000000000000")
Azure リソース ID Azure リソースの識別子 workspace("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/Contoso/providers/Microsoft.OperationalInsights/workspaces/contosoretail")

workspace("00000000-0000-0000-0000-000000000000").Update | count
workspace("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/Contoso/providers/Microsoft.OperationalInsights/workspaces/contosoretail").Event | count
union 
( workspace("00000000-0000-0000-0000-000000000000").Heartbeat | where Computer == "myComputer"),
(app("00000000-0000-0000-0000-000000000000").requests | where cloud_RoleInstance == "myRoleInstance")
| count  
union 
(workspace("00000000-0000-0000-0000-000000000000").Heartbeat), (app("00000000-0000-0000-0000-000000000000").requests) | where TimeGenerated between(todatetime("2023-03-08 15:00:00") .. todatetime("2023-04-08 15:05:00"))

app() を使用して従来の Application Insights アプリケーション全体にクエリを実行する

app 式を使用して、同じリソース グループ、別のリソース グループ、または別のサブスクリプション内にある、特定の従来の Application Insights リソースからデータを取得します。 ワークスペース ベースの Application Insights リソースを使用している場合、テレメトリは、その他のすべてのログ データと共に Log Analytics ワークスペースに格納されます。 workspace() 式を使用して、複数のワークスペース内のアプリケーションのデータにクエリを実行します。 同じワークスペース内にある複数のアプリケーションのデータにクエリを実行するために、クロスワークスペース クエリは必要ありません。

構文

app(識別子)

引数

*Identifier*: 以下の表の中のいずれかの形式を使用して、アプリを識別します。

識別子 説明
id アプリの GUID app("00000000-0000-0000-0000-000000000000")
Azure リソース ID Azure リソースの識別子 app("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/Fabrikam/providers/microsoft.insights/components/fabrikamapp")

app("00000000-0000-0000-0000-000000000000").requests | count
app("/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/Fabrikam/providers/microsoft.insights/components/fabrikamapp").requests | count
union 
(workspace("00000000-0000-0000-0000-000000000000").Heartbeat | where Computer == "myComputer"),
(app("00000000-0000-0000-0000-000000000000").requests | where cloud_RoleInstance == "myColumnInstance")
| count  
union 
(workspace("00000000-0000-0000-0000-000000000000").Heartbeat), (app("00000000-0000-0000-0000-000000000000").requests)
| where TimeGenerated between(todatetime("2023-03-08 15:00:00") .. todatetime("2023-04-08 15:05:00"))

resource() を使用してリソース間でデータを関連付ける

resource 式は、他のリソースからデータを取得するために、リソースをスコープとする Azure Monitor クエリで使用されます。

構文

resource(識別子)

引数

*Identifier*: データを関連付けるリソース、リソース グループ、またはサブスクリプションを識別します。

識別子 説明
リソース リソースのデータが含まれます。 resource("/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcesgroups/myresourcegroup/providers/microsoft.compute/virtualmachines/myvm")
リソースグループまたはサブスクリプション リソースとそれに含まれるすべてのリソースのデータが含まれます。 resource("/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcesgroups/myresourcegroup)

union (Heartbeat),(resource("/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcesgroups/myresourcegroup/providers/microsoft.compute/virtualmachines/myvm").Heartbeat) | summarize count() by _ResourceId, TenantId
union (Heartbeat),(resource("/subscriptions/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcesgroups/myresourcegroup).Heartbeat) | summarize count() by _ResourceId, TenantId

次のステップ

ログ クエリの概要と、Azure Monitor ログ データがどのように構成されているかについては、Azure Monitor でログ データを分析することに関するページをご覧ください。