銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Observabilty Conference 2022 by CloudNative Daysで登壇しました

所属は明らかにしていますが、個人登壇という立場で「Deep Dive Distributed Tracing」というセッションをしてきました。発表内容もW3C Trace ContextやOpenTelemetryなどを中心にしつつ、できるだけ特定のツールの考え方ではなく共通で考えられているものをもとに整理しています。アーカイブ視聴が可能なようです。

event.cloudnativedays.jp

リアルタイムでzoomから発表したため、Q&Aができませんでした。コメントを基に2つほど回答したいと思います。追加で質問がある、という場合はTwitter までコメントお願いします。

  1. 分散トレースはUI、LoadBalancer、API Gateway、DBといったインフラ要素まで串刺しで見られないと不十分ではないか?

  2. ボトルネックを分析する上で不十分なケースはあるでしょう。UI(Browser)上の処理は分散トレースを計測可能なことが多いですが、それ以外のLoadBalancerなどは現状難しいようです。アプリ内のトレースを分析することによって、まずアプリに原因があるかどうかの手がかりが得られます。また、アプリとアプリの間に原因がある場合、その間にある要素に手がかりがある可能性が高いので、その要素のトレメトリーデータ(メトリクスやログなど)を分析するという次のアクションに進むことができます。 また、それぞれの要素で少し異なるので補足します。

  3. UI: UI側の理も最近では分散トレースの計測が可能になっています。例えばBrowserであれば、OpenTelemetryだとこのドキュメントです。また、Mobile やデスクトップクライアントアプリの場合も可能です。UIから直接バックエンドアプリを呼び出すのではなく、間に次に出てくるLoadBalancerやAPI Gatewayといった中間要素を挟むケースが増えてきており、どこにボトルネックがあるか分析しやすくするためにも分散トレースとして計測しておく価値が増えてきていると感じます。

  4. LoadBalancer、API Gateway: 分散トレースに参加させることが難しいものが多いため、前後のスパンから遅延があるかどうか見つけるというのが現状の分析手段になるかと思います。これらの要素はメトリクスやログをテレメトリーデータとして取得できることが多いため、分散トレースとこれらのデータを突き合わせて分析することになりそうです。そのため、例えば特定のHTTPヘッダーを記録に使っている場合は、そのヘッダーをトレース・スパンにもタグとして記録しておくことが重要になります。
  5. DB: DBでの処理結果は、できるかぎりDB呼び出ししたスパンがDB呼び出しライブラリ経由で取得し、記録しておくことが重要です。例えばOpenTelemetryでどんなデータを記録すべきと考えているかは仕様のドキュメントにかかれています。

  6. OpenTelemetryではサンプリングアルゴリズムはどれが選択できるのか?

  7. OpenTelemetryではSamplerを設定することでアルゴリズムの選択が可能です。組み込みで用意されているものはこちらのドキュメントに記載されていますが、カスタマイズしたものを追加することも可能です。

OpenTelemetry .NETを理解する (3) デバッグログを出す

OpenTelemetry .NET で計測していると、正しく動作しているか確認したいときがあります。OpenTelemetry .NETにはこのようなときのために、自己診断機能が用意されています。

opentelemetry-dotnet/README.md at main · open-telemetry/opentelemetry-dotnet · GitHub

このドキュメントにあるとおり、計装コード側を変更する必要はなく、カレントディレクトリに以下の形式のOTEL_DIAGNOSTICS.jsonという名前のファイルを配置するだけです。

{
    "LogDirectory": ".",
    "FileSize": 1024,
    "LogLevel": "Error"
}

設定パラメータもドキュメントに説明されています。

  • LogDirectory にログファイルを出力するディレクトリを指定します。ここではカレントディレクトリに出力します。
  • FileSize にログファイルのサイズをKiB単位で指定します。1~128MiBの間で指定でき、ここでは1MiBを指定しています。
  • LogLevel に指定したレベル以上のログが記録されます。EventLevel列挙型の値を指定できます。

出力されるログファイルは{実行ファイルの名前}.{プロセスID}.logというフォーマットになります。また、FileSizeで指定したサイズになるよう、ログ出力が少ないときは末尾がNULで埋められています。

f:id:tanaka733:20220313165936p:plain

f:id:tanaka733:20220313170043p:plain

OpenTelemetry .NET ハンズオンを行いました

C# Tokyoでの企画でOpenTelemetryの初心者向けハンズオンを行いました。

csharp-tokyo.connpass.com

OpenTelemetry .NETについての発表資料はこちらです。

www.slideshare.net

ハンズオン課題はこちらのリポジトリのhandson1フォルダに配置しています。

github.com

当日参加者の方にはすぐに使えるNew Relicのアカウントを提供しましたが、もし試す場合はこちらの記事を参考にNew Relicの無償アカウントをセットアップするか、別のバックエンドに送信できます。

tech.tanaka733.net