本文介紹通過OpenTelemetry Java SDK將Java應用的Trace資料接入到Log Service的操作步驟。
前提條件
已建立Trace執行個體。更多資訊,請參見建立Trace執行個體。
已安裝Java 8及以上版本的開發環境。
說明建議使用JDK 8u252及以上版本。
(推薦)方案一:通過Java Agent自動上傳Trace資料
目前有數十種Java架構支援通過Java Agent自動上傳Trace資料到Log Service,詳細的Java架構列表請參見SupportedLibraries。
Java Agent上傳方式不支援和其他類似的方案(例如SkyWalking Agent、Zipkin Agent等)同時使用,可能會產生未定義行為。
下載最新版本Java Agent。更多資訊,請參見OpenTelemetry Release列表。
整合Java Agent。
此處以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}
Log ServiceProject的接入地址,格式為${project}.${region-endpoint}:Port,其中:
${project}:Log ServiceProject名稱。
${region-endpoint}:Log ServiceProject所在地區的訪問網域名稱,支援公網和阿里雲內網(傳統網路、VPC)。更多資訊,請參見服務入口。
Port:網路連接埠,固定為10010。
test-project.cn-hangzhou.log.aliyuncs.com:10010
${project}
Log ServiceProject名稱。
test-project
${instance}
Trace服務執行個體ID。更多資訊,請參見建立Trace執行個體。
test-traces
${access-key-id}
阿里雲帳號AccessKey ID。
建議您使用只具備Log ServiceProject寫入許可權的RAM使用者的AccessKey(包括AccessKey ID和AccessKey Secret)。授予RAM使用者向指定Project寫入資料許可權的具體操作,請參見授權。如何擷取AccessKey的具體操作,請參見存取金鑰。
無
${access-key-secret}
阿里雲帳號AccessKey Secret。
建議您使用只具備Log ServiceProject寫入許可權的RAM使用者的AccessKey。
無
${service.namespace}
服務歸屬的命名空間。
order
${service}
服務名。根據您的實際情境配置。
payment
${version}
服務版本號碼。建議按照va.b.c格式定義。
v0.1.2
${host}
主機名稱。
localhost
${environment}
部署環境。例如測試環境、生產環境。根據您的實際情境配置。
pre
方案二:手動構造Trace資料並上傳
當您使用自建架構或有其他需求時,可以手動構造Trace資料並上傳到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}") // 配置.setEndpoint參數時,必須添加https://,例如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 Agent中可能出現Could not find TLS ALPN provider錯誤,如何處理?
您可以參見如下步驟解決:
執行如下命令添加相關的.jar包。
${youpath}為各個.jar包所在路徑,請根據實際情況替換。
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