我一直在探索Graphite图形工具,用于显示来自多个服务器的指标,似乎"推荐"方式是首先将所有指标数据发送到StatsD.StatsD汇总数据并将其发送到石墨(或更确切地说,碳).
就我而言,我希望对服务器上的指标进行简单的聚合,例如求和和平均值,并用石墨绘制.石墨配有碳聚合器,可以做到这一点.
StatsD甚至没有提供我所说的那种聚合.
我的问题是 - 我应该根据我的用例使用statsd吗?我在这里缺少什么?
我们有一个度量标准,每当用户在我们的网站上执行某个操作时,我们就会递增,但这些图表似乎并不准确.
为了摆脱这种预感,我们投入了updated.log的碳,并发现今天的动作发生了超过4千次(使用grep和wc),但根据图的积分结果,它只返回220ish.
可能是什么原因造成的?正在使用statsd php库向statsd报告数据,并且statsd::increment('metric');如上所述,该日志确认此密钥今天发生了4,000多次更新.
我们正在使用:
石墨0.9.6,带有statsD(etsy)
我正在考虑将StatsD数据集添加到我的grails应用程序中,并查看现有的库和代码让我对什么是一个好的可扩展解决方案感到困惑.为了将问题放到上下文中,我正在开发一个在线游戏类型项目,我自然会监控用户与游戏引擎的交互,这些将自然地聚集在X用户将在窗口内执行交互的特定时刻一两秒,然后在10-20秒暂停后重复.
以下是我对今天可用选项的分析.
https://github.com/etsy/statsd/blob/master/examples/StatsdClient.java
"可能最简单的工作"解决方案,我可以将这个类拉入我的项目并将一个单例实例作为一个spring bean实例化并直接使用它.但是在注意到grails-statsd插件创建了一个客户端实例池后,我开始想知道这种方法的可扩展性.
如果许多线程试图同时发送事件,似乎该doSend方法可能成为瓶颈,但据我所知,由于发送UDP数据包的火灾和遗忘性质,这应该很快发生,避免了巨大的开销我们通常与网络连接相关联.
https://github.com/charliek/grails-statsd/
有人已经为grails创建了一个StatsD插件,其中包含一些很好的功能,例如注释和withTimer方法.但是我看到那里的实现缺少示例实现中的一些错误修复,例如在调用时指定语言环境String.format.当标准的Executor可以达到类似的效果时,我也不是为了吸引apache commons-pool的狂热粉丝.
https://github.com/tim-group/java-statsd-client/
这是一个替代的纯Java库,它通过维护自己的ExecutorService来异步操作.它支持整个StatsD API,包括集合和抽样,但不提供任何用于配置线程池和队列大小的挂钩.在出现问题的情况下,对于非关键的事情,例如监控,我认为我更喜欢有限的队列并且丢失事件而不是拥有填满我的堆的无限队列.
https://github.com/vznet/play-statsd/
现在我不能直接在我的grails项目中使用这个代码,但我认为值得一看,看看事情是如何实现的.一般来说,我喜欢编写代码的方式StatsdClient.scala,非常干净和可读.似乎也有区域设置错误,但其他功能完整与etsy示例.有趣的是,除非有一些我不理解的scala魔法,否则这似乎会为发送到StatsD的每个数据点创建一个新的套接字.虽然这种方法很好地避免了对象池或执行程序线程的必要性,但我无法想象它的效率非常高,可能会在请求线程中执行DNS查找,这应该尽快返回给用户.
到目前为止,看起来最好的现有解决方案是grails插件,只要我能接受公共池依赖,但是现在我正在认真考虑在周日编写我自己的版本,它结合了每个实现的最佳部分.
我们运行了etsy/statsd节点应用程序,每10秒将统计信息刷新为碳/低语.如果发送100个增量(计数),在前10秒内,石墨会正确显示它们,如:
localhost:3000/render?from=-20min&target=stats_counts.test.count&format=json
[{"target": "stats_counts.test.count", "datapoints": [
[0.0, 1372951380], [0.0, 1372951440], ...
[0.0, 1372952460], [100.0, 1372952520]]}]
Run Code Online (Sandbox Code Playgroud)
然而,10秒后,这个数字下降到0,null和33.3.最终,它在初始增量数的1/6处稳定,在这种情况下16.6.
/opt/graphite/conf/storage-schemas.conf 是:
[sixty_secs_for_1_days_then_15m_for_a_month]
pattern = .*
retentions = 10s:10m,1m:1d,15m:30d
Run Code Online (Sandbox Code Playgroud)
我想获得准确的计数,石墨是否平均了60秒窗口的数据而不是总结它?使用积分函数,经过一段时间后,显然给出:
localhost:3000/render?from=-20min&target=integral(stats_counts.test.count)&format=json
[{"target": "stats_counts.test.count", "datapoints": [
[0.0, 1372951380], [16.6, 1372951440], ...
[16.6, 1372952460], [16.6, 1372952520]]}]
Run Code Online (Sandbox Code Playgroud) 我可以输入时间戳通过statsd(javascript statsd)将数据发送到石墨吗?我需要绘制旧数据图表.
我正在使用statsD向石墨报告计数器数据; 每次收到消息时都会发送一个勾号.这种方法很有效,除非statsD因任何原因必须重新启动.然后我在我的图表中得到了很大的漏洞,因为在我没有收到任何消息的时间段内,statsD现在不再每10秒发送一次"0".
我正在报告各种不同的消息类型和队列,有时我很长时间没有收到特定队列的消息.
是否有任何现有的方法用我指定的默认值"填充"缺失的数据(在我的情况下,这将是0)?
我考虑为给定的指标发送'0'计数,以便statsD开始为它发送0,但我并不总是知道我将提前报告的指标集.
如果是这样,在什么条件下?或者,交替措辞,在twisted中运行此代码是安全的:
class StatsdClient(AbstractStatsdClient):
def __init__(self, host, port):
super(StatsdClient, self).__init__()
self.addr = (host, port)
self.server_hostname = socket.gethostname()
self.udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def incr(self, stat, amount=1):
data = {"%s|c" % stat: amount}
self._send(data)
def _send(self, data):
for stat, value in data.iteritems():
self.udp_sock.sendto("servers.%s.%s:%s" % (self.server_hostname, stat, value), self.addr)
Run Code Online (Sandbox Code Playgroud) 我使用statsd测量统计数据,使用Graphite显示这些数据.无论如何,我想在统计软件中做一个更复杂的分析,找出各种变量之间的关系.
为了做到这一点,我需要"原始"数据,这些数据通常在Graphite中显示为彩色线条.是否可以以CSV格式获取数据?我认为,每10秒采样1次的数据将是完美的,这是统计的默认行为.
我按照这些说明(https://www.digitalocean.com/community/tutorials/how-to-install-and-use-graphite-on-an-ubuntu-14-04-server)安装statsd和graphite,但我遇到了下面陈述的问题.似乎这不是石墨问题而是python问题.有谁知道如何解决这个问题?
~/build > sudo service carbon-cache start
* Starting Graphite backend daemon carbon-cache
Traceback (most recent call last):
File "/usr/bin/carbon-cache", line 32, in <module>
run_twistd_plugin(__file__)
File "/usr/lib/python2.7/dist-packages/carbon/util.py", line 90, in run_twistd_plugin
config.parseOptions(twistd_options)
File "/usr/local/lib/python2.7/dist-packages/twisted/application/app.py", line 604, in parseOptions
usage.Options.parseOptions(self, options)
File "/usr/local/lib/python2.7/dist-packages/twisted/python/usage.py", line 269, in parseOptions
raise UsageError("Unknown command: %s" % sub)
twisted.python.usage.UsageError: Unknown command: carbon-cache
Run Code Online (Sandbox Code Playgroud) 我很难理解Graphite和Kibana 3的集成来监控日志和系统命中率.我指的是这里描述的日志管理系统中的图.
提前致谢.