如何从代码中收集自定义统计信息

时间:2018-11-09 09:24:37

标签: ruby

我正在处理由许多不同类组成的大量代码,我想构建一种在运行时收集一些统计信息的方法。理想情况下,我希望内部类能够运行类似

record_stat(:api_requests, 1)

整个过程从单个入口点(引擎)开始,但是理想情况下,我希望避免将该实例传递给所有内部类。最明显的解决方案(但我想避免)是:

  • 将引擎本身的实例传递给所有子实例。然后,引擎将使用record_stat方法
  • 返回每个子实例的所有统计信息,并将其汇总到引擎中

最初,我在看第二个选项,因为我已经为某些内部函数提供了一个返回值类,但是我只是认为,只要有一个处理该问题而不需要传递任何东西的方法,那就干净得多了。一直。

我目前与日志记录有些相似,我可以在其中运行::Engine::Logger.debug('...'),但是正在使用Thread.current做某事,而且感觉永远不对,所以不确定我是否也应该这样做。

是否有任何方法可以使record_stat方法仅适用于该过程,或者仅对某个块全局可用,以使所有内部成员都可以访问该方法,并使该方法对于引擎的运行而言是唯一的?

编辑:提供示例

引擎

class Engine
  ...
  def sync
    remote = fetch_remote_data
    records = map_remote_to_records(remote)
    save_records(records)
  end

  def fetch_remote_data
    @types.map do |type|
      DataFetcher.new(type).fetch
    end
  end

  def map_remote_to_records(remote)
   remote.map do |r|
     RecordMapper.new.map(r)
   end
  end

  def save_records(records)
    records.each do |record|
      RecordSaver.new(record).save!
    end
  end
end

DataFetcher

class DataFetcher
  def fetch(query = nil)
    provider.fetch(query)
  end
end

提供商

class SomeRemoteServerProvider
  def fetch(query)
    make_api_request.map do |remote|
      <convert to internal format>
    end
  end
end

RecordMapper

class RecordMapper
  def map
    local = find_or_build(@remote)
    assign_attributes(local, @remote)
    local
  end
end

RecordSaver

class RecordSaver
  def save!
    @records.each do |record|
      save_record!
      save_associations!
      ...
    end
  end
end

好的,所以这是一个简化的简化示例,但是在这种情况下,我要跟踪的是诸如SomeRemoteServerProvider之类的类,以报告其已进行的API调用的次数,或{{1 }}报告实际找到的本地记录数量以及必须创建的本地记录数量。像这样

0 个答案:

没有答案