

# OpenTelemetry 收集器
<a name="CloudWatch-OTLPSimplesetup"></a>

OpenTelemetry Collector 是一个与供应商无关的开源代理，可接收、处理和导出遥测数据。该代理充当应用程序与 Amazon CloudWatch 之间的中心管道，从多个来源收集指标、日志和跟踪数据，然后使用 OpenTelemetry Protocol（OTLP）将其发送到 CloudWatch。

将 OpenTelemetry Collector 与 CloudWatch 搭配使用具有以下优势：
+ 通过单个代理从多个应用程序和主机收集遥测数据，从而减少与 CloudWatch 的连接数量。
+ 在将遥测数据发送到 CloudWatch 之前，对数据进行处理和筛选，包括添加或删除属性、批处理数据和采样跟踪数据。
+ 在 AWS、本地和其他云环境中使用相同的收集器配置，无论应用程序在哪里运行，都能提供一致的遥测管道。
+ 将带有丰富标签的指标发送到 CloudWatch，且可在 CloudWatch Query Studio 中使用 Prometheus 查询语言（PromQL）查询这些标签。

## 支持的接收器
<a name="CloudWatch-OTLPSupportedReceivers"></a>

OpenTelemetry Collector 支持各种用于摄取遥测数据的接收器。可以使用 OpenTelemetry 接收器，例如将 OTLP 接收器用于使用 OpenTelemetry SDK 埋点的应用程序，或者使用 Prometheus 接收器从现有 Prometheus 导出器中抓取指标。与 CloudWatch 一起使用的常见 Prometheus 接收器包括：
+ Prometheus 接收器，用于抓取任何兼容 Prometheus 的端点
+ 主机指标接收器，用于从主机收集系统级指标
+ Kubernetes 集群接收器，用于从 Kubernetes API 服务器收集集群级别的指标

您可以在单个收集器中配置多个接收器，从而收集 OpenTelemetry 和 Prometheus 指标，并通过同一个管道将它们发送到 CloudWatch。有关可用接收器的完整列表，请参阅 OpenTelemetry Collector [存储库](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver)。

## 开始使用
<a name="CloudWatch-OTLPSimplesetupGettingStarted"></a>

先决条件：如果使用 OTLP 端点进行跟踪，请确保启用事务搜索功能。

步骤：

