このトピックでは、OpenTelemetry SDK for Javaを使用してJavaアプリケーションからSimple Log Serviceにトレースデータをインポートする方法について説明します。
前提条件
トレースインスタンスが作成されます。 詳細については、「トレースインスタンスの作成」をご参照ください。
Java開発環境をセットアップします。 Javaバージョンは8以降です。
説明Java Development Kit (JDK) 8u252以降のバージョンを使用することを推奨します。
方法1 :( 推奨) Javaエージェントを使用してトレースデータを自動的にアップロードする
Javaエージェントを使用して、数十のJavaフレームワークでトレースデータをSimple Log Serviceに自動的にアップロードできます。 詳細については、「サポートされているライブラリ、フレームワーク、アプリケーションサーバー、およびJVM」をご参照ください。
JavaエージェントをSkyWalkingエージェントまたはZipkinエージェントと一緒に使用することはできません。 JavaエージェントをSkyWalkingエージェントまたはZipkinエージェントと一緒に使用すると、未定義の動作が発生する可能性があります。
最新バージョンのJavaエージェントをダウンロードします。 詳細については、「opentelemetry-java-instrumentation」をご参照ください。
Javaエージェントを設定します。
次のコードは、Java仮想マシン (JVM) の-javaagentパラメーターの環境変数を設定する方法の例を示しています。 詳細については、「opentelemetry-java-instrumentation」をご参照ください。 コード内の ${endpoint} や ${project} などの変数を実際の値に置き換える必要があります。
export OTEL_EXPORTER_OTLP_PROTOCOL=grpc export OTEL_EXPORTER_OTLP_ENDPOINT=https://${endpoint} export OTEL_EXPORTER_OTLP_COMPRESSION=gzip export OTEL_EXPORTER_OTLP_HEADERS=x-sls-otel-project=${project},x-sls-otel-instance-id=${instance},x-sls-otel-ak-id=${access-key-id},x-sls-otel-ak-secret=${access-key-secret} java -javaagent:/path/to/opentelemetry-javaagent-all.jar -Dotel.resource.attributes=service.namespace=${service.namespace},service.name=${service},service.version=${version},host.name=${host},deployment.environment=${environment} -jar /path/to/your/app.jar
表 1. 変数
変数
説明
例
${endpoint}
Simple Log Serviceプロジェクトのエンドポイント。 形式: ${project}.${region-endpoint}: ポート
${project}: Simple Log Serviceプロジェクトの名前。
${region-endpoint}: プロジェクトが存在するリージョンのSimple Log Serviceエンドポイント。 Simple Log Serviceには、内部エンドポイントまたはパブリックエンドポイントを使用してアクセスできます。 内部エンドポイントは、クラシックネットワークまたは仮想プライベートクラウド (VPC) 経由でアクセスできます。 インターネット経由でパブリックエンドポイントにアクセスできます。 詳細については、「エンドポイント」をご参照ください。
Port: ポート番号。 値は10010のように固定されます。
test-project.cn-hangzhou.log.aliyuncs.com:10010
${project}
Simple Log Serviceプロジェクトの名前。
test-project
${instance}
トレースインスタンスのID。 詳細については、「トレースインスタンスの作成」をご参照ください。
テストトレース
${access-key-id}
Alibaba CloudアカウントのAccessKey ID。
Simple Log Serviceプロジェクトの書き込み権限のみを持つResource Access Management (RAM) ユーザーのAccessKeyペアを使用することを推奨します。 AccessKey ペアは、AccessKey ID と AccessKey Secret で構成されます。 指定したプロジェクトの書き込み権限をRAMユーザーに付与する方法の詳細については、「カスタムポリシーを使用してRAMユーザーに権限を付与する」をご参照ください。 AccessKeyペアを取得する方法の詳細については、「AccessKeyペア」をご参照ください。
なし
${access-key-secret}
Alibaba CloudアカウントのAccessKeyシークレット。
Simple Log Serviceプロジェクトに対する書き込み権限のみを持つRAMユーザーのAccessKeyペアを使用することを推奨します。
なし
${service.nameスペース}
サービスが属する名前空間。
order
${service}
サービスの名前です。 ビジネス要件に基づいて値を指定します。
payment
${version}
サービスのバージョンです。 va.b.c形式でバージョンを指定することを推奨します。
v0.1.2
${host}
ホスト名。
localhost
${environment}
デプロイ環境。 例: テスト環境または本番環境。 ビジネス要件に基づいて値を指定します。
前
方法2: トレースデータを手動で生成してアップロードする
自己管理フレームワークを使用している場合、または特別な要件がある場合は、手動でトレースデータを生成し、そのデータをSimple Log Serviceにアップロードできます。 この例では、Mavenが使用されます。 詳細については、「Manual Instrumentation」をご参照ください。
Maven依存関係を追加します。
<dependencies> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk</artifactId> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-otlp</artifactId> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-semconv</artifactId> <version>1.20.1-alpha</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-bom</artifactId> <version>1.20.1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
初期化コードを追加します。
次のコードの ${endpoint} や ${project} などの変数を実際の値に置き換える必要があります。 変数の詳細については、「変数」をご参照ください。
Resource resource = Resource.getDefault() .merge(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, "service-name"))) .merge(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAMESPACE, "namespace"))) .merge(Resource.create(Attributes.of(ResourceAttributes.SERVICE_VERSION, "1.0.0"))) .merge(Resource.create(Attributes.of(ResourceAttributes.HOST_NAME, "host-name"))); SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() .addSpanProcessor( BatchSpanProcessor.builder(OtlpGrpcSpanExporter.builder().setEndpoint("https://${endpoint}") // Set the .setEndpoint parameter to a value that starts with https://. Example: https://test-project.cn-hangzhou.log.aliyuncs.com:10010. .addHeader("x-sls-otel-project", "${project}") .addHeader("x-sls-otel-instance-id", "${instance}") .addHeader("x-sls-otel-ak-id", "${access-key-id}") .addHeader("x-sls-otel-ak-secret", "${access-key-secret}").build()).build()) .setResource(resource).build(); OpenTelemetry openTelemetry = OpenTelemetrySdk.builder().setTracerProvider(sdkTracerProvider) .buildAndRegisterGlobal(); Tracer tracer = openTelemetry.getTracer("instrumentation-library-name", "1.0.0"); Span parentSpan = tracer.spanBuilder("parent").startSpan(); try { Span childSpan = tracer.spanBuilder("child").setParent(Context.current().with(parentSpan)).startSpan(); childSpan.setAttribute("test", "vllelel"); childSpan.end(); } finally { parentSpan.end(); }
よくある質問
JDKバージョンが8u252より前のときに、Javaエージェントから「Cillu not find TLS ALPN provider」というエラーメッセージが返された場合はどうすればよいですか?
この問題を解決するには、次の手順を実行します。
次のコマンドを実行して、必要なJARファイルを追加します。
${youpath} は、JARファイルへのパスを指定します。 各 ${youpath} 変数を実際の値に置き換えます。
java -Xbootclasspath/p:${youpath}/netty-tcnative-boringssl-static-2.0.25.Final.jar -javaagent:${youpath}/opentelemetry-javaagent-all.jar -jar ${youpath}/demo2-0.0.1-SNAPSHOT.jar