SlideShare a Scribd company logo
1 of 11
.NET Core diag tips
V1.1 2018/1/27 .NET Fringe Japan 2018
藤原 雄介 @yfakariya
このセッションについて
▪ .NET Fringeなのですがあまりディープな話はしません
▪ しかもAPIの名前空間がすべてMicrosoft.*
▪ ロガーをカスタマイズしてみよう、AppInsightsをカスタマイズしてみようという気にはなるかも
2
ログ
▪ Microsoft.Extensions.Logging
▪ ファサードとしてインターフェイスを定義しつつ、既定の実装も用意
▪ 構造化ロギングをサポート
▪ アダプター
▪ NLog、Serilog、TraceSource
▪ MS製ロガー
▪ Debug、Console、EventSource、EventLog、AppServiceDiagnostics、AppInsights
3
構造化ロギング
▪ M.E.Loggingの以下の拡張メソッドは構造化ロギングをサポート
▪ LogCritical
▪ LogError
▪ LogWarning
▪ LogInformation
▪ LogDebug
▪ LogTrace
▪ 値をどう見せるのかはLoggerの実装依存
▪ 構造化して出さずにフォールバックするのも自由
4
構造化ロギング
▪ formatで指定した名前で、argsで指定した値が入る
▪ 名前と値の紐づけは順序ベース
5
logger.LogDebug("Hello, {user}, I’m {service}", userName, serviceName)
string format object[] args
LogXxx拡張メソッド
Log<T>メソッド
"Hello, {user}, I’m {service}"
"Hello, {0}, I’m {1}"
["userName", "serviceName"]
logger.Log(state, formatter = (s, e)=>s.ToString())
FormattedLogValues
LogValueFormatter
[userName, serviceName]
originalMessage
originalFormat
valueNames
args
構造化ロギング
▪ Loggerの実装は、渡されたstateとformatterを以下のように使う
▪ 文字列実装
▪ stateをformatterに渡す
▪ これは最終的に(先ほどの図の変数名を使うと)String.Format(orginalFormat, args)になる
▪ Debug、Console、AppServiceDiagnosticsなど
▪ 構造化実装
▪ stateをIReadOnly<KeyValuePair<string, object>>にキャストし、JSON等に直す
▪ Serilog(のJsonFormatter系)、AppInsightsなど
6
App Insights
▪ 詳細や実用的な話は@takekazuomiさんがすでに述べているので割愛
▪ アプリケーションのメトリクスを採取するライブラリと、収集・分析用のSaaS
▪ SaaS側の話や.NETじゃないライブラリの話は別途
▪ カスタムのイベント(運用的な事象、発生のみを識別)、メトリクス(集計可能な数値)、トレース
(文字列)を出力可能(TelemetryClientクラスを使用)
▪ Log4netやNLogなどに出力をリダイレクト可能
▪ 今日は組み込みのメトリクスについて
7
App Insights 組み込みのメトリクス
▪ マジカルな方法で勝手に色々なメトリクスを取ってくれる
▪ 実態は
▪ HTTPのリクエストを横取りして記憶する HttpModule(ASP.NET)ないしStartupFilter(ASP.NET
Core)
▪ 標準的なAPI(HttpClientやSqlClient)の呼び出しを横取り
▪ 実装はここ
▪ https://github.com/Microsoft/ApplicationInsights-dotnet-server/tree/master/Src/DependencyCollector/
▪ 何が出ているのかの詳細も(corefxなどのソースコードを使って)追える
8
HTTPリクエスト関連
▪ ざっくりとした動作
▪ HttpContextから情報を取得
▪ 中間データ(たとえば要求ID)はHttpContextに保存
▪ ASP.NET/ASP.NET Coreからの診断イベントをDiagnosticsListenerで取得
▪ つまりはAPサーバーのインストゥルメントを横取り、集計してTelemetryClientで送っているだけ
▪ 詳細
▪ ASP.NET
▪ https://github.com/Microsoft/ApplicationInsights-dotnet-server/tree/master/Src/Web
▪ のWeb.Net45/ImplementationとWeb.Shared.Net/Implementation
▪ ASP.NET Core
▪ https://github.com/Microsoft/ApplicationInsights-
aspnetcore/tree/master/src/Microsoft.ApplicationInsights.AspNetCore/Extensibility/Implementation
9
依存先関連
▪ ざっくりとした動作
▪ .NET FrameworkでProfiler APIが有効な場合はCLRのProfiler APIでHttpWebRequest、SqlConnection、
SqlCommandのPrologueとEpilogueイベントをフック
▪ Profiler APIが無効な.NET Framework 4.5以降の場合はETW(EventListener)でSystem.Net.Httpと
System.Data.SqlClientのイベントをフック
▪ CoreFxのDiagnosticsListenerで(CoreFx由来の)System.Net.HttpとSystem.Data.SqlClientのイベントをフッ
ク
▪ .NETの場合はランタイムに割り込み、そうでない場合はライブラリのインストゥルメントを横取りして
TelemetryClientで送っているだけ
▪ 詳細
▪ https://github.com/Microsoft/ApplicationInsights-dotnet-
server/blob/master/Src/DependencyCollector/Shared/Implementation/ProfilerRuntimeInstrumentation.c
s
▪ https://github.com/Microsoft/ApplicationInsights-dotnet-
server/blob/master/Src/DependencyCollector/Shared/DependencyTrackingTelemetryModule.cs
10
Let’s hack
▪ Diagnostics Sourceを使えば、AppInsights相当の機能を作ることができる
▪ Diagnostics Sourceを仕込めば、MySQL、PostgreSQL、Cassandra、Redis、GRPC
なども連携できる
11

