# AWS DynamoDB

> Monitor AWS DynamoDB tables with CloudWatch Metrics Streams for latency, throttling, capacity utilization, and replication lag

Source: https://last9.io/docs/integrations/databases/aws-dynamodb/

Monitor your Amazon DynamoDB tables with Last9 using CloudWatch Metrics Streams. This integration provides visibility into request latency, throttling, capacity utilization, errors, and Global Tables replication lag — with no agents to deploy.

Follow the [AWS CloudWatch Metrics Stream setup guide](/docs/integrations/observability/aws-cloudwatch-metrics/) to configure the stream, then return here for DynamoDB-specific namespace and metric details.

### HTTP Endpoint URL

Set the HTTP endpoint as the following.

```sh
{{ .Metrics.StreamWriteURL }}
```

### Additional Parameters

Set the following keys and values in the Parameters section. The keys are case-sensitive.

username: `{{ .Metrics.Username }}`

password: `{{ .Metrics.WriteToken }}`

## Metric Namespace

Enable `AWS/DynamoDB` namespace in your CloudWatch Metric Stream to send DynamoDB metrics to Last9.

For the full list of available metrics, see the [AWS DynamoDB metrics and dimensions reference](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/metrics-dimensions.html).

---

## Key Metrics

### Latency

| Metric                     | Description                                                                                                      | Dimensions               |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------ |
| `SuccessfulRequestLatency` | Latency of successful requests. Monitor `avg` and `max` per operation to detect table design or capacity issues. | `TableName`, `Operation` |

**Operations:** `GetItem`, `PutItem`, `UpdateItem`, `DeleteItem`, `Query`, `Scan`, `BatchGetItem`, `BatchWriteItem`, `TransactGetItems`, `TransactWriteItems`

### Throttling

Throttling is the most critical DynamoDB signal. Monitor all granularities — they expose different problems.

| Metric                                     | Description                                                                                                                                                   | Dimensions                              |
| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
| `ThrottledRequests`                        | Requests where at least one read/write event was throttled.                                                                                                   | `TableName`, `Operation`                |
| `ReadThrottleEvents`                       | Individual read events throttled. A `BatchGetItem` of 10 items = 10 potential events. Should always be `0`.                                                   | `TableName`, `GlobalSecondaryIndexName` |
| `WriteThrottleEvents`                      | Individual write events throttled. A `PutItem` on a table with 3 GSIs = 4 potential events. Should always be `0`.                                             | `TableName`, `GlobalSecondaryIndexName` |
| `ReadProvisionedThroughputThrottleEvents`  | Reads throttled due to provisioned capacity limits.                                                                                                           | `TableName`                             |
| `WriteProvisionedThroughputThrottleEvents` | Writes throttled due to provisioned capacity limits.                                                                                                          | `TableName`                             |
| `ReadKeyRangeThroughputThrottleEvents`     | Reads throttled due to **hot partition** limits. A table can throttle well below its provisioned capacity if traffic is concentrated on a few partition keys. | `TableName`                             |
| `WriteKeyRangeThroughputThrottleEvents`    | Writes throttled due to **hot partition** limits.                                                                                                             | `TableName`                             |
| `ReadMaxOnDemandThroughputThrottleEvents`  | Reads throttled because on-demand max throughput was exceeded.                                                                                                | `TableName`                             |
| `WriteMaxOnDemandThroughputThrottleEvents` | Writes throttled because on-demand max throughput was exceeded.                                                                                               | `TableName`                             |
| `ReadAccountLimitThrottleEvents`           | Reads throttled due to account-level capacity limits.                                                                                                         | —                                       |
| `WriteAccountLimitThrottleEvents`          | Writes throttled due to account-level capacity limits.                                                                                                        | —                                       |

### Capacity Utilization

| Metric                                        | Description                                                                                                   | Dimensions                              |
| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | --------------------------------------- |
| `ConsumedReadCapacityUnits`                   | Read capacity units consumed. Compare against `ProvisionedReadCapacityUnits` to track utilization percentage. | `TableName`, `GlobalSecondaryIndexName` |
| `ConsumedWriteCapacityUnits`                  | Write capacity units consumed.                                                                                | `TableName`, `GlobalSecondaryIndexName` |
| `ProvisionedReadCapacityUnits`                | Provisioned read capacity (published at 5-minute intervals).                                                  | `TableName`, `GlobalSecondaryIndexName` |
| `ProvisionedWriteCapacityUnits`               | Provisioned write capacity (published at 5-minute intervals).                                                 | `TableName`, `GlobalSecondaryIndexName` |
| `OnDemandMaxReadRequestUnits`                 | Maximum on-demand read request units configured for the table.                                                | `TableName`                             |
| `OnDemandMaxWriteRequestUnits`                | Maximum on-demand write request units configured for the table.                                               | `TableName`                             |
| `AccountProvisionedReadCapacityUtilization`   | Percentage of provisioned read capacity used across the account.                                              | —                                       |
| `AccountProvisionedWriteCapacityUtilization`  | Percentage of provisioned write capacity used across the account.                                             | —                                       |
| `MaxProvisionedTableReadCapacityUtilization`  | Utilization of the single most-read table or GSI in the account.                                              | —                                       |
| `MaxProvisionedTableWriteCapacityUtilization` | Utilization of the single most-written table or GSI in the account.                                           | —                                       |

