Slide 1

Slide 1 text

計測の手間を省きたい! OpenTelemetry に見る ”自動計装” のイマ #cndt2023 逆井(さかさい) @ k6s4i53rx 逆井(さかさい) 啓佑

Slide 2

Slide 2 text

自己紹介 ー 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

Slide 3

Slide 3 text

話すこと / 話さないこと ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー 留意点 本セッション内では、自動計装 / 手動計装の定義は以下で使います ● コードに 変更を加えない 計装: 自動計装 ● コードに 変更を加える 計装 : 手動計装 ○ opentelemetry-sdk や計装ライブラリ(Instrumentor)を使用して計装 本日お話しできないこと - 自動計装の仕組みについてはあんまり触れない 本日お話しすること - トレースとメトリクスを中心に、 OpenTelemetry の自動計装でどう言ったことができるかを広く浅く

Slide 4

Slide 4 text

アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー ● イントロダクション(オブザーバビリティ / 計装 / OpenTelemetry) ● OpenTelemetry の計装 と 計装ライブラリについて ● OpenTelemetry の自動計装 ● Python のアプリケーションに自動計装してみる ● Kubernetes Operator を使った OpenTelemetry の自動計装 ● まとめ

Slide 5

Slide 5 text

アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー ● イントロダクション(オブザーバビリティ / 計装 / OpenTelemetry) ● OpenTelemetry の計装 と 計装ライブラリについて ● OpenTelemetry の自動計装 ● Python のアプリケーションに自動計装してみる ● Kubernetes Operator を使った OpenTelemetry の自動計装 ● まとめ

Slide 6

Slide 6 text

イントロダクション:オブザーバビリティ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー クラウドネイティブ環境 において システムは動的に変化 する 変化し続けてもなお、 継続的にシステムの状態を把握できる状態が理想 (オブザーバビリティ) 把握するための要素として Primary Signals がある プラットフォームの回復力・管理力/堅牢な自動化 ● ログ ● 分散トレース ● メトリクス ● プロファイル 総称して テレメトリー

Slide 7

Slide 7 text

イントロダクション:計装 ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー ● テレメトリーを収集するには アプリケーションに 計装 ( Instrumentation ) をする必要 ● テレメトリーを収集するための仕組みをアプリに施すことを "計装" と呼ぶ Service Input Output 計 装 ● ログ ● 分散トレース ● メトリクス ● プロファイル

Slide 8

Slide 8 text

イントロダクション:計装 ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー ● テレメトリーを収集するには アプリケーションに 計装 ( Instrumentation ) をする必要 ● テレメトリーを収集するための仕組みをアプリに施すことを "計装" と呼ぶ Instrumentation という言葉。 オブザーバビリティ・エンジニアリング(O’REILLY) で「計装」と定訳。

Slide 9

Slide 9 text

ログ トレース メトリクス イントロダクション:OpenTelemetry ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー 計装について理解したところで、OpenTelemetry(OTel) について 計装して収集したテレメトリーは、各種モニタリングのバックエンドに送信(エクスポート)される Service Input Output 計 装 テレメトリー バックエンドサービス

Slide 10

Slide 10 text

トレース ログ メトリクス イントロダクション:OpenTelemetry ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー Service Input Output 計 装 テレメトリー 特定のトレースサービスの ライブラリで計装 バックエンドサービス 計装について理解したところで、OpenTelemetry(OTel) について 計装して収集したテレメトリーは、各種モニタリングのバックエンドに送信(エクスポート)される

Slide 11

Slide 11 text

メトリクス トレース ログ イントロダクション:OpenTelemetry ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー Service Input Output 計 装 テレメトリー OpenTelemetry の 計装ライブラリで計装 バックエンドサービス 計装について理解したところで、OpenTelemetry(OTel) について 計装して収集したテレメトリーは、各種モニタリングのバックエンドに送信(エクスポート)される

Slide 12

Slide 12 text

イントロダクション: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 ー

Slide 13

Slide 13 text

