Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OpentelemetryでアプリケーションのObservabilityを強化しよう

 OpentelemetryでアプリケーションのObservabilityを強化しよう

2023/8/25に開催された「クラスメソッドの最新開発ノウハウを学ぶ勉強会 クラメソで使っている話題の技術編」でOpentelemetryに関して発表した際の資料です

TomoyaIwata

August 27, 2023
Tweet

More Decks by TomoyaIwata

Other Decks in Programming

Transcript

  1. 2 ⾃⼰紹介 l CX事業本部 Delivery部 サーバーサイドチーム l 2023 Japan AWS

    Top Engineer l 2023 Japan AWS All Certifications Engineer l 前⼗字靭帯再建⼿術3ヶ⽉経過 岩⽥ 智哉
  2. 8 コンポーネント • Specification • API、SDK、Dataの仕様を策定 • Collector • アプリケーションからテレメトリデータを受信してバックエンドに送信するプロキシ

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

    • Language-specific API & SDK implementations • テレメトリデータを⽣成&送信するための各⾔語固有のSDK • K8s operator • Kubernetes Operatorの実装 • Function as a Service assets • 各種FaaS環境で利⽤可能なアセット
  4. 22 SDKに関連する概念 • Instrumentation Libraries • Exporters ※既出 • Automatic

    Instrumentation • Resource Detectors • Cross Service Propagators • Sampler
  5. 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
  6. 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)
  7. 30 実装サンプル const exporterOptions = { url: process.env.OTLP_TRACE_ENDPOINT ?? 'http://127.0.0.1:4318/v1/traces',

    } const traceExporter = new OTLPTraceExporter(exporterOptions) Exporterを設定
  8. 31 実装サンプル export const otelSDK = new NodeSDK({ textMapPropagator: new

    AWSXRayPropagator(), PropagatorにX-Ray向けのPropagatorを指定 X-Amzn-Trace-IdにセットされたトレースIDが伝搬される
  9. 33 実装サンプル instrumentations: [ new HttpInstrumentation(), new MySQL2Instrumentation(), new PinoInstrumentation(),

    ], 利⽤しているモジュール/ライブラリに インストルメンテーション
  10. 34 実装サンプル const tracerConfig = { idGenerator: new AWSXRayIdGenerator(), }

    X-Rayに準拠したトレースID(相関ID)を⽣成するよう設定
  11. 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を使って フロント → バックエンド 横断的にログを抽出できる
  12. 40