

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

# 监控 Beanstalk 集群环境
<a name="monitoring-cluster-environments"></a>

Beanstalk 集群环境通过与 Beanstalk 标准环境相同的 Elastic Beanstalk 运行状况模型和 API 来报告环境级别的运行状况。您可以在 Elastic Beanstalk 控制台中查看其生命值颜色和状态，然后可以调用`DescribeEnvironmentHealth`以读取当前的颜色、状态以及解释其原因。两种模式下的生命值颜色和状态具有相同的含义。

当 Beanstalk 集群环境使用应用程序负载均衡器时，Elastic Beanstalk 会根据该环境的负载均衡器指标来确定应用程序的运行状况：请求速率、返回 HTTP 4xx 和 5xx 响应的请求比例以及响应延迟。成功提供请求的环境报告运行状况良好。随着失败请求比例的上升，状态变得越来越严重。如果环境接收的流量太少，Elastic Beanstalk 无法评估有关请求速率不足以确定运行状况的报告，这在空闲环境中是预期的。如果您将负载均衡器类型设置为`None`，则此负载均衡器评估不适用。

与 Beanstalk 标准环境不同，Beanstalk 集群环境不报告每个实例的运行状况。Beanstalk Cluster 不使用实例运行状况代理，适用于标准环境的实例级运行状况报告设置也不适用。

