OpenTelemetry基本設定パターン - 環境別の推奨設定
OpenTelemetryを実際に導入する際、環境に応じた適切な設定は非常に重要です。開発環境では詳細なトレースデータが必要ですが、本番環境ではコストとパフォーマンスのバランスを考慮した設定が求められます。本記事では、環境別の推奨設定パターン、効果的なサンプリング戦略、リソース属性の管理方法について解説します。
環境別設定パターン
OpenTelemetryの設定は、システムの環境によって大きく異なります。開発環境では詳細な情報収集を優先し、本番環境ではコスト効率とパフォーマンスを重視します。
開発環境での推奨設定
開発環境では、すべてのテレメトリデータを収集して、アプリケーションの動作を完全に把握することが目標です。
開発環境での設定では、エクスポート先をローカルホストに設定し、収集周期を短めに設定します。これによって、開発中のデバッグが効率的になります。
# OpenTelemetry Collector への接続設定
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
export OTEL_EXPORTER_OTLP_TIMEOUT=10s
# サンプリング:すべてのトレースを収集
export OTEL_TRACES_SAMPLER=always_on
# リソース属性の設定
export OTEL_SERVICE_NAME=my-service
export OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=development開発環境では always_on というサンプラーを使用して、全トレースを処理します。この設定により、問題の特定やデバッグが容易になります。ただし、ローカル開発マシンのリソースに余裕がない場合は、サンプリングレートを調整することも検討してください。
開発環境での設定のポイントは、アプリケーションの動作確認を優先することです。タイムアウト値は短めに設定し、データが迅速に収集できるようにします。
本番環境での推奨設定
本番環境では、セキュリティ、コスト効率、パフォーマンスのバランスを考慮した設定が必要です。
本番環境では、HTTPSプロトコルを使用してセキュアな通信を実現し、タイムアウト値を長めに設定してネットワーク遅延に対応します。
# OpenTelemetry Collector への接続設定(HTTPS)
export OTEL_EXPORTER_OTLP_ENDPOINT=https://collector.production.example.com:4318
export OTEL_EXPORTER_OTLP_TIMEOUT=30s
# TLS証明書の設定
export OTEL_EXPORTER_OTLP_CERTIFICATE=/etc/ssl/certs/ca.crt
# サンプリング:10%のトレースを収集
export OTEL_TRACES_SAMPLER=parentbased_traceidratio
export OTEL_TRACES_SAMPLER_ARG=0.1
# リソース属性の設定
export OTEL_SERVICE_NAME=my-service
export OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=production,service.version=1.2.3本番環境では、HTTPSを使用してセキュアな通信を確保します。また、TLS証明書パスを明示的に指定することで、認証が適切に行われるようにします。タイムアウト値を30秒に設定することで、ネットワークの遅延やコレクターの処理待ち時間に余裕を持たせます。
本番環境でのサンプリング設定では、システムのトラフィック量に応じて調整が必要です。毎秒1000トレースを超えるような高トラフィックシステムでは、より積極的なサンプリングを検討してください。
サンプリング戦略
サンプリングは、テレメトリデータの量を削減し、収集・保存・分析のコストを低減させる重要な機能です。適切なサンプリング戦略を選択することで、コストと監視の精度のバランスを取ることができます。
サンプリング方式の比較
ヘッドサンプリング は、トレース開始時点でサンプリング判定を行うため、実装が簡単で低オーバーヘッドです。開発環境から小規模なシステムまで、幅広く利用できます。
テールサンプリング は、トレース全体を評価してから判定するため、エラーを含むトレースを確実にキャッチできます。しかし、実装が複雑で、コレクターに高い負荷がかかるため、大規模システムでのみ検討する価値があります。
トラフィック量に応じたサンプリング設定
| トラフィック量 | 推奨サンプリング方式 | 推奨サンプリングレート | 利用シーン |
|---|---|---|---|
| 低い(秒単位10トレース未満) | Probabilistic Sampling | 100% (always_on) | 開発環境、小規模サービス |
| 中程度(秒単位100-1000トレース) | TraceID Ratio | 10-50% | 成長期の中規模サービス |
| 高い(秒単位1000+トレース) | TraceID Ratio + Tail Sampling | 1-10% | 大規模・高トラフィック |
| 可視性重視 | Parent-Based | 状況に応じて調整 | 特定トレースの詳細追跡 |
トラフィック量が秒単位で10トレース未満であれば、すべてのデータを収集できます。毎秒100から1000トレースのシステムでは、10~50%のサンプリングレートが一般的です。さらに高トラフィックなシステムでは、1~10%に低下させることもあります。
Parent-Based サンプリングの活用
Parent-Based方式は、親スパンのサンプリング決定を引き継ぐ方法です。これにより、分散トレースの整合性を保証できます。
# Parent-Based Trace ID Ratio: 親がサンプルなら子もサンプル、
# 親がサンプルでなければ子もサンプルでない
export OTEL_TRACES_SAMPLER=parentbased_traceidratio
export OTEL_TRACES_SAMPLER_ARG=0.1この設定により、親スパンがサンプル対象であれば、その子孫スパンもすべてサンプル対象になります。逆に親がサンプル対象でなければ、子孫もサンプル対象になりません。この方式により、トレース全体の一貫性が保たれます。
リソース属性の設定
リソース属性は、テレメトリデータを生成するサービスのメタデータです。これらの属性により、トレース・メトリクスをどのサービスが生成したかを特定でき、デバッグや分析が効率的になります。
重要なリソース属性
オペレーティングシステムやホスト情報は、OpenTelemetry SDKによって自動検出されます。しかし、サービス特有の情報は明示的に設定する必要があります。
service.name(必須)はサービスの識別名です。監視バックエンドでサービスを区別するために必要な属性で、デフォルトは unknown_service となります。必ず明示的に設定してください。
service.version はアプリケーションのバージョンです。これを設定することで、デプロイ後のテレメトリデータの変化を追跡できます。
deployment.environment.name は環境を示す属性です。development、staging、productionなどの値を指定します。これにより、環境ごとのデータを分別できます。
環境変数でリソース属性を設定する場合は、以下のようにします。
export OTEL_SERVICE_NAME=order-service
export OTEL_RESOURCE_ATTRIBUTES=\
service.version=1.2.3,\
deployment.environment.name=production,\
service.instance.id=order-svc-001複数の属性をカンマ区切りで指定できます。この方法により、環境変数での設定が容易になります。
自動検出される属性
OpenTelemetry SDKは以下の情報を自動的に検出します。
- ホスト情報:ホスト名、オペレーティングシステム
- プロセス情報:プロセスID、実行時間
- コンテナ情報:コンテナID、イメージ名
- Kubernetes情報:ポッド名、ネームスペース、デプロイメント名
- クラウド情報:クラウドプロバイダー、リージョン、インスタンスID
これらの属性は自動的に収集されるため、追加の設定は不要です。Kubernetesでの実行時には、特にポッド名とネームスペースが有用なメタデータとなります。
開発環境から本番環境への段階的な設定変更
実装を進める過程で、設定を段階的に調整することが一般的です。
初期開発では always_on サンプリングですべてのデータを収集し、アプリケーションの動作を完全に理解することから始めます。その後、パフォーマンステストで問題が明確になれば、本番に向けてサンプリングレートを調整します。
ステージング環境では、本番に近い設定を試験できます。ここで実際のトラフィック量下での動作確認、コストの見積もり、アラート設定の検証を行います。最後に、本番環境へ段階的にロールアウトすることで、予期しない問題を最小限に抑えることができます。
OpenTelemetryの設定は、システムの成長に応じて継続的に見直す必要があります。定期的にサンプリングレートやリソース属性を確認し、監視の有効性とコストのバランスを保つことが重要です。