Carpe Diem

備忘録

Bridgeを使ってOpenCensusのSpanをOpenTelemetryに取り込む

概要

OpenTelemetryはOpenCensusやOpenTracingをまとめた形で生まれたので、既にOpenCensusやOpenTracingの形で実装されたライブラリは移行するのが大変です。
例えばGCPの各SDKは基本的にOpenCensusで実装されています。

そのようなライブラリを使用する際に

といったBridgeを使うことで簡単にOpenTelemetry用のSpanとして取り込むことができます。

環境

  • Go v1.20.2
  • go.opentelemetry.io/otel/trace v1.14.0

実装

実装としては簡単で、以下のようにTraceProviderをOpenCensusのTracerとして渡してあげるだけです。

import (
        octrace "go.opencensus.io/trace"
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/bridge/opencensus"
)

func init() {
        bridge := otel.GetTracerProvider().Tracer("go.opentelemetry.io/otel/bridge/opencensus")
        octrace.DefaultTracer = opencensus.NewTracer(bridge)
}

こんなイメージですね。

動作確認

では実際にBigtable Emulatorを動かしつつ検証してみます。

version: "3"

services:
  api:
    build:
      context: .
    ports:
      - 8000:8000
    environment:
      - EXPORTER_ENDPOINT=http://jaeger:14268/api/traces
      - BIGTABLE_EMULATOR_HOST=bigtable:8086
  bigtable:
    image: jun06t/bigtable-emulator
  jaeger:
    image: jaegertracing/all-in-one:1.42
    ports:
      - "6831:6831/udp"
      - "6832:6832/udp"
      - "5778:5778"
      - "16686:16686"
      - "4317:4317"
      - "4318:4318"
      - "14250:14250"
      - "14268:14268"
      - "14269:14269"
      - "9411:9411"
    environment:
      - COLLECTOR_ZIPKIN_HOST_PORT=:9411
      - COLLECTOR_OTLP_ENABLED=true

リクエストを投げて見ると、

$ curl localhost:8000/hello

ちゃんとメトリクスが取得できていることが確認できます。

http://localhost:16686/

その他

サンプルコード

今回のサンプルコードはこちらです。

github.com

参考