OpenTelemetry Go(LoongSuite)¶
LoongSuite Go は、OpenTelemetry ベースの Go コンパイル時自動インストルメンテーションツールです。ビジネスコードを変更する必要はなく、従来の go build を otel go build に置き換えるだけで、コンパイル時にサポート対象のフレームワークやコンポーネントに OpenTelemetry SDK とインストルメンテーションロジックを注入します。
本記事では、DataKit の OpenTelemetry コレクターを使用して、LoongSuite が OTLP 経由で報告する Trace と Metric を受信し、Guance に転送します。
!!! note
LoongSuite の「ゼロコード」は、ビジネスコードの変更が不要であることを意味しますが、再構築が不要であることを意味するわけではありません。インストルメンテーションはコンパイル時に行われるため、既に生成された Go バイナリに LoongSuite を後付することはできません。`otel go build` を使用して再コンパイルし、新しいバイナリをデプロイする必要があります。
事前準備¶
- DataKit がインストールされ、対象の Guance ワークスペースに接続されていること。
- Go アプリケーションから DataKit へのネットワークが到達可能であること:OTLP/HTTP は DataKit HTTP ポート
9529、OTLP/gRPC はデフォルトで4317を使用します。 - アプリケーションが標準の
go buildで正常にコンパイルできること。 - Go のバージョン、OS、アーキテクチャが LoongSuite の互換性要件を満たしていること。
- アプリケーションが使用するフレームワークまたはコンポーネントが LoongSuite のサポートリストに含まれていること。
本記事では、Linux AMD64 ホストを例とし、Kubernetes デプロイメントは含みません。
一、OpenTelemetry コレクターを有効にする¶
DataKit インストールディレクトリの conf.d/opentelemetry に移動します。コレクター設定がまだない場合は、サンプルファイルをコピーします。
opentelemetry.conf に最低限以下の受信設定が含まれていることを確認します。
[[inputs.opentelemetry]]
# カスタム属性をタグとして保持する場合は、ここにホワイトリストを追加します。
# 属性名のドットはアンダースコアに変換されます(例: team.name -> team_name)。
customer_tags = ["team", "project"]
[inputs.opentelemetry.http]
http_status_ok = 200
trace_api = "/otel/v1/traces"
metric_api = "/otel/v1/metrics"
[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/gRPC | Trace、Metric | http://<DataKit-IP>:4317 |
アプリケーションと DataKit が同一ホスト上にない場合は、実際のデプロイに応じて DataKit の HTTP リスニングアドレス、ファイアウォール、その他のネットワークアクセス制御を調整する必要があります。OTLP/gRPC を使用する場合は、addr をアプリケーションがアクセス可能なリスニングアドレス(例:0.0.0.0:4317)に変更してください。OTLP 受信ポートを直接パブリックネットワークに公開しないでください。
DataKit を再起動して設定を反映させます。
DataKit の HTTP サービスが到達可能かどうかを確認します。
二、アプリケーションを OpenTelemetry に接続する¶
LoongSuite のインストール¶
LoongSuite 公式 GitHub Release から Linux AMD64 実行可能ファイルをダウンロードします。
sudo curl -fL \
https://github.com/alibaba/loongsuite-go/releases/latest/download/otel-linux-amd64 \
-o /usr/local/bin/otel
sudo chmod +x /usr/local/bin/otel
ARM64 ホストの場合は、ファイル名を otel-linux-arm64 に置き換えてください。その他の OS やアーキテクチャについては、LoongSuite Releases から対応するファイルを選択してください。
ツールが実行可能であることを確認します。
本番環境では、明確なバージョン番号を含む Release ダウンロードアドレスを使用して LoongSuite のバージョンを固定し、アップグレード前に互換性、リリースノートを確認し、コンパイルとトレーシングの回帰テストを実行することを推奨します。
インストルメンテーション前の確認¶
まず、元のコマンドでプロジェクトが正常にコンパイルできることを確認します。
プロジェクトがすでに OpenTelemetry Go API、SDK、または Contrib インストルメンテーションライブラリに直接依存している場合は、これらの依存関係が現在の LoongSuite バージョンの要件と一致しているかどうかを確認する必要があります。
LoongSuite はアプリケーションに SDK 初期化ロジックを注入し、OpenTelemetry 自体にもインストルメンテーションを施します。プロジェクト内に互換性のない OpenTelemetry 依存関係や重複する SDK 初期化ロジックが存在する場合、コンパイルエラー、Span の重複、またはコンテキストの中断が発生する可能性があります。このようなプロジェクトでは、まず公式の互換性テーブルに従って依存関係のバージョンを統一してください。アプリケーションで SDK を自ら制御する必要がある場合は、代わりに OpenTelemetry Go SDK を使用することをお勧めします。
LoongSuite を使用したコンパイル¶
Go プロジェクトディレクトリに移動し、元のビルドコマンドの前に otel を追加します。
その他の一般的なビルド方法についても、元の go build パラメータを保持します。例:
LoongSuite によるコンパイルは、前処理、インストルメンテーション、依存関係処理のフェーズが追加されるため、初回のビルドは通常の go build よりも著しく遅くなります。再利用可能な Go ビルドキャッシュを設定して、以降のビルド時間を短縮できます。
環境変数を使用して、CI や単発のビルド用にキャッシュを指定することもできます。
export OTELTOOL_GO_CACHE="/var/tmp/loongsuite-go-cache"
otel go build -o ./bin/order-service ./cmd/order-service
!!! warning
以降のリリースプロセスでは、`otel go build` で生成されたバイナリをデプロイする必要があります。通常の `go build` で成果物を上書きすると、実行時に LoongSuite の自動インストルメンテーションは含まれません。
OTLP/HTTP を設定して起動する¶
以下の例では、OTLP/HTTP + Protobuf を使用して Trace と Metric をローカルの DataKit に報告します。汎用 endpoint を http://127.0.0.1:9529/otel に設定すると、Exporter はそれぞれ /v1/traces と /v1/metrics を追加し、最終的に DataKit の /otel/v1/* 受信パスに対応します。
export OTEL_SERVICE_NAME="order-service"
export OTEL_RESOURCE_ATTRIBUTES="deployment.environment.name=prod,service.version=1.0.0,team=backend"
export OTEL_TRACES_EXPORTER="otlp"
export OTEL_METRICS_EXPORTER="otlp"
export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://127.0.0.1:9529/otel"
export OTEL_EXPORTER_OTLP_INSECURE="true"
# 1.0 は全量サンプリングを意味します。接続検証フェーズでのみ使用することを推奨します。
export OTEL_TRACE_SAMPLER="1.0"
./bin/order-service
実行時パラメータは、コンパイルホスト上だけでなく、インストルメント後のバイナリが実際に実行される環境で設定する必要があります。起動後、サポート対象のフレームワークが提供するインターフェースをリクエストし、データベース、HTTP クライアント、またはメッセージキューへの呼び出しをトリガーして、検証可能な Span と Metric を生成します。
OTLP/gRPC の使用¶
OTLP/gRPC に変更する場合は、プロトコルと endpoint を置き換えます。gRPC アドレスには /v1/traces などの HTTP パスを追加しないでください。
export OTEL_EXPORTER_OTLP_PROTOCOL="grpc"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://127.0.0.1:4317"
export OTEL_EXPORTER_OTLP_INSECURE="true"
三、データ報告パラメータ¶
LoongSuite はコンパイル時に OpenTelemetry SDK の初期化ロジックを注入します。インストルメント後のアプリケーションは、実行時に環境変数を使用して Exporter、endpoint、サンプリング、リソース属性を調整できます。
リソースと Exporter のパラメータ¶
| 環境変数 | 説明 | 推奨値または例 |
|---|---|---|
OTEL_SERVICE_NAME |
サービス名。Guance で APM サービスの所属を決定する重要なフィールドです。 | order-service。本番環境では明示的に設定する必要があります。 |
OTEL_RESOURCE_ATTRIBUTES |
リソース属性。カンマ区切りの key=value を使用します。 |
deployment.environment.name=prod,service.version=1.0.0,team=backend |
OTEL_TRACES_EXPORTER |
Trace Exporter。none、console、zipkin、otlp をサポートし、カンマで複数の値を設定できます。 |
DataKit に報告する場合は otlp に設定します。 |
OTEL_METRICS_EXPORTER |
Metric Exporter。none、console、prometheus、otlp をサポートし、カンマで複数の値を設定できます。 |
DataKit に報告する場合は otlp に設定します。Metric を収集しない場合は none に設定します。 |
OTEL_EXPORTER_OTLP_PROTOCOL |
Trace と Metric で共通の OTLP プロトコル。 | http/protobuf または grpc、デフォルトは http/protobuf。 |
OTEL_EXPORTER_OTLP_TRACES_PROTOCOL |
Trace のみで使用する OTLP プロトコル。共通プロトコルより優先されます。 | http/protobuf または grpc。 |
OTEL_EXPORTER_OTLP_ENDPOINT |
Trace と Metric で共通の OTLP endpoint。 | HTTP:http://datakit-host:9529/otel;gRPC:http://datakit-host:4317。 |
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT |
Trace のみで使用する endpoint。共通 endpoint より優先されます。 | HTTP:http://datakit-host:9529/otel/v1/traces。 |
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT |
Metric のみで使用する endpoint。共通 endpoint より優先されます。 | HTTP:http://datakit-host:9529/otel/v1/metrics。 |
OTEL_EXPORTER_OTLP_HEADERS |
すべての OTLP リクエストに含まれるリクエストヘッダー。複数の値はカンマで区切ります。 | x-tenant=tenant-a。DataKit の expected_headers と一致させる必要があります。 |
OTEL_EXPORTER_OTLP_INSECURE |
TLS を使用しない接続を使用するかどうか。 | 本記事の HTTP 平文アドレスを使用する DataKit の場合は true に設定します。 |
汎用 HTTP endpoint を使用する場合は http://<DataKit-IP>:9529/otel を入力します。シグナル専用 endpoint を使用する場合は、/otel/v1/traces または /otel/v1/metrics を含む完全なパスを入力する必要があります。DataKit の OTLP/HTTP 収集は Protobuf のみをサポートします。http/json は設定しないでください。
サンプリングと Metric のパラメータ¶
| 環境変数 | 説明 | デフォルト値または例 |
|---|---|---|
OTEL_TRACE_SAMPLER |
LoongSuite が注入する SDK が使用する Trace サンプリングレート。値の範囲は 0.0~1.0。デフォルトでは親ベースの全量サンプリングを使用します。 |
0.1 はルート Trace の 10% をサンプリングします。 |
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE |
OTLP Metric の集計時間性。 | cumulative(デフォルト)、delta、または lowmemory。 |
OTEL_EXPORTER_PROMETHEUS_PORT |
Prometheus Metric Exporter 使用時のリスニングポート。 | デフォルトは 9464。DataKit OTLP に報告する場合は設定不要です。 |
!!! warning
LoongSuite が現在使用するサンプリング変数は `OTEL_TRACE_SAMPLER` であり、OpenTelemetry SDK で一般的な `OTEL_TRACES_SAMPLER`、`OTEL_TRACES_SAMPLER_ARG` とは異なります。インストールされている LoongSuite のバージョンの [SDK 設定説明](https://github.com/alibaba/loongsuite-go/blob/main/docs/user/sdk-config.md){:target="_blank"} を参照してください。
本番環境では、トラフィック、データ予算、およびトラブルシューティングの要件に応じてサンプリングレートを調整してください。上下流のサービス間で互換性のある W3C Trace Context 伝播を維持し、サービス間の呼び出しでチェーンが切断されないようにする必要があります。
LoongSuite ビルドパラメータ¶
以下の変数は LoongSuite コンパイルツールのみを制御し、インストルメント後のバイナリのデータ報告は制御しません。
| 環境変数 | 対応する otel set パラメータ |
説明 |
|---|---|---|
OTELTOOL_GO_CACHE |
-gocache |
再利用可能な Go コンパイルキャッシュディレクトリを指定します。 |
OTELTOOL_DEBUG |
-debug |
デバッグ情報を出力します。コンパイルやインストルメンテーションの問題を調査する場合にのみ有効にします。 |
OTELTOOL_VERBOSE |
-verbose |
より詳細なコンパイルプロセスを出力します。 |
OTELTOOL_RULE_JSON_FILES |
-rule |
1 つまたは複数のカスタムインストルメンテーションルールファイルを指定します。 |
OTELTOOL_DISABLE_RULES |
-disable |
指定されたデフォルトルールを無効にします。複数のルールはカンマで区切ります。 |
例えば、一時的に詳細なコンパイルログを出力する場合:
export OTELTOOL_DEBUG="true"
export OTELTOOL_VERBOSE="true"
otel go build -o ./bin/order-service ./cmd/order-service
トラブルシューティングが完了したら、ログ量を減らすために Debug と Verbose をオフにしてください。
フィールドマッピング¶
LoongSuite によって報告された OTLP Span Attributes は、DataKit OpenTelemetry コレクターによってトレースフィールドに変換されます。一般的なマッピングは次のとおりです。
| OpenTelemetry 属性 | DataKit フィールド |
|---|---|
db.system、db.system.name |
db_system |
db.operation、db.operation.name |
db_operation |
db.query.text |
db_statement |
db.namespace |
db_name |
db.collection.name |
db_collection |
http.request.method |
http_method |
http.response.status_code |
http_status_code |
network.protocol.name |
net_protocol_name |
network.protocol.version |
net_protocol_version |
messaging.system |
messaging_system |
messaging.operation.name |
messaging_operation |
messaging.message.id |
messaging_message_id |
rpc.system.name |
rpc_system |
rpc.method |
rpc_method |
rpc.grpc.status_code |
rpc_grpc_status_code |
LoongSuite によって報告されたその他の Attributes をタグとして昇格させるには、DataKit の opentelemetry.conf で customer_tags を設定します。customer_tags は正規表現をサポートしており、一致した属性名の . は _ に変換されます。
[[inputs.opentelemetry]]
customer_tags = [
"reg:^db\\.query\\.parameter\\.",
"reg:^kratos\\.service\\.meta\\.",
"reg:^gen_ai\\.other_input\\.",
"reg:^gen_ai\\.other_output\\.",
]
ユーザー ID、注文番号などの高カーディナリティ値をタグとして一括で昇格させたり、パスワード、トークン、データベースの完全な接続文字列などの機密情報を報告したりしないでください。
接続の検証¶
otel go buildを使用してコンパイルし、新しいバイナリを起動します。- サポート対象の Web フレームワークによって処理されるインターフェースをリクエストし、データベース、HTTP クライアント、またはメッセージキューへの呼び出しをトリガーします。
- OTLP/HTTP を使用して報告する場合、DataKit ホストで受信ログを確認します。
/otel/v1/traces または /otel/v1/metrics への POST リクエストが表示され、応答コードが 200 の場合、DataKit がデータを受信したことを意味します。次に、Guance の「APM > トレース」に移動し、service:order-service で検索します。Metric は、少なくとも 1 つのエクスポートサイクルが経過した後にクエリします。
データがない場合は、以下の項目を順に確認してください。
- デプロイされているのが
otel go buildで生成された新しいバイナリであるかどうか。 OTEL_SERVICE_NAME、Exporter、プロトコル、endpoint が実際の実行プロセスで設定されているかどうか。- アプリケーションが使用するフレームワークとそのバージョンが LoongSuite のサポートリストに含まれているかどうか。
- LoongSuite とプロジェクトの既存の OpenTelemetry 依存関係との互換性。
- DataKit OpenTelemetry コレクターが有効化され、再起動されて反映されているかどうか。
- アプリケーションから DataKit へのネットワークとポートが到達可能かどうか。
通常の go build は成功するが otel go build が失敗する場合は、一時的に OTELTOOL_DEBUG=true と OTELTOOL_VERBOSE=true を有効にして、失敗したインストルメンテーションルールを特定します。必要に応じて、otel set -disable=<rule-name> で問題のあるルールを一時的に無効にし、LoongSuite Issues にフィードバックを送信してください。