Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

.NET Core Generic Host のログをAzure Application Insights で見てみよう!

580 views

Published on

https://vsuc.connpass.com/event/180470/

Published in: Technology
  • Be the first to comment

  • Be the first to like this

.NET Core Generic Host のログをAzure Application Insights で見てみよう!

  1. 1. #vsucjp .NET Core Generic Host のログを Azure Application Insights で見てみよう! 2020/07/04 VSUC #5 @tsubakimoto_s
  2. 2. #vsucjp 松村 優大 (Yuta Matsumura) Chief Technical Architect (C#, PHP, Azure) Microsoft MVP (Development Technologies) Fukuoka.NET Organizer @tsubakimoto_s Currently working for
  3. 3. #vsucjp 今日のテーマ 1. .NET Core の2つのホスト形式の紹介 2. アプリのログを Application Insights に集める 3. 汎用ホストのアプリケーションを ACI で動かす 4. まとめ
  4. 4. #vsucjp Webホスト と 汎用ホスト .NET Core には 2つのホスト形式があります。 1. Web ホスト ... HTTP サーバーを起動するための構成 2. 汎用ホスト ... 上記以外のアプリを起動するための構成 →コンソールアプリ、バックグラウンドアプリ など
  5. 5. #vsucjp Webホスト と 汎用ホスト .NET Core には 2つのホスト形式があります。 1. Web ホスト ... HTTP サーバーを起動するための構成 2. 汎用ホスト ... 上記以外のアプリを起動するための構成 →コンソールアプリ、バックグラウンドアプリ など
  6. 6. #vsucjp コンソールアプリのコードを比較 (Program.cs) class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } class Program { static void Main(string[] args) => CreateHostBuilder(args).Build().Run(); static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); }); } 素のコンソールアプリ 汎用ホストのコンソールアプリ
  7. 7. #vsucjp コンソールアプリのコードを比較 (Program.cs) class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } class Program { static void Main(string[] args) => CreateHostBuilder(args).Build().Run(); static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); }); } 素のコンソールアプリ 汎用ホストのコンソールアプリ
  8. 8. #vsucjp CreateDefaultBuilder で行われること • ルートパスの設定 (Directory.GetCurrentDirectory) • 設定の読込 (環境変数、appsettings.json、シークレット等) • ログプロバイダーの追加 • Console, Debug, EventSource, EventLog (windows only) • スコープの検証と依存関係の検証の有効化 (開発環境のみ)
  9. 9. #vsucjp コンソールアプリのコードを比較 (Program.cs) class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } class Program { static void Main(string[] args) => CreateHostBuilder(args).Build().Run(); static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); }); } 素のコンソールアプリ 汎用ホストのコンソールアプリ
  10. 10. #vsucjp ConfigureServices で行われること • 依存性注入 (Dependency Injection) • ASP.NET Core で提供されている機能と同等 • 以下は自動的に登録される • IHostApplicationLifetime • IHostLifetime • IWebHostEnvironment
  11. 11. #vsucjp IHostApplicationLifetime • 3つのイベントに処理を登録できる • アプリケーション起動後 • アプリケーション終了時 • アプリケーション終了後 グレースフルシャットダウン (正常なシャットダウン)
  12. 12. #vsucjp Ctrl + C で停止
  13. 13. #vsucjp 汎用ホストアプリケーションに Azure Application Insights を使用する https://github.com/tsubakimoto/vscommunity-sample
  14. 14. #vsucjp セットアップ 1. .NET Core コンソールアプリケーションの作成 2. NuGet パッケージのインストール Microsoft.ApplicationInsights.WorkerService 3. 汎用ホストの構成に変更 4. appsettings.json の追加 +インストゥルメンテーションキーの追加 +プロジェクト設定 5. テレメトリクライアントを DI に登録
  15. 15. #vsucjp $ dotnet new console -n VsCommuunitySample $ cd VsCommuunitySample $ dotnet add package Microsoft.ApplicationInsights.WorkerService $ dotnet add package Microsoft.Extensions.Hosting $ touch appsettings.json
  16. 16. #vsucjp
  17. 17. #vsucjp インストゥルメンテーションキー デフォルトのログレベル (標準出力) Application Insights のログレベル
  18. 18. #vsucjp ビルド時に appsettings.json を出力フォルダにコピー
  19. 19. #vsucjp テレメトリ収集のための実装 1. テレメトリクライアントを DI から取り出す 2. “操作”の作成 (StartOperation メソッド) 3. ILogger でログを記述 4. 最終的にテレメトリを送信する (Flush メソッド) 5. アプリケーション終了前に数秒待機
  20. 20. #vsucjp テレメトリクライアントの取り出し 操作の作成、ログの出力
  21. 21. #vsucjp 起動後の処理 終了時の処理 終了後の処理
  22. 22. #vsucjp インメモリのテレメトリを送信 送信後からプロセス終了までに数秒待機が必要
  23. 23. #vsucjp
  24. 24. #vsucjp Azure で汎用ホストアプリを動かすには つまりコンソールアプリケーションを動かすには • Web Apps (WebJobs) • Web App for Containers • Azure Container Instances (ACI) • Azure Kubernetes Service (AKS)
  25. 25. #vsucjp Q. バッチなら Azure Functions でいいのでは? • コンテナー+汎用ホストアプリケーション • 可搬性を保ちたい • ファイル等のリソースを扱う (コンテナー実行後に破棄) • Azure Functions でのバッチ • 上記以外の場合 • トリガーが必要な場合
  26. 26. #vsucjp Q. バッチなら Azure Functions でいいのでは? • コンテナー+汎用ホストアプリケーション • 可搬性を保ちたい • ファイル等のリソースを扱う (コンテナー実行後に破棄) • Azure Functions でのバッチ • 上記以外の場合 • トリガーが必要な場合
  27. 27. #vsucjp https://github.com/tsubakimoto/vscommunity-sample
  28. 28. #vsucjp
  29. 29. #vsucjp※ Azure Cloud Shell で以下のコマンドを実行する $ git clone https://github.com/tsubakimoto/vscommunity-sample.git $ cd vscommunity-sample/VsCommuunitySample $ az acr build --image generichostsample:v1 ¥ --registry {your-azure-container-registry-name} ¥ --file Dockerfile . ACR Tasks ソースコード及び Dockerfile を使って、 コンテナーイメージのビルドを自動化する機能
  30. 30. #vsucjp
  31. 31. #vsucjp
  32. 32. #vsucjp
  33. 33. #vsucjp アプリ内の操作および ILogger のログ
  34. 34. #vsucjp Azure Container Instances で実行した
  35. 35. #vsucjp リンク集 • https://github.com/tsubakimoto/vscommunity-sample • https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/worker-service • https://github.com/microsoft/ApplicationInsights-dotnet/issues/407 • https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/host/generic- host?view=aspnetcore-3.1 • https://docs.microsoft.com/ja-jp/azure/container-registry/container-registry- tasks-overview • https://docs.microsoft.com/ja-jp/azure/container-instances/container-instances- environment-variables
  36. 36. #vsucjp まとめ • .NET Core の汎用ホストには、コンソールアプリケーション やバックグラウンドアプリケーションの用途で使える • Application Insights でのテレメトリ収集には Microsoft.ApplicationInsights.WorkerService を使う • アプリケーション終了時に Task.Delay(n).Wait() が必要 • コンテナーイメージを作るパイプラインに ACR Tasks 便利 ※ Azure Pipelines もオススメ

×