

# 将 CloudWatch 指标与 Lambda 结合使用
<a name="monitoring-metrics"></a>

当您的 AWS Lambda 函数完成对事件的处理时，Lambda 会自动将有关调用的指标发送到 Amazon CloudWatch。您无需向执行角色授予任何其他权限即可接收函数指标，并且这些指标无需额外付费。

与 Lambda 函数关联的指标类型有很多。其中包括调用指标、性能指标、并发指标、异步调用指标和事件源映射指标。有关更多信息，请参阅 [Lambda 函数的指标类型](monitoring-metrics-types.md)。

在 CloudWatch 控制台中，您可以[查看这些指标](monitoring-metrics-view.md)，并使用其构建图形和控制面板。您还可以设置警报以响应利用率、性能或错误率的更改。Lambda 每隔 1 分钟向 CloudWatch 发送一次指标数据。有关对 Lambda 函数的即时洞察，可以创建[高分辨率自定义指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/publishingMetrics.html)。自定义指标和 CloudWatch 告警需支付费用。有关更多信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

# 查看 Lambda 函数的指标
<a name="monitoring-metrics-view"></a>

使用 CloudWatch 控制台查看 Lambda 函数的指标。在控制台中，可以按函数名称、别名、版本或事件源映射 UUID 对函数指标进行筛选和排序。

**要在 CloudWatch 控制台上查看指标**