More Related Content

Similar to .NET Core diagnostics tips

MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜Takahiro Inoue
 
サーバーレスの今とこれから
サーバーレスの今とこれからサーバーレスの今とこれから
サーバーレスの今とこれから真吾 吉田
 
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜Ryo Sasaki
 
LineairDBの紹介
LineairDBの紹介LineairDBの紹介
LineairDBの紹介Sho Nakazono
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624Yusuke Suzuki
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps
『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps 『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps
『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps Google Cloud Platform - Japan
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitSeiya Mizuno
 
jBOLT Ver3.2
jBOLT Ver3.2jBOLT Ver3.2
jBOLT Ver3.2skudoh
 
Infrastructure as Codeの取り組みと改善
Infrastructure as Codeの取り組みと改善Infrastructure as Codeの取り組みと改善
Infrastructure as Codeの取り組みと改善Takashi Honda
 
【20-E-5】実践!Infrastructure as a Codeの取り組みと改善
【20-E-5】実践!Infrastructure as a Codeの取り組みと改善【20-E-5】実践!Infrastructure as a Codeの取り組みと改善
【20-E-5】実践!Infrastructure as a Codeの取り組みと改善Developers Summit
 
Lagopus Project (Open Source Conference)
Lagopus Project (Open Source Conference)Lagopus Project (Open Source Conference)
Lagopus Project (Open Source Conference)Tomoya Hibi
 
AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月
AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月
AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月VirtualTech Japan Inc.
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説Daisuke Nishino
 

Similar to .NET Core diagnostics tips (20)

Grailsのススメ(仮)
Grailsのススメ(仮)Grailsのススメ(仮)
Grailsのススメ(仮)
 
hbstudy#06
hbstudy#06hbstudy#06
hbstudy#06
 
2013 Ignite UI 最新情報 in 岡山
2013 Ignite UI 最新情報 in 岡山2013 Ignite UI 最新情報 in 岡山
2013 Ignite UI 最新情報 in 岡山
 
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
 
