OpenTelemetryを楽に導入するAutomatic Instrumentation
2023-08-28
azblob://2023/08/24/eyecatch/2023-08-25-opentelemetry-000.jpg

マイクロサービスというソフトウェア開発のアーキテクチャがあります。大規模なアプリケーションを小さな独立した機能単位に分割し、それぞれを個別のサービスとして実装する方法です。分離性、独立性など多くの利点がありますが複雑さを増してしまうという大きな欠点があります。

1分でわかる可観測性

複雑さを増していくソフトウェアに必要になるのがオブザーバビリティ(可観測性)です。これを高めることでサービスを可視化し、パフォーマンスを正確に把握することができます。

可観測性は軸となる三つの柱があります。

メトリクス

システムやアプリケーションのパフォーマンスやリソース使用状況に関する数値データ

トレース

システムやアプリケーション内でのリクエストやトランザクションのフローを追跡するためのデータ

ログ

システムやアプリケーションの動作に関する時系列データ

What's OpenTelemetry

OpenTelemetryとは上記の観測データを作成、管理するフレームワークです。OpenTelemetryの大きな利点として、ベンダーに依存しない点とJaegerやPrometheusのような様々なバックエンドをサポートしている点です。

主なコンポーネント

OpenTelemetry Collector

観測データを受信、処理、エクスポートします。OpenTelemetryプロトコルだけでなく、Jaeger、Zipkin、Prometheusなどの他のトレーシングやメトリクスデータソースもサポートしています。

引用元:Collector | OpenTelemetry

otelcolimg
  • Receiver・・・観測データを受信する
  • Processor・・・観測データを処理する
  • Exporter・・・観測データをエクスポートする

OpenTelemetry Operator

Opentelemetry CollectorをKubernetesクラスターにデプロイする際に、簡単に設定を変更するためのカスタムリソースです。また、今回のタイトルでもあるAuto Instrumentationを管理します。Helm Chartを使ってインストールできます。

Auto Instrumentationを実装する

Insturumentationとは計測を行うためのプロセスです。従来のトレーシングでは観測データを出力する処理をコードに記述する必要がありました。しかしOpentelemetryはコードに記述することなくInstrumentationを行うことができます。これがベンダーに依存しないといわれる所以です。今回はその方法を紹介します。

Opentelemetry Operatorをインストールする

helm upgrade --install opentelemetry-operator open-telemetry/opentelemetry-operator -f .\operator.yml -n opentelemetry

operator.yml

admissionWebhooks:
  certManager: 
    enabled: false
  autoGenerateCert: true

本来であればあらかじめcert-managerというリソースを作成しておく必要がありますが上記の設定を追記することでその手間を省くことができます。あとはデフォルトの設定で問題ないです。

※Chartバージョン0.42.3以降フォーマットが変わったので新バージョンを使用する際は注意です。

Opentelemetry Collectorを作成する

kubectl apply -f collentor.yml

collector.yml

apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: otel
  namespace: opentelemetry
spec:
  config: |
	receivers:
  		otlp:
    		protocols:
      		grpc:
      		http:

	processors:
  		batch:

	exporters:
  		debug:

	service:

  		pipelines:
    		traces:
      			receivers: [otlp]
      			processors: [batch]
      			exporters: [debug]
    		metrics:
      			receivers: [otlp]
      			processors: [batch]
      			exporters: [debug]
    		logs:
      			receivers: [otlp]
      			processors: [batch]
      			exporters: [debug]

上記の設定はあくまで一例でreceiver、exporterを追加することで様々なツールと連携することができます。

Instrumentationを作成する

kubectl apply -f .\Instrumentation.yml
Instrumentation.yml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  namespace: default
  name: instrumentation
spec:
  exporter:
    endpoint: http://otel-collector:4318
  propagators:
    - tracecontext
    - baggage
  sampler:
    type: parentbased_traceidratio
    argument: '1'
バックエンドのコードに記述する代わりにkubernetesリソースを作成します。

PodにAnnotationを追加する

最後に、バックエンドのコードにInstrumentationを注入するアノテーションを追加します。

dotnetの場合:

instrumentation.opentelemetry.io/inject-dotnet: "true"
instrumentation.opentelemetry.io/otel-dotnet-auto-runtime: "linux-musl-x64" # 必要であれば

ほかの言語の記述はこちらからどうぞ

まとめ

以上がOpentelemetryを楽に導入する工程でした。可観測性を高めることで多くのメリットを得ることができます。

Automatic Instrumentationではないですが、簡単に動かせる公式のOpenTelemetryデモがあるので試しに触ってみてください!(ローカルで動かすとCPUめちゃ使う)

最後まで読んでいただきありがとうございました。

※2024/02/20更新