Slide 1

Slide 1 text

Opentelemetryでアプリケーションの Observabilityを強化しよう 岩⽥ 智哉 1

Slide 2

Slide 2 text

2 ⾃⼰紹介 l CX事業本部 Delivery部 サーバーサイドチーム l 2023 Japan AWS Top Engineer l 2023 Japan AWS All Certifications Engineer l 前⼗字靭帯再建⼿術3ヶ⽉経過 岩⽥ 智哉

Slide 3

Slide 3 text

3 OpenTelemetry 使ってる⼈います か︖︕

Slide 4

Slide 4 text

4 利⽤イメージ いい感じにシステムのObservability(可観測性)を強化できます

Slide 5

Slide 5 text

5 OpenTelemetry の概要

Slide 6

Slide 6 text

6 OpenTelemetry Project l テレメトリデータに関する標準を定義するCNCFのPJ l テレメトリデータ l ログ l トレース l メトリクス ※CNCF= Cloud Native Computing Foundation

Slide 7

Slide 7 text

7 OpenTelemetry OpenTelemetryはテレメトリデータを計測、⽣成、収集、エクス ポートするためのAPI、SDK、およびツールのコレクション

Slide 8

Slide 8 text

8 コンポーネント • Specification • API、SDK、Dataの仕様を策定 • Collector • アプリケーションからテレメトリデータを受信してバックエンドに送信するプロキシ • Language-specific API & SDK implementations • テレメトリデータを⽣成&送信するための各⾔語固有のSDK • K8s operator • Kubernetes Operatorの実装 • Function as a Service assets • 各種FaaS環境で利⽤可能なアセット

Slide 9

Slide 9 text

9 今⽇喋るところ • Specification • API、SDK、Dataの仕様を策定 • Collector • アプリケーションからテレメトリデータを受信してバックエンドに送信するプロキシ • Language-specific API & SDK implementations • テレメトリデータを⽣成&送信するための各⾔語固有のSDK • K8s operator • Kubernetes Operatorの実装 • Function as a Service assets • 各種FaaS環境で利⽤可能なアセット

Slide 10

Slide 10 text

10 Collectorについて

Slide 11

Slide 11 text

11 Collector テレメトリデータを処理するベンダー⾮依存のコンポーネント 以下4つのコンポーネントの組み合わせでPipelineを構成して利 ⽤する • Receivers • Processors • Exporters • Connectors https://opentelemetry.io/docs/collector/

Slide 12

Slide 12 text

12 Collector • Goで開発されており各種プラットフォームで動作可能 • Docker Hubでイメージが公開されている • ECR PublicでもAWS Distro for OpenTelemetry Collector が公開さ れている

Slide 13

Slide 13 text

13 Pipeline • メトリクスデータはPipelineによって処理される • Receiver/Processor/Exporterのセットで構成 • 種別は以下の3つ • トレース • メトリクス • ログ

Slide 14

Slide 14 text

14 Receivers • テレメトリデータを受信するためのコンポーネント • プラグインも含めて考えると⾮常に多くのデータソースに対応 • Jaeger • Kafka • Prometheus • …etc ココ

Slide 15

Slide 15 text

15 Processors • データを受信してからエクスポートするまでの間に任意の処理を 実⾏するためのコンポーネント • batch • memory_limiter • filter • …etc ココ

Slide 16

Slide 16 text

16 Exporters • テレメトリデータを送信するためのコンポーネント • プラグインも含めて考えると⾮常に多くのデータソースに対応 • logging • awsxray • datadog • sentry • …etc ココ

Slide 17

Slide 17 text

17 Connectors • ExporterとReceiver両⽅の役割を持つコンポーネント • count • ログ/トレース/メトリクスをカウントし、メトリクスとして Exportする • Routing • PipelineからPipelineにルーティングする

Slide 18

Slide 18 text

18 利⽤イメージ 4318ポートで待ち受け ⼀部URLへのアクセスは除外 バッチ単位で処理 送信先はX-Ray

Slide 19

Slide 19 text

19 OTEL SDKと主にTrace について

Slide 20

Slide 20 text

20 OTEL SDK • 各⾔語ごとに⽤意されているテレメトリデータを⽣成&エクス ポートするためのSDKが⽤意されている • OTEL SDKを利⽤してアプリケーションをインストルメント化する https://opentelemetry.io/docs/instrumentation/#status-and-releases

Slide 21

Slide 21 text

21 インストルメンテーション(Instrumentation) • ⽇本語に直訳すると「計装」︖︖ • システムを計測可能な状態にすること…つまりテレメトリデータ を発⾏する状態にすること

Slide 22

Slide 22 text

