当石墨的碳聚合器可以做同样的工作时,为什么要使用statsd?

tal*_*onx 64 metrics graphite statsd

我一直在探索Graphite图形工具,用于显示来自多个服务器的指标,似乎"推荐"方式是首先将所有指标数据发送到StatsD.StatsD汇总数据并将其发送到石墨(或更确切地说,碳).

就我而言,我希望对服务器上的指标进行简单的聚合,例如求和和平均值,并用石墨绘制.石墨配有碳聚合器,可以做到这一点.

StatsD甚至没有提供我所说的那种聚合.

我的问题是 - 我应该根据我的用例使用statsd吗?我在这里缺少什么?

Ale*_*uôc 31

  1. StatsD通过UDP运行,这消除了carbon-aggregator.py响应缓慢和在应用程序中引入延迟的风险.换句话说,松耦合.

  2. StatsD支持入站指标的抽样,当您不希望聚合器占用所有数据点的100%来计算描述性统计数据时,这非常有用.对于大容量代码段,通常使用0.5%-1%的采样率,以便不会使StatsD过载.

  3. StatsD拥有广泛的客户端支持.

  • 谢谢.除#2外,所有积分对碳也有效.Carbon可以配置为侦听UDP,并且还具有广泛的客户端支持. (10认同)

jam*_*ner 27

tldr:如果您想查看特定于服务器的总和或平均数,您可能需要statsd(或carbon-c-relay).

碳聚合器旨在将来自多个指标的值聚合到一个输出指标中,通常用于提高图形呈现性能.statsd旨在聚合单个指标中的多个数据点,因为否则graphite仅存储以最小存储分辨率报告的最后一个值.

statsd示例: 假设您的graphite storage-schemas.conf文件的最小保留期为10秒(默认值),并且您的应用程序每10秒向services.login.server1.count发送大约100个数据点,值为1.没有statsd,石墨只会存储每10秒桶中收到的最后一次计数.收到第100条消息后,其他99个数据点将被丢弃.但是,如果你在应用程序和石墨之间放置statsd,那么在将总数发送到石墨之前,它会将所有100个数据点加在一起.因此,如果没有statsd,您的图表仅指示在10秒间隔期间是否发生了登录.使用statsd,它表示在该间隔期间发生了多少次登录.(例如)

碳聚合器示例:假设您有200个不同的服务器报告200个单独的度量标准(services.login.server1.response.time , services.login.server2.response.time ,etcetera).在您的操作仪表板上,您显示使用此石墨查询的所有服务器的平均值图表:weightedAverage(services.login.server*.response.time,services.login.server*.response.count,2).遗憾的是,渲染此图表需要10秒钟.要解决此问题,您可以添加碳聚合器规则来预先计算所有服务器的平均值,并将值存储在新的度量标准中.现在,您可以更新仪表板,只需提取一个指标(例如services.login.response.time).新指标几乎立即呈现.

附注:

  1. storage-aggregation.conf中的聚合规则适用于storage-schemas.conf中的所有存储间隔,每个保留字符串的第一个(最小)保留期除外.可以使用碳聚合器来聚合第一个保留期的度量标准内的数据点.不幸的是,aggregation-rules.conf使用"blob"模式而不是正则表达式模式.因此,您需要为每个路径深度和聚合类型添加单独的aggregation-rules.conf文件条目.statsd的优点是发送度量的客户端可以指定聚合类型,而不是在度量标准路径中对其进行编码.这使您可以灵活地随时添加新指标,而不管指标路径深度如何.如果您想在添加新度量标准时将carbon-aggregator配置为自动执行类似statsd的聚合,那么您的aggregation-rules.conf文件将如下所示:

    <n1>.avg (10)= avg <n1>.avg$
    <n1>.count (10)= sum <n1>.count$
    <n1>.<n2>.avg (10)= avg <n1>.<n2>.avg$
    <n1>.<n2>.count (10)= sum <n1>.<n2>.count$
    <n1>.<n2>.<n3>.avg (10)= avg <n1>.<n2>.<n3>.avg$
    <n1>.<n2>.<n3>.count (10)= sum <n1>.<n2>.<n3>.count$
    ...
    <n1>.<n2>.<n3> ... <n99>.count (10)= sum <n1>.<n2>.<n3> ... <n99>.count$
    
    Run Code Online (Sandbox Code Playgroud)

    注意:石墨0.10+(目前预发布)中不需要尾随"$" 这里是github上的相关补丁,这里是聚合规则的标准文档

  2. 在石墨0.10中,weightedAverage函数是新的,但通常,只要您的负载均衡,averageSeries函数就会给出一个非常相似的数字.如果你有一些速度较慢且服务较少的服务器,或者你只是精确度较高的服务器,那么你仍然可以用石墨0.9计算加权平均值.你只需要构建一个更复杂的查询,如下所示:

    divideSeries(sumSeries(multiplySeries(a.time,a.count), multiplySeries(b.time,b.count)),sumSeries(a.count, b.count))
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果在客户端框上运行statsd,这也会减少网络负载.虽然从理论上讲,你也可以在客户端运行碳聚合器.但是,如果您使用其中一个statsd客户端库,您还可以使用抽样来减少应用程序计算机CPU的负载(例如,创建环回udp数据包).此外,statsd可以在单个输入指标上自动执行多个不同的聚合(总和,平均值,最小值,最大值等)

  4. 如果您在每个应用服务器上使用statsd来聚合响应时间,然后使用碳聚合器在石墨服务器上重新聚合这些值,则最终会得到应用服务器而不是请求加权的平均响应时间.显然,这仅适用于使用mean或top_90聚合规则进行聚合,而不是min,max或sum.此外,如果您的负载不平衡,它只对意味着重要.例如:假设您有一个包含100个服务器的集群,突然有1个服务器被发送99%的流量.因此,该服务器的响应时间翻了两番,但在其他99台服务器上保持稳定.如果您使用客户端聚合,您的整体指标只会上涨约3%.但如果您在单个服务器端碳聚合器中进行所有聚合,那么您的整体指标将上升约300%.

  5. 碳-c-继电器基本上是c中写的碳聚合器的直接替代品.它改进了性能和基于正则表达式的匹配规则.结果是你可以在同一个简单的基于正则表达式的配置文件中同时执行statsd风格的数据点聚合和碳中继风格度量聚合以及其他整洁的东西,如多层聚合.

  6. 如果使用氰基末端而不是碳缓存,则氰化物将在内存中进行度量内平均(从版本0.5.1开始)或在读取时(在版本<0.1.3体系结构中).


Jan*_*bry 10

如果Carbon聚合器提供您需要的一切,则没有理由不使用它.它有两个基本的聚合函数(总和和平均值),实际上StatsD不包含这些函数.(我不确定历史,但也许Carbon聚合器已经存在且StatsD作者不想复制功能?)Carbon也支持通过UDP接收数据,所以你唯一会想到的就是采样,如果你通过平均汇总无关紧要.

StatsD通过添加额外的聚合值来支持不同的度量类型(例如,对于定时器:平均值,下限,上部和上部第X百分位数,......).我喜欢它们,但如果你不需要它们,Carbon聚合器也是一种很好的方式.

我一直在查看Carbon聚合器和StatsD(以及Bucky,Python中的StatsD实现)的源代码,它们都非常简单,我不会担心任何一种选择的资源使用或性能.