サーバーレスの今とこれから
サーバーレスの今とこれからサーバーレスの今とこれから
サーバーレスの今とこれから
 
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
[Okta x Jamf合同新年会] Okta Workflowsによるノーコード業務改善 〜Jamf APIを使ってMac端末情報を自動収集してみよう〜
 
LineairDBの紹介
LineairDBの紹介LineairDBの紹介
LineairDBの紹介
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps
『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps 『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps
『 イドラ ファンタシースターサーガ 』を支える GCP | Google Cloud INSIDE Games & Apps
 
【初心者向け】API を使ってクラウドの管理を自動化しよう
【初心者向け】API を使ってクラウドの管理を自動化しよう【初心者向け】API を使ってクラウドの管理を自動化しよう
【初心者向け】API を使ってクラウドの管理を自動化しよう
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent Bit
 
jBOLT Ver3.2
jBOLT Ver3.2jBOLT Ver3.2
jBOLT Ver3.2
 
Infrastructure as Codeの取り組みと改善
Infrastructure as Codeの取り組みと改善Infrastructure as Codeの取り組みと改善
Infrastructure as Codeの取り組みと改善
 
【20-E-5】実践!Infrastructure as a Codeの取り組みと改善
【20-E-5】実践!Infrastructure as a Codeの取り組みと改善【20-E-5】実践!Infrastructure as a Codeの取り組みと改善
【20-E-5】実践!Infrastructure as a Codeの取り組みと改善
 
Lagopus Project (Open Source Conference)
Lagopus Project (Open Source Conference)Lagopus Project (Open Source Conference)
Lagopus Project (Open Source Conference)
 
AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月
AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月
AIの力で障害検知・解析をサポート!Loom(ログ解析ソリューション)のご紹介 - OpenStack最新情報セミナー 2017年7月
 
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
『これからの.NETアプリケーション開発』セミナー .NET用アプリケーション フレームワーク Open 棟梁 概説
 
LogicFlow 概要
LogicFlow 概要LogicFlow 概要
LogicFlow 概要
 

