OpenTelemetry CollectorJeager をDocker Composeで立てて手軽に可視化してみる試み

Docker compose

https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/examples/demo/docker-compose.yaml を参考にして最小限の構成にする

version: "3"
 
services:
  jaeger:
    image: "jaegertracing/all-in-one:1.52"
    ports:
      - "16686:16686"
    expose:
      - 4317
      - 4318
    environment:
      - COLLECTOR_ZIPKIN_HOST_PORT=:9411
      - COLLECTOR_OTLP_ENABLED=true
  # Collector
  otel-collector:
    image: otel/opentelemetry-collector:0.91.0
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
    ports:
      - 4317:4317 # OTLP gRPC receiver
    depends_on:
      - jaeger

Jaegerの各portの意味はこちらで確認する。 https://www.jaegertracing.io/docs/1.52/getting-started/

OTEL Collector Configuration

https://opentelemetry.io/docs/collector/configuration/ を参考に otel-collector-config.yaml を作成する

receivers:
  otlp:
    protocols:
      grpc:
      http:
 
processors:
  batch:
 
exporters:
  otlp:
    endpoint: jaeger:4317
    tls:
      insecure: true
 
extensions:
  health_check:
  pprof:
  zpages:
 
service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp]

Jaeger がOTLPをサポートしたことに伴い、 opentelemetry-collector v0.86.0jaeger exporter は削除され、otlp exporterでexportできるようになっている。

ちなみにjaeger exporterを指定すると以下のようなエラーが出る。 * error decoding 'exporters': unknown type: "jaeger" for id: "jaeger" (valid values: [kafka prometheus prometheusremotewrite debug logging otlphttp file otlp opencensus zipkin])

アプリケーションを実装する

Getting Started のHTTP serverのコードをベースにする。 こちらのコードをコピペしてhttp serverを作ったら、otel.go のtraceExporterを次のように書き換え、Collectorに送信されるようにする

func newTraceProvider(ctx context.Context, res *resource.Resource) (*trace.TracerProvider, error) {
	traceExporter, err := otlptracegrpc.New(ctx) // 向き先の設定などもこちらで行える。デフォルトはlocalhost:4317
	if err != nil {
		return nil, err
	}
 
	traceProvider := trace.NewTracerProvider(
		trace.WithBatcher(traceExporter,
			// Default is 5s. Set to 1s for demonstrative purposes.
			trace.WithBatchTimeout(time.Second)),
		trace.WithResource(res),
	)
	return traceProvider, nil
}

OTLP trace exporter using gRPC をgo getで入れる

go get go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc

Go のexporterの使い方はこちら https://opentelemetry.io/docs/instrumentation/go/exporters/

実行してみる

 go run ./
 
 curl 'http://localhost:1323/rolldice'

Jaeger (http://localhost:16686) できちんと送信されているのが確認できた

![[note/Pasted-image-20231220073520.png|]]

まとめ

Collectorを挟むとアプリケーションは楽に実装できそう。 Prometheus とJaeger両方に送信するってことも簡単なのでよさげ