

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 AWS Distro 在亚马逊 Elastic Kubernetes Service 集群 OpenTelemetry 上设置指标提取
<a name="AMP-onboard-ingest-metrics-OpenTelemetry"></a>

您可以使用 AWS Distro for OpenTelemetry (ADOT) 收集器从装有 Prometheus 工具的应用程序中获取指标，然后将这些指标发送到适用于 Prometheus 的亚马逊托管服务。

**注意**  
有关 ADOT 收集器的更多信息，请参阅[AWS 发行版](https://aws.amazon.com/otel/)。 OpenTelemetry  
有关 Prometheus 分析的应用程序的更多信息，请参阅[与 Prometheus 兼容的指标有哪些？](prom-compatible-metrics.md)。

使用 ADOT 收集 Prometheus 指标涉及三个 OpenTelemetry 组成部分：Prometheus 接收器、Prometheus 远程写入导出器和 Sigv4 身份验证扩展。

您可以使用现有的 Prometheus 配置来配置 Prometheus Receiver，以执行服务发现和指标抓取。Prometheus Receiver 以 Prometheus 展览格式抓取指标。您要抓取的任何应用程序或终端节点都应使用 Prometheus 客户端库进行配置。Prometheus Receiver 支持 Prometheus 文档[配置](https://prometheus.io/docs/prometheus/latest/configuration/configuration/)中描述的全套 Prometheus 抓取和重新标记配置。您可以将这些配置直接粘贴到 ADOT 收集器配置中。

Prometheus Remote Write Exporter 使用 `remote_write` 终端节点将抓取的指标发送到您的管理门户工作区。导出数据的 HTTP 请求将使用 AWS Sigv4（安全身份验证 AWS 协议）和 Sigv4 身份验证扩展插件进行签名。有关更多信息，请参阅[签名版本 4 签名流程](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)。

收集器会自动发现 Amazon EKS 上的 Prometheus 指标终端节点，并使用 [<kubernetes\_sd\_config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config) 中发现的配置。

 以下演示是在运行 Amazon Elastic Kubernetes Service 或自行管理 Kubernetes 的集群上进行此配置的示例。要执行这些步骤，您必须拥有来自默认 AWS 凭证链中任何潜在选项的 AWS 证书。有关更多信息，请参阅[配置 AWS SDK for Go](https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html)。此演示使用了一个用于流程集成测试的示例应用程序。该示例应用程序在 `/metrics` 端点处公开指标，就像 Prometheus 客户端库一样。

## 先决条件
<a name="AMP-onboard-ingest-metrics-OpenTelemetry-pre"></a>

在开始以下摄取设置步骤之前，您必须为服务账户和信任策略设置 IAM 角色。

**为服务账户和信任策略设置 IAM 角色**

1. 按照[设置服务角色从 Amazon EKS 集群中摄取指标](set-up-irsa.md#set-up-irsa-ingest)中的步骤为服务账户创建 IAM 角色。

   ADOT 收集器将在抓取和导出指标时使用此角色。

1. 接下来，编辑信任策略。使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/home) 打开 IAM 控制台。

1. 在左侧导航窗格中，选择**角色**并找到您在步骤 1 中创建的。**amp-iamproxy-ingest-role**

1. 选择**信任关系**选项卡，然后选择**编辑信任关系**。

1. 在信任关系策略 JSON 中，将 `aws-amp` 替换为 `adot-col`，然后选择**更新信任策略**。最终的信任策略应如下所示：

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Federated": "arn:aws:iam::{{111122223333}}:oidc-provider/oidc.eks.{{us-east-1}}.amazonaws.com/id/{{EXAMPLED539D4633E53DE1B71EXAMPLE}}"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
           "StringEquals": {
             "oidc.eks.{{us-east-1}}.amazonaws.com/id/{{EXAMPLED539D4633E53DE1B71EXAMPLE}}:sub": "system:serviceaccount:adot-col:amp-iamproxy-ingest-service-account",
             "oidc.eks.{{us-east-1}}.amazonaws.com/id/{{EXAMPLED539D4633E53DE1B71EXAMPLE}}:aud": "sts.amazonaws.com"
           }
         }
       }
     ]
   }
   ```

------

1. 选择**权限**选项卡，并确保将以下权限策略附加到该角色。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "aps:RemoteWrite",
                   "aps:GetSeries",
                   "aps:GetLabels",
                   "aps:GetMetricMetadata"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

## 启用 Prometheus 指标收集
<a name="AMP-onboard-ingest-metrics-OpenTelemetry-steps"></a>

**注意**  
在 Amazon EKS 中创建命名空间时，默认情况下，`alertmanager` 和 Node Exporter 处于禁用状态。

**在 Amazon EKS 或 Kubernetes 集群上启用 Prometheus 收集**

1. 从存储库中分叉并克隆示例应用程序，网址为[aws-otel-community](https://github.com/aws-observability/aws-otel-community)。

   然后，运行以下命令。

   ```
   cd ./sample-apps/prometheus-sample-app
   docker build . -t prometheus-sample-app:latest
   ```

1. 将此映像推送到注册表，例如 Amazon ECR 或 DockerHub。

1. 通过复制此 Kubernetes 配置并应用，在集群中部署示例应用程序。通过在 `prometheus-sample-app.yaml` 文件中替换 `{{PUBLIC_SAMPLE_APP_IMAGE}}`，将映像更改为刚才推送的映像。

   ```
   curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/examples/eks/aws-prometheus/prometheus-sample-app.yaml -o prometheus-sample-app.yaml
   kubectl apply -f prometheus-sample-app.yaml
   ```

1. 输入以下命令以验证示例应用程序是否已启动。在命令的输出中，您将在 `NAME` 列中看到 `prometheus-sample-app`。

   ```
   kubectl get all -n aoc-prometheus-pipeline-demo
   ```

1. 启动 ADOT 收集器的默认实例。为此，请先输入以下命令来提取 ADOT 收集器的 Kubernetes 配置。

   ```
   curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/examples/eks/aws-prometheus/prometheus-daemonset.yaml -o prometheus-daemonset.yaml
   ```

   然后编辑模板文件，用您 Amazon Managed Service for Prometheus 工作区的 **remote\_write** 终端节点替换 `YOUR_ENDPOINT`，并用您的区域替换 `YOUR_REGION`。查看工作区详细信息时，请使用 Amazon Managed Service for Prometheus 控制台中显示的 **remote\_write** 终端节点。

   你还需要`YOUR_ACCOUNT_ID`在 Kubernetes 配置的服务账户部分更改为你的 AWS 账户 ID。

   在本示例中，ADOT 收集器配置使用注释（`scrape=true`）来告知要抓取哪些目标终端节点。如此，ADOT 收集器便可以将示例应用程序终端节点与您集群中的 kube-system 终端节点区分开来。如果您想抓取其他示例应用程序，则可以将其从重新标记配置中删除。

1. 输入以下命令以部署 ADOT 收集器。

   ```
   kubectl apply -f prometheus-daemonset.yaml
   ```

1. 输入以下命令以验证 ADOT 收集器是否已启动。在 `NAMESPACE` 列中查找 `adot-col`。

   ```
   kubectl get pods -n adot-col
   ```

1. 使用日志导出器验证管道是否正常运行。我们的示例模板已经与日志导出器集成。输入以下命令。

   ```
   kubectl get pods -A
   kubectl logs -n adot-col {{name_of_your_adot_collector_pod}}
   ```

   从示例应用程序中抓取的一些指标如下所示：

   ```
   Resource labels:
        -> service.name: STRING(kubernetes-service-endpoints)
        -> host.name: STRING(192.168.16.238)
        -> port: STRING(8080)
        -> scheme: STRING(http)
   InstrumentationLibraryMetrics #0
   Metric #0
   Descriptor:
        -> Name: test_gauge0
        -> Description: This is my gauge
        -> Unit: 
        -> DataType: DoubleGauge
   DoubleDataPoints #0
   StartTime: 0
   Timestamp: 1606511460471000000
   Value: 0.000000
   ```

1. 要测试 Amazon Managed Service for Prometheus 是否已收到这些指标，请使用 `awscurl`。[此工具允许您通过 AWS Sigv4 身份验证通过命令行发送 HTTP 请求，因此您必须在本地设置 AWS 凭证，并具有从亚马逊托管服务查询 Prometheus 的正确权限。有关安装的说明，请参阅 awscurl。`awscurl`](https://github.com/okigan/awscurl)

   在以下命令中，将 `AMP_REGION` 和 `AMP_ENDPOINT`替换为您 Amazon Managed Service for Prometheus 工作区的信息。

   ```
   awscurl --service="aps" --region="{{AMP_REGION}}" "https://{{AMP_ENDPOINT}}/api/v1/query?query=adot_test_gauge0"
   {"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"adot_test_gauge0"},"value":[1606512592.493,"16.87214000011479"]}]}}
   ```

   如果您收到指标响应，则表示您的管道设置已成功，并且该指标已成功从示例应用程序传播到 Amazon Managed Service for Prometheus。

**清理**

要清理此演示，请输入以下命令。

```
kubectl delete namespace aoc-prometheus-pipeline-demo
kubectl delete namespace adot-col
```

## 高级配置
<a name="AMP-otel-advanced"></a>

Prometheus Receiver 支持 Prometheus 文档[配置](https://prometheus.io/docs/prometheus/latest/configuration/configuration/)中描述的全套 Prometheus 抓取和重新标记配置。您可以将这些配置直接粘贴到 ADOT 收集器配置中。

Prometheus Receiver 的配置包括您的服务发现、抓取配置和重新标记配置。接收方配置如下所示。

```
receivers:
  prometheus:
    config:
      [{{[Your Prometheus configuration]}}]
```

下面是一个配置示例：

```
receivers:
  prometheus:
    config:
      global:
        scrape_interval: 1m
        scrape_timeout: 10s
        
      scrape_configs:
      - job_name: kubernetes-service-endpoints
        sample_limit: 10000
        kubernetes_sd_configs:
        - role: endpoints
        tls_config:
          ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
          insecure_skip_verify: true
        bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
```

如果您已有 Prometheus 配置，则必须将 `$` 字符替换为 `$$`，以避免将值替换为环境变量。\*这对于 relabel\_configurations 的替换值尤其重要。例如，如果您从以下 relabel\_configuration 开始：

```
relabel_configs:
- source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]
  regex: (.+);(.+);(.+)
  replacement: ${1}://${2}${3}
  target_label: __param_target
