
# 如何通过OpenTelemetry Collector将链路追踪数据上报到APM
OpenTelemetry Collector作为数据收集和转发的代理，支持从多种来源接收数据，经过处理后导出到不同的后端。使用Collector可以实现数据的统一收集、过滤、增强和转发，降低应用端的开销。本文介绍如何通过OpenTelemetry Collector将应用的链路追踪数据上报至华为云应用性能管理（APM）服务。
#### 前提条件
1. 已开通链路追踪白名单功能。
2. 已获取APM接入信息。
   - service.name：\<应用名称.组件名称.环境名称\>，其中应用名称获取信息方式参见的[应用管理](https://support.huaweicloud.com/usermanual-apm2/apm_07_0101.html)的"应用名称"参数，组件名称和环境名称为自定义参数。
   
   - endpoint：上报地址，请参见[探针接入地址](https://support.huaweicloud.com/usermanual-apm2/apm_07_1008.html)。
   
   - Authentication：鉴权信息，获取信息方式参见的[应用管理](https://support.huaweicloud.com/usermanual-apm2/apm_07_0101.html)的"APPKEY"参数。
    
 
#### 示例demo
使用springboot实现一个简单掷骰子应用。
1. 编写业务代码，初始化一个springboot项目。
   - 创建RollController.java文件，内容如下：
     ```
     import org.springframework.web.bind.annotation.GetMapping;
     import org.springframework.web.bind.annotation.RequestParam;
     import org.springframework.web.bind.annotation.RestController;
     import java.util.Optional;
     import java.util.concurrent.ThreadLocalRandom;
     @RestController
     public class RollDice {
         @GetMapping("/rolldice")
         public String rollDiceAndSave(@RequestParam("player") Optional<String> player) {
             int result = 0;
             //掷骰子
             try {
                 Thread.sleep(100);
                 result = ThreadLocalRandom.current().nextInt(1, 7);
             } catch (InterruptedException e) {
                 Thread.currentThread().interrupt();
             }
             saveResult(player.orElse("Anonymous player"), result);
             return Integer.toString(result);
         }
         private void saveResult(String player, int dicePoint) {
             //模拟数据库操作耗时
             try {
                 Thread.sleep(100);
             } catch (InterruptedException e) {
                 Thread.currentThread().interrupt();
             }
         }
     }
     ```
     
   
   - application.properties 内容如下：
     ```
     server.port=8080
     ```
     
    
2. 启动Demo，命令如下：
   ```
   java -jar otel-demo-0.0.1-SNAPSHOT.jar &
   curl http://localhost:8080/rolldice
   ```
   
 
#### 操作步骤
1. 部署Collector。 
   1. 访问[GitHub Releases](https://github.com/open-telemetry/opentelemetry-collector-releases/releases) 页面确认版本，以ECS安装为例，示例如下。其他安装方式可参考[Collector安装](https://opentelemetry.io/docs/collector/install/)。
      ```
      mkdir otel_collector && cd otel_collector
      wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.140.0/otelcol_0.140.0_linux_amd64.tar.gz
      tar -xvf otelcol_0.140.0_linux_amd64.tar.gz
      ```
      
   
   2. 创建config.yaml配置文件，用于定义collector的数据接收、处理和导出规则。内容参考[config.yaml](https://github.com/open-telemetry/opentelemetry-collector-releases/blob/main/distributions/otelcol/config.yaml)，示例如下：
      ```
      # To limit exposure to denial of service attacks, change the host in endpoints below from 0.0.0.0 to a specific network interface.
      # See https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/security-best-practices.md#safeguards-against-denial-of-service-attacks
      extensions:
        health_check:
        pprof:
          endpoint: 0.0.0.0:1777
        zpages:
          endpoint: 0.0.0.0:55679
      receivers:
        otlp:
          protocols:
            grpc:
              endpoint: 0.0.0.0:4317   
      processors:
        # Data sources: traces
        resource:
          attributes:
            - key: service.name                           #可以在探针启动参数中定义
              value: 应用名称.组件名称.环境名称
              action: upsert
      exporters:
        # Data sources: traces, metrics, logs
        otlp:
          endpoint: 上报地址               
          headers:                                             
            Authentication: "鉴权信息"
          tls:
            insecure: true
      service:
        pipelines:
          traces:                                                #启用配置
            receivers: [otlp]
            processors: [resource]                    
            exporters: [otlp]
        extensions: [health_check, pprof, zpages]
      ```
      
   
   3. 配置完成后，启动 opentelemetry-collector。
      ```
      ./otelcol --config=./config.yaml &
      ```
      
   
   
   
   
2. 启动opentelemetry探针，命令如下： 
   ```
   java -javaagent:探针安装路径 \
   -Dotel.exporter.otlp.protocol=grpc \
   -Dotel.exporter.otlp.traces.endpoint=http://127.0.0.1:4317 \            #collector receivers.otlp.protocols.grpc.endpoint地址
   -Dotel.metrics.exporter=none \
   -Dotel.logs.exporter=none \
   -Dotel.service.name=otel-czf.collector.dev \             #也可在collector的config.yaml中配置
   -jar <yourApp>.jar
   ```
   
   
3. 根据业务实际触发的业务请求情况，在APM控制台链路追踪中查看应用的监控数据。详细操作参见[接口调用](https://support.huaweicloud.com/usermanual-apm2/apm_07_0104.html)。
   
   例如：调用demo接口"http://localhost:8080/rolldice"重复9次，可以在"接口调用"页面查看到"GET /rolldice"的调用次数为9。
   ![](https://support.huaweicloud.com/bestpractice-apm2/zh-cn_image_0000002543406883.png "点击放大")
   
   
   
 
