---
title: 202202 open telemetry .net handson
tags:  #observability #opentelemetry #.net  
author: [Takayoshi Tanaka](https://convert.docswell.com/user/tanaka_733)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/54EM3GQ57W.jpg?width=480
description: OpenTelemety .NET ハンズオン資料
published: February 23, 22
canonical: https://convert.docswell.com/s/tanaka_733/KE17N5-202202-open-telemetry-net-handson
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/54EM3GQ57W.jpg)

OpenTelemetry .NET
ハンズオン
2022/02/22 #csharptokyo
@tanaka_733


# Page. 2

![Page Image](https://bcdn.docswell.com/page/ZPERQZ8ZJ9.jpg)

講師紹介
@tanaka_733
New Relic K.K. Lead Technical Support Engineer
C# Tokyo運営メンバーの一人です
好きな言語はC#
コンテナとパブリッククラウドと量子コンピューターが好物
Microsoft MVP for Azure, Development Technologies
Microsoft Certified Cloud Solution Architect Expert
Certified Kubernetes Administrator/Application Developer
(CKA/CKAD)
©2008–21 New Relic, Inc. All rights reserved
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/NP7X5981JX.jpg)

事前準備の確認
まだの人は聞きながらセットアップしておいてください
◦ https://github.com/tanaka-takayoshi/opentelemetry-dotnet-labのクローン
◦ .NET 6 SDKのインストール
◦ handson1/handson1.sln の起動確認
◦ connpassのページにあるNew Relicのログイン情報とAPIキーのメモ
提供しているNew Relicアカウントは1週間程度使えますが、
その後無効化します。
継続的に使いたい方は無償のStandard Tierの登録を検討ください。


# Page. 4

