我正在考虑将StatsD数据收集添加到我的grails应用程序,并查看现有的库和代码让我有点困惑,这将是一个很好的可扩展解决方案.为了将问题放在上下文中,我正在开发一个在线游戏类型项目,我自然会监控用户与游戏引擎的交互,这些将自然地围绕着X用户在窗口内执行交互的特定时刻一秒钟或两秒钟,然后在10-20秒停顿后重复.
这是我对今天可用的选项的分析.
Etsy StatsD客户端示例
可以解决的最简单的事情就是将这个类引入我的项目,并将一个单例实例作为一个spring bean来实现,直接使用它.然而,注意到grails-statsd插件创建了一个客户端实例池,我开始想知道这种方法的可扩展性.
似乎如果许多线程尝试同时发送事件,doSend方法可能会成为一个瓶颈,但是据了解,由于发送UDP数据包的性质,这会发生很快,避免了巨大的开销我们通常与网络连接相关联.
grails-statsd插件
有人已经为包含一些很好的功能(如注释和withTimer方法)的Grails创建了一个StatsD插件.但是我看到,实现方法从示例实现中缺少一些错误修复,例如在String.format的调用上指定语言环境.当一个标准的执行者可以达到类似的效果时,我也不是一个很大的粉丝,只是为了这个目的而拉扯apache commons-pool.
Java的statsd客户端
这是一个替代的纯Java库,通过维护自己的ExecutorService来异步运行.它支持整个StatsD API,包括集合和抽样,但不提供用于配置线程池和队列大小的任何钩子.在出现问题的情况下,对于非关键的事情,如监视,我认为我宁愿有限队列和丢失事件,而不是一个无限队列填满我的堆.
播放statsd插件
现在我不能直接在我的grails项目中使用这个代码,但是我认为看看事情是如何实现的.一般来说,我喜欢StatsdClient.scala中的代码的构建方式,非常干净和可读.也似乎有区域设置的bug,但是其他功能完整的etsy示例.有趣的是,除非有一些Scala魔术,我不明白,这似乎为发送到StatsD的每个数据点创建一个新的套接字.虽然这种方法很好地避免了对象池或执行器线程的必要性,但我无法想象它是非常有效的,可能会在请求线程内执行DNS查找,该请求线程应尽快返回给用户.
问题
>从所有其他实现似乎已经实现了另一个处理并发策略的事实来看,我可以假设Etsy示例对于生产使用来说有点太天真吗?
我的分析在这里是否正确?
>其他人在java / groovy中使用什么是statsd?
到目前为止,只要能够接受公共库依赖关系,现在最好的解决方案就是grails插件,但现在我正在认真考虑在星期天写下我自己的版本,结合每个实现的最佳部分.