※ Jaeger は既に自前の計装ライブラリは非推奨とし、OTel 推奨 しています。 イントロダクション:OpenTelemetry ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー Service Jaeger Tempo モニタリング SaaS 計装 Service Jaeger Tempo 計装 モニタリング SaaS アプリケーションを OTel を用いて標準計装するメリット として、 ● モニタリングバックエンドの切り替えが容易 ○ バックエンドが OpenTelemetry に対応していることが前提。メジャーどころは対応してきている ● プロプライエタリの緩和  ※ ただし、モニタリングベンダーの提供している  ※ エージェントやライブラリに比べて、機能劣後やメンテナンス性を比較・評価する必要はあるかと思います。

Slide 14

Slide 14 text

アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー ● イントロダクション(オブザーバビリティ / 計装 / OpenTelemetry) ● OpenTelemetry の計装 と 計装ライブラリについて ● OpenTelemetry の自動計装 ● Python のアプリケーションに自動計装してみる ● Kubernetes Operator を使った OpenTelemetry の自動計装 ● まとめ

Slide 15

Slide 15 text

OpenTelemetry の計装 と 計装ライブラリについて ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー Service Input Output 計 装 テレメトリー OpenTelemetry の 計装ライブラリで計装

Slide 16

Slide 16 text

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/

Slide 17

Slide 17 text

OpenTelemetry の計装 と 計装ライブラリについて ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー OpenTelemetry Metrics の概略 ❶ メトリクスのセットアップ ● エクスポーター:メトリクス送り方 / 先 ● リソース:メトリクスのラベル(サービス名等) ● インスツルメント: ○ カウンター ○ ゲージ ○ ヒストグラム ❷ メトリクスのロジック追加 とあるサービス例 メトリクスのセットアップ 例えばカウンターを使う場合、ある処理で counter.add(1) / counter.add(-1) ❶ ❷ メトリクス バックエンド https://opentelemetry.io/docs/concepts/signals/metrics/

Slide 18

Slide 18 text

