Takayuki Shimizukawa
OpenTelemetryで
Webシステムの処理を
追跡しよう
1
DjangoCongress JP 2022
おまえ誰よ
● BeProud IT Architect
○ 受託開発(Webアプリ / 機械学習 / 数理最適化)
○ 自社サービス( connpass / PyQ / TRACERY)
○ Python研修(Python基礎、Django、Pandas、その他)
● 一般社団法人PyCon JP Association 会計理事
○ PyCon JP 年次イベントの見守り
○ Python Boot Camp 主催
● Sphinx コミッター
● 書籍執筆・翻訳
2
@shimizukawa (清水川)
アジェンダ
1. Webアプリ開発の困りごと
2. デモ
3. 計装とテレメトリ
4. Python/Djangoへの計装
5. 分散トレースとOpenTelemetry
6. 各種サービスの動向
7. まとめ、参考文献
8. 質疑応答
3
Webアプリ開発の困りごと
4
1. Webアプリ開発の困りごと
2. デモ
3. 計装とテレメトリ
4. Python/Djangoへの計装
5. 分散トレースとOpenTelemetry
6. 各種サービスの動向
7. まとめ、参考文献
8. 質疑応答
5
● 現代のWebアプリは構成要素が多すぎる
○ フロントエンド (JS)
○ Webサーバー(Nginx)
○ Serverless API (Lambda/Functions)
○ バックエンド (Python)
○ ミドルウェア (RDB,KVS,ES, ...)
○ 各種サービスAPI (認証、決済、...)
● あるリクエストで呼び出された、処理全体の把握が難しい
● 処理を流れるデータの把握には、デバッグログ仕込みが必要
● ログを追うにも集約が必要
● 集約したログから処理全体を再構成して把握するのも難しい
本番、開発、テスト、あらゆるシーンで、状態の追跡(トレース)をしたい
Webアプリ開発の困りごと
こういった困りごとを
OpenTelemetry で解決したい
6
デモ
7
1. Webアプリ開発の困りごと
2. デモ
3. 計装とテレメトリ
4. Python/Djangoへの計装
5. 分散トレースとOpenTelemetry
6. 各種サービスの動向
7. まとめ、参考文献
8. 質疑応答
デモの概要
● Uptraceで
○ 収集した情報を見れるよ
● OpenTelemetry-Collector で
○ 色んな情報を収集してるよ
● Vectorで
○ ログを収集してるよ
● OpenTelemetry SDK で
○ アプリ内でも情報収集するよ
8
デモ1: 社内システム
9
デモ1:社内システム
● Nginx
● Redmine
● MySQL
10
社内 Network
Web Server
Redmine Server
デモ1:社内システム
● Nginx
● Redmine
● MySQL
● Docker (snapd)
● OpenTelemetry Collector
● Vector
● opentelemetry-ruby
11
社内 Network
Web Server
Redmine Server
デモ1:社内システム
● Nginx
● Redmine
● MySQL
● Docker (snapd)
● OpenTelemetry Collector
● Vector
● opentelemetry-ruby
● Uptrace (Cloud)
12
社内 Network
Web Server
Redmine Server
demonstration
13
デモ2: デモ用アプリ
14
● Nginx
● React App
● Django App
● Python Requests App
● PostgreSQL
デモコード
https://github.com/shimizukawa/
try-otel/tree/20221112-djangoco
ngressjp2022
デモ2: デモ用アプリ
15
devcontainer
Web Server
● Nginx
● React App
● Django App
● Python Requests App
● PostgreSQL
● OpenTelemetry Collector
● opentelemetry/plugin-react-load
● opentelemetry-python
● opentelemetry-cpp-contrib/nginx
デモ2: デモ用アプリ
16
devcontainer
OpenTelemetry Collector
Web Server
● Nginx
● React App
● Django App
● Python Requests App
● PostgreSQL
● OpenTelemetry Collector
● opentelemetry/plugin-react-load
● opentelemetry-python
● opentelemetry-cpp-contrib/nginx
● Uptrace (OSS)
デモ2: デモ用アプリ
17
devcontainer
OpenTelemetry Collector
Web Server
demonstration
コード
https://github.com/shimizukawa/try-otel/tree/20221112-djangocongressjp2022
18
デモのまとめ
● Uptraceは
○ 監視ツールだよ
○ OSS版とクラウド版があるよ
○ 収集した情報を色々な角度で見れるよ
● OpenTelemetry-Collector で
○ システム情報を収集してるよ
○ ログ収集もできるけど、 Vectorの方が楽だったよ
● Vectorで
○ ログを楽に収集できるよ
● OpenTelemetry SDKで
○ アプリコードにも仕込んで直接情報収集できるよ
19
計装とテレメトリ
20
1. Webアプリ開発の困りごと
2. デモ
3. 計装とテレメトリ
4. Python/Djangoへの計装
5. 分散トレースとOpenTelemetry
6. 各種サービスの動向
7. まとめ、参考文献
8. 質疑応答
計装とテレメトリ
● 計装(インスツルメンテーション)
○ 各コードに組み込んでいる部分
● テレメトリ
○ 赤い破線
● エクスポート
○ 計装したコードで集めた情報を取り出し、テ
レメトリを送信すること
21
テレメトリの3要素
● トレース
○ 1つのリクエストを元に発生する、各コ
ンポーネントでの
処理(SPAN)の集まり
● メトリック
○ 統計情報
○ 時間単位のアクセス数、負荷、等
● ログ
22
ログ
メトリック
トレース
トレース
ログ
トレース
ログ
メトリック
Python/Djangoへの計装
23
1. Webアプリ開発の困りごと
2. デモ
3. 計装とテレメトリ
4. Python/Djangoへの計装
5. 分散トレースとOpenTelemetry
6. 各種サービスの動向
7. まとめ、参考文献
8. 質疑応答
デモ2のコード
● https://github.com/shimizukawa/try-otel/tree/2022111
2-djangocongressjp2022
● DevContainer / GitHub Codespaces で動かせます
24
はい、Djangoはここまで
25
後はザッと流しますね
26
分散トレースとOpenTelemetry
1. Webアプリ開発の困りごと
2. デモ
3. 計装とテレメトリ
4. Python/Djangoへの計装
5. 分散トレースとOpenTelemetry
6. 各種サービスの動向
7. まとめ、参考文献
8. 質疑応答
27
分散トレースとは
28
分散トレースとは
29
● 分散している、
● 各コンポーネントの処理を、
● 各所で収集し、
● 1箇所に集約し、
● contextで関連付ける
context=0x0123
context=0x0123
Request
http://~~
Request
0x0123
0x0123
0x0123
0x0123
context=0x0123
context の伝搬
● context = trace-id + span-id + α
● trace-id
○ 発生源が同じ処理(SPAN)に付けられる共通
のid
● span-id
○ 処理(SPAN)それぞれのid
● contextの伝搬
○ contextを traceparent ヘッダーで渡す
■ W3Cで規定されている
■ https://w3c.github.io/trace-context/
30
context=0x0123
context=0x0123
Request
http://~~
Request
0x0123
0x0123
0x0123
0x0123
context=0x0123
contextで関連付けたTRACEとSPAN
31
Frontend
GET POST
DB保存 Email
traca-id => {context}
{context} {context}
{context}
{context}
Frontend
GET
POST
DB保存
Email
DB取得
{context}
DB取得
時間
TRACE
SPAN
OpenTelemetryとは
32
OpenTelemetryとは
● 標準仕様
○ 複数のプロセス、システムをまたがってアプリケーションの処理を追跡する
仕組み。その仕様。
○ TRACE(通信の流れ)、LOG(ログ)、METRIC(統計情報)を収集し、関連付
ける
● リファレンス実装
○ 各言語向けのSDK, OpenTelemetry Collector
● 守備範囲外
○ バックエンド(テレメトリデータ保存、ビジュアライズ、監視)
33
Before OpenTelemetry
● 各種サービスを使い監視してきた
○ Nagios (サーバメトリクス監視 )
○ Sentry (エラー監視)
○ DataDog (パフォーマンス監視 )
○ Fluentd (ログ収集)
● 各サービスに共通仕様がなかった
○ 守備範囲が異なる
○ 複数サービス併用でカバー
○ 複数のエージェントの導入
○ サービス間の情報分断
● ベンダーロックイン
○ ベンダー都合は制御不能
○ 一度使い始めると乗換が困難
34
After OpenTelemetry
● OpenTelemetryが要件を整理
○ Trace, Metrics, Log の3要素に整理
○ 3要素のトレーサビリティを確保
● OpenTelemetryが共通仕様を策定
○ 共通プロトコル OTLP を策定
○ Trace, Metrics, Logのデータ構造を定義
○ API仕様を定義
● OpenTelemetryが実装を提供
○ Instrumentation SDKの提供
○ OpenTelmetry Collectorの提供
○ Collectorの拡張をcontribで提供
● ベンダーロックインの回避
○ 共通プロトコルでサービス間のデータ流通を可能に
○ OpenTelemetry Collectorが既存プロトコルをサポート
35
詳しくは....
歴史、目的、守備範囲などを、
分かりやすく解説してくれているトークを紹介します。
Obervability Conference 2022、OpenTelemetryの概要をGoogleのアドボケイ
トが解説 | Think IT(シンクイット)
https://thinkit.co.jp/article/19572
36
グーグル合同会社 デベロッパーアドボケイト
山口 能迪 氏
「OpenTelemetryのこれまでとこれから」
https://event.cloudnativedays.jp/o11y2022/talks/1347
各種サービスの動向
37
1. Webアプリ開発の困りごと
2. デモ
3. 計装とテレメトリ
4. Python/Djangoへの計装
5. 分散トレースとOpenTelemetry
6. 各種サービスの動向
7. まとめ、参考文献
8. 質疑応答
各種サービスの動向
1. NewRelic:
○ OTLP対応中
https://docs.newrelic.com/jp/docs/more-integrations/open-source-telemetry-integrations/opentelemetry/opentelemetry-introduction/
2. DataDog:
○ 対応予定なし?
○ 併用するための、 trace_idの共通化方法を提示
https://docs.datadoghq.com/ja/tracing/connect_logs_and_traces/opentelemetry/
■ Vector (by DataDog) はotlp対応予定
https://github.com/vectordotdev/vector/issues/1444
3. AWS X-RAY
○ 2021/9 ~ OpenTelemetry対応
https://aws.amazon.com/jp/otel/
4. Sentry
○ 対応予定なし?
○ OpenTelemetryとの関連を示すリサーチ文書
https://develop.sentry.dev/sdk/research/performance/
38
なぜ既存サービスではなく
OpenTelemetryを使うのか?
39
既存サービス or OpenTelemetry
Q. それ、DataDog/NewRelic/AWS X-Ray/Sentryで出来るのでは?
● A1. 標準規格なので手を出しやすい
○ インタフェースから内部データモデルまで仕様化されている
● A2. OSSだから
○ 必要なら、全てのコードを確認できる(理解できる)
○ 必要なら、仕様に則って拡張・変更できる(待たなくて良い)
○ 必要なら、改修したら元コードにコントリビュートできる
○ 必要なら、etc
● A3. OpenTelemetryだけを使わず、併用してもよい
○ とりあえずOpenTelemetryとUptraceは無料で使い始められるよ
40
Uptrace
● https://uptrace.dev/
● OpenTelemetryネイティブなバックエンド
○ プロトコルは OTLP
○ TRACE, METRIC, LOG の3つを扱える
● OSSで提供されている
● クラウドサービス(無料プラン~)もある
41
まとめ
42
1. Webアプリ開発の困りごと
2. デモ
3. 計装とテレメトリ
4. Python/Djangoへの計装
5. 分散トレースとOpenTelemetry
6. 各種サービスの動向
7. まとめ、参考文献
8. 質疑応答
まとめ
● 分散トレースとは
○ 多数のインスタンスで構成されるサービスの情報を収集
○ TRACE(処理の流れ)、METRIC(統計)、LOG(ログ)を収集し、
オブザーバビリティを実現
● OpenTelemetryとは
○ OpenTelemetryは分散トレースの標準規格 & リファレンス実装
○ 既存の多くのトレースツールと互換性がある
● OpenTelemetry-Collectorとは
○ 一次受け口、情報をバックエンドに転送する
○ CPUやDISKなどのシステムMETRICも収集できる
● Uptraceとは
○ OSSのOpenTelemetryネイティブなバックエンド
○ クラウド版は無料枠もあり使い始めやすい
43
参考文献
● ドキュメント
○ Documentation by OpenTelemetry
■ Documentation | OpenTelemetry https://opentelemetry.io/docs/
■ specification https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification
■ log specification https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification/logs
○ What is OpenTelemetry? by Uptrace https://uptrace.dev/opentelemetry/
■ Semantic Attributes https://uptrace.dev/opentelemetry/attributes.html
○ The Vector documentation by Vector https://vector.dev/docs/
■ VRL function reference | Vector documentation https://vector.dev/docs/reference/vrl/functions/#parse_nginx_log
● talk
○ OpenTelemetryのこれまでとこれから | Observability Conference 2022 by CloudNative Days https://event.cloudnativedays.jp/o11y2022/talks/1347
○ 入門 OpenTelemetry Collector | Observability Conference 2022 by CloudNative Days https://event.cloudnativedays.jp/o11y2022/talks/1354
● blog
○ 2022年版 OpenTelemetryを知れば世界が平和に - じゃあ、おうちで学べる https://syu-m-5151.hatenablog.com/entry/2022/07/12/115434
○ 仕様と実装から理解する OpenTelemetryの全体像 https://zenn.dev/ymtdzzz/articles/37c2856f46ea10
○ nginxのメトリクス・ログ・トレースを Datadogでモニターする方法 - Qiita https://qiita.com/stanabe/items/a208377100a4ba2ea907
○ 分散トレーシング (OpenTelemetry / Jaeger) | 豆蔵デベロッパーサイト https://developer.mamezou-tech.com/containers/k8s/tutorial/ops/jaeger/#fnref1
● 記事
○ いまさら聞けない「メトリクス」とは? ――注目を集めるオブザーバビリティの実現にどう役立つのか 【デブサミ2022夏】
https://codezine.jp/article/detail/16312?p=1&anchor=0
○ New RelicによるOpenTelemetryの紹介 by NewRelic
https://docs.newrelic.com/jp/docs/more-integrations/open-source-telemetry-integrations/opentelemetry/opentelemetry-introduction/
○ OpenTelemetry トレースとログに接続 by DataDog https://docs.datadoghq.com/ja/tracing/connect_logs_and_traces/opentelemetry/
44
質疑応答
45
1. Webアプリ開発の困りごと
2. デモ
3. 計装とテレメトリ
4. Python/Djangoへの計装
5. 分散トレースとOpenTelemetry
6. 各種サービスの動向
7. まとめ、参考文献
8. 質疑応答
質疑応答(覚えてる範囲)
46
● Q. Python 向け opentelemetry-sdk の完成度が低い気がしませんか。 asyncで使うとgRPCが詰まる問題が
あって困っている
○ A. asyncで試してないので分からないですが、 sdkの完成度は低い感じがします。 opentelemetry-rubyをRedmine(Rails)に
設定してみて、そちらの方が定型コードを書く必要がなかったりして、完成度が高く感じました。
● Q. Reactに計装しているコードを見てみたんですが、 TRACEを扱う範囲の指定を
BaseOpenTelemetryComponent でラップしているようですが、 React hooksを使った場合はどう実装する感
じですか?
○ A. すみません、React初心者なので分からないです。 Reactのexampleコードではこの書き方しか見つかりませんでした。もう
ちょっとSDKのAPIを読めばなにか分かるかもしれません。
● Q. OpenTelemetryを使って、エラーが出たときに検知したり、そのときのリクエストデータや変数などが分かる
ようにできますか?
○ A. OpenTelemetryは基本的に生データを扱わないようになっていると思うので、生データを見るために、今日のデモでは
Django Instrumentorのrequest/response hookを設定して、そこでカスタマイズする方法で実現しました。エラー時のデー
タを見たいのであれば、 Sentryがかなり優秀なので、 Sentryを導入した方が良いと思います。

OpenTelemetryでWebシステムの処理を追跡しよう - DjangoCongress JP 2022