ソフトウェアエンジニア必見:OpenTelemetry Collectorでシステムの情報を完全掌握
open-telemetry/opentelemetry-collector
FPSゲームで、敵の位置を正確に把握し、弾薬やヘルスパックの残量をリアルタイムで確認できるレーダーやHUDがあったら心強いですよね?「OpenTelemetry Collector」は、まさにそんな存在です。
一言でいうと、あなたのアプリケーションやシステムから発せられる様々な「情報」を収集し、加工し、指定の場所に送り届けてくれる、頼もしい「情報収集・転送マシン」です。
この「情報」には、
トレース(Trace)
あるリクエストがシステム全体をどのように流れていったか、その道のりを追跡する情報。ゲームで言えば、ある弾丸が発射されてから敵に命中するまでの軌跡を記録するようなものです。
メトリクス(Metrics)
CPU使用率、メモリ使用量、リクエスト数、レイテンシなど、システムのパフォーマンスを数値で表す情報。ゲームで言えば、ヘルスバー、スタミナ、弾薬数といったステータス情報ですね。
ログ(Logs)
アプリケーションが特定のタイミングで出力するテキスト情報。ゲームで言えば、イベントログやチャットログのようなものです。
といったものが含まれます。
これらをまとめて「テレメトリデータ」と呼びます。
サバイバルFPSゲームで、プレイヤーがなぜ死んでしまったのか、どの敵にやられたのか、どの武器が効果的だったのかを知ることは、次のプレイに活かす上で非常に重要ですよね。ソフトウェア開発でも、なぜシステムが遅くなったのか、どの部分でエラーが発生しているのか、どの機能がよく使われているのかを知ることは、システムの改善や安定運用に不可欠です。
「OpenTelemetry Collector」は、そんな課題を解決するための強力な武器になります。
一元的なデータ収集
異なる言語やフレームワークで開発された複数のマイクロサービスから発せられるテレメトリデータを、このコレクターが一箇所に集約してくれます。これにより、各サービスから直接、複数の監視ツールにデータを送る必要がなくなり、構成がシンプルになります。
データの加工とフィルタリング
収集したデータをそのまま送り出すだけでなく、必要に応じて加工したり、不要なデータをフィルタリングしたりできます。たとえば、個人情報を含むようなログをマスクしたり、特定の条件を満たすメトリクスだけを転送したりすることが可能です。
ベンダーロックインからの解放
収集したデータを特定の監視ツール(例
Prometheus, Jaeger, Datadog)に依存せずに、どのツールにも柔軟に転送できます。もし将来的に監視ツールを変更したくなった場合でも、コレクターの設定を変更するだけで済むため、アプリケーション側のコードを変更する必要がありません。これは、まるで様々な銃弾に対応できるユニバーサルマガジンのようなものです。
さあ、この強力なツールをあなたのシステムに導入する方法を見ていきましょう。一番簡単なのは、Dockerコンテナとして実行する方法です。
まず、otel-collector-config.yaml という設定ファイルを作成します。このファイルが、コレクターの振る舞いを定義する「作戦指示書」になります。
receivers:
otlp:
protocols:
grpc:
http:
exporters:
logging:
loglevel: debug
service:
pipelines:
traces:
receivers: [otlp]
exporters: [logging]
metrics:
receivers: [otlp]
exporters: [logging]
logs:
receivers: [otlp]
exporters: [logging]
receivers
どこからデータを受け取るか。ここでは、OpenTelemetry Protocol (OTLP) という共通のプロトコルで、gRPCとHTTP経由でデータを受け取るように設定しています。
exporters
どこにデータを送り出すか。この例では、一旦ログとして標準出力に出力するだけです。実際の運用では、ここにPrometheusやJaegerなどの監視ツールのエンドポイントを指定します。
service
pipelinesで、どのレシーバーからどのエクスポーターにデータを流すかを定義します。
次に、docker-compose.yaml ファイルを作成し、コレクターをコンテナとして起動する設定を書きます。
version: "3.8"
services:
otel-collector:
image: otel/opentelemetry-collector:latest
container_name: otel-collector
restart: always
ports:
- "4317:4317" # gRPC (OTLP)
- "4318:4318" # HTTP (OTLP)
volumes:
- ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
command: ["--config=/etc/otel-collector-config.yaml"]
あとは、このコマンドを打つだけで、コレクターが起動します。
docker-compose up -d
これで、あなたのシステムはテレメトリデータを受け入れる準備ができました!
では、実際にあなたのアプリケーションからコレクターにデータを送ってみましょう。ここでは、Pythonアプリケーションを例にします。
まず、必要なライブラリをインストールします。
pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-grpc opentelemetry-instrumentation-flask
次に、簡単なFlaskアプリケーションにトレースを追加します。
from flask import Flask
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.instrumentation.flask import FlaskInstrumentor
# TracerProviderを初期化
provider = TracerProvider()
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="localhost:4317"))
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
app = Flask(__name__)
FlaskInstrumentor().instrument_app(app)
@app.route("/")
def hello_world():
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("say-hello"):
return "Hello, World!"
if __name__ == "__main__":
app.run(port=5000)
このアプリケーションを実行すると、FlaskInstrumentorがリクエストの開始と終了を自動的にトレースし、OTLPSpanExporterがそのデータをlocalhost:4317(つまり、先ほど起動したコレクター)に送信します。
コレクターのログを確認すると、受け取ったトレース情報が表示されているはずです。
「OpenTelemetry Collector」は、まるでサバイバルFPSゲームにおける高性能なレーダーや通信機器のように、あなたのシステムの状況を正確に把握し、問題を素早く発見・解決するための強力な武器です。
一箇所に情報を集約し、
必要に応じて加工し、
監視ツールに依存しない柔軟な構成を実現できます。