【问题标题】:Cannot collect metrics in Cassandra无法在 Cassandra 中收集指标
【发布时间】:2016-08-18 09:04:58
【问题描述】:

我正在尝试按照此处http://www.datastax.com/dev/blog/pluggable-metrics-reporting-in-cassandra-2-0-2 的建议使用metrics-graphite 将Cassandra 3.0 指标报告给Graphite 服务器。当集群上没有负载时,一切正常,并且所有指标都正确报告。但是如果发生一些负载,我会在 system.log 中收到以下异常:

ERROR [metrics-graphite-reporter-1-thread-1] 2016-07-13 08:21:23,580 ScheduledReporter.java:119 - RuntimeException thrown from GraphiteReporter#report. Exception was suppressed.
java.lang.IllegalStateException: Unable to compute ceiling for max when histogram overflowed
        at org.apache.cassandra.utils.EstimatedHistogram.rawMean(EstimatedHistogram.java:231) ~[apache-cassandra-3.0.7.jar:3.0.7]
        at org.apache.cassandra.metrics.EstimatedHistogramReservoir$HistogramSnapshot.getMean(EstimatedHistogramReservoir.java:103) ~[apache-cassandra-3.0.7.jar:3.0.7]
        at com.codahale.metrics.graphite.GraphiteReporter.reportHistogram(GraphiteReporter.java:265) ~[metrics-graphite-3.1.2.jar:3.1.2]
        at com.codahale.metrics.graphite.GraphiteReporter.report(GraphiteReporter.java:179) ~[metrics-graphite-3.1.2.jar:3.1.2]
        at com.codahale.metrics.ScheduledReporter.report(ScheduledReporter.java:162) ~[metrics-core-3.1.0.jar:3.1.0]
        at com.codahale.metrics.ScheduledReporter$1.run(ScheduledReporter.java:117) ~[metrics-core-3.1.0.jar:3.1.0]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_91]
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) [na:1.8.0_91]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_91]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) [na:1.8.0_91]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_91]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_91]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91]

每次报告者尝试获取每个 Cassandra 节点上的指标并且某些指标变得不可用时,都会重复此消息。为了再次接收指标,我必须重新启动所有 Cassandra 节点,这是非常不切实际的。我尝试了从 3.1.0 到 3.1.2 的不同 metrics-graphite 版本,但遇到了同样的问题。

【问题讨论】:

    标签: cassandra datastax cassandra-3.0


    【解决方案1】:

    如果您可以在不向 Graphite 报告表和键空间指标的情况下生存,这里有一个解决此错误的解决方法。

    我们使用的是 DataStax Enterprise 5.0.1,其中包含 Cassandra 3.0.7.1159。我在使用 metrics-graphite-2.2.0.jar 和 metrics-graphite-3.1.2.jar 的全新安装(不是升级)中遇到了这个错误,所以我不认为错误取决于版本Coda Hale/Yammer GraphiteReporter 插件。

    研究相关的 CASSANDRA Jira 票证,似乎这个错误是由于 Cassandra 3.0 指标值变得大于 GraphiteReporter 可以处理的。

    在我的 metrics-reporter-config.yaml 中,我使用了白名单通配符值,因此所有指标都报告给 Graphite,如下所示:

    graphite:
      -
        period: 60
        timeunit: 'SECONDS'
        prefix: 'dev.servers'
        hosts:
         - host: 'cassandra-1'
           port: 2003
        predicate:
          color: "white"
          useQualifiedName: false
          patterns:
            - ".*"
    

    我们发现的解决方法是,如果我们切换到使用如下所示的特定黑名单(由消除过程确定),以防止报告 Cassandra 表和键空间指标,错误就会消失:

    graphite:
      -
        period: 60
        timeunit: 'SECONDS'
        prefix: 'dev.servers'
        hosts:
         - host: 'cassandra-1'
           port: 2003
        predicate:
          color: "black"
          useQualifiedName: true
          patterns:
            - "^org.apache.cassandra.metrics.Table.+"
            - "^org.apache.cassandra.metrics.keyspace.+"
    

    进行此更改后,我必须重新启动 Cassandra。重启后,Cassandra system.log 文件中不再出现错误信息,也不再报告导致错误信息的指定指标组。

    【讨论】:

    • 不幸的是,我需要表格指标。为了克服这个问题,我切换到 collectd 并编写了一个 conf 来通过 JMX 收集我需要的所有 Cassandra 指标。
    • 我们在 3.0.9 上遇到了同样的错误,@nickoff 你能分享一下适用于你情况的 conf 吗?
    • 根据 cassandra jira 的说法,此错误已在 3.0.10 issues.apache.org/jira/browse/CASSANDRA-11117 中修复
    猜你喜欢
    • 1970-01-01
    • 2016-06-13
    • 2019-07-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2020-12-17
    • 2020-05-20
    相关资源
    最近更新 更多