Slide 1

Slide 1 text

OpenTelemetryで分散型アプリケーション の処理フローを可視化する

Slide 2

Slide 2 text

● Hank Ehly (ハンク イーリー) ● ENECHANGE株式会社 ● qiita.com/hankehly ● github.com/hankehly ● connpass.com/user/hankehly ● New: Meety (カジュアル面談) 自己紹介

Slide 3

Slide 3 text

アジェンダ 1. オブザーバビリティとは 2. OpenTelemetryとは 3. トレースとは 4. Pythonアプリケーションの導入例

Slide 4

Slide 4 text

● 内部構造を知らなくても、外側から動き方が理解できる ● 出会ったことがない問題でも、原因特定が容易にできる オブザーバビリティとは アプリケーションは、シグナルを出す必要がある 1. トレース 2. メトリクス 3. ログ これをインストルメンテーション と言います。 WHY IS THIS HAPPENING? エラー I see..

Slide 5

Slide 5 text

オブザーバビリティとは ● 分散型アプリケーション(Lambda、Kubernetes、ECS、RDS…) ● より速く、独立した形でアプリケーションを構築/リリース ● 規模が大きくなると、処理の流れやサービスの関係の確認が難しくなる ● デプロイ後のトラブル・緊急時に、スピードと情報の正確性が非常に重要 PostgreSQL :5432 Ruby on Rails :3000 Nginx :8000 Airflow :8080 /mnt/data (ストレージ) 1インスタンスに全部 PostgreSQL Airflow Ruby on Rails /Nginx ストレージ 独立している

Slide 6

Slide 6 text

OpenTelemetryとは ● アプリケーションコードをインスツルメンテーションする仕組みです。 ● ベンダーに依存しない、標準化されたツールを提供する ○ SDK(Python、Ruby、JavaScript、Go、Java、等々…) ○ API(ルール定義) ○ テレメトリーデータを受信、処理、出力するための「 Collector」バイナリー

Slide 7

Slide 7 text

OpenTelemetryとは ECS Cluster Lambda 1 分散型アプリケーション Lambda 2 DynamoDB

Slide 8

Slide 8 text

OpenTelemetryとは Collector ECS Cluster Lambda 1 分散型アプリケーション Lambda 2 収集/転送 DynamoDB

Slide 9

Slide 9 text

X-Ray OpenTelemetryとは Collector Datadog Prometheus Jaeger ECS Cluster Lambda 1 分散型アプリケーション Lambda 2 可視化/保存 収集/転送 DynamoDB

Slide 10

Slide 10 text

フォーム送信(ブラウザー) 時間 トレースとは POST /api/tasks GET /firebase/auth Task.objects.create (Python) INSERT INTO tasks … (SQL) ● 何が、どの順番で行われ、どのくらい時間かかったかが分かる ● ボタン押下、HTTPリクエスト、Python関数実行、DBからレコード取得…

Slide 11

Slide 11 text

{ "name": "Example Trace", "context": { "trace_id": "0x5b8aa5a2d2c872e8321cf37308d69df2", "span_id": "0x5fb397be34d26b51", }, "start_time": "2022-04-29T18:52:58.114304Z", "end_time": "2022-04-29T18:52:58.114435Z", "events": [ { "name": "フォーム送信(ブラウザー)", "timestamp": "2022-04-29T18:52:58.114561Z" }, { "name": "POST /api/tasks", "timestamp": "2022-04-29T18:53:00.012345Z" }, { "name": "GET /firebase/auth", "timestamp": "2022-04-29T18:53:01.012345Z" } ... 処理フロー

Slide 12

Slide 12 text

ウェブリクエスト 非同期的ジョブ実行 S3バケット一覧取得

Slide 13

Slide 13 text

実装は大変そう…

Slide 14

Slide 14 text

Auto Instrumentation (自動インストルメンテーション)

Slide 15

Slide 15 text

import os import sys def main(): os.environ.setdefault("DJANGO_SETTINGS_MODULE", "instrumentation_example.settings") try: from django.core.management import execute_from_command_line except ImportError as exc: ...

Slide 16

Slide 16 text

import os import sys +from opentelemetry.instrumentation.django import DjangoInstrumentor                   def main(): os.environ.setdefault("DJANGO_SETTINGS_MODULE", "instrumentation_example.settings") + DjangoInstrumentor().instrument()                                     try: from django.core.management import execute_from_command_line except ImportError as exc: ... 自動インストルメンテーション (モンキーパッチ)

Slide 17

Slide 17 text

import os import sys +from opentelemetry.instrumentation.django import DjangoInstrumentor                   +from opentelemetry.instrumentation.botocore import BotocoreInstrumentor                 def main(): os.environ.setdefault("DJANGO_SETTINGS_MODULE", "instrumentation_example.settings") + DjangoInstrumentor().instrument()                                     + BotocoreInstrumentor().instrument()                                    try: from django.core.management import execute_from_command_line except ImportError as exc: ...

Slide 18

Slide 18 text

import os import sys +from opentelemetry.instrumentation.django import DjangoInstrumentor                   +from opentelemetry.instrumentation.botocore import BotocoreInstrumentor                 +from opentelemetry.instrumentation.redis import RedisInstrumentor                 def main(): os.environ.setdefault("DJANGO_SETTINGS_MODULE", "instrumentation_example.settings") + DjangoInstrumentor().instrument()                                     + BotocoreInstrumentor().instrument()                                    + RedisInstrumentor().instrument()                                     try: from django.core.management import execute_from_command_line except ImportError as exc: ...

Slide 19

Slide 19 text

コンテキストのプロパゲーション trace_id=123 trace_id=123 trace_id=123 trace_id=123

Slide 20

Slide 20 text

ご清聴ありがとうございます! Jaeger OpenTelemetry X-Ray ADOT AWS Cloud Trace GCP OSS