容器探测器控制应用程序副本何时收到流量以及何时重启：就绪探测器从服务中移除未就绪的副本，存活探测器重启保持不健康的副本，启动探测为缓慢启动的副本提供初始化时间。使用下面的探测命名空间配置探测器。`aws:elasticbeanstalk:eks:environment`请参阅[容器探测器命名空间](command-options-general-eks.md#command-options-eks-probes)。

## 指标、日志和跟踪
<a name="monitoring-cluster-environments-observability"></a>

应用程序的可观测性与环境运行状况是分开的。您可以使用`aws:elasticbeanstalk:eks:observability`命名空间中的配置选项为应用程序的指标、日志和跟踪选择后端。默认情况下，Elastic Beanstalk 会将您的应用程序的指标和日志发送到亚马逊 CloudWatch (CloudWatch)，并且跟踪没有后端。您可以改为向 Amazon S3 发送日志，将指标发送到 Prometheus 的亚马逊托管服务，并将跟踪发送到。 AWS X-Ray您也可以将这三个中的任何一个发送到接受 OpenTelemetry 数据的第三方后端；请参阅[向第三方后端发送可观测性数据](#monitoring-cluster-environments-custom-backend)。有关可用选项，请参见[aws: elasticbeanstalk: eks: 可观察性](command-options-general-eks.md#command-options-eks-observability)。

Elastic Beanstalk 预置和操作收集组件，并代表您发布基础设施指标。您负责对应用程序进行检测，使其发出所需的指标、日志和跟踪，并负责提供和维护对您选择的任何目的地的访问权限。

你的应用程序必须发出 OpenTelemetry 数据才能让后端接收任何东西。要在不更改应用程序的情况下实现这一点，请将`aws:elasticbeanstalk:eks:environment`命名空间中的`language`选项设置为应用程序的运行时。Elastic Beanstalk 为您的容器添加了针对该运行时的 OpenTelemetry 自动检测功能，这适用于所有后端， AWS 也适用于第三方。 Auto-instrumentation 可用于 Java Node.js、Python 和 .NET 应用程序。对于 Java 应用程序，该代理还桥接 Log4j2、Logback 和`java.util.logging`，因此应用程序的日志无需更改任何应用程序即可到达日志后端。

除了日志后端之外，Elastic Beanstalk 还会为每个环境操作收集部署日志。它包含您的 pod 的容器日志和操作中的 Kubernetes 事件，这使其成为查看操作何时失败的地方。有关更多信息，请参阅 [部署日志](environments-deployment-logs.md)。

### 在中查找您的日志和指标 CloudWatch
<a name="monitoring-cluster-environments-destinations"></a>

使用默认后端，Elastic Beanstalk 会写入四个日志组。 CloudWatch 日志组名称是固定的，您无法对其进行更改。


**CloudWatch Beanstalk 集群环境的日志组**  

| **日志组** | **内容** | **日志流名称** | **当它存在时 ** | 
| --- | --- | --- | --- | 
| `/aws/elasticbeanstalk/application/logs` | 应用程序容器的输出。 | `eb-{{environment-name}}.{{pod-name}}` | 如果`logs-backend`是`cloudwatch`，则为默认值。 | 
| `/aws/elasticbeanstalk/application/metrics` | 您的应用程序发出的指标。 | `{{environment-name}}/{{pod-name}}` | 何时`metrics-backend`为`cloudwatch`，为默认值，您的应用程序会发出指标。 | 
| `/aws/elasticbeanstalk/infrastructure/logs` | Elastic Beanstalk 代表您在集群上运行的组件的输出。 | `{{kubernetes-namespace}}.{{pod-name}}` | 永远。 | 
| `/aws/elasticbeanstalk/infrastructure/metrics` | Elastic Beanstalk 以嵌入式指标格式为您发布的指标。 | `{{kubernetes-namespace}}.{{pod-name}}` | 永远。 | 

**注意**  
这些日志组是共享的。一个 AWS 账户和区域中的每个 Beanstalk 集群环境都会写入到每个集群中相同的四个组。您的环境数据由日志流名称分隔，而不是按日志组分隔。Elastic Beanstalk 在命名`eb-`后跟环境名称的 Kubernetes 命名空间中运行每个环境，因此您的应用程序的日志流以和句点开头。`eb-{{environment-name}}`您的应用程序的指标流以环境名称和斜杠开头，没有`eb-`前缀。

Elastic Beanstalk 在创建这些日志组时没有保留策略，因此它们的内容永不过期。日志流名称包含 pod 名称，因此每次部署都会创建新的流，而来自早期部署的流也会保留。为每个日志组设置保留策略以限制您存储的内容。

Elastic Beanstalk 为您发布的指标分为三个命名空间。 CloudWatch 这三个都是自定义命名空间，您需要为每个指标付费。Beanstalk 标准环境改为发布到`AWS/ElasticBeanstalk`命名空间，命名空间 CloudWatch 免费提供。Beanstalk Cluster 环境会在下面发布其每个副本的容器指标，因此自定义指标的数量会随着您运行的副本数量的增加而增加。有关当前费率，请参阅[亚马逊 CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。


**CloudWatch Beanstalk 集群环境的指标**  

| **命名空间** | **Metrics** | **Dimensions** | 
| --- | --- | --- | 
| `ElasticBeanstalk/Infrastructure` | 对于应用程序的容器：`container_cpu_usage_seconds_total``container_memory_working_set_bytes`、和`EnvironmentReplicas`，准备就绪的副本数量。 | 这两个容器指标使用`namespace``pod`、发布`container`，再次`namespace`单独发布。`EnvironmentReplicas``namespace`仅与... 一起发布。 | 
| `ElasticBeanstalk/System` | 这两个容器指标相同，适用于 Elastic Beanstalk 代表您在集群上运行的组件，而不是为您的应用程序运行的组件。 | `namespace`，`pod`，`container`，再`namespace`单独一次。 | 
| `ElasticBeanstalk/Application` | 您的应用程序发出的指标，包括自动仪器生成的运行时指标。 | `EnvironmentName`。请求持续时间也以`http.method``http.route`、和发布`http.status_code`。 | 

`namespace`维度是 Kubernetes 命名空间，因此它的值`eb-`后面是你的环境名称。取而代之的是，`ElasticBeanstalk/Application`命名空间使用其值本身就是环境名称的`EnvironmentName`维度。使用与您正在查询的命名空间相匹配的值。

如果您设置为 `logs-backend``s3`，则 Elastic Beanstalk 会将应用程序的日志写入一个名为的存储桶，该存储桶`elasticbeanstalk-logs-{{account-id}}-{{region}}-an`使用基于 Kubernetes 命名空间、容器名称和日期构建的密钥下，没有任何内容。`/aws/elasticbeanstalk/application/logs`Elastic Beanstalk 会对这些上传进行批处理，因此对象最多可能需要一分钟才能出现。如果您将`logs-backend`或设置`metrics-backend`为`custom`，则该数据将转到您配置的后端，不会出现在任何日志组中。请参阅[向第三方后端发送可观测性数据](#monitoring-cluster-environments-custom-backend)。

## 向第三方后端发送可观测性数据
<a name="monitoring-cluster-environments-custom-backend"></a>

Beanstalk Cluster 使用收集 OpenTelemetry 器收集应用程序的遥测数据，因此您可以将其发送到任何接受 OpenTelemetry 数据的后端，例如 Datadog 或 Splunk，而不是发送到目的地。 AWS 您提供管道配置及其所需的证书，然后 Elastic Beanstalk 将您的管道作为边车容器运行在应用程序的 pod 中。

配置第三方后端需要做四件事：

1. 设置要重定向到的每个信号`custom`。信号是独立的，因此您可以将指标和日志发送到第三方后端，同时继续进行跟踪 AWS X-Ray。在`aws:elasticbeanstalk:eks:observability`命名空间`traces-backend`中使用`metrics-backend``logs-backend`、和。

1. 以 JSON 格式设置`custom-config`为收集器的管道配置。将每个凭据作为`${{{NAME}}}`占位符引用，而不是将值放入配置中。

1. 将证书存储在中 AWS Secrets Manager 并设置`custom-credentials`为密钥的 ARN。密钥值必须是 JSON 对象，其密钥与配置中的占位符名称相匹配。

1. 在`aws:elasticbeanstalk:eks:environment`命名空间中设置该`application-role`选项，并授予该角色读取密钥的权限。收集器在运行时使用应用程序角色，而不是可观察性角色，它通过 pod 的身份获取密钥，该身份`application-role`仅在设置时存在。没有它，装载将失败，您的副本永远无法启动。

以下示例向 Datadog 发送指标和日志，并保持跟踪记录。 AWS X-Ray首先，创建用于保存您的配置引用的证书的密钥：

```
$ aws secretsmanager create-secret \
    --name {{my-app/otel-credentials}} \
    --secret-string '{"DD_API_KEY":"{{your-api-key}}"}'
```

授予应用程序角色读取权限，以便收集者可以在运行时提取它：

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret"
      ],
      "Resource": "{{arn:aws:secretsmanager:us-east-1:111122223333:secret:my-app/otel-credentials-AbCdEf}}"
    }
  ]
}
```

Elastic Beanstalk 会按计划刷新已安装的凭证，刷新会检查密钥的当前版本，因此除此之外还要授予`secretsmanager:DescribeSecret`。`secretsmanager:GetSecretValue`环境从`GetSecretValue`单独开始，但以后的每次刷新都会失败。

接下来，将选项设置放入文件中。收集器配置包含逗号，的速记语法将其`--option-settings`视为分隔符，因此改为将设置作为 JSON 传递。将以下内容另存为`options.json`，在`custom-config`值中将管道配置作为 JSON 字符串：

```
[
  {
    "Namespace": "aws:elasticbeanstalk:eks:observability",
    "OptionName": "metrics-backend",
    "Value": "custom"
  },
  {
    "Namespace": "aws:elasticbeanstalk:eks:observability",
    "OptionName": "logs-backend",
    "Value": "custom"
  },
  {
    "Namespace": "aws:elasticbeanstalk:eks:observability",
    "OptionName": "traces-backend",
    "Value": "xray"
  },
  {
    "Namespace": "aws:elasticbeanstalk:eks:observability",
    "OptionName": "custom-config",
    "Value": "{\"receivers\":{\"otlp\":{\"protocols\":{\"grpc\":{\"endpoint\":\"0.0.0.0:4317\"},\"http\":{\"endpoint\":\"0.0.0.0:4318\"}}}},\"processors\":{\"batch\":{}},\"exporters\":{\"datadog\":{\"api\":{\"site\":\"{{datadoghq.com}}\",\"key\":\"${DD_API_KEY}\"}}},\"service\":{\"pipelines\":{\"metrics\":{\"receivers\":[\"otlp\"],\"processors\":[\"batch\"],\"exporters\":[\"datadog\"]},\"logs\":{\"receivers\":[\"otlp\"],\"processors\":[\"batch\"],\"exporters\":[\"datadog\"]}}}}"
  },
  {
    "Namespace": "aws:elasticbeanstalk:eks:observability",
    "OptionName": "custom-credentials",
    "Value": "{{arn:aws:secretsmanager:us-east-1:111122223333:secret:my-app/otel-credentials-AbCdEf}}"
  }
]
```

设置`site`为您的组织使用的 Datadog 站点。然后应用该文件：

```
$ aws elasticbeanstalk update-environment \
    --environment-name {{my-cluster-env}} \
    --option-settings file://options.json
```

为设置的每个信号定义管道`custom`。你留在 AWS 目的地的信号会继续使用 Elastic Beanstalk 运行的集合，不需要自己的管道。

没有设置的组件取一个空对象，如`"batch": {}`。该`receivers`区块是可选的。如果您省略它，Elastic Beanstalk 会添加您的应用程序发送到的 OTLP 接收器，并记录一个报告添加情况的环境事件。前面的示例明确定义了接收器。

在进行此设置时，向每个管道添加一个`debug`导出器并将其包含在管道的`exporters`列表中。然后，收集器记录其接收和导出的遥测数据，这会告诉您数据是否已到达收集器，以及收集器是否可以到达您的后端。