```

它将变成以下内容：

```
relabel_configs:
- source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]
  regex: (.+);(.+);(.+)
  replacement: $${1}://${2}${3}
  target_label: __param_target
```

**Prometheus Remote Write Exporter 和 Sigv4 Authentication Extension**

Prometheus Remote Write Exporter 和 Sigv4 Authentication Extension 的配置比 Prometheus Receiver 简单。在管道的这个阶段，指标已经被摄取完毕，我们准备将这些数据导出到 Amazon Managed Service for Prometheus。对可与 Amazon Managed Service for Prometheus 进行通信的成功配置的最低要求如以下示例所示。

```
extensions:
  sigv4auth:
    service: "aps"
    region: "user-region"
exporters:
  prometheusremotewrite:
    endpoint: "https://aws-managed-prometheus-endpoint/api/v1/remote_write"
    auth:
      authenticator: "sigv4auth"
```

此配置使用默认 AWS 凭证链中的 AWS 凭据发送由 AWS Sigv4 签名的 HTTPS 请求。有关更多信息，请参阅[配置 适用于 Go 的 AWS SDK](https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html)。必须将服务指定为 `aps`。

无论采用何种部署方法，ADOT 收集器都必须有权访问默认 AWS 凭证链中列出的选项之一。Sigv4 身份验证扩展依赖于 适用于 Go 的 AWS SDK 并使用它来获取凭据和进行身份验证。您必须确保这些凭证对于 Amazon Managed Service for Prometheus 具有远程写入权限。