Azure SQLの依存関係(EF Core 3.1.7に基づく)がAppInsightsのアプリケーションマップに表示されない

Aug 19 2020

.net Core3.1に基づくAzure関数があります。最新バージョンのEntityFrameworkCoreを使用しています。

Azure SQLに接続して、データを保存/取得/クエリします。アプリインサイトのライブストリームで接続を開く、接続を閉じるなどのAzure SQLのログを表示できる場合があります(サンプリングが有効になっていることが原因の場合もあります)

ただし、アプリインサイトのアプリケーションマップにはAzureSQLの依存関係はありません。トレーステーブルを見ると、AzureSQLに関連するものは何もありません。

Azure SQLを依存関係として表示するために有効にする必要があるものはありますか?いくつかのmsdnの記事を読んだところ、Microsoft.Data.SqlClientパッケージを使用するとSQLが自動的に検出されることがわかりました(EFコアにはそのパッケージが既に内部的にインストールされていることがわかります)。

また、上記が回答されて解決された場合のフォローアップの質問-接続が破棄/閉じられたかどうか、またはアプリインサイトで特定の関数呼び出しに対して接続がいつ開かれた/閉じられたかを確認する方法はありますか?

以下のコメントに従って、さらに情報を追加し、

スタートアップファイルで次のステートメントを使用して、DbContextをサービスに追加します。

builder.Services.AddDbContextPool<OurDbContext>(options =>
{
    options.UseSqlServer("connectionstring"), builder =>
    {
       builder.EnableRetryOnFailure(3, TimeSpan.FromSeconds(2), null);
    });
});

OurDbContextクラスには次のコンストラクタがあります。

public OurDbContext(DbContextOptions<OurDbContext> options)
    : base(options)
{
}

次に、このコンテキストを使用してSQLと通信するさまざまなリポジトリにOurDbContextクラスを挿入します。以下のように:

public class Repo : IRepo
{
  public Repo(OurDbContext ourDbContext)
  {

  }
  
  public async Task AddAsync(Entity entity)
  {
    ourDbContext.AddAsync(entity);
    ourDbContext.SaveChangesAsync()
  }
}

これらのリポジトリを関数クラスに挿入し、次のような上記のメソッドを呼び出します。

await _repo.AddAsync()

以下のEFCoreパッケージを使用します

以下のhost.jsonファイルがあります。

{
    "version": "2.0",
    "logging": {
        "applicationInsights": {
            "samplingExcludedTypes": "Request",
            "samplingSettings": {
                "isEnabled": true
            }
        }
    }
}

注:以下のリンクを試して、SQLの依存関係がアプリインサイトに表示されているかどうかを確認しましたが、使用しているEFCore /最新バージョンのAzure関数の構成は使用していません。追加したのは、ローカル設定のAPPINSIGHTS_INSTRUMENTATIONKEYだけです。

https://dev.to/azure/using-entity-framework-with-azure-functions-50aa GitHubソースコード: https://github.com/jeffhollan/functions-csharp-entityframeworkcore

上記により、アプリのインサイトでSQLの依存関係を確認できました。ただし、上記でAzure関数のバージョンである.net core、EFCoreに変更すると、現在のプロジェクトで使用しているため、SQLの依存関係がアプリインサイトに表示されなくなりました。ただし、ログレベルより下に追加すると、コンソールにデバッグログが表示されます。

"Logging": {
    "LogLevel": {
      "Default": "Debug",
    }
}

KrishnenduGhosh-MSFTの以下のコメントによるスクリーンショット。

stackifyからのログ。

回答

krishg Aug 30 2020 at 10:00

host.jsonのログセクションを以下のように更新して、情報レベルのログを許可します(上記で投稿した既存の構成にlogLevelを追加したことに注意してください)。指定しない場合、デフォルトでは警告です。ここの注で述べたように、依存関係は情報レベルでログに記録されます。また、excludedTypes(samplingExcludedTypesではない)は、ドキュメントに従ってsamplingSettings内にある必要があることに注意してください。

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "excludedTypes": "Dependency;Request"
            }
        },
    "logLevel": {"default": "Information"}
  }
}

また、Azure関数の場合は、スタートアップにmicrosoft.applicationinsights.aspnetcorenugetを追加しないでくださいbuilder.Services.AddApplicationInsightsTelemetry();。これは、asp.netコアアプリケーション用です。関数はそれを持つべきではありませんhttps://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#logging-services