マイクロサービスというソフトウェア開発のアーキテクチャがあります。大規模なアプリケーションを小さな独立した機能単位に分割し、それぞれを個別のサービスとして実装する方法です。分離性、独立性など多くの利点がありますが複雑さを増してしまうという大きな欠点があります。
1分でわかる可観測性
複雑さを増していくソフトウェアに必要になるのがオブザーバビリティ(可観測性)です。これを高めることでサービスを可視化し、パフォーマンスを正確に把握することができます。
可観測性は軸となる三つの柱があります。
メトリクス
システムやアプリケーションのパフォーマンスやリソース使用状況に関する数値データ
トレース
システムやアプリケーション内でのリクエストやトランザクションのフローを追跡するためのデータ
ログ
システムやアプリケーションの動作に関する時系列データ
What's OpenTelemetry
OpenTelemetryとは上記の観測データを作成、管理するフレームワークです。OpenTelemetryの大きな利点として、ベンダーに依存しない点とJaegerやPrometheusのような様々なバックエンドをサポートしている点です。
主なコンポーネント
OpenTelemetry Collector
観測データを受信、処理、エクスポートします。OpenTelemetryプロトコルだけでなく、Jaeger、Zipkin、Prometheusなどの他のトレーシングやメトリクスデータソースもサポートしています。
- 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
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'
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更新