我正在构建一个Rails应用程序,其主要功能是通过API使用的。我想跟踪为每个用户调用的对象的API使用情况,以便我可以为每个用户显示用户的指标,并根据总使用情况对其进行计费。
我正在寻找一种数据结构或其他解决方案,允许我跟踪和报告为给定资源调用API的次数(在本例中为属于用户的'Flow'对象)。 / p>
为了解决这个问题,我在我的模型中添加了一个'daily_calls'哈希字段,它有一个按日期计算API调用次数的计数器。我还希望在一天之后添加另一个级别,但我知道在运行汇总查询时(例如上个月的呼叫),这将不会非常高效。
# Flow daily_calls field example (Y => M => D)
{2016=>{12=>{14=>5}}, 2017=>{1=>{9=>6}}}
# Flow daily_calls example with hours (Y => M => D => H)
{2016=>{12=>{14=>{23=>5}}}, 2017=>{1=>{9=>{3=>4,4=>2}}}}
目前我在调用API时使用方法更新计数,并且我有一些方法可以聚合特定对象的数据:
class Flow < ApplicationRecord
belongs_to :user
...
# Update usage metrics
def api_called
update_lifetime_count!
update_daily_count!
end
# Example method for displaying usage
def calls_in_month(date)
return 0 unless daily_calls[date.year] && daily_calls[date.year][date.month]
daily_calls[date.year][date.month].values.sum
end
end
我解释的越多,听起来就越疯狂!我希望应用程序的数量很大,所以如果可以提供帮助,我不想创建过多的数据量,尽管将来可能有助于保存有关API使用的更多信息,例如:地理位置/请求的IP。
我正在考虑的另一种方法是为每小时创建一个对象实例,并在该对象上增加一个整数字段。然后我可以运行一个时间范围的查询并对整数求和(这比所有这些Hash工作要容易得多)。
我怀疑这不是最佳解决方案,因此想知道最佳数据结构,或者是否有一个gem允许灵活地跟踪这些类型的用户活动并使用此信息显示用户的使用情况。用户和汇总报告的使用情况。
它应该支持的一些示例用例:
答案 0 :(得分:0)
我认为你可以使用像public_activity或paper_trail这样的宝石。
如果您使用其中一个宝石,则可以根据需要查询这些宝石,以便向用户显示这些信息。