全部產品
Search
文件中心

Simple Log Service:通過OpenTelemetry接入Java Trace資料

更新時間:Jun 30, 2024

本文介紹通過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等)同時使用,可能會產生未定義行為。

  1. 下載最新版本Java Agent。更多資訊,請參見OpenTelemetry Release列表

  2. 整合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

  1. 添加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>
  2. 添加初始化代碼。

    代碼中的變數(例如${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錯誤,如何處理?Counld not find TLS ALPN provider

您可以參見如下步驟解決:

  1. 下載引導包

  2. 執行如下命令添加相關的.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

後續步驟