Links#
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/metrics-dimensions.html
https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html
https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/1. Alert Standard#
| Severity | Alert | Metric | Namespace | Statistic | Period | Definition | Evaluation | Alarm After | Why Monitor |
|---|---|---|---|---|---|---|---|---|---|
| P1 | Throttled requests | ThrottledRequests |
AWS/DynamoDB |
Sum |
300s | > 0 |
1/1 datapoint |
~5m | 限流会导致应用错误、重试放大和延迟升高 |
| P1 | System errors | SystemErrors |
AWS/DynamoDB |
Sum |
300s | > 0 |
1/1 datapoint |
~5m | 代表 AWS 服务侧或短暂可用性问题,需要观察影响面 |
| P1 | GetItem/Query p95 high | SuccessfulRequestLatency |
AWS/DynamoDB |
p95 |
60s | >= 50ms |
10/10 datapoints |
~10m | 发现分区热点、索引设计或访问模式问题 |
| P1 | Put/Update p95 high | SuccessfulRequestLatency |
AWS/DynamoDB |
p95 |
60s | >= 100ms |
10/10 datapoints |
~10m | 发现写热点、条件写冲突或容量压力 |
| P2 | Read capacity high | ConsumedReadCapacityUnits / ProvisionedReadCapacityUnits |
AWS/DynamoDB |
metric math | 300s | >= 80% |
2/2 datapoints |
~10m | 提前发现读限流风险和扩容需求 |
| P2 | Write capacity high | ConsumedWriteCapacityUnits / ProvisionedWriteCapacityUnits |
AWS/DynamoDB |
metric math | 300s | >= 80% |
2/2 datapoints |
~10m | 提前发现写限流风险和扩容需求 |
| P2 | User errors high | UserErrors |
AWS/DynamoDB |
Sum |
300s | >= 10 |
1/1 datapoint |
~5m | 发现参数错误、条件失败、权限或代码调用问题 |
Evaluation rule:
Period 是每个 datapoint 的统计窗口,不是告警持续时间。
Alarm After 约等于 Period * EvaluationPeriods。
错误计数类用 5m Sum;latency / capacity 类用连续 datapoints。On-Demand 表也要看 throttle 和 latency;capacity ratio 只适合 provisioned 表。
2. CloudWatch Metrics#
| Metric | Meaning | Why Monitor | When Datapoint Appears | Namespace | Statistic | Period |
|---|---|---|---|---|---|---|
| ThrottledRequests | 被 DynamoDB 限流的请求数 | 判断容量不足、热点分区或 on-demand 突发限制 | 请求被 throttle | AWS/DynamoDB | Sum | 300s |
| SystemErrors | DynamoDB 服务端错误数 | 识别 AWS 服务侧异常和可用性影响 | DynamoDB 服务侧错误发生 | AWS/DynamoDB | Sum | 300s |
| UserErrors | 客户端侧请求错误数 | 识别代码、参数、权限或条件表达式问题 | 客户端请求错误发生 | AWS/DynamoDB | Sum | 300s |
| SuccessfulRequestLatency | 成功请求的响应延迟 | 衡量 DynamoDB 操作的性能和访问模式健康 | 成功请求完成 | AWS/DynamoDB | p95 | 60s |
| ConsumedReadCapacityUnits | 周期内消耗的读容量 | 计算读容量使用率和成本/扩容趋势 | 读请求消耗 RCU | AWS/DynamoDB | Sum | 300s |
| ProvisionedReadCapacityUnits | 配置的读容量 | 作为读容量使用率分母,判断是否接近上限 | 表/索引配置了 provisioned read capacity | AWS/DynamoDB | Average | 300s |
| ConsumedWriteCapacityUnits | 周期内消耗的写容量 | 计算写容量使用率和写入压力趋势 | 写请求消耗 WCU | AWS/DynamoDB | Sum | 300s |
| ProvisionedWriteCapacityUnits | 配置的写容量 | 作为写容量使用率分母,判断是否接近上限 | 表/索引配置了 provisioned write capacity | AWS/DynamoDB | Average | 300s |
Read capacity 使用率:
[
{
"Id": "consumed",
"MetricStat": {
"Metric": {
"Namespace": "AWS/DynamoDB",
"MetricName": "ConsumedReadCapacityUnits",
"Dimensions": [{ "Name": "TableName", "Value": "prod-orders" }]
},
"Period": 300,
"Stat": "Sum"
},
"ReturnData": false
},
{
"Id": "provisioned",
"MetricStat": {
"Metric": {
"Namespace": "AWS/DynamoDB",
"MetricName": "ProvisionedReadCapacityUnits",
"Dimensions": [{ "Name": "TableName", "Value": "prod-orders" }]
},
"Period": 300,
"Stat": "Average"
},
"ReturnData": false
},
{
"Id": "read_capacity_percent",
"Expression": "IF(provisioned>0,100*consumed/(provisioned*300),0)",
"Label": "Read capacity percent",
"ReturnData": true
}
]ConsumedReadCapacityUnits 是周期内总消耗,ProvisionedReadCapacityUnits 是每秒容量,所以 300 秒周期要乘以 300。
3. PromQL#
# 用正则先确认 YACE 暴露的 DynamoDB metric 名称。
# 这里不是告警表达式,只用于找真实 metric 和 label。
{__name__=~"aws_dynamodb_.*(throttled|latency|error|capacity).*"}ThrottledRequests 是 AWS 官方 DynamoDB metric。 如果当前没有发生过 throttle,CloudWatch list-metrics 或 YACE 输出可能暂时看不到它。先确认 table 被 YACE discovery 发现,再用上面的 PromQL 查实际 metric name 和 labels。
# 最近 5 分钟出现过 throttle。
# throttle 表示 DynamoDB 拒绝或延迟了请求,通常要看容量、热分区或 on-demand 突增。
increase(aws_dynamodb_throttled_requests_sum{table_name="prod-orders"}[5m]) > 0# 最近 5 分钟出现过 AWS 服务端系统错误。
# SystemErrors 不是应用参数错误,应该按可用性问题处理。
increase(aws_dynamodb_system_errors_sum{table_name="prod-orders"}[5m]) > 0# GetItem / Query 的 p95 延迟超过 50ms。
# operation label 用正则匹配读操作;写操作建议用 100ms 阈值。
aws_dynamodb_successful_request_latency_p95{table_name="prod-orders",operation=~"GetItem|Query"} >= 50# Provisioned read capacity 使用率:
# rate(consumed capacity sum[5m]) = 每秒消耗的 RCU
# provisioned average = 配置的每秒 RCU
# 二者相除再 * 100 = 使用率百分比
# >= 80 表示读容量接近瓶颈。
100 *
rate(aws_dynamodb_consumed_read_capacity_units_sum{table_name="prod-orders"}[5m])
/
clamp_min(aws_dynamodb_provisioned_read_capacity_units_average{table_name="prod-orders"}, 1)
>= 804. vmalert Rules#
groups:
- name: dynamodb.rules
rules:
- alert: DynamoDBThrottledRequests
# 最近 5 分钟 throttle 增量大于 0。
expr: increase(aws_dynamodb_throttled_requests_sum[5m]) > 0
for: 5m
labels:
severity: P1
component: dynamodb
annotations:
summary: "DynamoDB throttled requests occurred"
- alert: DynamoDBReadCapacityHigh
# 每秒消耗的 RCU / provisioned RCU * 100。
expr: |
100 * rate(aws_dynamodb_consumed_read_capacity_units_sum[5m])
/
clamp_min(aws_dynamodb_provisioned_read_capacity_units_average, 1) >= 80
for: 10m
labels:
severity: P2
component: dynamodb
annotations:
summary: "DynamoDB read capacity usage is >= 80%"