OpenTelemetry Python¶
OpenTelemetry Python Agent は、実行時のモンキーパッチにより、サポート対象の Python ライブラリおよびフレームワークにテレメトリ機能を注入します。opentelemetry-instrument を使用してアプリケーションを起動すると、ビジネスコードを変更することなく、Web リクエスト、HTTP クライアント、データベース、メッセージキューなどの呼び出しを収集できます。
本ドキュメントでは、DataKit の OpenTelemetry コレクターを使用して OTLP データを受信し、Guance に転送します。
前提条件¶
- Python 3.10 以降
pipおよび利用可能な Python 仮想環境- DataKit がインストールされ、対象の Guance ワークスペースに接続されていること
- Python アプリケーションから DataKit へのネットワーク到達性があること。OTLP/HTTP は DataKit HTTP ポート
9529を使用し、OTLP/gRPC はデフォルトで4317を使用します。
一、OpenTelemetry コレクターを有効にする¶
DataKit のインストールディレクトリ配下の conf.d/opentelemetry に移動します。コレクター設定がまだ作成されていない場合は、サンプルファイルをコピーします。
opentelemetry.conf に少なくとも以下の受信設定が含まれていることを確認します。
[[inputs.opentelemetry]]
# Guance でタグとして保持するカスタム属性をホワイトリストに追加します。
customer_tags = ["team", "project"]
[inputs.opentelemetry.http]
http_status_ok = 200
trace_api = "/otel/v1/traces"
metric_api = "/otel/v1/metrics"
logs_api = "/otel/v1/logs"
[inputs.opentelemetry.grpc]
addr = "127.0.0.1:4317"
max_payload = 16777216
受信アドレスは次のとおりです。
| プロトコル | データタイプ | DataKit 受信アドレス |
|---|---|---|
| OTLP/HTTP + Protobuf | Trace | http://<DataKit-IP>:9529/otel/v1/traces |
| OTLP/HTTP + Protobuf | Metric | http://<DataKit-IP>:9529/otel/v1/metrics |
| OTLP/HTTP + Protobuf | Log | http://<DataKit-IP>:9529/otel/v1/logs |
| OTLP/gRPC | Trace、Metric、Log | http://<DataKit-IP>:4317 |
Python アプリケーションと DataKit が同一ホスト上にない場合は、実際のデプロイに合わせて DataKit のリスニングアドレス、ファイアウォール、その他のネットワークアクセス制御を調整してください。gRPC では、addr をアプリケーションからアクセス可能なリスニングアドレス(例: 0.0.0.0:4317)に変更できます。OTLP 受信ポートをパブリックネットワークに直接公開しないでください。
DataKit を再起動し、サービスを確認します。
二、アプリケーションの OpenTelemetry 接続¶
仮想環境の作成¶
OpenTelemetry Agent、アプリケーション、およびインストルメンテーションパッケージは、同じ Python 環境にインストールする必要があります。アプリケーションには個別の仮想環境を使用することをお勧めします。
まず、アプリケーション自身の依存関係をインストールします。例:
Agent、Exporter、およびインストルメンテーションパッケージのインストール¶
Python Package Index の公式パッケージソースから OpenTelemetry Distro と OTLP exporter をインストールします。
python -m pip install opentelemetry-distro opentelemetry-exporter-otlp
opentelemetry-bootstrap -a install
opentelemetry-distro は、SDK、opentelemetry-bootstrap、および opentelemetry-instrument を提供します。opentelemetry-bootstrap -a install は、現在の環境にインストールされているアプリケーションの依存関係を確認し、一致するインストルメンテーションパッケージをインストールします。例えば、環境に Flask が存在する場合、opentelemetry-instrumentation-flask がインストールされます。
アプリケーションの依存関係をインストールしてから、bootstrap を実行する必要があります。アプリケーションにフレームワーク、データベースドライバー、HTTP クライアントなどの依存関係を追加またはアップグレードした後は、以下のコマンドを再実行することをお勧めします。
インストールせずに、インストールされるインストルメンテーションパッケージを事前に確認する場合は、次のコマンドを実行します。
アプリケーションの設定と起動¶
以下は OTLP/HTTP + Protobuf の例で、デフォルトで Trace に接続し、Metric と Log は一時的に無効にします。
export OTEL_SERVICE_NAME="order-service"
export OTEL_RESOURCE_ATTRIBUTES="env=prod,version=1.0.0,team=backend"
export OTEL_TRACES_EXPORTER="otlp"
export OTEL_METRICS_EXPORTER="none"
export OTEL_LOGS_EXPORTER="none"
export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://127.0.0.1:9529/otel"
export OTEL_PROPAGATORS="tracecontext,baggage"
export OTEL_PYTHON_LOG_AUTO_INSTRUMENTATION="false"
opentelemetry-instrument python app.py
OTEL_EXPORTER_OTLP_ENDPOINT はベースアドレスです。OTLP/HTTP exporter は、データタイプに応じて自動的に /v1/traces、/v1/metrics、または /v1/logs を追加し、最終的に DataKit の /otel/v1/* ルートに対応します。
実際のアプリケーションプロセスを起動するには、opentelemetry-instrument を使用する必要があります。環境変数を設定した後に python app.py を直接実行しても、ゼロコードの自動インストルメンテーションは有効になりません。
一般的な起動方法¶
Flask 開発サーバー:
Gunicorn:
Gunicorn などのプリフォークサーバーで複数のワーカーを使用する場合、自動インストルメンテーションと Metric のエクスポートは、プロセスの fork 動作の影響を受ける可能性があります。最初はシングルワーカーで検証することをお勧めします。本番環境でマルチプロセスが必要な場合は、使用するフレームワークとシグナルタイプに基づいて、公式のプリフォークデプロイメント方式を評価してください。
Django 開発サーバー:
本番環境で Supervisor、systemd、またはその他のプロセスマネージャーを使用する場合は、環境変数と opentelemetry-instrument を実際の起動コマンドに記述し、アプリケーションを再起動してください。
OTLP/gRPC の使用¶
インストールされた opentelemetry-exporter-otlp には、OTLP exporter がすでに含まれています。gRPC を使用する場合は、プロトコルとエンドポイントを変更します。
export OTEL_EXPORTER_OTLP_PROTOCOL="grpc"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://127.0.0.1:4317"
gRPC エンドポイントには、/v1/traces などの HTTP パスを追加しないでください。
三、データ送信パラメータ¶
Python Agent は、コマンドライン引数と環境変数をサポートしています。コマンドライン引数名を環境変数に変換する場合は、大文字に変換して OTEL_ プレフィックスを追加する必要があります。たとえば、--service_name は OTEL_SERVICE_NAME に対応します。同じパラメータがコマンドラインと環境変数の両方で設定されている場合、コマンドライン引数が優先されます。
基本パラメータ¶
| 環境変数 | 説明 | 推奨値または例 |
|---|---|---|
OTEL_SERVICE_NAME |
service.name を設定します。設定されていない場合、サービスは安定して識別できません。 |
order-service。本番環境では明示的に設定する必要があります。 |
OTEL_RESOURCE_ATTRIBUTES |
リソース属性。カンマ区切りの key=value 形式。 |
env=prod,version=1.0.0,team=backend |
OTEL_TRACES_EXPORTER |
Trace エクスポーター。 | DataKit に送信する場合は otlp に設定します。無効にする場合は none に設定します。 |
OTEL_METRICS_EXPORTER |
Metric エクスポーター。 | メトリクスを送信する必要がある場合は otlp に設定し、それ以外の場合は none に設定します。 |
OTEL_LOGS_EXPORTER |
Log エクスポーター。 | ログを送信する必要がある場合は otlp に設定し、それ以外の場合は none に設定します。 |
OTEL_PROPAGATORS |
サービス間のコンテキスト伝搬形式。 | デフォルトは tracecontext,baggage。全リンクで互換性を維持する必要があります。 |
OTEL_SDK_DISABLED |
OpenTelemetry SDK を無効にします。 | デフォルトは false。緊急時に無効にする場合は true に設定します。 |
service.name は、Guance でのサービス所属に使用されます。env と version も設定し、環境とバージョンでフィルタリングできるようにすることをお勧めします。その他のカスタムリソース属性は、DataKit の customer_tags ホワイトリストに追加した場合にのみタグとして保持されます。属性名の . は _ に変換されます。
Python 自動インストルメンテーションパラメータ¶
| 環境変数 | 説明 | デフォルト値または例 |
|---|---|---|
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS |
指定されたインストルメンテーションを無効にします。複数のエントリポイント名はカンマで区切ります。 | redis,kafka,grpc_client |
OTEL_PYTHON_EXCLUDED_URLS |
サポートされているすべての Web インストルメンテーションで共通に除外する URL の正規表現。 | healthz,readyz |
OTEL_PYTHON_<LIBRARY>_EXCLUDED_URLS |
特定のライブラリのみ URL を除外します。<LIBRARY> は大文字のライブラリ名を使用します。 |
OTEL_PYTHON_FLASK_EXCLUDED_URLS=healthz |
OTEL_PYTHON_LOG_CORRELATION |
Python ログレコードに Trace コンテキストを注入します。 | デフォルトは false。ログの関連付けが必要な場合は true に設定します。 |
OTEL_PYTHON_LOG_AUTO_INSTRUMENTATION |
OpenTelemetry Logging Handler を自動的に構成します。 | 現在のバージョンのデフォルトは true。OTLP 経由でログを送信しない場合は false に設定することをお勧めします。 |
OTEL_PYTHON_LOG_LEVEL |
Python 自動インストルメンテーションのログレベル。 | info、warning、error、debug。 |
OTEL_PYTHON_AUTO_INSTRUMENTATION_EXPERIMENTAL_GEVENT_PATCH |
SDK を初期化する前に gevent monkey patch を呼び出します。 | gevent アプリケーションの場合は patch_all に設定できます。 |
OTLP パラメータ¶
| 環境変数 | 説明 | 推奨値または例 |
|---|---|---|
OTEL_EXPORTER_OTLP_PROTOCOL |
すべてのシグナルの OTLP プロトコル。 | DataKit は http/protobuf または grpc をサポートしています。 |
OTEL_EXPORTER_OTLP_ENDPOINT |
すべてのシグナルで共通のベースアドレス。 | HTTP: http://datakit-host:9529/otel、gRPC: http://datakit-host:4317。 |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT |
Trace のみに使用されるアドレス。共通アドレスより優先されます。 | http://datakit-host:9529/otel/v1/traces |
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT |
Metric のみに使用されるアドレス。共通アドレスより優先されます。 | http://datakit-host:9529/otel/v1/metrics |
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT |
Log のみに使用されるアドレス。共通アドレスより優先されます。 | http://datakit-host:9529/otel/v1/logs |
OTEL_EXPORTER_OTLP_HEADERS |
すべての OTLP リクエストに含まれるリクエストヘッダー。複数の値はカンマで区切ります。 | x-tenant=tenant-a。DataKit の expected_headers と一致させる必要があります。 |
OTEL_EXPORTER_OTLP_COMPRESSION |
OTLP リクエストの圧縮方式。 | ホストをまたいで送信する場合は gzip に設定できます。 |
OTEL_EXPORTER_OTLP_TIMEOUT |
1回のエクスポートのタイムアウト(秒)。 | 10 |
DataKit の OTLP/HTTP コレクションは Protobuf のみをサポートしています。http/protobuf を使用し、http/json は使用しないでください。共通エンドポイントと特定のデータタイプのエンドポイントが両方存在する場合、特定のデータタイプの設定が優先されます。
サンプリングとバッチ送信パラメータ¶
| 環境変数 | 説明 | デフォルト値または例 |
|---|---|---|
OTEL_TRACES_SAMPLER |
Trace ヘッドサンプラー。 | デフォルトは parentbased_always_on。比率でサンプリングする場合は parentbased_traceidratio を使用します。 |
OTEL_TRACES_SAMPLER_ARG |
サンプラー引数。 | 0.1 はルート Trace の 10% をサンプリングします。 |
OTEL_BSP_SCHEDULE_DELAY |
Span バッチエクスポートの間隔(ミリ秒)。 | デフォルトは 5000。 |
OTEL_BSP_MAX_QUEUE_SIZE |
エクスポート待ちの Span キューの上限。 | デフォルトは 2048。 |
OTEL_BSP_MAX_EXPORT_BATCH_SIZE |
1バッチあたりの最大エクスポート Span 数。 | デフォルトは 512。 |
OTEL_BSP_EXPORT_TIMEOUT |
Span バッチエクスポートのタイムアウト(ミリ秒)。 | デフォルトは 30000。 |
OTEL_METRIC_EXPORT_INTERVAL |
Metric エクスポートの間隔(ミリ秒)。 | デフォルトは 60000。 |
本番環境では、トラフィックとデータバジェットに基づいてサンプリングレートを設定する必要があります。アプリケーション側のヘッドサンプリングと DataKit 側のサンプリングを同時に有効にすると、最終的な保持率が相乗的に低下します。サンプリングの場所は統一して計画する必要があります。
接続の確認¶
インストルメンテーションライブラリがインストールされたアプリケーションのルートにリクエストを送信し、DataKit ホストで受信ログを確認します。
/otel/v1/traces への POST リクエストが表示され、応答コードが 200 の場合、DataKit が Trace を受信したことを示します。次に、Guance の「APM > トレース」に移動し、service:order-service でクエリを実行します。
データがない場合は、以下の項目を順に確認してください。アプリケーションと OpenTelemetry が同じ仮想環境にインストールされているか、アプリケーションの依存関係インストール後に opentelemetry-bootstrap -a install を実行したか、opentelemetry-instrument で起動したか、実際のコードパスがサポート対象のインストルメンテーションライブラリに該当するか、OTLP エンドポイントに到達可能か。