TelemetryClient と Activity の挙動を理解する (1) - データモデル

このブログのゴールは、Application Insights correlation で使うTelemetryClient と Activity の使い方を正しく理解すること。

分散トレーシングに関しては、Application Insights では２つの方法がサポートされている。

* [HttpCorrelationProtocol](https://github.com/dotnet/corefx/blob/master/src/System.Diagnostics.DiagnosticSource/src/HttpCorrelationProtocol.md)
* [Trace Context W3C Editor's Draft 29 October 2018](https://w3c.github.io/trace-context/?fbclid=IwAR3exAmMf2QMok0eMzegZrguQXYZejVNCCBYSknIHldoRKlYtAjiKFCZPiM)

この両方の挙動を理解してみたい。最初にこのドキュメントから読み始める

* [Telemetry correlation in Application Insights](https://docs.microsoft.com/en-us/azure/application-insights/application-insights-correlation?fbclid=IwAR2mopnCudzvk1-mSxp8jG4HyGLBvvst0uA5wVqjTUROoahPsrVBqJE7-7E#w3c-distributed-tracing)

# Application Insights のデータモデル

* [Application Insights telemetry data model](https://docs.microsoft.com/en-us/azure/application-insights/application-insights-data-model)

Application Insights のデータモデルは下記のアプリケーションの実行パターンが基になっている。

![application-insights-data-model.png](https://qiita-image-store.s3.amazonaws.com/0/3470/329255a6-730e-888f-52e8-93212275ce8c.png)

## Web アプリケーションフレームワークで自動で集められる３種類のテレメトリ

### [Request](https://docs.microsoft.com/en-us/azure/application-insights/application-insights-data-model-request-telemetry) 

リクエストを受け取ったときに生成されるログ。Application Insights web SDK は自動で WebAppが受け取った HTTP リクエストの Request テレメトリアイテムを生成してくれる。

**Operation** というのはリクエストを実行 (Process) するスレッド。他の多印譜のオペレーションをモニタするために、[コードを書く](https://docs.microsoft.com/en-us/azure/application-insights/app-insights-api-custom-events-metrics#trackrequest)こともできます。例えば、`wake up` というweb jobや、定期的に実行される function などです。すべてのオペレーションは、 ID を持ちます。このID はアプリケーションがリクエストされる間に作られたすべてのリクエストを[group](https://docs.microsoft.com/en-us/azure/application-insights/application-insights-correlation)化するのにつかわれます。すべての Operation は成功、もしくは失敗、そして実行時間を持ちます。

### [Exception](https://docs.microsoft.com/en-us/azure/application-insights/application-insights-data-model-exception-telemetry)
Operation が失敗したときの例外を表す

### [Dependency](https://docs.microsoft.com/en-us/azure/application-insights/application-insights-data-model-dependency-telemetry)
あなたのアプリケーションから、外部のサービス呼び出しを表します。例えば、REST API や SQLなどです。ASP.NET では SQL への dependency call は、`System.Data` で定義されています。HTTPのエンドポイント呼び出しは、`System.Net` で定義されています。

Application Insights は、３つのデータタイプをカスタムテレメトリのために用意しています。

### [Trace](https://docs.microsoft.com/en-us/azure/application-insights/application-insights-data-model-trace-telemetry)
診断ログを実装するために直接、または、皆さんが慣れている instrumentation framework たとえば `Log4Net` や `System.Diagnostics` 

### [Event](https://docs.microsoft.com/en-us/azure/application-insights/application-insights-data-model-event-telemetry) 
主にユーザインタラクションをキャプチャするのにつかわれます。使われ方のパターンなど

### [Metric](https://docs.microsoft.com/en-us/azure/application-insights/application-insights-data-model-metric-telemetry)

一定期間のスカラの計測につかわれます。

全てのテレメトリアイテムは、[context](https://docs.microsoft.com/en-us/azure/application-insights/application-insights-data-model-context)を定義しています。例えば、アプリケーションのバージョンや、ユーザセッション ID などです。`Context` は各フィールドの型が決まっており、特定のシナリオで役に立ちます。アプリケーションのバージョンが適切に初期化されていると、Application Insights は、再デプロイメントと関係しているアプリケーションの振る舞いのなかで新しいパターンを検出します。Session id は、Outage や、ユーザにインパクトのある問題を算出するのに使われます。特定の失敗した依存や、エラーのトレースや、致命的な例外のsession id の数を重複なくカウントして計算するのは、問題に対するインパクトをよく理解するのに便利です。

Application Insights テレメトリモデルはテレメトリどうしの関係性 [correlate](https://docs.microsoft.com/en-us/azure/application-insights/application-insights-correlation)の方法を定義します。いったいオペレーションのどの部分であるのか。例えば、リクエストが、SQL Database の呼び出しをして、診断情報を記録したとします。correlation context をこれらのテレメトリアイテムにセットして、リクエストテレメトリと紐づけることができます。

# スキーマの改善

Application Insights のデータモデルは、単純で基本的ですが、あなたのアプリケーションテレメトリをモデル化するパワフルな方法です。
私たちは、モデルをシンプルに、スリムに保って、本質的なシナリオをサポートして、アドバンスな使い方にスキーマを拡張できるように努力しています。

モデルやスキーマーに関する問題や、提案はこちらまで [ApplicationInsights-Home](https://github.com/Microsoft/ApplicationInsights-Home/labels/schema)リポジトリまで。

# まとめ

最初はデータモデルを正しく理解してみた。そのためにほとんどそのまま翻訳することになった。もう少し英語力があれば翻訳しなくても正確に入るのだと思うが、私の場合は、理解に問題があるので、今は重要な時は翻訳するようにしている。

モデルはとてもシンプルで、リンクになっているページも主に、私の使いたいところでいうと、Request と Dependency と Context ぐらいを理解しておけばよさげ。Context のフォーマットはほぼまんま Application Insights に出てくるログのようなイメージがある。


# Dictionary

* scalar noun[c] 
: something that has size but no direction, such as a quantity, distance, speed, or temperature
* instrument noun[c]: a tool or other device used for doing a particular piece of work:
* strive verb[i]: to try very hard to do something or to make something happen, especially for a long time or against difficulties:
* context noun[c]:the situation within which something exists or happens, and that can help explain it: