View a markdown version of this page

监控 Beanstalk 集群环境 - AWS Elastic Beanstalk

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

监控 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 的亚马逊托管服务,并将跟踪发送到。 AWS X-Ray您也可以将这三个中的任何一个发送到接受 OpenTelemetry 数据的第三方后端;请参阅向第三方后端发送可观测性数据。有关可用选项,请参见aws: elasticbeanstalk: eks: 可观察性。

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 事件,这使其成为查看操作何时失败的地方。有关更多信息,请参阅 部署日志。

在中查找您的日志和指标 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

永远。

注意

这些日志组是共享的。一个 AWS 账户和区域中的每个 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,而不是发送到目的地。 AWS 您提供管道配置及其所需的证书,然后 Elastic Beanstalk 将您的管道作为边车容器运行在应用程序的 pod 中。

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

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

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

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

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