如何在 DynamoDB 中获取给定时间段的总计数?

How to get total count for given time period in DynamoDB?

背景:我们有一个 api 不同的 api 用户从不同的公司呼叫。我们正在记录 DataDog 中的每个请求。从 DD,我每分钟获取这些日志,获取所需的数据,即 apiUserKeycompanyNamedateAccessedapiVersion 等。我将每个请求记录在一个如图所示,DynamoDB table 调用了 EpgApiStatistics

我可以对列表进行分页,但我还需要维护每个 api 用户的总数以及每个公司(渠道)的总数。为此,我创建了两个单独的 tables,其中我将 apiUserkey 作为分区键,将 channelId 作为分区键,然后增加总计数。

我的问题是如何计算给定时间段或时间范围内的总计数。假设我们想要查看用户在 11 月 10 日至 17 日或一个月等期间的总 api 次通话?

我已阅读有关 GSI(全球二级索引)的信息,但我对如何在当前设置中使用它们感到困惑。感谢您的宝贵时间。

按日期范围查询单个 ApiUserKey

改变 SortKey 列的用途以包含日志的时间戳:

每个日志条目的

SortKey 变为:Log#<Timestamp>Log#<Date>#<Random>

我们现在可以按日、月、年日期范围查询单个 ApiKey ApiUserKey=<APIKey> and starts_with(SortKey, Log#2021-11)

对于日期范围查询,例如周或任意从-到日期,您必须将查询(基于 ><starts_with 的过度获取)与 filter expression.

查询特定日期范围内的所有 api 个键

要获取 所有 ApiKeys 范围内的日志,请添加一个 Global Secondary Index,您可以在其中反转上述键。时间戳成为 GSI 分区键,ApiKey 成为 GSI 排序键。

按日期范围查询频道

相同的模式。添加第二个 GSI,通道为 GSI PK,时间戳为 GSI SK。您使用第二个索引通过时间戳上的 >、< 或 = 按通道查询。

重要提示:dynamodb 为每个添加的索引复制所有索引行项目。