1. 下载最新版本的 OpenTelemetry Collector 发行版。有关更多信息，请参阅 OpenTelemetry Collector [版本](https://github.com/open-telemetry/opentelemetry-collector-releases/releases)。

1. 在主机上安装 OpenTelemetry Collector。该收集器可在任何操作系统和平台上运行。有关更多信息，请参阅 [Install the Collector](https://opentelemetry.io/docs/collector/installation/)。

1. 在 Amazon EC2 或本地主机上配置 AWS 凭证。发送遥测数据时，该收集器使用这些凭证向 CloudWatch 进行身份验证。有关详细信息，请参阅下文。

------
#### [ Setup IAM permissions for Amazon EC2 ]

**按照以下步骤将 `CloudWatchAgentServerPolicy` IAM 策略附加到 Amazon EC2 实例的 IAM 角色。**

   1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   1. 选择**角色**，查找并选择您的 Amazon EC2 实例使用的角色。

   1. 在**权限**选项卡下，选择**添加权限**、**附加策略**。

   1. 使用搜索框，搜索 `CloudWatchAgentServerPolicy` 策略。

   1. 选择 **CloudWatchAgentServerPolicy** 策略，然后选择**添加权限**。

------
#### [ Setup IAM permissions for on-premise hosts ]

**可以创建用于向本地主机提供权限的 IAM 用户：**

   1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   1. 依次选择**用户**、**创建用户**。

   1. 在**用户详细信息**下，为**用户名**输入新 IAM 用户的名称。这是 AWS 的登录名，将用于对您的主机进行身份验证。

   1. 选择**下一步**。

   1. 在**设置权限**页面的**权限选项**下，选择**直接附加策略**。

   1. 从**权限策略**列表中，选择要添加到您的用户的 **CloudWatchAgentServerPolicy** 策略。

   1. 选择**下一步**。

   1. 在**审核并创建**页面上，确保您对用户名满意，并且 **CloudWatchAgentServerPolicy** 策略位于**权限摘要**下。

   1. 选择**创建用户**。

   1. **创建并检索您的 AWS 访问密钥和秘密密钥** – 在 IAM 控制台的导航窗格中，选择**用户**，然后选择您在上一步中所创建用户的用户名。

   1. 在用户的页面上，选择**安全凭证**选项卡。

   1. 在**访问密钥**部分，选择**创建访问密钥**。

   1. 对于**创建访问密钥步骤 1**，选择**命令行界面 (CLI)**。

   1. 对于**创建访问密钥步骤 2**，（可选）输入标记，然后选择**下一步**。

   1. 对于**创建访问密钥步骤 3**，选择**下载.csv 文件**以保存包含您的 IAM 用户访问密钥和秘密访问密钥的 .csv 文件。您在后续步骤中需要此信息。

   1. 选择**完成**。

   1. 通过输入以下命令，在本地主机中配置 AWS 凭证。将 *ACCESS\$1KEY\$1ID* 和 *SECRET\$1ACCESS\$1ID* 替换为您在上一步中下载的 .csv 文件中新生成的访问密钥和秘密访问密钥。

      ```
      $ aws configure
      AWS Access Key ID [None]: ACCESS_KEY_ID
      AWS Secret Access Key [None]: SECRET_ACCESS_ID
      Default region name [None]: MY_REGION
      Default output format [None]: json
      ```

------

1. 为 Amazon EKS 或 Kubernetes 集群设置 AWS 凭证。开始使用 Amazon EKS 的最简单方式是使用 EKS OTel Container Insights 附加组件。如果您偏好直接使用 OpenTelemetry Collector，请按照以下步骤为 Amazon EKS 或 Kubernetes 集群设置 AWS 凭证，以向 CloudWatch 发送遥测数据。

------
#### [ Setup IAM permissions for Amazon EKS ]

   1. 使用以下命令为您的集群创建 IAM OIDC 身份提供商。

      ```
      eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} --region ${REGION} --approve
      ```

   1. 使用以下命令为 OTel Collector 的 Kubernetes 服务账户分配 IAM 角色。

      ```
      eksctl create iamserviceaccount \
      --name ${COLLECTOR_SERVICE_ACCOUNT}\
      --namespace ${NAMESPACE} \
      --cluster ${CLUSTER_NAME} \
      --region ${REGION} \
      --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
      --approve \
      --override-existing-serviceaccounts
      ```

------
#### [ Setup IAM permissions for Kubernetes ]

   1. 通过输入以下命令，在本地主机中配置 AWS 凭证。将 *ACCESS\$1KEY\$1ID* 和 *SECRET\$1ACCESS\$1ID* 替换为您在上一步中下载的 .csv 文件中新生成的访问密钥和秘密访问密钥。默认情况下，凭证文件保存在 */home/user/.aws/credentials* 下。

      ```
      aws configure
      AWS Access Key ID [None]: ACCESS_KEY_ID 
      AWS Secret Access Key [None]: SECRET_ACCESS_ID 
      Default region name [None]: MY_REGION 
      Default output format [None]: json
      ```

   1. 使用以下命令编辑 OpenTelemetry Collector 资源以添加新创建的 Amazon 凭证密钥：`kubectl edit OpenTelemetryCollector otel_collector`

   1. 使用文件编辑器，通过将以下配置添加到部署顶部，将 AWS 凭证添加到 OpenTelemetryCollector 容器中。将路径 */home/user/.aws/credentials* 替换为本地 AWS 凭证文件的位置。

      ```
                           spec:
                          volumeMounts:
                          - mountPath: /rootfs
                          volumeMounts:
                          - name: aws-credentials
                          mountPath: /root/.aws
                          readOnly: true
                          volumes:
                          - hostPath:
                          path: /home/user/.aws/credentials
                          name: aws-credentials
      ```

------

1. 在收集器配置中配置 OTLP 导出器，以将遥测数据发送到 CloudWatch 端点。请参阅以下示例。

## 收集器配置示例
<a name="CloudWatch-OTLPSimplesetupConfigureCollector"></a>

复制并粘贴以下内容，以配置您的收集器将日志和跟踪发送到 OTLP 端点。

```
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

exporters:
  otlphttp/logs:
    compression: gzip
    logs_endpoint: logs_otlp_endpoint
    headers: 
      x-aws-log-group: ency_log_group
      x-aws-log-stream: default
    auth:
      authenticator: sigv4auth/logs
      
  otlphttp/traces:
    compression: gzip
    traces_endpoint: traces_otlp_endpoint
    auth:
      authenticator: sigv4auth/traces

extensions:
  sigv4auth/logs:
    region: "region"
    service: "logs"
  sigv4auth/traces:
    region: "region"
    service: "xray"

service:
  telemetry:
  extensions: [sigv4auth/logs, sigv4auth/traces]
  pipelines:
    logs:
      receivers: [otlp]
      exporters: [otlphttp/logs]
    traces:
      receivers: [otlp]
      exporters: [otlphttp/traces]
```

下面是使用 sigv4 向 us-east-1 发送日志和跟踪的示例。

```
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

exporters:
  otlphttp/logs:
    compression: gzip
    logs_endpoint: https://logs.us-east-1.amazonaws.com/v1/logs
    headers: 
      x-aws-log-group: MyApplicationLogs
      x-aws-log-stream: default
    auth:
      authenticator: sigv4auth/logs
      
  otlphttp/traces:
    compression: gzip
    traces_endpoint: https://xray.us-east-1.amazonaws.com/v1/traces
    auth:
      authenticator: sigv4auth/traces

extensions:
  sigv4auth/logs:
    region: "us-east-1"
    service: "logs"
  sigv4auth/traces:
    region: "us-east-1"
    service: "xray"

service:
  telemetry:
  extensions: [sigv4auth/logs, sigv4auth/traces]
  pipelines:
    logs:
     receivers: [otlp]
      exporters: [otlphttp/logs]
    traces:
      receivers: [otlp]
      exporters: [otlphttp/traces]
```

**注意**  
将 OpenTelemetry SDK 配置为 *always\$1on* 采样配置，进而可靠地记录 100% 的跨度，并通过 CloudWatch Application Signals 全面了解您的关键应用程序。有关更多信息，请参阅 [OpenTelemetry Java SDK 采样器配置](https://opentelemetry.io/docs/languages/java/sdk/#sampler)示例。有关使用 X-Ray OTLP 端点设置 OpenTelemetry Collector 的示例，请参阅[应用程序信号演示](https://github.com/aws-observability/application-signals-demo/blob/main/scripts/opentelemetry/otel_simple_setup/opentelemetry.yaml)存储库。

复制并粘贴以下内容，将您的收集器配置为向 OTLP 端点发送指标。

```
receivers:
  otlp:
    protocols:
      http:
        endpoint: "0.0.0.0:4318"

processors:
  batch:
    send_batch_size: 200
    timeout: 10s

exporters:
  otlphttp:
    tls:
      insecure: false
    endpoint: metrics_otlp_endpoint
    auth:
      authenticator: sigv4auth

extensions:
  sigv4auth:
    service: "monitoring"
    region: "region"

service:
  extensions: [sigv4auth]
  pipelines:
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp]
```

下面是使用 sigv4 向 us-east-1 发送指标的示例。

```
receivers:
  otlp:
    protocols:
      http:
        endpoint: "0.0.0.0:4318"

processors:
  batch:
    send_batch_size: 200
    timeout: 10s

exporters:
  otlphttp:
    tls:
      insecure: false
    endpoint: "https://monitoring.us-east-1.amazonaws.com/v1/metrics:443"
    auth:
      authenticator: sigv4auth

extensions:
  sigv4auth:
    service: "monitoring"
    region: "us-east-1"

service:
  extensions: [sigv4auth]
  pipelines:
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp]
```