1. 打开 CloudWatch 控制台的 [Metrics page](https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#metricsV2:graph=~();namespace=~'AWS*2fLambda)（指标页面）（`AWS/Lambda` 命名空间）。

1. 在**浏览**选项卡的**指标**下，选择以下任一维度：
   + **按函数名称** (`FunctionName`) – 查看函数的所有版本和别名的聚合指标。
   + **按资源** (`Resource`) – 查看函数的版本或别名的指标。
   + **按已执行版本** (`ExecutedVersion`) – 查看别名和版本组合的指标。使用 `ExecutedVersion` 维度可以比较函数的两个版本的错误率，这两个版本都是[加权别名](configuration-aliases.md)的目标。
   + **按事件源映射 UUID** (`EventSourceMappingUUID`)：查看事件源映射的指标。
   + **跨所有函数**（无）– 查看当前 AWS 区域 区域中所有函数的聚合指标。

1. 选择指标。该指标应自动出现在可视化图形中，以及**绘成图表的指标**选项卡下。

默认情况下，图表将使用所有指标的 `Sum` 统计数据。要选择其他统计数据并自定义图表，请使用 **Graphed metrics (图表化指标)** 选项卡上的选项。

**注意**  
指标上的时间戳反映函数被调用的时间。根据调用的持续时间，这可能是发出指标前的几分钟。例如，如果您函数的超时值为 10 分钟，请查看 10 分钟之前的情况，以获取准确的指标。

有关 CloudWatch 的更多信息，请参阅 [Amazon CloudWatch 用户指南](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html)。

# Lambda 函数的指标类型
<a name="monitoring-metrics-types"></a>

本节介绍 CloudWatch 控制台中提供的 Lambda 指标的类型。

**Topics**
+ [调用指标](#invocation-metrics)
+ [部署指标](#deployment-metrics)
+ [性能指标](#performance-metrics)
+ [并发指标](#concurrency-metrics)
+ [异步调用指标](#async-invocation-metrics)
+ [事件源映射指标](#event-source-mapping-metrics)

## 调用指标
<a name="invocation-metrics"></a>

调用指标是 Lambda 函数调用结果的二进制指示器。使用 `Sum` 统计数据查看这些指标。例如，如果函数返回一个错误，则 Lambda 会发送值为 1 的 `Errors` 指标。要获取每分钟发生的函数错误计数，请查看一分钟时段内的 `Errors` 指标的 `Sum`。
+ `Invocations` – 函数代码的调用次数，包括成功调用和导致函数错误的调用。如果调用请求受到限制或导致调用错误，则不会记录调用。`Invocations` 的值等于计费的请求数。
+ `Errors` – 导致出现函数错误的调用的次数。函数错误包括您的代码所引发的异常以及 Lambda 运行时所引发的异常。运行时返回因超时和配置错误等问题导致的错误。要计算错误率，请将 `Errors` 的值除以 `Invocations` 的值。请注意，错误指标上的时间戳反映的是调用函数的时间，而非错误发生的时间。
+ `DeadLetterErrors` – 对于[异步调用](invocation-async.md)，Lambda 尝试将事件发送到死信队列（DLQ）但失败的次数。由于资源或大小限制设置不正确，可能会发生死信错误。
+ `DestinationDeliveryFailures` – 对于异步调用和支持的 [事件源映射](https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventsourcemapping.html)，Lambda 尝试将事件发送到 [目标](invocation-async-retain-records.md#invocation-async-destinations) 但失败的次数。对于事件源映射，Lambda 支持流源（DynamoDB 和 Kinesis）的目标。由于权限错误、资源配置不正确或大小限制，可能会发生传输错误。如果您配置的目标是不支持的目标类型，例如 Amazon SQS FIFO 队列或 Amazon SNS FIFO 主题，则可能会发生这种错误。
+ `Throttles` – 受限制的调用请求数。当所有函数实例都在处理请求并且没有可用于纵向扩展的并发时，Lambda 将拒绝其他请求，并出现 `TooManyRequestsException` 错误。受限制的请求和其他调用错误不会计为 `Invocations` 或 `Errors`。
**注意**  
通过 [Lambda 托管实例](lambda-managed-instances.md)，Lambda 可提供细粒度的节流指标，以识别导致节流的特定约束。当执行环境中出现节流时，以下子指标中的一个指标值为 1，其余三个指标值为 0。`Throttles` 指标始终与这些子指标一起发布。  
`CPUThrottles` — 由于执行环境的 CPU 耗尽，导致调用节流。
`MemoryThrottles` — 由于执行环境的内存耗尽，导致调用节流。
`DiskThrottles` — 由于执行环境的磁盘耗尽，导致调用节流。
`ConcurrencyThrottles` — 当达到执行环境并发限制时，对调用进行节流。
+ `OversizedRecordCount`：对于 Amazon DocumentDB 事件源，函数从变更流接收到的大小超过 6 MB 的事件数。Lambda 会丢弃该消息并发出此指标。
+ `ProvisionedConcurrencyInvocations` – 使用[预置并发](provisioned-concurrency.md)调用函数代码的次数。
+ `ProvisionedConcurrencySpilloverInvocations` – 当所有预置并发均处于使用状态时，使用标准并发调用函数代码的次数。
+ `RecursiveInvocationsDropped` – Lambda 因检测到您的函数属于无限递归循环而停止调用函数的次数。递归循环检测通过跟踪受支持的 AWS SDK 添加的元数据，来监控函数作为请求链的一部分被调用的次数。默认情况下，如果您的函数作为请求链的一部分被调用的次数接近 16 次，Lambda 会中断下一次调用。如果禁用递归循环检测，则不会发出此指标。有关此特征的更多信息，请参阅[使用 Lambda 递归循环检测来防止无限循环](invocation-recursion.md)。

## 部署指标
<a name="deployment-metrics"></a>

部署指标提供有关 Lambda 函数部署事件及相关验证过程的信息。
+ `SignatureValidationErrors`— 当代码签名配置策略设置为 `Warn` 时，代码包部署出现签名验证失败的次数。未通过到期、不匹配或撤销检查时，但由于 `Warn` 策略设置仍允许部署，就会发送此指标。有关代码签名的更多信息，请参阅 [使用代码签名通过 Lambda 验证代码完整性](configuration-codesigning.md)。

## 性能指标
<a name="performance-metrics"></a>

性能指标提供了有关单个函数调用的性能详细信息。例如，`Duration` 指标指示函数处理事件所花费的时间量（以毫秒为单位）。要了解函数处理事件的速度，请使用 `Average` 或 `Max` 统计数据查看这些指标。
+ `Duration` – 函数代码处理事件所花费的时间量。调用的计费持续时间是已舍入到最近的毫秒的 `Duration` 值。`Duration` 不包括冷启动时间。
+ `PostRuntimeExtensionsDuration` – 函数代码完成后，运行时为扩展运行代码所花费的累积时间。
+ `IteratorAge`：对于 DynamoDB、Kinesis 和 Amazon DocumentDB 事件源，事件中最后一条记录的期限（毫秒）。该指标测量流接收记录的时间到事件源映射将事件发送到函数的时间之间的时间量。
+ `OffsetLag` – 对于自行管理的 Apache Kafka 和 Amazon Managed Streaming for Apache Kafka（Amazon MSK）事件源，写入到主题的最后一条记录与函数的使用者组处理的最后一条记录之间的偏移量差值。尽管 Kafka 主题可以包含多个分区，但此指标仍可在主题级别衡量偏移延迟。

`Duration` 还支持百分位数 (`p`) 统计数据。使用百分位数可排除偏离 `Average` 和 `Maximum` 数据的异常值。例如，`p95` 统计数据显示 95% 的调用的最长持续时间，并排除最慢的 5% 的调用。有关更多信息，请参阅《Amazon CloudWatch 用户指南》**中的[百分位数](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Percentiles)。

## 并发指标
<a name="concurrency-metrics"></a>

Lambda 将并发指标报告为跨函数、版本、别名或 AWS 区域 处理事件的实例数的总计数。要查看接近[并发限制](lambda-concurrency.md#concurrency-quotas)的程度，请使用 `Max` 统计数据查看这些指标。
+ `ConcurrentExecutions` – 正在处理事件的函数实例的数目。如果此数目达到区域的[并发执行配额](gettingstarted-limits.md#compute-and-storage)或您在函数上配置的[预留并发](configuration-concurrency.md)限制，则 Lambda 将会限制其他调用请求。
+ `ProvisionedConcurrentExecutions` – 使用[预置并发](provisioned-concurrency.md)处理事件的函数实例的数目。对于具有预置并发性的别名或版本的每次调用，Lambda 都会发出当前计数。如果您的函数处于非活跃状态或未接收请求，则 Lambda 不会发出此指标。
+ `ProvisionedConcurrencyUtilization` – 对于版本或别名，为将 `ProvisionedConcurrentExecutions` 值除以配置的预置并发总数。例如，为函数配置的预置并发数为 10，而 `ProvisionedConcurrentExecutions` 为 7，则 `ProvisionedConcurrencyUtilization` 为 0.7。

  如果您的函数处于非活跃状态或未接收请求，则 Lambda 不会发出此指标，因为它基于 `ProvisionedConcurrentExecutions`。如果您使用 `ProvisionedConcurrencyUtilization` 作为 CloudWatch 告警的基础，则请记住这一点。
+ `UnreservedConcurrentExecutions` – 对于区域，由不具有预留并发的函数处理的事件数。
+ `ClaimedAccountConcurrency` – 针对某个区域，不可用于按需调用的并发数。`ClaimedAccountConcurrency` 等于 `UnreservedConcurrentExecutions` 加上分配的并发数（即总预留并发数加上总预置并发数）。有关更多信息，请参阅 [使用 `ClaimedAccountConcurrency` 指标](monitoring-concurrency.md#claimed-account-concurrency)。

## 异步调用指标
<a name="async-invocation-metrics"></a>

异步调用指标提供有关来自事件源的异步调用和直接调用的详细信息。您可以设置阈值和警报以通知您某些变化。例如，当排队等待处理的事件数量意外增加时 (`AsyncEventsReceived`)。或者，当一个事件等待了很长时间才完成处理时 (`AsyncEventAge`)。
+ `AsyncEventsReceived` – Lambda 成功排队等待处理的事件数。此指标可让您深入了解 Lambda 函数接收的事件数量。监控此指标并设置阈值警报以检查是否存在问题。例如，用于检测出发送到 Lambda 的事件数量是否异常，还能用于快速诊断出因触发错误或函数配置不正确而导致的问题等等。`AsyncEventsReceived` 和 `Invocations` 之间的不匹配可能表明处理过程存在差异、事件被丢弃或潜在的队列积压。
+ `AsyncEventAge` – Lambda 成功将事件排队到调用该函数之间的时间。当由于调用失败或节流而重试事件时，此指标的值会增加。监控此指标，并在出现队列积聚时针对不同统计信息的阈值设置警报。要解决该指标增加的问题，请查看 `Errors` 指标以识别函数错误，并查看 `Throttles` 指标以确定并发问题。
+ `AsyncEventsDropped` – 在未成功执行函数的情况下丢弃的事件数。如果您配置了死信队列（DLQ）或 `OnFailure` 目标，则事件会在丢弃之前发送到那里。事件因各种原因被丢弃。例如，事件可能超过最大事件期限或耗尽最大重试次数，或者预留并发可能设置为 0。要解决该指标被丢弃的问题，请查看 `Errors` 指标以识别函数错误，并查看 `Throttles` 指标以确定并发问题。

## 事件源映射指标
<a name="event-source-mapping-metrics"></a>

事件源映射指标可让您对事件源映射的处理行为进行深入了解。

目前，事件源映射指标可用于 Amazon SQS、Kinesis、DynamoDB、Amazon MSK 和自托管式 Apache Kafka 事件源。

对于带有指标配置的事件源映射，您现在还可以从控制台 **Lambda** > **其他资源** > **事件源映射**页面的**监视器**选项卡中查看所有与 ESM 相关的指标。

**要启用指标或事件源映射（控制台）**

1. 打开 Lamba 控制台的[函数](https://console.aws.amazon.com/lambda/home#/functions)页面。

1. 选择想要为其启用指标的函数。

1. 选择**配置**，然后选择**触发器**。

1. 选择想要为其启用指标的事件源映射，再选择**编辑**。

1. 在**事件源映射配置**下，选择**启用指标**或从**指标**下拉列表中选择。

1. 选择**保存**。

或者，您可以使用 [EventSourceMappingConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_EventSourceMappingConfiguration.html) 中的 [EventSourceMappingMetricsConfig](https://docs.aws.amazon.com/lambda/latest/api/API_EventSourceMappingMetricsConfig.html) 对象，以编程方式启用事件源映射的指标。例如，以下 [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) CLI 命令启用事件源映射的指标：

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --metrics-config Metrics=EventCount
```

有 3 个指标组：`EventCount`、`ErrorCount` 和 `KafkaMetrics`，每个组都有多个指标。并非每个指标都可用于每个事件源。下表汇总了每种类型的事件源支持的指标。

您必须选择加入指标组才能接收与指标相关的指标，例如在指标配置中将 EventCount 设置为：（`PolledEventCount`、`FilteredOutEventCount`、`InvokedEventCount`、`FailedInvokeEventCount`、`DroppedEventCount`、`OnFailureDestinationDeliveredEventCount` 和 `DeletedEventCount`）。


| 事件源映射指标 | 指标组 | Amazon SQS | Kinesis 和 DynamoDB 流 | Amazon MSK 和自托管式 Apache Kafka | 
| --- | --- | --- | --- | --- | 
|  `PolledEventCount`  |  `EventCount`  |  支持  |  是  |  是  | 
|  `FilteredOutEventCount`  |  `EventCount`  |  是  |  是  |  是  | 
|  `InvokedEventCount`  |  `EventCount`  |  是  |  是  |  是  | 
|  `FailedInvokeEventCount`  |  `EventCount`  |  是  |  是  |  是  | 
|  `DroppedEventCount`  |  `EventCount`  |  否  |  是  |  是  | 
|  `OnFailureDestinationDeliveredEventCount`  |  `EventCount`  |  否  |  是  |  是  | 
|  `DeletedEventCount`  |  `EventCount`  |  是  |  否  |  否  | 
|  `CommittedEventCount`  |  `EventCount`  |  否  |  否  |  是  | 
|  `PollingErrorCount`  |  `ErrorCount`  |  否  |  否  |  是  | 
|  `InvokeErrorCount`  |  `ErrorCount`  |  否  |  否  |  是  | 
|  `OnFailureDestinationDeliveryErrorCount`  |  `ErrorCount`  |  否  |  否  |  是  | 
|  `SchemaRegistryErrorCount`  |  `ErrorCount`  |  否  |  否  |  是  | 
|  `CommitErrorCount`  |  `ErrorCount`  |  否  |  否  |  是  | 
|  `MaxOffsetLag`  |  `KafkaMetrics`  |  否  |  否  |  是  | 
|  `SumOffsetLag`  |  `KafkaMetrics`  |  否  |  否  |  是  | 

此外，如果您的事件源映射处于[预调配模式](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode)，则 Lambda 会提供以下指标：
+ `ProvisionedPollers`：对于在预调配模式下的事件源映射，即为正在运行的事件轮询器数量。使用 `MAX` 数学查看此指标。
+ （仅限 Amazon MSK 和自托管式 Apache Kafka 事件源）`EventPollerUnit`：对于预置模式下的事件源映射，即为主动运行的事件轮询器单元数量。使用 `SUM` 数学查看此指标。
+ （Amazon MSK 和自托管式 Apache Kafka 事件源）`EventPollerThroughputInBytes`：对于预置模式下的事件源映射，即为从事件源轮询的事件轮询器的总记录大小。它可以告知您当前轮询吞吐量。使用 `SUM` 数学查看此指标。

下面是有关每个指标的更多详细信息：
+ `PolledEventCount`：Lambda 成功从事件源读取的事件数。如果 Lambda 轮询事件但收到空轮询（没有新记录），则 Lambda 会为该指标发出 0 值。使用此指标来检测您的事件源映射是否正在以正确方式轮询新事件。
+ `FilteredOutEventCount`：对于使用[筛选条件](invocation-eventfiltering.md)的事件源映射，即按该筛选条件筛选出的事件数量。使用此指标来检测事件源映射是否正确筛选出事件。对于符合筛选条件的事件，Lambda 会发出一个 0 指标。
+ `InvokedEventCount`：调用您的 Lambda 函数的事件数量。使用此指标来验证事件是否正在以正确方式调用您的函数。如果某个事件导致函数错误或节流，则由于自动重试，`InvokedEventCount` 可能会对同一轮询事件进行多次计数。
**警告**  
Lambda 事件源映射至少处理每个事件一次，有可能出现重复处理记录的情况。因此，在涉及事件计数的指标中，可能会对事件进行多次计数。
+ `FailedInvokeEventCount`：Lambda 尝试调用您的函数但失败的事件数量。调用可能由于网络配置问题、权限不正确或者 Lambda 函数、版本或别名被删除等原因而失败。如果您的事件源映射已启用[部分批次响应](services-sqs-errorhandling.md#services-sqs-batchfailurereporting)，则 `FailedInvokeEventCount` 将包含响应中 `BatchItemFailures` 非空的任何事件。
**注意**  
`FailedInvokeEventCount` 指标的时间戳表示函数调用的结束。此行为与其他 Lambda 调用错误指标不同，后者在函数调用开始时带有时间戳。
+ `DroppedEventCount`：Lambda 因过期或重试耗尽而删除的事件数量。具体而言，这是超过您为 `MaximumRecordAgeInSeconds` 或 `MaximumRetryAttempts` 配置的值的记录数量。重要的是，这不包括因超过事件源的保留设置而过期的记录数量。删除的事件还不包括您发送到[失败时的目标](invocation-async-retain-records.md)的事件。使用此指标来检测不断增加的事项积压。
+ `OnFailureDestinationDeliveredEventCount`：对于配置了[失败时的目标](invocation-async-retain-records.md)的事件源映射，即为发送到该目标的事件数量。使用此指标对与来自该事件源的调用相关的函数错误进行监控。如果向目标交付失败，则 Lambda 会按以下方式处理指标：
  + Lambda 不会发出 `OnFailureDestinationDeliveredEventCount` 指标。
  + 对于 `DestinationDeliveryFailures` 指标，Lambda 发出 1。
  + 对于 `DroppedEventCount` 指标，Lambda 发出一个等于交付失败的事件数量的数字。
+ `DeletedEventCount`：Lambda 在处理后成功删除的事件数量。如果 Lambda 尝试删除事件但失败，则 Lambda 会发出 0 指标。使用此指标来确保成功处理的事件已从您的事件源中删除。
+ `CommittedEventCount`：Lambda 在处理后成功提交的事件数量。它是 Kafka 事件源映射中每个分区的上次提交偏移量与当前提交偏移量的增量之和。
+ `PollingErrorCount`：Lambda 从事件源轮询请求失败时发生的错误数量。Lambda 仅在发生错误时发出此指标数据。
+ `InvokeErrorCount`：Lambda 调用函数失败时发生的错误数量。请注意，调用是批量记录。该数值是批次级别，而不是记录计数级别。Lambda 仅在发生错误时发出此指标数据。
+ `SchemaRegistryErrorCount`：Lambda 获取架构失败或使用架构进行反序列化时发生的错误数量。Lambda 仅在发生错误时发出此指标数据。
+ `CommitErrorCount`：Lambda 向 Kafka 集群提交失败时发生的错误数量。Lambda 仅在发生错误时发出此指标数据。
+ `MaxOffsetLag`：事件源映射中所有分区的最大偏移量延迟（最新偏移量和提交的偏移量之间的差异）。
+ `SumOffsetLag`：事件源映射中所有分区的偏移量延迟总和。

如果您的事件源映射已禁用，则您将不会收到事件源映射指标。如果 CloudWatch 或 Lambda 出现可用性下降的情况，则您可能还会发现缺少指标。