![Page Image](https://bcdn.docswell.com/page/637K6PKM7D.jpg)

今日のテーマ
OpenTelemetry .NETを試してみよう
OpenTelemetryの概要をしる
OpenTelemetry .NETの構造をしる


# Page. 5

![Page Image](https://bcdn.docswell.com/page/4LJ36XZ2J5.jpg)

Agenda
OpenTelemetryとは
◦ OpenTelemetryとは
◦ OpenTelemetryの生まれた背景
OpenTelemetryの構造
◦ OpenTelemetryが計測するテレメトリーデータ
◦ OpenTelemetryの構成要素
OpenTelemetry .NETで計装するには
◦
◦
◦
◦
計装とは
OpenTelemetry .NETの仕組み
計装の実際
データの送信とコレクター


# Page. 6

![Page Image](https://bcdn.docswell.com/page/V8JDV2R6JG.jpg)

OpenTelemetryとは
オ ブザー バビ リティ の新 しい標 準


# Page. 7

![Page Image](https://bcdn.docswell.com/page/4VEPV1MZE8.jpg)

OpenTelemetryとは
オブザーバビリティのために
テレメトリーデータを生成し管理するための新しい標準
オブザーバビリティ=
アプリケーション（サービス）に問題が起きているか、なぜ起きているかを把握できる
こと
テレメトリーデータ=アプリケーションの状態を把握するためのデータ
新しい標準=OSSで広く使われるCNCFプロジェクト
オブザーバビリティについては以前のC# Tokyoでのセッションでまとめました
https://www.slideshare.net/tanakata/202109-c


# Page. 8

![Page Image](https://bcdn.docswell.com/page/L27VZY9MJQ.jpg)

OpenTelemetryの生まれた背景
ベンダーサービスが先行し、データモデルが固有化
Vendor X Agent
Agentの移行は
手間がかかる
Vendor Y Agent
Vendor X backend
異なるベンダーには
送信できない
Vendor Y
backend


# Page. 9

![Page Image](https://bcdn.docswell.com/page/Z5JG49ZX7L.jpg)

OpenTelemetryの生まれた背景
ライブラリや利用しているクラウドサービスを別サービスで再利用したい場合、
Agent固有の計測用のコードが移植の妨げに
Vendor X
Agent
API
Vendor Y
Agent
ライブラ
リA
ライブラ
リA
サービス P
サービス Q


# Page. 10

![Page Image](https://bcdn.docswell.com/page/V47QGWL5EP.jpg)

OpenTelemetryの特徴
ベンダー
ニュートラル
単一のベンダーに
依存しない
普遍性
end to endの実装
将来性
さまざまな言語、
フレームワークに対応
データの生成から、収集、
処理、送信まで対応
進化する標準
活発なOSSプロジェクト


# Page. 11

![Page Image](https://bcdn.docswell.com/page/DKE45KDV71.jpg)

OpenTelemetryの構造


# Page. 12

![Page Image](https://bcdn.docswell.com/page/PL71WXZ4EG.jpg)

計測するテレメトリーデータは3種類
トレース
(特に分散トレース)
•
システムへのリクエス
トの一覧のライフサイ
クル情報
•
分散トレースは特に複
数のシステムをまたい
だライフサイクル
•
エラーやパフォーマン
ス問題が起きた場所を
特定する情報を含む
メトリクス
ログ
•
ある状態を表す
集約された統計値
•
プロセスから生じた
詳細なデバッグ情報
•
CPU利用率、
リクエスト経過時間、
データベースクエリ数
など
•
Error: XXX happened
Trace: YYY invoked
など


# Page. 13

![Page Image](https://bcdn.docswell.com/page/8G7W6N9Z72.jpg)

トレース(Trace)はスパン(Span)の集合
Span A
Span B
Span C
Span E
Span D
サービスA
Spanの持つ情報
• TraceID/SpanID
• ParentID
• Name
• Start/End Time
• Attributes
• Events
Span P
サービスB


# Page. 14

![Page Image](https://bcdn.docswell.com/page/W4JZY39L73.jpg)

トレース(Trace)
root Span
(必ず1つだけ存在)
Span A
Caller Span
(呼び出しスパン)
AのChild
Span
Span B
Span C
Span E
Span D
サービスA
Callee Span
(呼び出されたス
パン)
Span P
サービスB


# Page. 15

![Page Image](https://bcdn.docswell.com/page/KYE6DXKMJV.jpg)

トレース
time
Span A
Span B
C
Span D
Span E
Span P
ボトルネック（どこで経過時間がかかっているか）を見つけるためには、
横軸を実時間にしたこのような表現が使われることが多い。
上の図では、SpanP、つぎにSpanDがボトルネックだとわかる


# Page. 16

![Page Image](https://bcdn.docswell.com/page/5GE53XPQ74.jpg)

Notifica
tion
サービスの論理的なつながりとトレース
Ext
Client
Purchase
API
Client
API
Purchase
DB
DB
Notification
Ext
User
DB
User
分散システムにおいては、トレースからどのように呼び出されたか（システムの依存関係）
を見つけることもできる。


# Page. 17

![Page Image](https://bcdn.docswell.com/page/V972ZX6WJR.jpg)

メトリクス
ある時点でのサービスに関する測定値から取得した、
あらかじめ集計された時系列データ
例えば…
◦ CPUとメモリの使用率
◦ リクエスト経過時間
◦ リクエストサイズ
属性によりメタデータを追加し、ファセット(グルーピング)できるように
◦ URLごとの経過時間どのAPIが最も遅いか
◦ ユーザーごとのアイテム利用数ユーザー属性による利用傾向


# Page. 18

![Page Image](https://bcdn.docswell.com/page/5DJYR8997M.jpg)

ログ
タイムスタンプ付きのテキストレコード
トレースやメトリクスより歴史が長いため従来のログとの共存が課題:
◦ メトリクスやトレースと関連づけるためのコンテキストとなるメタデータが必要
◦ 歴史的に多くの言語、ツールによる実装が幅広く使われている
◦ メッセージに加えてログレベル、ログメッセージまでも統一したデータモデルがない
OpenTelemetryの戦略
◦ 既存のロギングライブラリやツールを採用しつつ、
ログデータにコンテキスト情報を追加する仕組みを提供する。
例: ASP. NET Core向けのOTel .NET では ILoggerと連携


# Page. 19

![Page Image](https://bcdn.docswell.com/page/2V7NDQLDE8.jpg)

OpenTelemetryの構成要素
Jaegarなど
その他のソース
アプリ (Java)
OTel SDK
異なる言語でも
APIで
標準化され、
言語ごとに
SDKで実装
Collector
(Agent)
Instrumentation
アプリ (C#)
Collector
（Gateway）
Grafana,
New Relic
などのバックエンド
送信するデータの形式を
OTLPとして定める
OTel SDK
Collector
(Agent)
Instrumentation
OpenTelemetry
19
の構成要素


# Page. 20

![Page Image](https://bcdn.docswell.com/page/GYJ9GD4873.jpg)

OpenTelemetryのコレクター
テレメトリーデータは大まかに以下の3通りの送信方法がある。
1. SDKから直接送信 (今日のハンズオンでやります）
2. アプリと同じホストのコレクターが送信
3. アプリと同じホストのコレクターとGatewayとなるコレクター
を経由して送信
アプリ (C#)
OTel SDK
①
②
Collector
(Agent)
Instrumentation
③
Collector
（Gateway）
Grafana,
New Relic
などのバックエンド
OpenTelemetry
20
の構成要素


# Page. 21

![Page Image](https://bcdn.docswell.com/page/5GJ8V3QZJD.jpg)

OpenTelemetryのSDK
異なる言語・フレームワークでの
テレメトリーデータの標準化をするため、
APIにより仕様を定めている
API仕様を言語ごとに実装しているのがSDK
SDKは必要最低限のデータ形式と収集の操作を提供している


# Page. 22

![Page Image](https://bcdn.docswell.com/page/MLJL5VX1ER.jpg)

OpenTelemetry .NETで計装するには


# Page. 23

![Page Image](https://bcdn.docswell.com/page/547M3GL5JW.jpg)

OpenTelemetryでの計装
計装…テレメトリーデータの計測コードを実装すること
自動と手動の2通りの方法を提供
自動計装…
最低限の設定コードで計装できる。ASP.NET CoreやHTTPClientといっ
た広く使われるフレームワーク、ライブラリに提供
手動計装…
SDKの操作を使って、自分で細かく計装する必要あり。自動計装で
サポートしていないライブラリやより詳細な計装をする場合に行う。


# Page. 24

![Page Image](https://bcdn.docswell.com/page/ZP7RQZKZE9.jpg)

contrib
あるライブラリへの自動計装の提供など、実験的な意味合いがあるライブラリを提供
今回のハンズオンではEntity Framework Coreの計装部分に利用


# Page. 25

![Page Image](https://bcdn.docswell.com/page/NPJX59L1EX.jpg)

ハンズオンのお題 (OTel .NETの計装)
1. ASP.NET CoreとHTTPClientでの自動計装によるトレースの計装
2. 自動計装されたトレース詳細な情報を追加
3. SQL呼び出しなど一部対応が必要なトレースの自動計装
(例: contribによるEF Coreの計装）
4. ILoggerでのログ出力をOTelで収集
https://github.com/tanaka-takayoshi/opentelemetry-dotnetlab/blob/main/handson1/Handson1.md


# Page. 26

![Page Image](https://bcdn.docswell.com/page/63JK6PLMJD.jpg)

ハンズオンでやらないお題
メトリクスの収集
サポートされないライブラリにおけるトレースを一から手動計装
より詳細なログの収集
コレクターの計画とセットアップ
etc


# Page. 27

![Page Image](https://bcdn.docswell.com/page/4LE36X32E5.jpg)

宣伝
OpenTelemetry .NETについてブログでまとめています
https://tech.tanaka733.net/entry/2022/01/opentelemetry-dotnet-01
今後扱う予定のテーマ
◦ より詳細な計装コード
◦ .NET Frameworkでの計装
◦ GUI（クライアントアプリ）での計装
◦ ライブラリ開発者向けの計装
◦ コレクターの設計と展開


# Page. 28

![Page Image](https://bcdn.docswell.com/page/V8EDV246EG.jpg)

Thank you.


