Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
計測の手間を省きたい!OpenTelemetry に見る”自動計装”のイマ / Getting...
Search
逆井(さかさい)
December 12, 2023
13
16k
計測の手間を省きたい!OpenTelemetry に見る”自動計装”のイマ / Getting started auto instrumentation with OpenTelemetry
Cloud Native Days Tokyo 2023 の登壇スライドです
https://event.cloudnativedays.jp/cndt2023/talks/2058
逆井(さかさい)
December 12, 2023
Tweet
Share
More Decks by 逆井(さかさい)
See All by 逆井(さかさい)
まわりを巻き込むための越境アウトプット活動のススメ / getting-started-public-output
k6s4i53rx
1
70
開発フェーズでのオブザーバビリティ活用やプロファイルのススメ / getting-started-profile-o11y
k6s4i53rx
3
670
エンジニアによるコミュニティ活動のススメ / community-and-carrier-and-me
k6s4i53rx
0
140
オブザーバビリティを民主化してコア分析ループを加速したい話 / trace-log-correlation-on-google-cloud-observability
k6s4i53rx
2
160
OpenTelemetry を使ったトレースエグザンプラーの活用 / otel-trace-exemplar
k6s4i53rx
5
1.5k
サービスメッシュ環境における OpenTelemetry 活用 / OpenTelemetry in Service Mesh
k6s4i53rx
5
2.7k
Kubernetesアップデートのツラミから学んだデプロイ手順のユガミ / Challenges Learned from Kubernetes Update
k6s4i53rx
0
590
ジョインしたチームのマイクロサービスたちを再計装した話 / Getting started tracing instrument micro service with OpenTelemetry
k6s4i53rx
16
6k
GKEのワークロードからGCPサービスへ安全にアクセスする〜Workload Identity入門〜 / Getting started GKE Workload Identity
k6s4i53rx
0
640
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
4
120
The Cult of Friendly URLs
andyhume
78
6k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Writing Fast Ruby
sferik
627
61k
Automating Front-end Workflow
addyosmani
1366
200k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
16k
Making Projects Easy
brettharned
115
5.9k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
What's in a price? How to price your products and services
michaelherold
243
12k
Scaling GitHub
holman
458
140k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Transcript
計測の手間を省きたい! OpenTelemetry に見る ”自動計装” のイマ #cndt2023 逆井(さかさい) @ k6s4i53rx 逆井(さかさい)
啓佑
自己紹介 ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー intro_po.yaml 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 kind: "バックエンドエンジニア と SRE" - Go でサービス開発 - Kubernetes(GKE) のお守り係 hobby: - 練習するとスコアの落ちるゴルフ / スノボ 🏂 event:# OpenTelemetry と OSS を使った Observability 基盤の構築 逆 井 啓 佑 さかさい 逆井(さかさい) @ k6s4i53rx
話すこと / 話さないこと ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー
留意点 本セッション内では、自動計装 / 手動計装の定義は以下で使います • コードに 変更を加えない 計装: 自動計装 • コードに 変更を加える 計装 : 手動計装 ◦ opentelemetry-sdk や計装ライブラリ(Instrumentor)を使用して計装 本日お話しできないこと - 自動計装の仕組みについてはあんまり触れない 本日お話しすること - トレースとメトリクスを中心に、 OpenTelemetry の自動計装でどう言ったことができるかを広く浅く
アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー • イントロダクション(オブザーバビリティ
/ 計装 / OpenTelemetry) • OpenTelemetry の計装 と 計装ライブラリについて • OpenTelemetry の自動計装 • Python のアプリケーションに自動計装してみる • Kubernetes Operator を使った OpenTelemetry の自動計装 • まとめ
アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー • イントロダクション(オブザーバビリティ
/ 計装 / OpenTelemetry) • OpenTelemetry の計装 と 計装ライブラリについて • OpenTelemetry の自動計装 • Python のアプリケーションに自動計装してみる • Kubernetes Operator を使った OpenTelemetry の自動計装 • まとめ
イントロダクション:オブザーバビリティ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー クラウドネイティブ環境 において
システムは動的に変化 する 変化し続けてもなお、 継続的にシステムの状態を把握できる状態が理想 (オブザーバビリティ) 把握するための要素として Primary Signals がある プラットフォームの回復力・管理力/堅牢な自動化 • ログ • 分散トレース • メトリクス • プロファイル 総称して テレメトリー
イントロダクション:計装 ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー • テレメトリーを収集するには
アプリケーションに 計装 ( Instrumentation ) をする必要 • テレメトリーを収集するための仕組みをアプリに施すことを "計装" と呼ぶ Service Input Output 計 装 • ログ • 分散トレース • メトリクス • プロファイル
イントロダクション:計装 ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー • テレメトリーを収集するには
アプリケーションに 計装 ( Instrumentation ) をする必要 • テレメトリーを収集するための仕組みをアプリに施すことを "計装" と呼ぶ Instrumentation という言葉。 オブザーバビリティ・エンジニアリング(O’REILLY) で「計装」と定訳。
ログ トレース メトリクス イントロダクション:OpenTelemetry ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー 計装について理解したところで、OpenTelemetry(OTel) について 計装して収集したテレメトリーは、各種モニタリングのバックエンドに送信(エクスポート)される Service Input Output 計 装 テレメトリー バックエンドサービス
トレース ログ メトリクス イントロダクション:OpenTelemetry ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー Service Input Output 計 装 テレメトリー 特定のトレースサービスの ライブラリで計装 バックエンドサービス 計装について理解したところで、OpenTelemetry(OTel) について 計装して収集したテレメトリーは、各種モニタリングのバックエンドに送信(エクスポート)される
メトリクス トレース ログ イントロダクション:OpenTelemetry ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー Service Input Output 計 装 テレメトリー OpenTelemetry の 計装ライブラリで計装 バックエンドサービス 計装について理解したところで、OpenTelemetry(OTel) について 計装して収集したテレメトリーは、各種モニタリングのバックエンドに送信(エクスポート)される
イントロダクション:OpenTelemetry • テレメトリー 収集・送信の標準仕様を定めている ◦ ログ・トレース・メトリクス・(プロファイル) • あらゆる言語の 計装ライブラリ を提供
◦ Go, Java, Python, C++, JavaScript,... https://opentelemetry.io/docs/instrumentation/ ◦ 言語によってステータスに差がある ▪ @ymotongoo さんの 「OpenTelemetryのここ4年弱の流れ」 が参考になります https://speakerdeck.com/ymotongpoo/opentelemetry-in-last-4-plus-years • OpenTelemetry Collector の仕様策定や開発も行なっている ◦ ここは今回はアプリケーションの計装にフォーカスを当てるので省略 ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー
※ Jaeger は既に自前の計装ライブラリは非推奨とし、OTel 推奨 しています。 イントロダクション:OpenTelemetry ー 2023/12/12 CLOUDNATIVE DAYS
TOKYO 2023 ー Service Jaeger Tempo モニタリング SaaS 計装 Service Jaeger Tempo 計装 モニタリング SaaS アプリケーションを OTel を用いて標準計装するメリット として、 • モニタリングバックエンドの切り替えが容易 ◦ バックエンドが OpenTelemetry に対応していることが前提。メジャーどころは対応してきている • プロプライエタリの緩和 ※ ただし、モニタリングベンダーの提供している ※ エージェントやライブラリに比べて、機能劣後やメンテナンス性を比較・評価する必要はあるかと思います。
アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー • イントロダクション(オブザーバビリティ
/ 計装 / OpenTelemetry) • OpenTelemetry の計装 と 計装ライブラリについて • OpenTelemetry の自動計装 • Python のアプリケーションに自動計装してみる • Kubernetes Operator を使った OpenTelemetry の自動計装 • まとめ
OpenTelemetry の計装 と 計装ライブラリについて ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー Service Input Output 計 装 テレメトリー OpenTelemetry の 計装ライブラリで計装
OpenTelemetry の計装 と 計装ライブラリについて ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー OpenTelemetry Trace の概略 ❶ トレースのセットアップ • エクスポーター:トレース / スパンの送り方 / 先 • リソース:トレースのラベル(サービス名など) • サンプラー:サンプル条件 • など ❷ リクエストからトレース情報を抽出 ❸ Span の生成 ❹ リクエストにトレース情報を注入 とあるサービス例 Server Client 処理 処理 処理 トレースのセットアップ S :Span S S S ❶ ❸ ❷ ❹ トレース バックエンド https://opentelemetry.io/docs/concepts/signals/traces/
OpenTelemetry の計装 と 計装ライブラリについて ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー OpenTelemetry Metrics の概略 ❶ メトリクスのセットアップ • エクスポーター:メトリクス送り方 / 先 • リソース:メトリクスのラベル(サービス名等) • インスツルメント: ◦ カウンター ◦ ゲージ ◦ ヒストグラム ❷ メトリクスのロジック追加 とあるサービス例 メトリクスのセットアップ 例えばカウンターを使う場合、ある処理で counter.add(1) / counter.add(-1) ❶ ❷ メトリクス バックエンド https://opentelemetry.io/docs/concepts/signals/metrics/
OpenTelemetry の Ecosystem ( https://opentelemetry.io/ecosystem/registry/ ) の中で、 様々な言語の、様々なツールで計装を楽にする 計装ライブラリ
を提供 してくれている 分散トレースやメトリクスのセットアップと使用し、 スパンの差し込みや、メトリクスを生成してくれる OpenTelemetry の計装 と 計装ライブラリについて ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー • PostgreSQL, Redis • gRPC, Echo, net/http Go で検索 ←セットアップで使うライブラリ
OpenTelemetry API や SDK / 各ツールの計装ライブラリを駆使して、 アプリケーションを計装してテレメトリーを収集していくことはわかった。 • 実際そこまでコード変更は大変ではない。 しかし、"オブザーバビリティ"
という "横断的関心事"。アプリケーションに手を入れずに行えると嬉しい • 大規模プロジェクトの場合、 チーム間でオブザーバビリティスキルに格差がある可能性 分散トレーシングであれば、とあるサービスのせいでトレーシングが途切れる... と言ったことも有り得る OpenTelemetry の計装 と 計装ライブラリについて ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー
OpenTelemetry の manual 計装について ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー OpenTelemetry API や SDK / 各ツールの計装ライブラリを駆使して、 アプリケーションを計装してテレメトリーを収集していくことはわかった。だがしかし... • 実際そこまでコード変更は大変ではない。 しかし、"オブザーバビリティ" という "横断的関心事"のためにアプリケーションに手入れは 理想で言えばあんまりしたくない • 大規模プロジェクトの場合、チーム間でオブザーバビリティに格差が生まれたり、 分散トレーシングであれば、あるサービスのせいでトレーシングが途切れる... と言ったこと も有り得る できることなら アプリに手を入れずに "自動計装" して、 計測の手間を省きたい...
アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー • イントロダクション(オブザーバビリティ
/ 計装 / OpenTelemetry) • OpenTelemetry の計装 と 計装ライブラリについて • OpenTelemetry の自動計装 • Python のアプリケーションに自動計装してみる • Kubernetes Operator を使った OpenTelemetry の自動計装 • まとめ
• アプリのソースコードを変更することなく計装を行う ◦ 先ほど見てきたような OpenTelemetry SDK や 計装ライブラリ、エクスポーターの設定行なってくれる ツール /
ライブラリ • 自動計装のメカニズムは言語依存。言語によって自動計装有無がある ◦ .NET / Java / JavaScript / PHP / Python で自動計装あり https://opentelemetry.io/docs/concepts/instrumentation/automatic/ ◦ Go は記載はない(が、OTel で実験的な取り組みがあるので後ほど簡単に紹介します) ◦ 自動計装自体は OTEPS #0001 で議論がある OpenTelemetry の自動計装(Auto Instrumentation) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー Ref: https://opentelemetry.io/docs/concepts/instrumentation/automatic/
— Java の場合 — ・Java Agent の仕組みを使って、アプリ実行時にバイトコードを動的にインジェクト ・opentelemetry-java-instumentation で活発に開発されている https://github.com/open-telemetry/opentelemetry-java-instrumentation
OpenTelemetry の自動計装(Auto Instrumentation) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー Ref: https://opentelemetry.io/docs/concepts/instrumentation/automatic/ $ export JAVA_TOOL_OPTIONS="-javaagent:<path-to>/opentelemetry-javaagent.jar" $ export OTEL_SERVICE_NAME="サービス名" $ java -jar app.jar • 多くのライブラリ / フレームワークをサポート https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/supported-libraries.md ◦ Web サーバー( Servlet, Spring MVC )のリクエスト受信時、HTTP リクエスト (Apatche HTTPClient, Java HTTP Client) 時、データベースコール ( JDBC, Jedis ) 時にスパン生成したり、メトリクス生成 ◦ メトリクスはライブラリごとに有無。Servlet の場合は dutaion や active request 数など
OpenTelemetry の自動計装(Auto Instrumentation) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー
— JavaScript ( NodeJS ) の場合 — ・Node アプリ実行時に自動計装のモジュールをプリロードし計装を行う ・opentelemetry-js-contrib 内の Meta Package として提供されている https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/metapackages/auto-instrumentations-node $ npm install --save @opentelemetry/api $ npm install --save @opentelemetry/auto-instrumentations-node $ export OTEL_SERVICE_NAME="サービス名" $ node --require @opentelemetry/auto-instrumentations-node/register app.js • 以下の計装ライブラリをサポート https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/metapackages/auto-instrumentations-node ◦ Web フレームワーク の express や fastify など。スパン生成やメトリクス生成に対応 ※ 自動計装を使う際、環境変数から使用する計装ライブラリの制限は現状できない Ref: https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/metapackages/auto-instrumentations-node#supported-instrumentations
OpenTelemetry の自動計装(Auto Instrumentation) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー
— Python の場合 — ・Python アプリ実行時に計装ライブラリを動的にインジェクトする ・opentelemetry-python-contrib の opentelemetry-instrumentation を使用する https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/opentelemetry-instrumentation $ pip install opentelemetry-distro opentelemetry-exporter-otlp $ opentelemetry-bootstrap -a install $ export OTEL_SERVICE_NAME="サービス名" $ opentelemetry-instrument python app.py • 以下の計装ライブラリをサポート https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation ◦ Web フレームワーク の Flask, Django, FastAPI など様々。先述同様にスパン生成やメトリクス生成に対応 ◦ Flask の場合、リクエスト受信時に Span 生成や、 duration time、active request 数のメトリクスを自動生成 Ref: https://opentelemetry.io/docs/instrumentation/python/automatic/
◼ 環境変数による OTel の設定 自動計装の場合は環境変数で OTel の設定を行う (Java の場合は、System Property
で設定も可能) ・OTEL_TRACES_EXPORTER / OTEL_METRICS_EXPORTER = console, otlp ・OTEL_EXPOTER_OTLP_ENDOPOINT = 0.0.0.0:4317(バックエンドの URL) 指定できる環境変数一覧は OpenTelemetry Environment Variable Specification に定義されています。 https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/configuration/sdk-environment-variables.md#otlp-exporter 他にも各言語の計装ライブラリでサポートされている環境変数あり。詳細は各計装ライブラリを参照 ・例えば OTEL_PYTHON_EXCLUDED_URLS / OTEL_PYTHON_DISABLED_INSTRUMENTATIONS など OpenTelemetry の自動計装(Auto Instrumentation) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー = トレース計装を排除するリクエストパスの設定 = 自動計装を行わないパッケージの設定
コード変更しなくても、計装できる言語があるんだな... ということで、実際にアプリケーションを Let’s 自動計装! OpenTelemetry の自動計装(Auto Instrumentation) ー 2023/12/12 CLOUDNATIVE
DAYS TOKYO 2023 ー
アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー • イントロダクション(オブザーバビリティ
/ 計装 / OpenTelemetry) • OpenTelemetry の計装 と 計装ライブラリについて • OpenTelemetry の自動計装 • Python のアプリケーションに自動計装してみる • Kubernetes Operator を使った OpenTelemetry の自動計装 • まとめ
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー 概要だけだとイメージ湧きにくいと思うので、以下の構成でデモ的に見ていきます ※ 計装をイメージするためのアプリケーションなので、アプリの名前含めて細かいところには目を瞑ります 😌 フロント サービス 都道府県 人口 API Tokyo-To 人口 Tokyo-To 人口
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー Cache Cache Tokyo-To 人口 都道府県名 ⇔ 人口 神アプリ 都道府県 人口 API フロント サービス Tokyo-To 人口 概要だけだとイメージ湧きにくいと思うので、以下の構成でデモ的に見ていきます ※ 計装をイメージするためのアプリケーションなので、アプリの名前含めて細かいところには目を瞑ります 😌
備考: ・opnetelemetry-instrument 0.41b0 Flask と Redis を 扱うパッケージは自動計装でサポート ・Flask: v2.3.3(<
3 に注意) ・redis: v5.0.1 ・requests: v2.31.0 ◼ フロントサービス ・自動計装(Auto Instrumentation) ・アプリケーションのコードに計装なし アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー フロント サービス 都道府県 人口 API requests
◼ 都道府県人口 API ・手動計装(Manual Instrument) ・トレースとメトリクスを設定 ・計装ライブラリを使用 ・カスタムスパン / カスタムメトリクスの作成
備考: Flask と Memcached と MySQL の 計装ライブラリ(v0.41b0)を使用 ・opentelemetry-instrumentation-flask ・opentelemetry-instrumentation-pymemcache ・opentelemetry-instrumentation-mysql アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー フロント サービス 都道府県 人口 API
# 必要なパッケージのインストール $ pip install opentelemetry-distro opentelemetry-exporter-otlp $ opentelemetry-bootstrap -a
install $ export OTEL_SERVICE_NAME=FRONT_SERVICE $ export OTEL_TRACES_EXPORTER=otlp $ export OTEL_METRICS_EXPORTER=otlp $ export OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf $ export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:5080/api/default $ export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic%***" $ opentelemetry-instrument python app.py アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー OTel の設定は環境変数より Python の 自動計装ツール を使ってアプリケーションの実行(だけ) 計装なし フロント サービス フロントサービス( 自動計装 )
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー 都道府県 人口 API 都道府県人口 API( 計装ライブラリを使って手動計装 ) • トレースとメトリクスの設定 • Flask と memcached と MySQL に対して計装ライブラリ使用 • 任意の場所でスパンを生成 • カスタムメトリクス値(都道府県カウント値)をメトリクスとして生成
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー 都道府県 人口 API 都道府県人口 API( 計装ライブラリを使って手動計装 ) • トレースとメトリクスの設定 • Flask と memcached と MySQL に対して計装ライブラリ使用 • 任意の場所でスパンを生成 • カスタムメトリクス値(都道府県カウント値)をメトリクスとして生成 ・・・ res = Resource(attributes={"service.name": "BackendService"}) tracer_provider = TracerProvider(res) trace_exporter = OTLPSpanExporter(endpoint='http://localhost:5080') tracer_provider.add_span_processor( span_processor=BatchSpanProcessor(span_exporter=otlp_exporter) ) trace.set_tracer_provider(tracer_provider) tracer = trace.get_tracer(__name__) ・・・ metrics_exporter = OTLPMetricExporter(endpoint='http://localhost:5080') reader = PeriodicExportingMetricReader(otlp_exporter) meter_provider = MeterPorvider( metric_readers=[reader], resource=res ) metrics.set_meter_provider(meter_provider) meter = metrics.get_meter(__name__) トレースの手続的な設定 メトリクスの手続的な設定 tracer を使ってスパンを生成する meter を使ってメトリクスを生成する
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー # === Use Instrument Library. from opentelemetry.instrumentation.flask import FlaskInstrumentor from opentelemetry.instrumentation.pymemcache import PymemcacheInstrumentor from opentelemetry.instrumentation.mysql import MySQLInstrumentor FlaskInstrumentor().instrument_app(app) PymemcacheInstrumentor().instrument() MySQLInstrumentor().instrument() フロントサービスに使った Python の 自動計装 "opentelemetry-instrument" は これら計装ライブラリをコードに書くことなくアプリ実行時に動的に設定してくれている仕組み。 都道府県 人口 API 都道府県人口 API( 計装ライブラリを使って手動計装 ) • トレースとメトリクスの設定 • Flask と memcached と MySQL に対して計装ライブラリ使用 • 任意の場所でスパンを生成 • カスタムメトリクス値(都道府県カウント値)をメトリクスとして生成
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー def 処理(): # 手動で Span を生成 with tracer.start_as_current_span( "何らかの処理(手動でスパン生成)", context=extract(request.headers), kind=trace.SpanKind.INTERNAL, ): # 処理... 都道府県 人口 API 都道府県人口 API( 計装ライブラリを使って手動計装 ) • トレースとメトリクスの設定 • Flask と memcached と MySQL に対して計装ライブラリ使用 • 任意の場所でスパンを生成 • カスタムメトリクス値(都道府県カウント値)をメトリクスとして生成 Python コードでスパン生成をする書き方
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー # カスタムメトリクス ( Updown Counter ). request_counter = meter.create_up_down_counter( name="http_requests_by_prefecture", description="Number of HTTP Request 各都道府県", unit="1", ) # 都道府県人口 API の Main Hander: From Prefecture Name To Population. @app.route('/get_population', methods=['GET']) def main(): pref = request.args.get('pref') request_counter.add(1, {"prefecture": pref}) 都道府県 人口 API 都道府県人口 API( 計装ライブラリを使って手動計装 ) • トレースとメトリクスの設定 • Flask と memcached と MySQL に対して計装ライブラリ使用 • 任意の場所でスパンを生成 • カスタムメトリクス値(都道府県カウント値)をメトリクスとして生成
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー フロント サービス 都道府県 人口 API サービスのテレメトリーを OpenObserve で確認していきます(トレース) 手動計装で生成したスパン Flask / Redis / Request の自動計装 コード変えずに 計装されている のは歓喜
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー フロント サービス 都道府県 人口 API サービスのテレメトリーを OpenObserve で確認していきます(トレース) Span の詳細を確認 semconv の属性値が 自動で設定
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー フロント サービス 都道府県 人口 API サービスのテレメトリーを OpenObserve で確認していきます(メトリクス) カスタムメトリクス ・都道府県カウント数 ・都道府県ごとに集計 ( ・佐賀県が 515 件 で最も多い ) アプリ内のビジネスロジック などが関わるメトリクス値を取得
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー 自動計装 と 手動計装 どっち? • 自動計装は楽ちん。コードに手入れをせずにテレメトリー取得できるメリット は大きい • 痒いところに手が届くのは手動計装 ◦ アプリ固有の値(例: User ID / Shop ID…) を Trace / Span に付与したい...手動が早そう ◦ 自動計装にライブラリが対応していない場合や、カスタムにスパンを追加したい場合も手動の必要 ◦ カスタムメトリクス生成のためには手動 ▪ アプリロジックを使ったメトリクス / ログから集計するよりアプリで作ってしまいたいメトリクス
まだ計装をしていなくて、自動計装ができる言語であれば自動計装を試してみるも良い ◦ オブザーバビリティが浸透してくると、ここも見たい!なども出てくる。そしたらカスタマイズ アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE
DAYS TOKYO 2023 ー 自動計装 と 手動計装 どっち? • 自動計装は楽ちん。コードに手入れをせずにテレメトリー取得できるメリット は大きい • 痒いところに手が届くのは手動計装 ◦ アプリ固有の値(例: User ID / Shop ID…) を Trace / Span に付与したい...手動が早そう ◦ 自動計装にライブラリが対応していない場合や、カスタムにスパンを追加したい場合も手動の必要 ◦ カスタムメトリクス生成のためには手動 ▪ アプリロジックを使ったメトリクス / ログから集計するよりアプリで作ってしまいたいメトリクス
アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー 自動計装 v.s. 手動軽装? (答えはないです...) • 自動計装は楽ちん。コードに手入れをせずにテレメトリー取得できるメリットは大きい • 一方で痒いところに手が届くのは手動計装 ◦ アプリ固有の値(User ID / Shop ID…) を Trace / Span に付与したい...手動が早そう ◦ 使ってるライブラリに計装ライブラリが対応していない場合や、Span を追加したい場合も手動の必要 ◦ カスタムメトリクスも意義が大きい ▪ アプリロジックを使って計算するメトリクスを取得したい場合 ▪ ログからメトリクス生成してもいいが、リアルタイム性が求められる場合 ▪ セキュア環境でログに簡単にアクセスできない場合は、工夫してメトリクスで...などもあるかも • まだ計装をしていなくて、自動計装ができる言語であれば自動計装をしてみる ◦ オブザーバビリティが浸透してくると、よりここも見たい!なども出てくる。そしたらカスタマイズ? ◦ 自動計装だと計装ライブラリが全ロードされるからオーバヘッドは見る。disable しても良いものはする... 計装どこまで頑張るかは、 プロジェクトの課題によるところも大きい。 自動の課題、手動の利点など事例ある方はぜひお話したいです。
securityContext: runAsUser: 0 privileged: true (おまけ)OpenTelemetry Go の自動計装 ー 2023/12/12
CLOUDNATIVE DAYS TOKYO 2023 ー • Go でも分散トレースを自動計装するプロジェクトがある • opentelemetry-go-instrumentation ◦ 🚧 現状 Work In Progress( v0.8.0-alpha ) • 2023/04 に OTel として初リリースされた • Go だと Java や Python のような形で起動時に 計装コードの注入などができない => eBPF を使って試みようとしているプロジェクト • net/http / grpc / database/sql などの 標準 PKG や、Web FW の Gin に対応している • 注意点としては、 ◦ 計装エージェントのコンテナに対して、特権を与える必要がある ※ 計装したいコンテナと プロセス名前空間を共有するため https://cloudnativedays.jp/cndt2021/talks/1187 https://github.com/open-telemetry/opentelemetry-go-instrumentation コンテナへ 過剰権限を与えた 際のリスク紹介
アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー • イントロダクション(オブザーバビリティ
/ 計装 / OpenTelemetry) • OpenTelemetry の計装 と 計装ライブラリについて • OpenTelemetry の自動計装 • Python のアプリケーションに自動計装してみる • Kubernetes Operator を使った OpenTelemetry の自動計装 • まとめ
最後に、Kubernetes を使っている場合 opentelemetry-operator を使って、 さらに簡単にアプリケーションへ自動計装を行うことができるので方法を紹介します。 • OpenTelemetry Operator では、現状以下 2
つの Custome Resource を管理している ◦ OpenTelemetryCollector ◦ Instrumentation • 自動計装は、Apache HTTPD, .NET, Go, Java, Nginx, NodeJS, Python をサポートしている Operator を使った OpenTelemetry の自動計装 ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー https://github.com/open-telemetry/opentelemetry-operator
最後に、Kubernetes を使っている場合 opentelemetry-operator を使って、 さらに簡単にアプリケーションへ自動計装を行うことができるので方法を紹介します。 • OpenTelemetry Operator では、現状以下 2
つの Custome Resource を管理している ◦ OpenTelemetryCollector ◦ Instrumentation • 自動計装は、Apache HTTPD, .NET, Go, Java, Nginx, NodeJS, Python をサポートしている • Admission Webhook の Mutating を使用して自動計装ツールを起動している ※ cert-manager が必要 Operator を使った OpenTelemetry の自動計装 ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー kind: Pod spec: containers: - name: cndt-app image: nginx kind: Pod spec: containers: - name: cndt-app image: nginx - name: cndt-sidecar image: envoy Mutating Kubernetes API へのリクエストのタイミングでリソース変更を Webhook で実行する仕組み https://github.com/open-telemetry/opentelemetry-operator サイドカーコンテナを注入
Operator を使った OpenTelemetry の自動計装 ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー カスタムリソース OTel の設定値 Instrumentation カスタムリソースのデプロイ Jaeger に送る設定 Instrumentation (OTel の設定値) opentelemetry- operator-mutation https://cloud.google.com/blog/ja/topics/developers-practitioners/easy-telemetry-instrumentation-gke-opentelemetry-operator
opentelemetry- operator-mutation Operator を使った OpenTelemetry の自動計装 ー 2023/12/12 CLOUDNATIVE DAYS
TOKYO 2023 ー apiVersion: v1 kind: Pod metadata: name: app-for-k8soperator-client-pod labels: app: app-for-k8soperator-client-pod annotations: instrumentation.opentelemetry.io/inject-python: "true" spec: containers: - name: app-for-k8soperator-client image: ghcr.io/***/app_for_k8soperator_client:*** ports: - containerPort: 8080 imagePullPolicy: Always 自動計装したいアプリケーションのデプロイ annotation で "inject-python" = "true" とする 使うイメージは 計装をしていなくて良い Instrumentation (OTel の設定値) APP
opentelemetry- operator-mutation Operator を使った OpenTelemetry の自動計装 ー 2023/12/12 CLOUDNATIVE DAYS
TOKYO 2023 ー apiVersion: v1 kind: Pod metadata: name: app-for-k8soperator-client-pod labels: app: app-for-k8soperator-client-pod annotations: instrumentation.opentelemetry.io/inject-python: "true" spec: containers: - name: app-for-k8soperator-client image: ghcr.io/***/app_for_k8soperator_client:*** ports: - containerPort: 8080 imagePullPolicy: Always 使うイメージは 計装をしていなくて良い Instrumentation (OTel の設定値) ・Init Container として 自動計装 Agent コンテナが Inject ・Instrumentation CR の情報から、 アプリコンテナの環境変数に OTEL の各種が export Mutating APP APP 自動計装 Agent OTEL の設定を環境変数 自動計装したいアプリケーションのデプロイ annotation で "inject-python" = "true" とする
opentelemetry- operator-mutation Operator を使った OpenTelemetry の自動計装 ー 2023/12/12 CLOUDNATIVE DAYS
TOKYO 2023 ー apiVersion: v1 kind: Pod metadata: name: app-for-k8soperator-client-pod labels: app: app-for-k8soperator-client-pod annotations: instrumentation.opentelemetry.io/inject-python: "true" spec: containers: - name: app-for-k8soperator-client image: ghcr.io/***/app_for_k8soperator_client:*** ports: - containerPort: 8080 imagePullPolicy: Always 自動計装したいアプリケーションのデプロイ annotation で "inject-python" = "true" とする 使うイメージは 計装をしていなくて良い Instrumentation (OTel の設定値) Mutating APP APP 自動計装 Agent OTEL の設定を環境変数 ( Python の場合 ) 自動計装 Agent コンテナの自動計装ツールが共有され "opentelemetry-instrument python app.py" としてアプリが実行される => 自動計装 Done.
opentelemetry- operator-mutation Operator を使った OpenTelemetry の自動計装 ー 2023/12/12 CLOUDNATIVE DAYS
TOKYO 2023 ー apiVersion: v1 kind: Pod metadata: name: app-for-k8soperator-client-pod labels: app: app-for-k8soperator-client-pod annotations: instrumentation.opentelemetry.io/inject-python: "true" spec: containers: - name: app-for-k8soperator-client image: ghcr.io/***/app_for_k8soperator_client:*** ports: - containerPort: 8080 imagePullPolicy: Always 自動計装したいアプリケーションのデプロイ annotation で "inject-python" = "true" とする 使うイメージは 計装をしていなくて良い Instrumentation (OTel の設定値) Mutating ・今回は、Jaeger に送る設定 ・自動でトレースが Jaeger に送信 APP APP 自動計装 Agent ENV で OTEL の設定値 トレース
Operator を使った OpenTelemetry の自動計装(補足) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー Pod に複数コンテナ(myapp, myapp2, myapp3) がある場合、計装したいコンテナを指定 できる myapp, myapp2 のみ Java の自動軽装を有効化する 複数コンテナがあって、一方は Java, もう一方は Python などの計装が可能 myapp, myapp2 は Java, myapp3 は Python で自動計装を有効化する my app2 自動計装 Agent my app my app3 my app2 自動計装 Agent my app my app3 補足:Go の場合はシングルコンテナのみサポート / 特権が自動的に付与される https://github.com/open-telemetry/opentelemetry-operator/tree/main
Operator を使った OpenTelemetry の自動計装 ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023
ー • 自動計装の手続きすらも、 Kubernetes の拡張性を使って自動化 している仕組み • 序盤に課題提起した以下にも有効な手段になり得るかも ◦ 横断的関心事、アプリケーションにコード追加少なければ嬉しい ◦ 大規模サービスの場合のオブザーバビリティ格差 opentelemetry- operator APP APP APP APP APP APP APP APP APP APP APP APP とあるサービスでトレース断... OpenTelemetry Operator が、 デプロイされたアプリを自動計装 🫶
アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー • イントロダクション(オブザーバビリティ
/ 計装 / OpenTelemetry) • OpenTelemetry の計装 と 計装ライブラリについて • OpenTelemetry の自動計装 • Python のアプリケーションに自動計装してみる • Kubernetes Operator を使った OpenTelemetry の自動計装 • まとめ
• OpenTelemetry の計装について、自動計装を中心に広く浅く 触れました • OpenTelemetry や 自動計装、OpenTelemetry Operator など
もしあまり 聞き馴染みのなかった技術の調べるきっかけ になりましたら幸いです まとめ(と最後に) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー
引き続き楽しんでいきましょう〜
記載されている会社名、商品名、 またはサービス名は、各社の商標登録または商標です。