

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

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

Beanstalk Cluster 环境通过与 Beanstalk 标准环境相同的 Elastic Beanstalk 运行状况模型和 API 来报告环境级别的运行状况。您可以在 Elastic Beanstalk 控制台中查看其生命值颜色和状态，`DescribeEnvironmentHealth`也可以致电阅读当前颜色、状态和解释它的原因。在这两种模式下，Health 颜色和状态的含义相同。

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

与 Beanstalk 标准环境不同，Beanstalk Cluster 环境不报告每个实例的运行状况。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 的亚马逊托管服务，然后将跟踪发送到。 Amazon 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 OpenTelemetry Beanstalk 在您的容器中添加了该运行时的自动检测功能，该功能适用于所有后端和第三方。 Amazon 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 Cluster 环境的日志组**  

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

**注意**  
这些日志组是共享的。一个 Amazon 账户和区域中的每个 Beanstalk 集群环境都写入每个集群中相同的四个组。您的环境数据是按日志流名称分隔的，而不是按日志组分隔的。Elastic Beanstalk 在 Kubern `eb-` etes 命名空间中运行每个环境，命名后跟环境名称。无论该表显示在哪里`{{kubernetes-namespace}}`，都是关于您的环境`eb-{{environment-name}}`的直播以及系统命名空间，例如 Elastic Beanstalk 在集群上运行的组件。`kube-system`因此，您的应用程序的日志流以`eb-{{environment-name}}`和开头，其应用程序指标和基础架构指标都位于一个名为的流中`eb-{{environment-name}}`。

Elastic Beanstalk 在没有保留策略的情况下创建这些日志组，因此其内容永不过期。在保存日志的两个日志组中，流名称包含 pod 名称，因此每次部署都会创建新的流，并且之前部署的流仍然保留。保存指标的两个日志组每个 Kubernetes 命名空间都有一个流，因此部署会添加到环境的现有流中；每条指标记录仍能标识其 pod。为每个日志组设置保留策略以限制存储的内容。

Elastic Beanstalk 为你发布的指标来自三个命名空间。 CloudWatch 这三个都是自定义命名空间，您需要按指标付费。Beanstalk 标准环境改为发布到`AWS/ElasticBeanstalk`命名空间，命名空间 CloudWatch 免费提供。Beanstalk Cluster 环境会为其每个副本发布以下容器指标，因此自定义指标的数量会随着您运行的副本数量的增加而增加。有关当前费率，请参阅 [Amazon CloudWatch 定价](https://www.amazonaws.cn/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，而不是发送到目的地。 Amazon 您提供管道配置及其所需的凭证，然后 Elastic Beanstalk 在应用程序的 pod 中将您的管道作为边车容器运行。

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

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

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

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

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

以下示例向 Datadog 发送指标和日志，并保持对这些指标和日志的跟踪。 Amazon 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`。你离开 Amazon 目的地的信号会一直使用 Elastic Beanstalk 运营的集合，不需要自己的管道。

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

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