View a markdown version of this page

监控 Beanstalk 集群环境 - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

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

监控 Beanstalk 集群环境

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请参阅容器探测器命名空间。

指标、日志和跟踪

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

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

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

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

在中查找您的日志和指标 CloudWatch

使用默认后端,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

永远。

注意

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

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

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

CloudWatch Beanstalk 集群环境的指标
命名空间 Metrics Dimensions

ElasticBeanstalk/Infrastructure

对于应用程序的容器:container_cpu_usage_seconds_totalcontainer_memory_working_set_bytes、和EnvironmentReplicas,准备就绪的副本数量。

这两个容器指标使用namespacepod、发布container,再次namespace单独发布。EnvironmentReplicasnamespace仅与... 一起发布。

ElasticBeanstalk/System

这两个容器指标相同,适用于 Elastic Beanstalk 代表您在集群上运行的组件,而不是为您的应用程序运行的组件。

namespace,pod,container,再namespace单独一次。

ElasticBeanstalk/Application

您的应用程序发出的指标,包括自动仪器生成的运行时指标。

EnvironmentName。请求持续时间也以http.methodhttp.route、和发布http.status_code。

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

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

向第三方后端发送可观测性数据

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

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

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

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

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

  4. 在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列表中。然后,收集器记录其接收和导出的遥测数据,这会告诉您数据是否已到达收集器,以及收集器是否可以到达您的后端。