我是 Node.js 的新手,但是阅读 statsd 源代码后,在我看来,如果由于某种原因 Graphite 后端变得无法访问,那么 statsd 只会将其收集的统计数据洒在地板上,而不是将它们保留在不断增长的缓存中统计数据。这个对吗?
(我并不担心丢弃统计数据,而是担心无法联系 Graphite 的不断增长的 statsd 堆。所以,如果我对代码的阅读是正确的,我很高兴!)
简短的回答:它是可配置的,但默认行为是您想要的行为(缓存在刷新周期之间被丢弃)。
长答案:statsd 实际上并不向石墨报告。但是,它可以加载一个可以这样做的插件(并且它与这样的插件一起提供)。
要理解的重要一点是,虽然插件可以报告初始化成功或失败,但刷新事件没有回调或其他反馈选项。石墨插件注册 2 个事件,状态和刷新(https://github.com/etsy/statsd/blob/master/backends/graphite.js第 230 行),其中刷新是唯一报告指标的事件。
石墨插件注册刷新事件。在刷新事件期间,节点 EventEmitter 将调用所有已注册的插件,并带有一份缓存的统计数据。不同的副本被发送到每个插件,没有订单保证。如果您查看https://github.com/etsy/statsd/blob/master/stats.js第 32 行,您会看到正在发生这种情况,您将在其中看到 metrics_hash 正在创建和填充,然后用于发出刷新事件(第 122 行)。
缓存本身在副本被填充后立即被删除(第 77-120 行)。正如您在代码中看到的那样,您可以通过在配置文件中添加一个条目来更改此默认行为,以用于特定的度量类型(时间、仪表、计数器、集合)。例如,要保留计数器缓存,您应该将 deleteCounters = true 添加到您的配置中。请注意,无论任何插件的成功或失败,此配置将始终保留缓存的指标。