22 SDKに関連する概念 • Instrumentation Libraries • Exporters ※既出 • Automatic Instrumentation • Resource Detectors • Cross Service Propagators • Sampler

Slide 23

Slide 23 text

23 Instrumentation Libraries • ⼀般的なライブラリやフレームワークをよしなにインストルメン テーションするライブラリ群 https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/plugins/node

Slide 24

Slide 24 text

24 Automatic Instrumentation • アプリのコードに⼿を加えることなくインストルメンテーション export OTEL_TRACES_EXPORTER="otlp" export OTEL_METRICS_EXPORTER="otlp" export OTEL_EXPORTER_OTLP_ENDPOINT="your-endpoint" export OTEL_NODE_RESOURCE_DETECTORS="env,host,os" export OTEL_SERVICE_NAME="your-service-name" export NODE_OPTIONS="--require @opentelemetry/auto-instrumentations-node/register" node app.js

Slide 25

Slide 25 text

25 Resource Detectors • リソース = テレメトリデータを⽣成するエンティティの情報を⾃ 動的に検出&付与してくれる • AWSでは以下の環境に対応 • EC2 • ECS • EKS • EB • Lambda

Slide 26

Slide 26 text

26 Cross Service Propagators サービスやプロセス間でテレメトリデータを伝搬させる仕組み X-RayであればX-Amzn-Trace-IdヘッダにセットしたトレースIDをキーに伝搬させる

Slide 27

Slide 27 text

27 Sampler • 処理対象のテレメトリデータの量を制限する = サンプリングする • 全リクエストを処理してしまうとパフォーマンスや料⾦に影響が ⼤きい

Slide 28

Slide 28 text

28 実装サンプル

Slide 29

Slide 29 text

29 実装サンプル const exporterOptions = { url: process.env.OTLP_TRACE_ENDPOINT ?? 'http://127.0.0.1:4318/v1/traces', } const traceExporter = new OTLPTraceExporter(exporterOptions) export const otelSDK = new NodeSDK({ textMapPropagator: new AWSXRayPropagator(), resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: 'example service', }), traceExporter, instrumentations: [ new HttpInstrumentation(), new MySQL2Instrumentation(), new PinoInstrumentation(), ], }) const tracerConfig = { idGenerator: new AWSXRayIdGenerator(), } const spanProcessor = new BatchSpanProcessor(traceExporter) otelSDK.configureTracerProvider(tracerConfig, spanProcessor)

Slide 30

Slide 30 text

30 実装サンプル const exporterOptions = { url: process.env.OTLP_TRACE_ENDPOINT ?? 'http://127.0.0.1:4318/v1/traces', } const traceExporter = new OTLPTraceExporter(exporterOptions) Exporterを設定

Slide 31

Slide 31 text

31 実装サンプル export const otelSDK = new NodeSDK({ textMapPropagator: new AWSXRayPropagator(), PropagatorにX-Ray向けのPropagatorを指定 X-Amzn-Trace-IdにセットされたトレースIDが伝搬される

Slide 32

Slide 32 text

32 実装サンプル resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME] : 'example service', }), リソースの属性(ここではサービス名)を設定

Slide 33

Slide 33 text

33 実装サンプル instrumentations: [ new HttpInstrumentation(), new MySQL2Instrumentation(), new PinoInstrumentation(), ], 利⽤しているモジュール/ライブラリに インストルメンテーション

Slide 34

Slide 34 text

34 実装サンプル const tracerConfig = { idGenerator: new AWSXRayIdGenerator(), } X-Rayに準拠したトレースID(相関ID)を⽣成するよう設定

Slide 35

Slide 35 text

35 実装サンプル const spanProcessor = new BatchSpanProcessor(traceExporter) Processorの設定 Batch単位でまとめて処理するように設定

Slide 36

Slide 36 text

36 結果 トレースが容易に

Slide 37

Slide 37 text

37 結果 { “level”: “info”, “time”: 1692705040339, “pid”: 11749, “hostname”: “localhost”, “req”: { “id”: “915b5ff7-3157-4da7-a7d2-0974ca9f6711”, “method”: “GET”, …略 }, "trace_id": "64e4a110bafcc4b6de62edd2ee9be314", "span_id": "6c1a24078dc1098b", "trace_flags": "01", "msg": "test log" } PinoInstrumentationでPinoのログにトレースID等が⾃動付与される トレースIDを使って フロント → バックエンド 横断的にログを抽出できる

Slide 38

Slide 38 text

38 まとめ

Slide 39

Slide 39 text

39 まとめ • OpenTelemetryはシステムのobservabilityを強化する強い味⽅ • ⾃前実装は⼤変なので、便利に使わせてもらいましょう • OpenTelemetryの今後の動向を要チェック︕

Slide 40

Slide 40 text

40