OpenTelemetry の Ecosystem ( https://opentelemetry.io/ecosystem/registry/ ) の中で、   様々な言語の、様々なツールで計装を楽にする 計装ライブラリ を提供 してくれている 分散トレースやメトリクスのセットアップと使用し、 スパンの差し込みや、メトリクスを生成してくれる OpenTelemetry の計装 と 計装ライブラリについて ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー ● PostgreSQL, Redis ● gRPC, Echo, net/http Go で検索 ←セットアップで使うライブラリ

Slide 19

Slide 19 text

 OpenTelemetry API や SDK / 各ツールの計装ライブラリを駆使して、  アプリケーションを計装してテレメトリーを収集していくことはわかった。 ● 実際そこまでコード変更は大変ではない。 しかし、"オブザーバビリティ" という "横断的関心事"。アプリケーションに手を入れずに行えると嬉しい ● 大規模プロジェクトの場合、 チーム間でオブザーバビリティスキルに格差がある可能性 分散トレーシングであれば、とあるサービスのせいでトレーシングが途切れる... と言ったことも有り得る OpenTelemetry の計装 と 計装ライブラリについて ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー

Slide 20

Slide 20 text

OpenTelemetry の manual 計装について ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー OpenTelemetry API や SDK / 各ツールの計装ライブラリを駆使して、 アプリケーションを計装してテレメトリーを収集していくことはわかった。だがしかし... ● 実際そこまでコード変更は大変ではない。 しかし、"オブザーバビリティ" という "横断的関心事"のためにアプリケーションに手入れは 理想で言えばあんまりしたくない ● 大規模プロジェクトの場合、チーム間でオブザーバビリティに格差が生まれたり、 分散トレーシングであれば、あるサービスのせいでトレーシングが途切れる... と言ったこと も有り得る できることなら アプリに手を入れずに "自動計装" して、 計測の手間を省きたい...

Slide 21

Slide 21 text

アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー ● イントロダクション(オブザーバビリティ / 計装 / OpenTelemetry) ● OpenTelemetry の計装 と 計装ライブラリについて ● OpenTelemetry の自動計装 ● Python のアプリケーションに自動計装してみる ● Kubernetes Operator を使った OpenTelemetry の自動計装 ● まとめ

Slide 22

Slide 22 text

● アプリのソースコードを変更することなく計装を行う ○ 先ほど見てきたような 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/

Slide 23

Slide 23 text

— 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:/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 数など

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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/

Slide 26

Slide 26 text

◼ 環境変数による 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 ー = トレース計装を排除するリクエストパスの設定 = 自動計装を行わないパッケージの設定

Slide 27

Slide 27 text

コード変更しなくても、計装できる言語があるんだな... ということで、実際にアプリケーションを Let’s 自動計装! OpenTelemetry の自動計装(Auto Instrumentation) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー

Slide 28

Slide 28 text

アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー ● イントロダクション(オブザーバビリティ / 計装 / OpenTelemetry) ● OpenTelemetry の計装 と 計装ライブラリについて ● OpenTelemetry の自動計装 ● Python のアプリケーションに自動計装してみる ● Kubernetes Operator を使った OpenTelemetry の自動計装 ● まとめ

Slide 29

Slide 29 text

アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー 概要だけだとイメージ湧きにくいと思うので、以下の構成でデモ的に見ていきます  ※ 計装をイメージするためのアプリケーションなので、アプリの名前含めて細かいところには目を瞑ります 😌 フロント サービス 都道府県 人口 API Tokyo-To 人口 Tokyo-To 人口

Slide 30

Slide 30 text

アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー Cache Cache Tokyo-To 人口 都道府県名 ⇔ 人口 神アプリ 都道府県 人口 API フロント サービス Tokyo-To 人口 概要だけだとイメージ湧きにくいと思うので、以下の構成でデモ的に見ていきます  ※ 計装をイメージするためのアプリケーションなので、アプリの名前含めて細かいところには目を瞑ります 😌

Slide 31

Slide 31 text

備考: ・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

Slide 32

Slide 32 text

◼ 都道府県人口 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

Slide 33

Slide 33 text

# 必要なパッケージのインストール $ 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 の 自動計装ツール を使ってアプリケーションの実行(だけ) 計装なし フロント サービス フロントサービス( 自動計装 )

Slide 34

Slide 34 text

アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー 都道府県 人口 API 都道府県人口 API( 計装ライブラリを使って手動計装 ) ● トレースとメトリクスの設定 ● Flask と memcached と MySQL に対して計装ライブラリ使用 ● 任意の場所でスパンを生成 ● カスタムメトリクス値(都道府県カウント値)をメトリクスとして生成

Slide 35

Slide 35 text

アプリケーションに自動計装してみる ( 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 を使ってメトリクスを生成する

Slide 36

Slide 36 text

アプリケーションに自動計装してみる ( 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 に対して計装ライブラリ使用 ● 任意の場所でスパンを生成 ● カスタムメトリクス値(都道府県カウント値)をメトリクスとして生成

Slide 37

Slide 37 text

アプリケーションに自動計装してみる ( 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 コードでスパン生成をする書き方

Slide 38

Slide 38 text

アプリケーションに自動計装してみる ( 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 に対して計装ライブラリ使用 ● 任意の場所でスパンを生成 ● カスタムメトリクス値(都道府県カウント値)をメトリクスとして生成

Slide 39

Slide 39 text

アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー フロント サービス 都道府県 人口 API サービスのテレメトリーを OpenObserve で確認していきます(トレース) 手動計装で生成したスパン Flask / Redis / Request の自動計装 コード変えずに 計装されている のは歓喜

Slide 40

Slide 40 text

アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー フロント サービス 都道府県 人口 API サービスのテレメトリーを OpenObserve で確認していきます(トレース) Span の詳細を確認 semconv の属性値が 自動で設定

Slide 41

Slide 41 text

アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー フロント サービス 都道府県 人口 API サービスのテレメトリーを OpenObserve で確認していきます(メトリクス) カスタムメトリクス  ・都道府県カウント数  ・都道府県ごとに集計  ( ・佐賀県が 515 件 で最も多い ) アプリ内のビジネスロジック などが関わるメトリクス値を取得

Slide 42

Slide 42 text

アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー 自動計装 と 手動計装 どっち? ● 自動計装は楽ちん。コードに手入れをせずにテレメトリー取得できるメリット は大きい ● 痒いところに手が届くのは手動計装 ○ アプリ固有の値(例: User ID / Shop ID…) を Trace / Span に付与したい...手動が早そう ○ 自動計装にライブラリが対応していない場合や、カスタムにスパンを追加したい場合も手動の必要 ○ カスタムメトリクス生成のためには手動 ■ アプリロジックを使ったメトリクス / ログから集計するよりアプリで作ってしまいたいメトリクス

Slide 43

Slide 43 text

   まだ計装をしていなくて、自動計装ができる言語であれば自動計装を試してみるも良い ○ オブザーバビリティが浸透してくると、ここも見たい!なども出てくる。そしたらカスタマイズ アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー 自動計装 と 手動計装 どっち? ● 自動計装は楽ちん。コードに手入れをせずにテレメトリー取得できるメリット は大きい ● 痒いところに手が届くのは手動計装 ○ アプリ固有の値(例: User ID / Shop ID…) を Trace / Span に付与したい...手動が早そう ○ 自動計装にライブラリが対応していない場合や、カスタムにスパンを追加したい場合も手動の必要 ○ カスタムメトリクス生成のためには手動 ■ アプリロジックを使ったメトリクス / ログから集計するよりアプリで作ってしまいたいメトリクス

Slide 44

Slide 44 text

アプリケーションに自動計装してみる ( Python ) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー 自動計装 v.s. 手動軽装? (答えはないです...) ● 自動計装は楽ちん。コードに手入れをせずにテレメトリー取得できるメリットは大きい ● 一方で痒いところに手が届くのは手動計装 ○ アプリ固有の値(User ID / Shop ID…) を Trace / Span に付与したい...手動が早そう ○ 使ってるライブラリに計装ライブラリが対応していない場合や、Span を追加したい場合も手動の必要 ○ カスタムメトリクスも意義が大きい ■ アプリロジックを使って計算するメトリクスを取得したい場合 ■ ログからメトリクス生成してもいいが、リアルタイム性が求められる場合 ■ セキュア環境でログに簡単にアクセスできない場合は、工夫してメトリクスで...などもあるかも ● まだ計装をしていなくて、自動計装ができる言語であれば自動計装をしてみる ○ オブザーバビリティが浸透してくると、よりここも見たい!なども出てくる。そしたらカスタマイズ? ○ 自動計装だと計装ライブラリが全ロードされるからオーバヘッドは見る。disable しても良いものはする... 計装どこまで頑張るかは、 プロジェクトの課題によるところも大きい。 自動の課題、手動の利点など事例ある方はぜひお話したいです。

Slide 45

Slide 45 text

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 コンテナへ 過剰権限を与えた 際のリスク紹介

Slide 46

Slide 46 text

アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー ● イントロダクション(オブザーバビリティ / 計装 / OpenTelemetry) ● OpenTelemetry の計装 と 計装ライブラリについて ● OpenTelemetry の自動計装 ● Python のアプリケーションに自動計装してみる ● Kubernetes Operator を使った OpenTelemetry の自動計装 ● まとめ

Slide 47

Slide 47 text

最後に、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

Slide 48

Slide 48 text

最後に、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 サイドカーコンテナを注入

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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" とする

Slide 52

Slide 52 text

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.

Slide 53

Slide 53 text

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 の設定値 トレース

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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 が、 デプロイされたアプリを自動計装 🫶

Slide 56

Slide 56 text

アジェンダ ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー ● イントロダクション(オブザーバビリティ / 計装 / OpenTelemetry) ● OpenTelemetry の計装 と 計装ライブラリについて ● OpenTelemetry の自動計装 ● Python のアプリケーションに自動計装してみる ● Kubernetes Operator を使った OpenTelemetry の自動計装 ● まとめ

Slide 57

Slide 57 text

● OpenTelemetry の計装について、自動計装を中心に広く浅く 触れました ● OpenTelemetry や 自動計装、OpenTelemetry Operator など もしあまり 聞き馴染みのなかった技術の調べるきっかけ になりましたら幸いです まとめ(と最後に) ー 2023/12/12 CLOUDNATIVE DAYS TOKYO 2023 ー

Slide 58

Slide 58 text

引き続き楽しんでいきましょう〜

Slide 59

Slide 59 text

記載されている会社名、商品名、 またはサービス名は、各社の商標登録または商標です。