.NET Core diagnostics tips

  • 1. .NET Core diag tips V1.1 2018/1/27 .NET Fringe Japan 2018 藤原 雄介 @yfakariya
  • 2. このセッションについて ▪ .NET Fringeなのですがあまりディープな話はしません ▪ しかもAPIの名前空間がすべてMicrosoft.* ▪ ロガーをカスタマイズしてみよう、AppInsightsをカスタマイズしてみようという気にはなるかも 2
  • 3. ログ ▪ Microsoft.Extensions.Logging ▪ ファサードとしてインターフェイスを定義しつつ、既定の実装も用意 ▪ 構造化ロギングをサポート ▪ アダプター ▪ NLog、Serilog、TraceSource ▪ MS製ロガー ▪ Debug、Console、EventSource、EventLog、AppServiceDiagnostics、AppInsights 3
  • 4. 構造化ロギング ▪ M.E.Loggingの以下の拡張メソッドは構造化ロギングをサポート ▪ LogCritical ▪ LogError ▪ LogWarning ▪ LogInformation ▪ LogDebug ▪ LogTrace ▪ 値をどう見せるのかはLoggerの実装依存 ▪ 構造化して出さずにフォールバックするのも自由 4
  • 5. 構造化ロギング ▪ formatで指定した名前で、argsで指定した値が入る ▪ 名前と値の紐づけは順序ベース 5 logger.LogDebug("Hello, {user}, I’m {service}", userName, serviceName) string format object[] args LogXxx拡張メソッド Log<T>メソッド "Hello, {user}, I’m {service}" "Hello, {0}, I’m {1}" ["userName", "serviceName"] logger.Log(state, formatter = (s, e)=>s.ToString()) FormattedLogValues LogValueFormatter [userName, serviceName] originalMessage originalFormat valueNames args
  • 6. 構造化ロギング ▪ Loggerの実装は、渡されたstateとformatterを以下のように使う ▪ 文字列実装 ▪ stateをformatterに渡す ▪ これは最終的に(先ほどの図の変数名を使うと)String.Format(orginalFormat, args)になる ▪ Debug、Console、AppServiceDiagnosticsなど ▪ 構造化実装 ▪ stateをIReadOnly<KeyValuePair<string, object>>にキャストし、JSON等に直す ▪ Serilog(のJsonFormatter系)、AppInsightsなど 6
  • 7. App Insights ▪ 詳細や実用的な話は@takekazuomiさんがすでに述べているので割愛 ▪ アプリケーションのメトリクスを採取するライブラリと、収集・分析用のSaaS ▪ SaaS側の話や.NETじゃないライブラリの話は別途 ▪ カスタムのイベント(運用的な事象、発生のみを識別)、メトリクス(集計可能な数値)、トレース (文字列)を出力可能(TelemetryClientクラスを使用) ▪ Log4netやNLogなどに出力をリダイレクト可能 ▪ 今日は組み込みのメトリクスについて 7
  • 8. App Insights 組み込みのメトリクス ▪ マジカルな方法で勝手に色々なメトリクスを取ってくれる ▪ 実態は ▪ HTTPのリクエストを横取りして記憶する HttpModule(ASP.NET)ないしStartupFilter(ASP.NET Core) ▪ 標準的なAPI(HttpClientやSqlClient)の呼び出しを横取り ▪ 実装はここ ▪ https://github.com/Microsoft/ApplicationInsights-dotnet-server/tree/master/Src/DependencyCollector/ ▪ 何が出ているのかの詳細も(corefxなどのソースコードを使って)追える 8
  • 9. HTTPリクエスト関連 ▪ ざっくりとした動作 ▪ HttpContextから情報を取得 ▪ 中間データ(たとえば要求ID)はHttpContextに保存 ▪ ASP.NET/ASP.NET Coreからの診断イベントをDiagnosticsListenerで取得 ▪ つまりはAPサーバーのインストゥルメントを横取り、集計してTelemetryClientで送っているだけ ▪ 詳細 ▪ ASP.NET ▪ https://github.com/Microsoft/ApplicationInsights-dotnet-server/tree/master/Src/Web ▪ のWeb.Net45/ImplementationとWeb.Shared.Net/Implementation ▪ ASP.NET Core ▪ https://github.com/Microsoft/ApplicationInsights- aspnetcore/tree/master/src/Microsoft.ApplicationInsights.AspNetCore/Extensibility/Implementation 9
  • 10. 依存先関連 ▪ ざっくりとした動作 ▪ .NET FrameworkでProfiler APIが有効な場合はCLRのProfiler APIでHttpWebRequest、SqlConnection、 SqlCommandのPrologueとEpilogueイベントをフック ▪ Profiler APIが無効な.NET Framework 4.5以降の場合はETW(EventListener)でSystem.Net.Httpと System.Data.SqlClientのイベントをフック ▪ CoreFxのDiagnosticsListenerで(CoreFx由来の)System.Net.HttpとSystem.Data.SqlClientのイベントをフッ ク ▪ .NETの場合はランタイムに割り込み、そうでない場合はライブラリのインストゥルメントを横取りして TelemetryClientで送っているだけ ▪ 詳細 ▪ https://github.com/Microsoft/ApplicationInsights-dotnet- server/blob/master/Src/DependencyCollector/Shared/Implementation/ProfilerRuntimeInstrumentation.c s ▪ https://github.com/Microsoft/ApplicationInsights-dotnet- server/blob/master/Src/DependencyCollector/Shared/DependencyTrackingTelemetryModule.cs 10
  • 11. Let’s hack ▪ Diagnostics Sourceを使えば、AppInsights相当の機能を作ることができる ▪ Diagnostics Sourceを仕込めば、MySQL、PostgreSQL、Cassandra、Redis、GRPC なども連携できる 11