### Errors

| Metric                           | Description                                                                                                         | Dimensions               |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------ |
| `SystemErrors`                   | HTTP 500 internal errors from DynamoDB. Should always be `0`.                                                       | `TableName`, `Operation` |
| `UserErrors`                     | HTTP 400 errors from client-side problems (bad parameters, missing tables, auth failures). Account-level aggregate. | —                        |
| `ConditionalCheckFailedRequests` | Failed conditional writes where the condition expression evaluated to false.                                        | `TableName`              |
| `TransactionConflict`            | Item-level requests rejected due to concurrent transactional conflicts on the same items.                           | `TableName`              |

### Returned Data

| Metric              | Description                                                                                                               | Dimensions               |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
| `ReturnedItemCount` | Items returned by `Query`, `Scan`, or `ExecuteStatement`. A low ratio versus items scanned indicates inefficient queries. | `TableName`, `Operation` |

### TTL

| Metric                       | Description                                         | Dimensions  |
| ---------------------------- | --------------------------------------------------- | ----------- |
| `TimeToLiveDeletedItemCount` | Items deleted by TTL expiration in the time period. | `TableName` |

### Global Tables (Replication)

| Metric                    | Description                                                                                      | Dimensions                     |
| ------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------ |
| `ReplicationLatency`      | Time between an item appearing in one region's stream and arriving in another region's replica.  | `TableName`, `ReceivingRegion` |
| `PendingReplicationCount` | Item updates written to one replica but not yet replicated to another. Global Tables v2017 only. | `TableName`, `ReceivingRegion` |

### Kinesis Data Streams

| Metric                          | Description                                                               | Dimensions                        |
| ------------------------------- | ------------------------------------------------------------------------- | --------------------------------- |
| `AgeOfOldestUnreplicatedRecord` | Age in milliseconds of the oldest record waiting for Kinesis replication. | `TableName`, `DelegatedOperation` |
| `FailedToReplicateRecordCount`  | Records DynamoDB failed to replicate to the Kinesis data stream.          | `TableName`, `DelegatedOperation` |
| `ThrottledPutRecordCount`       | Records throttled by Kinesis due to insufficient stream capacity.         | `TableName`, `DelegatedOperation` |

---

## Recommended Alerts

| Signal                                    | Condition                                                          | Severity |
| ----------------------------------------- | ------------------------------------------------------------------ | -------- |
| Read throttle events                      | `ReadThrottleEvents > 0`                                           | Warning  |
| Write throttle events                     | `WriteThrottleEvents > 0`                                          | Warning  |
| Hot partition — read                      | `ReadKeyRangeThroughputThrottleEvents > 0`                         | Critical |
| Hot partition — write                     | `WriteKeyRangeThroughputThrottleEvents > 0`                        | Critical |
| System errors                             | `SystemErrors > 0`                                                 | Critical |
| Consumed read capacity ≥ 80% provisioned  | `ConsumedReadCapacityUnits / ProvisionedReadCapacityUnits > 0.8`   | Warning  |
| Consumed write capacity ≥ 80% provisioned | `ConsumedWriteCapacityUnits / ProvisionedWriteCapacityUnits > 0.8` | Warning  |
| Global Tables replication lag             | `ReplicationLatency > 60000` ms                                    | Warning  |
| Transaction conflicts                     | `TransactionConflict > 0` anomaly                                  | Warning  |

:::tip
Alert on **consumed/provisioned capacity ratio** at 80% rather than on throttle events directly. This gives you lead time to scale before requests start failing.
:::

:::note
`ReadThrottleEvents` and `WriteThrottleEvents` count individual events within batch operations, not just requests. A single `BatchWriteItem` writing to a table with 3 GSIs can generate up to 4 throttle events. Use these alongside `ThrottledRequests` for complete throttle visibility.
:::

---

## Troubleshooting

Please get in touch with us on [Discord](https://discord.com/invite/Q3p2EEucx9) or [Email](mailto:support@last9.io) if you have any questions.
