Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

C# ではじめる OpenTelemetry

neno
December 16, 2023

C# ではじめる OpenTelemetry

.NET ラボ 2023/12/16 での発表資料

ブログ: C# ではじめる OpenTelemetry。
Example: GitHub

neno

December 16, 2023
Tweet

More Decks by neno

Other Decks in Technology

Transcript

  1. 自己紹介 1 • 所属: NTTコミュニケーションズ イノベーションセンター • 趣味: C#, OSS,

    ドール, 一眼(α7 IV) • 執心領域 • C# ⇔ TypeScript • SignalR 何縫ねの。 nenoNaninu nenoMake ブログ https://blog.neno.dev その他 https://neno.dev
  2. OSS 紹介 2 属性を付与するだけ Tapper • C# の型定義から TypeScript の型定義を生成する

    .NET Tool/ library • JSON / MessagePack 対応! https://github.com/nenoNaninu/Tapper
  3. OSS 紹介 3 • C# の SignalR Client を強く型付けするための Source

    Generator TypedSignalR.Client Before After (using TypedSignalR.Client) こんな SignalR の Hub と Receiver の interface が あったとして… 脱文字列! 全てが強く型付け! https://github.com/nenoNaninu/TypedSignalR.Client
  4. 4 • TypeScript の SignalR Client を強く型付けするための .NET Tool /

    library TypedSignalR.Client.TypeScript Before After (using TypedSignalR.Client.TypeScript) 脱文字列! 全てが強く型付け! TypeScript 用の型を C# から自動生成 MessagePack Hub Protocol 対応! https://github.com/nenoNaninu/TypedSignalR.Client.TypeScript 属性を付与するだけ! OSS 紹介
  5. 5 • SignalR 使ったアプリを快適に開発するための GUI を自動生成する library • 2 step

    で利用可能! • http pipeline に middleware の追加 • Hub と Receiver を定義してる interface に属性を付与 • JWT 認証 サポート • パラメータのユーザ定義型サポート • JSON で入力! SignalR 版 SwaggerUI TypedSignalR.Client.DevTools https://github.com/nenoNaninu/TypedSignalR.Client.DevTools OSS 紹介
  6. お品書き 6 • OpenTelemetry とは • OpenTelemetry Collector • C#/ASP.NET

    Core での使い方 • W3C Trace Context • Example (C# + collector + backend) • SignalR + OpenTelemetry
  7. OpenTelemetry とは 8 • Observability のためには テレメトリデータが重要 • トレース •

    メトリクス • ログ • テレメトリに関わる様々な仕様を標準化 + 各言語向けに実装 • 以前は各 OSS (e.g. Jaeger, Prometheus) 依存の仕様あるいは APM ベンダ依存の仕様だった。 • CNCF のプロジェクトの1つ。 OpenTelemetry is an Observability framework and toolkit https://opentelemetry.io/docs/specs/status/ 公式の言 それぞれを Signal という
  8. OpenTelemetry とは 9 • 全てのコンポーネントの仕様 • テレメトリデータのプロトコル • テレメトリデータに関する意味的規約 (semantic

    conventions) • どのようにテレメトリデータの生成するかの API • 仕様に沿った各言語に対する SDK の実装 • 広く使われているライブラリ向けの計装エコシステム • コードを変更する事なくテレメトリデータを生成するための自動計装 • テレメトリデータのプロキシ (OpenTelemetry Collector) • 様々なツール (OpenTelemetry Operator for Kubernetes など) プロジェクトの主要なコンポーネント https://opentelemetry.io/docs/what-is-opentelemetry/
  9. OpenTelemetry とは 10 https://opentelemetry.io/docs/specs/otel/overview/ OpenTelemetry における言葉 • API • API

    packages consist of the cross-cutting public interfaces used for instrumentation. • SDK • The SDK is the implementation of the API provided by the OpenTelemetry project. • Within an application, the SDK is installed and managed by the application owner. • Instrumentation authors MUST NOT directly reference any SDK package of any kind, only the API.
  10. OpenTelemetry とは 11 https://opentelemetry.io/docs/specs/otel/overview/ OpenTelemetry における言葉 • API • API

    packages consist of the cross-cutting public interfaces used for instrumentation. • SDK • The SDK is the implementation of the API provided by the OpenTelemetry project. • Within an application, the SDK is installed and managed by the application owner. • Instrumentation authors MUST NOT directly reference any SDK package of any kind, only the API. NuGet のパッケージと 対応させると分かりやすい
  11. OpenTelemetry とは 12 https://github.com/open-telemetry/opentelemetry-dotnet/blob/core-1.6.0/src/OpenTelemetry.Api/README.md https://github.com/open-telemetry/opentelemetry-dotnet/blob/core-1.6.0/src/OpenTelemetry/README.md NuGet パッケージとの対応 • API :

    OpenTelemetry.Api https://www.nuget.org/packages/OpenTelemetry.Api/ • The API only surfaces necessary abstractions to instrument an application/library. • SDK : OpenTelemetry https://www.nuget.org/packages/OpenTelemetry/ • OpenTelemetry SDK is a reference implementation of the OpenTelemetry API. • It implements the Tracing API, the Metrics API, and the Context API. • This SDK also supports ILogger integration.
  12. OpenTelemetry とは 13 https://github.com/open-telemetry/opentelemetry-dotnet/blob/core-1.6.0/src/OpenTelemetry.Api/README.md https://github.com/open-telemetry/opentelemetry-dotnet/blob/core-1.6.0/src/OpenTelemetry/README.md NuGet パッケージとの対応 • API :

    OpenTelemetry.Api https://www.nuget.org/packages/OpenTelemetry.Api/ • The API only surfaces necessary abstractions to instrument an application/library. • SDK : OpenTelemetry https://www.nuget.org/packages/OpenTelemetry/ • OpenTelemetry SDK is a reference implementation of the OpenTelemetry API. • It implements the Tracing API, the Metrics API, and the Context API. • This SDK also supports ILogger integration. 要するに Xxx と Xxx.Abstractions で パッケージ分けるよくある構成
  13. OpenTelemetry とは 16 https://opentelemetry.io/docs/specs/status/ https://github.com/open-telemetry/opentelemetry-specification/pull/3376 仕様のステータス 2023/4 Logging の Bridge

    API/SDK の仕様が Experimental から Stable に Bridge API が既存の logger を OpenTelemetry の世界に 統合するための API
  14. OpenTelemetry とは 17 https://opentelemetry.io/docs/specs/status/ https://github.com/open-telemetry/opentelemetry-specification/pull/3376 仕様のステータス 2023/4 Logging の Bridge

    API/SDK の仕様が Experimental から Stable に Bridge API が既存の logger を OpenTelemetry の世界に 統合するための API Microsoft.Extensions.Logging 的には Bridge API が stable になってれば OK
  15. OpenTelemetry Collector 21 • 全てのコンポーネントの仕様 • テレメトリデータのプロトコル • テレメトリデータに関する意味的な命名規則 •

    どのようにテレメトリデータの生成するかの API • 仕様に沿った各言語に対する SDK の実装 • 広く使われているライブラリ向けの計装ライブラリ・エコシステム • コードを変更する事なくテレメトリデータを生成するための自動計装 • テレメトリデータのプロキシ (OpenTelemetry Collector) • 様々なツール (OpenTelemetry Operator for Kubernetes など) プロジェクトの主要なコンポーネント (再掲) https://opentelemetry.io/docs/what-is-opentelemetry/
  16. OpenTelemetry Collector 22 • 全てのコンポーネントの仕様 • テレメトリデータのプロトコル • テレメトリデータに関する意味的な命名規則 •

    どのようにテレメトリデータの生成するかの API • 仕様に沿った各言語に対する SDK の実装 • 広く使われているライブラリ向けの計装ライブラリ・エコシステム • コードを変更する事なくテレメトリデータを生成するための自動計装 • テレメトリデータのプロキシ (OpenTelemetry Collector) • 様々なツール (OpenTelemetry Operator for Kubernetes など) プロジェクトの主要なコンポーネント (再掲) https://opentelemetry.io/docs/what-is-opentelemetry/
  17. OpenTelemetry Collector 24 • Application が直接テレメトリデータを各バックエンドに送信 Deployment patterns : Collector

    なし https://opentelemetry.io/docs/collector/deployment/no-collector/ テレメトリデータを取るのに OpenTelemetry SDK を用いる
  18. OpenTelemetry Collector 25 • Application が直接テレメトリデータを各バックエンドに送信 Deployment patterns : Collector

    なし https://opentelemetry.io/docs/collector/deployment/no-collector/ テレメトリデータを取るのに OpenTelemetry SDK を用いる 送信するのに各バックエンド用のプロトコルを用いる。 OpenTelemetry Protocol (OTLP) を用いるとは限らない。
  19. OpenTelemetry Collector 26 • Application が直接テレメトリデータを各バックエンドに送信 Deployment patterns : Collector

    なし テレメトリデータを取るのに OpenTelemetry SDK を用いる 送信するのに各バックエンド用のプロトコルを用いる。 OpenTelemetry Protocol (OTLP) を用いるとは限らない。 https://opentelemetry.io/docs/collector/deployment/no-collector/ App が各バックエンドに 依存してしまう事になってしまう
  20. OpenTelemetry Collector 27 • Application が直接テレメトリデータを各バックエンドに送信 Deployment patterns : Collector

    なし テレメトリデータを取るのに OpenTelemetry SDK を用いる 送信するのに各バックエンド用のプロトコルを用いる。 OpenTelemetry Protocol (OTLP) を用いるとは限らない。 https://opentelemetry.io/docs/collector/deployment/no-collector/ App が各バックエンドに 依存してしまう事になってしまう 使いたい Backend 向け Exporter の (C#)実装が存在しない可能性
  21. OpenTelemetry Collector 28 • Application は OpenTelemetry Collector にテレメトリデータを送信 •

    まさしくテレメトリデータのプロキシ Deployment patterns : Collector あり https://opentelemetry.io/docs/collector/deployment/agent/
  22. OpenTelemetry Collector 29 • Application は OpenTelemetry Collector にテレメトリデータを送信 •

    まさしくテレメトリデータのプロキシ Deployment patterns : Collector あり App から生まれたテレメトリデータは OTLP で送信される https://opentelemetry.io/docs/collector/deployment/agent/
  23. OpenTelemetry Collector 30 • Application は OpenTelemetry Collector にテレメトリデータを送信 •

    まさしくテレメトリデータのプロキシ Deployment patterns : Collector あり 各バックエンド用のプロトコルに https://opentelemetry.io/docs/collector/deployment/agent/ App から生まれたテレメトリデータは OTLP で送信される
  24. OpenTelemetry Collector 31 • Application は OpenTelemetry Collector にテレメトリデータを送信 •

    まさしくテレメトリデータのプロキシ Deployment patterns : Collector あり https://opentelemetry.io/docs/collector/deployment/agent/ App から生まれたテレメトリデータは OTLP で送信される App が依存するのは OpenTelemetry だけ! 各バックエンド用のプロトコルに
  25. OpenTelemetry Collector 32 • Application は OpenTelemetry Collector にテレメトリデータを送信 •

    まさしくテレメトリデータのプロキシ Deployment patterns : Collector あり https://opentelemetry.io/docs/collector/deployment/agent/ App から生まれたテレメトリデータは OTLP で送信される App が依存するのは OpenTelemetry だけ! 各バックエンド用のプロトコルに Collector 向け Exporter の 実装さえあれば 任意の Backend が使える
  26. OpenTelemetry Collector 33 • Application は OpenTelemetry Collector にテレメトリデータを送信 •

    まさしくテレメトリデータのプロキシ Deployment patterns : Collector あり どこにホストするかは 幾つかの選択肢がある https://opentelemetry.io/docs/collector/deployment/agent/ App から生まれたテレメトリデータは OTLP で送信される App が依存するのは OpenTelemetry だけ! 各バックエンド用のプロトコルに Collector 向け Exporter の 実装さえあれば 任意の Backend が使える
  27. OpenTelemetry Collector 34 • Receiver • OTLP • Processer •

    Batch • Filter • Exporter • OTLP • Prometheus • Extensions • HealthCheck Collector は様々なコンポーネントの塊 https://opentelemetry.io/docs/collector/ https://github.com/open-telemetry/opentelemetry-collector https://github.com/open-telemetry/opentelemetry-collector-contrib 他にもコンポーネントはいろいろあるので Repository 覗くと楽しい
  28. OpenTelemetry Collector 35 • Collector は様々なコンポーネントの集合体 • コンポーネントによってステータスが異なる • 現状それぞれのコンポーネントの

    README を見に行く他ない (一覧はない) Collector のステータス https://github.com/open-telemetry/opentelemetry-collector/blob/v0.91.0/exporter/otlpexporter/README.md https://github.com/open-telemetry/opentelemetry-collector/blob/v0.91.0/receiver/otlpreceiver/README.md https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/v0.91.0/exporter/prometheusexporter/README.md Logs はまだ beta
  29. OpenTelemetry Collector 36 • Docker に config 食わせるのが手っ取り早い • オレオレ

    processer とか書きたくなったら Go lang で頑張って実装してビルド お手軽な動かし方
  30. OpenTelemetry Collector 37 • Docker に config 食わせるのが手っ取り早い • オレオレ

    processer とか書きたくなったら Go lang で頑張って実装してビルド お手軽な動かし方 Config 書いて
  31. OpenTelemetry Collector 38 • Docker に config 食わせるのが手っ取り早い • オレオレ

    processer とか書きたくなったら Go lang で頑張って実装してビルド お手軽な動かし方 Docker で動かす Config 書いて
  32. C#/ASP.NET Core での使い方 40 • OpenTelemetry.Extensions.Hosting • OpenTelemetry SDK の

    Generic Host 統合のパッケージ。 • OpenTelemetry (SDK) に依存している。 • Generic Host 上 で OpenTelemetry 使うならほぼ必須。 • つまり ASP.NET Core で OpenTelemetry 使う上でもほぼ必須。 • OpenTelemetry.Exporter.OpenTelemetryProtocol • テレメトリデータを OTLP でエクスポートするため 最低限必要なパッケージ (SDK + Exporter) https://github.com/open-telemetry/opentelemetry-dotnet
  33. C#/ASP.NET Core での使い方 41 • OpenTelemetry.Instrumentation.AspNetCore • ASP.NET Core /

    Grpc.AspNetCore の inbound に対する計装 • OpenTelemetry.Instrumentation.Http • HttpClient と HttpWebRequest の outbound に対する計装 • OpenTelemetry.Instrumentation.GrpcNetClient • Grpc.Net.Client の outbound に対する計装 最低限必要なパッケージ (Instrumentation) https://github.com/open-telemetry/opentelemetry-dotnet
  34. C#/ASP.NET Core での使い方 42 • Npgsql.OpenTelemetry • MySql.Data.OpenTelemetry (GPL-2.0) •

    OpenTelemetry.Instrumentation.SqlClient • OpenTelemetry.Instrumentation.EntityFrameworkCore • OpenTelemetry.Instrumentation.StackExchangeRedis • OpenTelemetry.Instrumentation.ElasticsearchClient • AspNetCore.SignalR.OpenTelemetry 便利なパッケージ [1] https://github.com/npgsql/npgsql [2] https://github.com/mysql-net/MySqlConnector/blob/2.3.1/docs/content/diagnostics/tracing.md [3] https://github.com/open-telemetry/opentelemetry-dotnet-contrib [4] https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry
  35. C#/ASP.NET Core での使い方 43 • Npgsql.OpenTelemetry • MySql.Data.OpenTelemetry (GPL-2.0) •

    OpenTelemetry.Instrumentation.SqlClient • OpenTelemetry.Instrumentation.EntityFrameworkCore • OpenTelemetry.Instrumentation.StackExchangeRedis • OpenTelemetry.Instrumentation.ElasticsearchClient • AspNetCore.SignalR.OpenTelemetry 便利なパッケージ [1] https://github.com/npgsql/npgsql [2] https://github.com/mysql-net/MySqlConnector/blob/2.3.1/docs/content/diagnostics/tracing.md [3] https://github.com/open-telemetry/opentelemetry-dotnet-contrib [4] https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry MySqlConnector (MIT) は パッケージは無いが Tracing は可能[2]
  36. C#/ASP.NET Core での使い方 44 • Npgsql.OpenTelemetry • MySql.Data.OpenTelemetry (GPL-2.0) •

    OpenTelemetry.Instrumentation.SqlClient • OpenTelemetry.Instrumentation.EntityFrameworkCore • OpenTelemetry.Instrumentation.StackExchangeRedis • OpenTelemetry.Instrumentation.ElasticsearchClient • AspNetCore.SignalR.OpenTelemetry 便利なパッケージ [1] https://github.com/npgsql/npgsql [2] https://github.com/mysql-net/MySqlConnector/blob/2.3.1/docs/content/diagnostics/tracing.md [3] https://github.com/open-telemetry/opentelemetry-dotnet-contrib [4] https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry opentelemetry-dotnet-contrib を 覗くと楽しい MySqlConnector (MIT) は パッケージは無いが Tracing は可能[2]
  37. C#/ASP.NET Core での使い方 46 Logging の構成 A Resource is an

    immutable representation of the entity producing telemetry as Attributes. [1] [1] https://opentelemetry.io/docs/specs/otel/resource/sdk/ [2] https://opentelemetry.io/docs/specs/otel/common/#attribute
  38. C#/ASP.NET Core での使い方 47 Logging の構成 A Resource is an

    immutable representation of the entity producing telemetry as Attributes. [1] [1] https://opentelemetry.io/docs/specs/otel/resource/sdk/ [2] https://opentelemetry.io/docs/specs/otel/common/#attribute An Attribute is a key-value pair [2]
  39. C#/ASP.NET Core での使い方 48 Logging の構成 OTEL_EXPORTER_OTLP_ENDPOINT を 環境変数に設定しておけば 読み込んでくれる

    A Resource is an immutable representation of the entity producing telemetry as Attributes. [1] [1] https://opentelemetry.io/docs/specs/otel/resource/sdk/ [2] https://opentelemetry.io/docs/specs/otel/common/#attribute An Attribute is a key-value pair [2]
  40. C#/ASP.NET Core での使い方 52 Metrics/Tracing の構成 追加したパッケージに合わせて 拡張メソッドで構成 Logging と同様に

    resource について構成 OTEL_EXPORTER_OTLP_ENDPOINT を 環境変数に設定しておけば 読み込んでくれる
  41. W3C Trace Context 56 Span 1 Span 3 Span 5

    Span 2 Span 4 Service A Service B Service C Trace HTTP W3C Trace Context
  42. W3C Trace Context 57 Span 1 Span 3 Span 5

    Span 2 Span 4 Service A Service B Service C Trace HTTP W3C Trace Context W3C Trace Context のより詳細は以下のブログで。 【C#】ASP.NET Core と W3C Trace Context とお手軽ロギング。 https://blog.neno.dev/entry/2023/07/04/181843
  43. • Example を用意しました https://github.com/nenoNaninu/opentelemetry-dotnet-example Example 59 C# + collector +

    backend で動かしてみよう WebApi OpenTelemetry Collector Prometheus Tempo Loki Grafana OTLP gRPC Service PostgreSQL Redis Request Telemetry
  44. • Example を用意しました https://github.com/nenoNaninu/opentelemetry-dotnet-example Example 60 C# + collector +

    backend で動かしてみよう WebApi OpenTelemetry Collector Prometheus Tempo Loki Grafana OTLP gRPC Service PostgreSQL Redis Request Telemetry お馴染みのテンプレに 少し手を加えただけ トレースを それっぽくするためだけ
  45. Example 61 Grafana でみてみる :メトリクス編 https://github.com/dotnet/aspire/tree/main/src/Grafana/dashboards • Prometheus を素朴に見ると… Grafana

    上でメトリクスをみるための dashboard の設定が Aspire の中に存在するので拝借する 2つの dashboard の 設定があります
  46. SignalR + OpenTelemetry 79 SignalR をトレースするぞ! • Hub のメソッド単位でスパンが切られていない… •

    各メソッドの振る舞いが全く分からない • どのメソッドが重たいのかとかも分からない
  47. SignalR + OpenTelemetry 80 SignalR をトレースするぞ! • Hub のメソッド単位でスパンが切られていない… •

    各メソッドの振る舞いが全く分からない • どのメソッドが重たいのかとかも分からない どうにかせねば…
  48. SignalR + OpenTelemetry 81 AspNetCore.SignalR.OpenTelemetry https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry • トレースのための計装 • 最低限のログ

    • 接続時 • Transport 層の情報も出力(WebSocket 等) • メソッド呼び出し時 • HubName.MethodName の素朴なログ • メソッド呼び出し毎にログのスコープを追加 • HubName, MethodName, InvocationId を 振っているのでログの検索性が向上 • Duration • 切断時 • 切断時に例外が発生していれば例外もログに出力 2023/11/30 リリース 出来立てほやほや Inspired by HttpLogging ログのスコープについて: 【C#】明日から使える ASP.NET Core ロギング術! https://blog.neno.dev/entry/2023/07/23/202823
  49. SignalR + OpenTelemetry 82 AspNetCore.SignalR.OpenTelemetry • 使い方 1. AddSignalR の後に

    AddHubInstrumentation を追加 2. AddSignalRInstrumentation を WithTracing 内で利用 https://github.com/nenoNaninu/AspNetCore.SignalR.OpenTelemetry